Innehållsförteckning:

EAL - Industriel Internet - Fabrikshal: 7 steg
EAL - Industriel Internet - Fabrikshal: 7 steg

Video: EAL - Industriel Internet - Fabrikshal: 7 steg

Video: EAL - Industriel Internet - Fabrikshal: 7 steg
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Juli
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

Det har blivit fortfarande möjligt att ge upp för att implementera och automatisera systemet från industri 4.0 -principen. Jag gav denna uppgift, där vi gjorde en liten simulering av en fabrikshal. I hallen står der en servomotor, samt et par dioder. Ude externt, sidder der en RFID kortlæser, der skulle bruka till at lukke de relevanta ind i fabrikshallen. Alt data, gemmes i en databas i Wampserver.

Steg 1: RFID Kortlæser

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

Det är inkluderat i RFID kortläser. Hensigten är at ud från de id numre der är på det kort, och den brik der är med är skriven i vår Arduino -kod. Det kan göras när kortlæseren uppfyller en brik eller et kort, och den kan delas ut på enhetens id-nummer, och godkännaren först när det nummer fungerar tillsammans med det är skrivet i koden.

När kortlæseren giver access, så tændes lyset i fabrikken. Lyset slukkes igen, när en enhet, der är godkänd av kortlæseren, blir detekterad.

Kortlæseren blir fjärran från projektet, då den körs seriell kommunikation. Det vill säga att der kan uppstå förstyrelser på den seriella porten, det finns på projektets Arduino Uno. Seriel porten kan också användas för Arduinoens ordrer och den kommer att få från våra Windows Forms -applikationer. I den sammanhängande är lyset också fravalgt.

Steg 2: Servomotor (Anlæg)

Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)

I hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere och anlæg, som kan producera olika produkter. Ordrerbeholdningen, samt att erbjuda de utførte produkter, blir gemt i en MySQL -databas. Motorer kan köra ut och tre olika positioner. Varje position symboliserar tre olika produkter. När produkten är färdigproduceret, kör motorer tillbaka i nul position, och avventer nya ordrer. Det är meningen att man, via WPF -applikationer kan få nya ordrer till motoren. Alt vad blir producent blir gemt i en MySQL -databas.

Steg 3: MySQL -databas - Innehåll

MySQL -databas - Innehåll
MySQL -databas - Innehåll
MySQL -databas - Innehåll
MySQL -databas - Innehåll
MySQL -databas - Innehåll
MySQL -databas - Innehåll

I MySQL -databasen kommer att vara tre tabeller. Den första innehavaren kan användas med vilka produkter som är bäst och många. En annan tabell kommer att logga alla de utförda produkterna. Den tredje, och den sista tabellen innehar en översikt över hur många produkter som är producent, och hur många der mangler. Ydermere är där och när jag kommer att använda produkterna som produceras. Det är Windows Forms applikationer der vil styre, vad det ska skicka Arduinoen, samt databasen. När det blir avgivet och ordrer, kommer det att skickas till Arduinoen, efterföljande, och den relevanta data blir logget i databasen. Det blir skickat tre olika datatyper till databaser. En Integer, en String, som blir kallt en VarChar, i databasen. Det finns också en TimeStamp, Det finns en inställning, det finns tillfälligt i databasen.

Steg 4: Arduino Kode

#omfatta

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Seriell kommunikation startar Serial.begin (9600); } void loop () {// Læsning från serieport produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) används i detta fall '1': myServo.write (50); fördröjning (1000); myServo.write (0); fördröjning (1000); Serial.println ("Klart"); ha sönder; // Produkt B (2) används i detta fall '2': myServo.write (100); fördröjning (1000); myServo.write (0); fördröjning (1000); Serial.println ("Klart"); ha sönder; // Produkt C (3) används i detta fall '3': myServo.write (150); fördröjning (1000); myServo.write (0); fördröjning (1000); Serial.println ("Klart"); ha sönder; }}

Steg 5: Windows Forms -applikation

använder System; använder System. Collections. Generic; använder System. ComponentModel; använder System. Data; använder System. Drawing; använder System. Linq; använder System. Text; använder System. Threading. Tasks; använder System. Windows. Forms; använder System. Collections; använder System. IO. Ports; med MySql; med MySql. Data. MySqlClient;

namnutrymme WindowsFormsApp2

{public partial class Form1: Form { /* I this class will be public public variabler oprettet. Här är en upprättad klass (MySqlConnection) där jag kan använda mig för att kunna ansluta till MySQL -serveren. Ydermere är der oprettet en String (connectionString) som kan användas för att definiera vilken användare som ska på och lösenord, och vilken databas som är berättad om. Det är upprättat ett heltal, i et 2d array (orde). Grunden för det kan bestå av flera produktioner av ett produkt eller flera produkter. Seriel kommunikation til Arduinoen blir också definierat av henne. Det blir också oprettet en Class (BackgroundWorker). Den gör att en bestämd del av programmet blir exikveret gentagende gange i bakgrunden. I detta fall är det brugbart, då det kan bli oprettet nya ordrer, med korte mellanrum. */ MySqlConnection -anslutning; string connectionString;

privat int ordrenummer;

privat int [,] order = ny int [100, 100]; privat int sendingOrder = ny int [100]; privat sträng prodType;

SerialPort sp = ny SerialPort ();

privat BackgroundWorker myWorker = ny BackgroundWorker ();

offentlig form1 ()

{InitializeComponent (); // Her blir vår String (connectionString) defineret. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; databas = arduino;"; /* Her blir variablen "myWorker" satt till att logga på hur långt diverse bestillinger är i deras process. */ myWorker. DoWork += new DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Her blir selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her blir der defineret vilket format datoen kører i. Hennes format är bestämt efter MySQL -databasen. dateTimePicker1. CustomFormat = "åååå-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

privat void Afgiv_Ordre_Click (objektavsändare, EventArgs e)

{ /* Her is der oprettet some variabler, der will be used in this void. De tre första er Integers der skal definere vilket produkt der is tale om. De nästa tre är upprättade för att kunna skriva det antal man vill ha, in i applikationer. Den sista är oprettet för att få en längd på den nödvändiga ordren. */ 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; /* I disse for loops blir køen oprettet, således at ordrene blir produceret i den serienfølge, de er bestilt i. */ for (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

för (int prod1C = (prodA + prodB); prod1C 99)

{ordrenummer = 0; } // Hennes överlevererade produkter för databaser. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VÄRDEN (" + prodA + "," + prodB + "," + prodC + ")"); // Hennes överförs och oversikt över vilka produkter som behöver bli producent, till databasen. DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` +(" +(prodA +prodB +prodC) +")) WHERE 1 "); }

// I dette void är alt det kode der will drive in backgrounden, lagt ind.

private void myWorker_DoWork (object sender, EventArgs e) {while (true) { /* Så länge at summen of the afsendte ordre not er lig with 0, vil this while loop driver. */ Status (); while (sendingOrder. Sum ()! = 0) { /* I dette for loop fungerar det således, så länge den oprettede Integer (i) er mindre end längden på den afgivet ordre, vil det eksikvere. Variablen (i) kigger på den här delen i arrayet, där den aktuella tiden fungerar i. Den kigger i kolonnen, ser vilket tal der står i kolonnen. Tallet blir eksikveret, och inden kan variablen rykker vidare till nästa kolonne, blir den effektiva kolonnen satt till 0. De eksikverade produkterna kan laddas upp till databasen. Inden om sætningarna blir kommunikation till Arduinoen öppnet, och den avgivet ordre skickas till Arduinoen. */ for (int i = 0; i <sendingOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (sendingOrder . ToString ()); // Programmet der er i en af disse if statements, vil blive eksikveret, beroende av vilket tal fra et til tre der er i variablen (i). if (sendingOrder == 1) {prodType = "Produkt A"; } annars if (sendingOrder == 2) {prodType = "Produkt B"; } annars if (sendingOrder == 3) {prodType = "Produkt C"; }

sendingOrder = 0;

// När hela den exponerade raden i arrayet totalt ger 0, blir de utförda produkterna uppladdade i databasen, och komunikationen till Arduinoen, blir lukket. if (sendingOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

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

sp. Close ();

ha sönder; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". När det är mottaget, blir de utførte ännu en gång uppladdning till databasen Grunden för detta, är att man ska vara säker på att det senaste utførte produkt blir överfört till databasen. */ sp. ReadTo ("Klart");

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

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

sp. Close (); Status(); }} // I detta for loop blir der lagt en ny rad med ordre till eksikvering, när den föregående raden är eksikveret (summen av föregående rad är 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 ++) {sendingOrder [j] = order [i, j];

order [i, j] = 0;

}

ha sönder; }}

}

} /* Her är der oprettet et void by name "Status". Det är gjord för att skulle komma att skriva de samma linjerna flera platser. I stället kan man ha nycklar med att skriva "Status" Detta void är också inkluderat i det void, med andra koder, som jag använder i bakgrunden. * / private void Status () { /* Her öppner man MySQL -förbindelser, välger allt från den tabell der hedder total, och eksikverer den forespørgsel. */ MySqlConnection con = ny MySqlConnection (connectionString); con. Open (); string str = "välj * från totalt"; MySqlCommand com = nytt MySqlCommand (str, con); MySqlDataReader -läsare = com. ExecuteReader (); // Denna funktion är med för att dela Baggrundskoden på en tråd i CPU'en, och en annan tråd till resten av koden. reader. Read (); MissingProd. Invoke ((MethodInvoker) delegat {// Her blir de manglende produkter, samt produkter där är gjorda, skrivna på applikationer. MissingProd. Text = "manglende produkter:" + (läsare ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter gjorda:" + (läsare ["producentprodukter"]. ToString ());}); // Her blir der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegat {// Om läseren i My SQL forbindelsen læser at "produceret products not are lig with 0, blir this if statement eksikveret. label. if (int. Parse (läsare ["producentprodukter"]. ToString ())! = 0) {// Her tar man de produceret produkter och plusser med de manglende produkter. Resultat av detta gånger man med hundra, för kl. få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (läsare ["producentprodukter"]. ToString ()) /(float. Parse(reader ["produceret produkter "]. ToString ()) + float. Parse (läsare ["manglende produkter"]. ToString ())) * 100). ToString (); // Hennes resultat av tidigare utskrivning läggs över på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void blir alla produkter, der er produceret på den valda dato, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (objektavsändare, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Ta bort (10);

date = dateTimePicker1. Text;

string query = "VÄLJ` Produkttyp`, `Tid` FRÅN udforte VAR Tid> = '" + datum + "00:00:00' OCH Tid <= '" + datum + "23:59:59'"; med (anslutning = ny MySqlConnection (connectionString)) med (MySqlCommand -kommando = ny MySqlCommand (fråga, anslutning)) med (MySqlDataAdapter adapter = ny MySqlDataAdapter (kommando)) {DataTable prodTable = new DataTable (); adapter. Fyll (prodTable);

dataGridView1. DataSource = prodTable;

}

} // I dette void blir MySQL -förbindelse styret. Den fungerar således att förbindelser blir öppnet, eksikverer och lukkes. private void DBQuery (string cmd) {string query = cmd; använder (anslutning = ny MySqlConnection (connectionString)) med (MySqlCommand -kommando = nytt MySqlCommand (fråga, anslutning)) {connection. Open ();

command. ExecuteScalar ();

anslutning. Stäng ();

} } } }

Steg 6: Materiallista

1 stk. Arduino Uno

1 stk. Micro servo SG90 9g

Steg 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Sortera

Signal = Grøn

Rekommenderad: