Բովանդակություն:

EAL - Industriel Internet - Fabrikshal: 7 քայլ
EAL - Industriel Internet - Fabrikshal: 7 քայլ

Video: EAL - Industriel Internet - Fabrikshal: 7 քայլ

Video: EAL - Industriel Internet - Fabrikshal: 7 քայլ
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Հուլիսի
Anonim
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal

Եթե ցանկանում եք օգտագործել այն, մինչև այն գործարկեք և ավտոմատացրեք համակարգը ՝ օգտագործելով 4.0 արդյունաբերական պրինցիպետ: Ես ուզում եմ ասել, er der lavet en lille simulation af en fabrikshal. I hallen står der en servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges til at lukke de relevante ind i fabrikshallen. Alt տվյալներ, արժեքներ և տվյալների բազա և Wampserver:

Քայլ 1: RFID Kortlæser

RFID Kortlæser
RFID Kortlæser
RFID Kortlæser
RFID Kortlæser

Der er inkluderet en RFID ծածկագիր: Hensigten er at ud fra de id numre der er på det kort, og den brik der er med med skrevet ind i vores Arduino kode. Det gør at når kortlæseren opfanger en brik eller et kort, kigger den på enhedens id-nummer, եւ godkender først når det nummer stemmer overens med det der er skrevet ind i koden.

Når kortlæseren giver adgang, s tændes lyset i fabrikken: Lyset slukkes igen, n enr en enhed, der er godkendt af kortlæseren, bliver detekteret:

Kortlæseren bliver fjernet fra projektet, da den kører seriel kommunikation. Det vil sige at der kan opstå forstyrrelser på den seriel port, der er på projektets Arduino Uno. Seriel porten, skal også bruges til Arduinoens ordrer, den vil få fra vores Windows Forms դիմում: I den sammenhæng er lyset også fravalgt.

Քայլ 2. Սերվոմոտոր (Anlæg)

Սերվոմոտոր (Anlæg)
Սերվոմոտոր (Anlæg)
Սերվոմոտոր (Anlæg)
Սերվոմոտոր (Anlæg)
Սերվոմոտոր (Anlæg)
Սերվոմոտոր (Anlæg)

I hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan hilberrer forskellige produkter. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt i en MySQL տվյալների բազայի. Motoren kan køre ud i tre forskellige positioner: Hver պաշտոնը խորհրդանշող tre forskellige produkter. N produktr produktet er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Det er meningen at man, via WPF applikationen kan afgive nye ordrer til motoren. Alt hvad bliver productret bliver gemt i en MySQL տվյալների բազայում:

Քայլ 3. MySQL տվյալների շտեմարան

MySQL տվյալների շտեմարան - Indhold
MySQL տվյալների շտեմարան - Indhold
MySQL տվյալների շտեմարան - Indhold
MySQL տվյալների շտեմարան - Indhold
MySQL տվյալների շտեմարան - Indhold
MySQL տվյալների շտեմարան - Indhold

Ես MySQL տվյալների բազա եմ ներկայացնում v tabre tre tabeller. Den første holder øje med hvilke produkter der er bestilt, og hvor mange. Այս դեպքում դուք կարող եք օգտագործել արտադրանքը: Հարկ է նշել, որ դուք կարող եք գերակշռել այն արտադրողին, որը գտնվում է տնային տնտեսության մեջ, ինչպես նաև տնից դուրս: Ydermere er der et tidspunkt på, hvornår de pågældende produkter er productionret: Տեղադրեք Windows Forms- ը, օգտագործելով այս կամ այն ձևը, այն կարող է ուղարկել Arduinoen, տվյալների բազա: Når der bliver afgivet en ordrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relevante data blive logget and databasen. Der bliver sendt tre forskellige datatyper til տվյալների բազան: En Integer, en String, som bliver kaldt en VarChar, i տվյալների շտեմարան: Der er også et TimeStamp, Det er en indstilling, der er tilføjet i տվյալների բազան:

Քայլ 4: Arduino Kode

#ներառում

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Serial kommunikation startes Serial.begin (9600); } void loop () {// Læsning fra serial port produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) udføres i denne case case '1': myServo.write (50); ուշացում (1000); myServo.write (0); ուշացում (1000); Serial.println («Կատարված է»); ընդմիջում; // Produkt B (2) udføres i denne case case '2': myServo.write (100); ուշացում (1000); myServo.write (0); ուշացում (1000); Serial.println («Կատարված է»); ընդմիջում; // Արտադրանքի C (3) և գործի դեպք '3'. MyServo.write (150); ուշացում (1000); myServo.write (0); ուշացում (1000); Serial.println («Կատարված է»); ընդմիջում; }}

Քայլ 5. Windows Forms Applikation

օգտագործելով System; օգտագործելով System. Collections. Generic; օգտագործելով System. ComponentModel; օգտագործելով System. Data; օգտագործելով System. Drawing; օգտագործելով System. Linq; օգտագործելով System. Text; օգտագործելով System. Threading. Tasks; օգտագործելով System. Windows. Forms; օգտագործելով System. Collections; օգտագործելով System. IO. Ports; օգտագործելով MySql; օգտագործելով MySql. Data. MySqlClient;

անունների տարածք WindowsFormsApp2

{public partial class Form1: Form { /* I denne class bliver alle public variabler oprettet. Herunder er der oprettet en Class (MySqlConnection) der skal tages i brug, for at kunne oprette forbindelse til MySQL serveren. Ydermere er der oprettet en String (connectionString) - ը կարող է օգտագործվել մինչև սահմանել գաղտնաբառ, ինչպես նաև հեքիաթային տվյալների բազա: Der er oprettet en integer, i et 2d array (orde): Grunden til det er at en ordrer kan bestå af flere productioner af et product, eller flere products. Seriel kommunikationen til Arduinoen bliver også defineret նրան: Der bliver også oprettet en Class (BackgroundWorker): Den gør at en bestemt del af programmet bliver eksikveret gentagende gange i baggrunden. I dette tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ MySqlConnection միացում; լարային միացումԼար;

մասնավոր int ordrenummer;

մասնավոր int [,] կարգ = նոր int [100, 100]; մասնավոր int sendOrder = նոր int [100]; մասնավոր տող prodType;

SerialPort sp = նոր SerialPort ();

մասնավոր BackgroundWorker myWorker = նոր BackgroundWorker ();

հանրային ձև 1 ()

{InitializeComponent (); // Her bliver vores String (connectionString) defineret. connectionString = "սերվեր = 192.168.1.100; userid = արմատ; pwd = langeland; բազա = arduino;"; /* Նրա «myWorker» փոփոխական փոփոխականը նստել է մինչև տեղեկամատյան տարբեր բազմազանության լավագույն ընթացքը: */ myWorker. DoWork += նոր DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = ճշմարիտ; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der definret hvilket format datoen kører i. Նրա ձևաչափը լավագույնն է MySQL տվյալների բազայից հետո: dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

մասնավոր դատարկ Afgiv_Ordre_Click (օբյեկտ ուղարկող, EventArgs ե)

{ /* Her er op opettet nogle variabler, der kun bliver brugt i dette void. De tre første er Integers der skal definere hvilket produkt der er tale om. De næste tre er oprettet for at kunne skrive det antal man ønsker, ind i applikationen. Den sidste er oprettet for at få en længde på den pågældende ordre. */ int produktA = 1; int produktB = 2; int produktC = 3; int prodA = int. Parse (prodAOrder. Text); int prodB = int. Parse (prodBOrder. Text); int prodC = int. Parse (prodCOrder. Text); int orderLength = prodA + prodB + prodC; /* Ես քանդում եմ օղակները, որոնք աշխատում են, ընտրում եմ արտադրողներն ու արտադրողները և ես ավելի լավ եմ օգտագործում: */ for (int prod1A = 0; prod1A <prodA; prod1A ++) {կարգ [ordrenummer, prod1A] = produktA; }

for (int prod1B = (prodA); prod1B <(prodB+prodA); prod1B ++) {order [ordrenummer, prod1B] = produktB; }

համար (int prod1C = (prodA + prodB); prod1C 99)

{ordrenummer = 0; } // Her overføres de bestilte produkter til databasen. DBQuery ("INSERT INTO` bestilteprod "(` Produkt A`, `Produkt B`,` Produkt C`) VALUES (" + prodA +", " + prodB +", " + prodC +") "); // Her overføres en oversigt over hvilke produkter der mangler at blive productionrert, տվյալների շտեմարանների համար: DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` +(" +(prodA +prodB +prodC) +")) WHERE 1 "); }

// I dette void er alt det kode der skal køre i baggrunden, lagt ind.

private void myWorker_DoWork (օբյեկտ ուղարկող, EventArgs e) {իսկ (ճշմարիտ) { /* Så længe at summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre. */ Կարգավիճակ (); while (sendOrder. Sum ()! = 0) { /* Ես հեռանում եմ loop fungerer- ից ՝ որոշելով այն, երբ արդեն ամբողջ թիվն է (i) er mindre end længden på den afgivet ordre, vil det eksikvere. Variablen (i) kigger på den pågældende række i arrayet, der på nuværende tidspunkt arbejdes i. Den kigger i kolonnen, ser hvilket tal der står i kolonnen. Tallet bliver eksikveret, կամ inden at variablen rykker videre til næste kolonne, bliver den pågældende kolonne նստել մինչեւ 0: Inden if sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i <sentOrder. Length; i ++) {կարգավիճակ (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Բաց (); sp. Write (sendOrder . ToString ()); // Programmet der er i en af disse if statement- երը, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). եթե (ուղարկողՊատվեր == 1) {prodType = "Արտադրանք Ա"; } else if (ուղարկողՊատվեր == 2) {prodType = "Produkt B"; } else if (ուղարկողՊատվեր == 3) {prodType = "Produkt C"; }

ուղարկողՊատվեր = 0;

// N her hele den eksikverede række i arrayet samlet giver 0, bliver de udførte produkter uploadet i databasen, og Communicationen til Arduinoen, bliver lukket. if (sendOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` ("Produkt type`) VALUES ('" + prodType + "')");

DBQuery ("UPDATE` total` SET `productret produkter` = (` productret produkter` + 1), `manglende produkter` = (` manglende produkter` - 1) ");

sp. Փակել ();

ընդմիջում; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done": Մենք չենք կարող փոխել մոդելը, այն կարող է վերբեռնել և ներբեռնել տվյալների բազայի Grunden til dette- ի միջոցով, այնուհետև այն կարող է օգտագործվել որպես տվյալների բազայի ավելցուկային ավելցուկ: */ sp. ReadTo («Կատարված է»);

DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

DBQuery ("UPDATE` total` SET `productret produkter` = (` productret produkter` + 1), `manglende produkter` = (` manglende produkter` - 1) ");

sp. Փակել (); Կարգավիճակ (); }} // Ես հեռանում եմ loop bliver der lagt- ից ny række med ordre til eksikvering- ում, չեմ կարող ասել, թե ինչ է դա նշանակում (summen af foregående række er lig med 0): for (int i = 0; i <order. GetLength (0); i ++) {int test = order [i, 0]; if (test! = 0) {for (int j = 0; j <100; j ++) {sentOrder [j] = պատվիրել [i, j];

կարգը [i, j] = 0;

}

ընդմիջում; }}

}

} /* Her er der oprettet et void ved navn "Status": Det er lavet for at skulle undgå at skrive de samme linjer kode flere steder. I stedet kan man nøjes med at skrive "Status" Dette void er også inkluderet i det void, med det andet kode, der kører i baggrunden. * / private void Status () { /* Her åbner man MySQL forbindelsen, vælger alt fra den tabel der hedder total, og eksikverer den forespørgsel. */ MySqlConnection con = նոր MySqlConnection (connectionString); con. Բաց (); string str = "ընդհանուրից ընտրել *"; MySqlCommand com = նոր MySqlCommand (փող, կոն); MySqlDataReader reader = com. ExecuteReader (); // Denne funktion er med for at dele Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. ընթերցող: Կարդալ (); MissingProd. Invoke ((MethodInvoker) պատվիրակ {// Her bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter:" + (ընթերցող ["manglende produkter"]. ToString () OrdereProd. Text = "produkter lavet:" + (ընթերցող ["productionret produkter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) պատվիրակ {// Hvis læseren i My SQL- ը արգելում է այն «productret produkter ikke er lig med 0, bliver denne if statement eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0%"skrevet til պիտակ. if (int. Parse (reader ["productionret produkter"]. ToString ())! = 0) {// Her tager man de productionret produkter og plusser med de manglende produkter. Resultatet af dette ganger man med sed, for at få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (reader ["productionret produkter"]. ToString ()) /(float. Parse(reader ["produceret produkter "]. ToString ()) + float. Parse (ընթերցող ["manglende produkter"]. ToString ()))) * 100). ToString (); // Her bliver resultatet tidligere udregning lagt over på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Նրա խնդրանքով MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void bliver alle produkter, der er productionret på den valgte dato, lagt ud på a pplikationen. մասնավոր դատարկություն Vis_Produkter_Click_1 (օբյեկտ ուղարկող, EventArgs ե) {string date = dateTimePicker1. Value. ToString (). Հեռացնել (10);

ամսաթիվ = dateTimePicker1. Text;

string query = "SELECT` Produkt type`, `Tid` FROM udforte WHERE Tid> = '" + date + "00:00:00' AND Tid <= '" + date + "23:59:59'"; օգտագործելով (կապ = նոր MySqlConnection (connectionString)) օգտագործումը (MySqlCommand հրաման = նոր MySqlCommand (հարցում, կապ)) օգտագործելով (MySqlDataAdapter ադապտեր = նոր MySqlDataAdapter (հրաման)) {DataTable prodTable = նոր DataTable (); ադապտեր: Լրացրեք (արտադրական սեղան);

dataGridView1. DataSource = prodTable;

}

} // I dette void bliver MySQL forbindelsen styret. Den fungerer således at forbindelsen bliver åbnet, eksikverer, og lukkes. մասնավոր դատարկություն DBQuery (տող cmd) {string query = cmd; օգտագործելով (կապ = նոր MySqlConnection (connectionString)) օգտագործումը (MySqlCommand հրաման = նոր MySqlCommand (հարցում, կապ)) {connection. Open ();

command. ExecuteScalar ();

կապ. Փակել ();

} } } }

Քայլ 6: Նյութական նյութ

1 հատ Արդուինո Ունո

1 հատ Միկրո սերվո SG90 9 գ

Քայլ 7: Fobindelsesdiagram / I / O Lliste

Fobindelsesdiagram / I / O Lliste
Fobindelsesdiagram / I / O Lliste

Սերվոմոտոր:

+ = Ռեդ

- = Տեսակավորել

Ազդանշան = Grøn

Խորհուրդ ենք տալիս: