Sadržaj:

EAL - Industriel Internet - Fabrikshal: 7 koraka
EAL - Industriel Internet - Fabrikshal: 7 koraka

Video: EAL - Industriel Internet - Fabrikshal: 7 koraka

Video: EAL - Industriel Internet - Fabrikshal: 7 koraka
Video: Кама пуля выбивает долги с мутного типа 2024, Srpanj
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

Der er blevet fået stillet til opgave and implementere et automatiseret system ud fra industri 4.0 princippe. Ja denne opgave, er der lavet en lille simulacija en en fabrikshal. 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. Alternativni podaci, dragulji i baza podataka na Wampserveru.

Korak 1: RFID Kortlæser

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

Der er inkluderet en RFID kortlæser. Hensigten er at ud fra de id numre der er på det kort, og den brik der er med er 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, og godkender først når det nummer stemmer overens med det der er skrevet ind i koden.

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

Kortlæseren bliver fjernet fra projektit, 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 to Arduinoens order, den vil få fra vores app Windows Forms. I den sammenhæng er lyset også fravalgt.

Korak 2: Servomotor (dopušteno)

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

Hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan Producer forskellige produkter. Naručite, pregledajte antenu o udruženim proizvodima, provjerite je li u MySQL bazi podataka. Motoren kan køre ud i tre forskellige pozicioner. Hver symboliserer tre forskeskelige produkter. Nír produktet er færdigproduceret, kører motoren tilbage i nul position, niti afventer nye ordrer. Det er meningen at man, via WPF applikationen can cangive nye ordrer to motoren. Alt hvad bliver proizvodi bliver gemt u MySQL bazi podataka.

Korak 3: MySQL baza podataka - Indhold

MySQL baza podataka - Indhold
MySQL baza podataka - Indhold
MySQL baza podataka - Indhold
MySQL baza podataka - Indhold
MySQL baza podataka - Indhold
MySQL baza podataka - Indhold

U MySQL bazi podataka nalazi se više tabela. Den første nosilac øje med hvilke produkter der er bestilt, og hvor mange. En anden tabel vil logge alle de udførte produkter. Den tredje, og sidste tabel indenholder en oversigt over hvor mange produkter der er produceret, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende produkter er produceret. U aplikaciji Windows Forms aplikacija koja se nalazi na stilovima, hval der skal šalje Arduinoen, sam baze podataka. Når der bliver afgivet en orderrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relevante data blive logget i databasen. Der bliver sendt tre forskellige datatyper til databasen. En Integer, en String, som bliver kaldt en VarChar, and databasen. Der er også et TimeStamp, Det er en indstilling, der er tilføjet i databasen.

Korak 4: Arduino Kode

#uključi

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Serijska komunikacija započinje Serial.begin (9600); } void loop () {// Pogled na serijski port produkt = Serial.read (); // Zahtjev za dodavanjem naredbe switch (produkt) {// Proizvod A (1) udžbenik i slučaj slučaja '1': myServo.write (50); kašnjenje (1000); myServo.write (0); kašnjenje (1000); Serial.println ("Gotovo"); pauza; // Proizvod B (2) udžbenik i slučaj slučaja '2': myServo.write (100); kašnjenje (1000); myServo.write (0); kašnjenje (1000); Serial.println ("Gotovo"); pauza; // Proizvod C (3) udžbenik i slučaj slučaja '3': myServo.write (150); kašnjenje (1000); myServo.write (0); kašnjenje (1000); Serial.println ("Gotovo"); pauza; }}

Korak 5: Aplikacija Windows Forms

pomoću System; pomoću System. Collections. Generic; pomoću System. ComponentModel; pomoću System. Data; pomoću System. Drawing; pomoću System. Linq; pomoću System. Text; pomoću System. Threading. Tasks; pomoću System. Windows. Forms; pomoću System. Collections; pomoću System. IO. Ports; koristeći MySql; pomoću MySql. Data. MySqlClient;

imenski prostor WindowsFormsApp2

{javni djelomični razred Form1: Obrazac { /* I denne class bliver alle public variabler oprettet. Herunder er der oprettet en Class (MySqlConnection) der skal tages and brug, for at kunne oprette forbindelse to MySQL serveren. Zahtjev za opremanje u nizu (connectionString) koji prikazuje bruges do definiranja hvilken bruger der skal på og password, og hvilken database der er tale om. Der er oprettet en integer, i et 2d array (orde). Grunden til det er at en ordrer can bestå af flere productioner af et produkt, eller flere produkter. Seriel kommunikationen til Arduinoen je bliže definirao. 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 veza; string connectionString;

privatni int ordrenummer;

private int [,] order = novi int [100, 100]; private int šaljeOrder = novi int [100]; privatni niz prodType;

SerialPort sp = novi SerialPort ();

privatni BackgroundWorker myWorker = novi BackgroundWorker ();

javni obrazac1 ()

{InitializeComponent (); // Njezin bliver vores String (connectionString) defineret. connectionString = "poslužitelj = 192.168.1.100; userid = root; pwd = langeland; baza podataka = arduino;"; /* Njezina bliža varijabla "myWorker" sjedila je dok se nije prijavila na različitim stranicama. */ myWorker. DoWork += novi DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datoen kører i. Njezino je računalo osnovano nakon MySQL baze podataka. dateTimePicker1. CustomFormat = "gggg-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

privatna praznina Afgiv_Ordre_Click (pošiljatelj objekta, EventArgs e)

{ /* Her er der oprettet 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; /* I disse for petlje bliver køen oprettet, således at ordrene bliver produceret i den rækkefølge, de er bestilt i. */ for (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

za (int prod1C = (prodA + prodB); prod1C 99)

{ordrenummer = 0; } // Njezini prekomjerni produkti do baze podataka. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VRIJEDNOSTI (" + prodA + "," + prodB + "," + prodC + ")"); // Her overføres en oversigt over hvilke produkter der mangler at blive producerert, til databasen. 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 (pošiljatelj objekta, EventArgs e) {while (true) { /* Så længe at summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre. */ Status (); while (sendOrder. Sum ()! = 0) { /* I dette for fungerer loop det således, at så længe den oprettede Integer (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, og inden and variablen rykker videre do næste kolonne, bliver den pågældende kolonne sat do 0. De ekskverziran proizvod bliver uploadet do baze podataka. Inden ako sætningerne bliver kommunikationen do Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i <šaljeOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); 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). if (sendOrder == 1) {prodType = "Proizvod A"; } else if (sendOrder == 2) {prodType = "Proizvod B"; } else if (sendOrder == 3) {prodType = "Proizvod C"; }

slanje Naloga = 0;

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

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

sp. Zatvori ();

pauza; } /* Njezini afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "učinjeno". Nís det er modtaget, bliver de udførte endnu en gang uploadet to the databasen Grunden til dette, er at man skal være sikker på at det sidste udførte produkt bliver overil to bazu podataka. */ sp. ReadTo ("Gotovo");

DBQuery ("INSERT INTO` udforte` (`Vrsta proizvoda`) VRIJEDNOSTI ('" + prodType + "')");

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

sp. Zatvori (); Status(); }} // I dette for loop bliver der lagt en ny række med ordre til eksikvering, når den foregående række er eksikveret (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 ++) {slanje Naloga [j] = narudžba [i, j];

red [i, j] = 0;

}

pauza; }}

}

} /* Her er der oprettet et void ved navn "Status". Det er lavet for at skulle undgå at skrive de samme linjer kode flere steder. 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 () { /* Njezin stariji muškarac MySQL je forbindelsen, potrebno je alt fra den tabel der hedder total, i eksikverer den forespørgsel. */ MySqlConnection con = nova MySqlConnection (connectionString); con. Open (); string str = "odaberi * od ukupnog broja"; MySqlCommand com = novi MySqlCommand (str, con); Čitač MySqlDataReader = com. ExecuteReader (); // Denne funktion er med for for at Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. čitač. Read (); MissingProd. Invoke ((MethodInvoker) delegat {// Her bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter:" + (reader ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (čitač ["produceret produkter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegate {// Hvis læseren in My SQL forbindelsen læser at "Producerter produkter ikke er lig with 0, bliver denne if statement eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0%"skrevet til label. if (int. Parse (reader ["produceret produkter"]. ToString ())! = 0) {// Njezin tager man de produceret produkter og plusser med de manglende produkter. Rezultat af dette ganger man med stotinu, za na få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (reader ["produceret produkter"]. ToString ()) /(float. Parse(reader["produceret produkter "]. ToString ()) + float. Parse (reader ["manglende produkter"]. ToString ()))) * 100). ToString (); // Njen rezultat je postignut nakon što je evidentirano zaostajanje na prethodnoj procjeni. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Njezin luk sadrži MySQL forbindelsen. reader. Close (); con. Close ();} // Odbacujem poništenost svih proizvoda, der er proizvodite på den valgte dato, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (pošiljatelj objekta, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Remove (10);

date = dateTimePicker1. Text;

string query = "SELECT` Vrsta proizvoda`, `Tid` FROM udforte WHERE Tid> = '" + datum + "00:00:00' AND Tid <= '" + datum + "23:59:59'"; pomoću (veza = novi MySqlConnection (connectionString)) pomoću (Naredba MySqlCommand = novi MySqlCommand (upit, veza)) pomoću (MySqlDataAdapter adapter = novi MySqlDataAdapter (naredba)) {DataTable prodTable = new DataTable (); adapter. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // Određujem void bliver MySQL forbindelsen styret. Den fungerer således at forbindelsen bliver åbnet, eksikverer, og lukkes. private void DBQuery (niz cmd) {upit upita = cmd; pomoću (connection = new MySqlConnection (connectionString)) pomoću (MySqlCommand naredba = nova MySqlCommand (upit, veza)) {connection. Open ();

naredba. ExecuteScalar ();

veza. Zatvori ();

} } } }

Korak 6: Materialeliste

1 stk. Arduino Uno

1 stk. Mikro servo SG90 9g

Korak 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Poredaj

Signal = Grøn

Preporučeni: