Cov txheej txheem:

EAL - Kev Lag Luam Hauv Internet - Fabrikshal: 7 Kauj Ruam
EAL - Kev Lag Luam Hauv Internet - Fabrikshal: 7 Kauj Ruam

Video: EAL - Kev Lag Luam Hauv Internet - Fabrikshal: 7 Kauj Ruam

Video: EAL - Kev Lag Luam Hauv Internet - Fabrikshal: 7 Kauj Ruam
Video: 7 nqi lus qhia, piv kev kawm thiab kev ua neej sib txawv li cas? 2024, Lub Xya hli ntuj
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 at implementere et automatiseret system ud fra industryri 4.0 tus thawj tswj hwm. Kuv lees paub opgave, er der lavet en lille simulation af en fabrikshal. Kuv tau txais kev pabcuam los ntawm servomotor, samt thiab par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges til at lukke de ពាក់ព័ន្ធe ind in fabrikshallen. Alt cov ntaub ntawv, gemmes hauv en database thiab Wampserver.

Kauj ruam 1: RFID Kortlæser

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

Tau txais kev suav nrog hauv RFID daim npav. 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.

Tsis txhob muab tus neeg muab rau, tsis yog lyset thiab fabrikken. Lyset slukkes igen, når 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 chaw nres nkoj, der er på projektets Arduino Uno. Seriel porten, skal også bruges til Arduinoens ordrer, den vil få fra vores Windows Forms applikation. Kuv tab tom hais txog qhov tsis txaus ntseeg ntawm qhov tsis txaus ntseeg.

Kauj Ruam 2: Servomotor (Anlæg)

Servomotor (Tsis teb los tau)
Servomotor (Tsis teb los tau)
Servomotor (Tsis teb los tau)
Servomotor (Tsis teb los tau)
Servomotor (Tsis teb los tau)
Servomotor (Tsis teb los tau)

Kuv tab tom ua haujlwm rau servomotor, ua raws li styret ntawm Arduino Uno. Nyob rau hauv cov ntaub ntawv no, der kan producersrer forskellige produkter. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt i en MySQL database. Motoren thiab koj tuaj yeem ua haujlwm ntxiv rau qhov chaw ua haujlwm me me. Hver txoj haujlwm tus cim tus cim tre forskellige produkter. Tsis yog cov khoom lag luam uas tau tsim, tsim cov tshuab ntxhua khaub ncaws hauv qhov chaw tsis muaj haujlwm, thiab tom qab ntawd nws yog tus tsim khoom. Tsis yog tus txiv neej, ntawm WPF applikationen kan afgive nye ordrer til motoren. Alt hvad bliver tsim tawm bliver gemt i en MySQL database.

Kauj Ruam 3: MySQL Database - Indhold

MySQL Database - Indhold
MySQL Database - Indhold
MySQL Database - Indhold
MySQL Database - Indhold
MySQL Database - Indhold
MySQL Database - Indhold

Kuv MySQL cov ntaub ntawv vil der være tre tabeller. Tus tuav lub første øje med hvilke produkter der er bestilt, og hvor mange. Ib qho ntxiv thiab tsis pom qhov twg tag nrho ntawm cov khoom tsim tawm. Tsis tas li ntawd, thiab tsis muaj leej twg nyob hauv qhov kev saib xyuas dhau los ntawm cov neeg ua haujlwm tsim khoom los ntawm kev tsim khoom, thiab cov neeg ua haujlwm tau zoo. Ydermere er der thiab tidspunkt på, hvornår de pågældende cov khoom lag luam tsim khoom. Nrhiav qhov Windows Cov Ntawv thov kev ua haujlwm tsis zoo, hvad der skal xa Arduinoen, cov ntaub ntawv khaws tseg. Når der bliver afgivet en ordrer, vil den blive xa mus rau Arduinoen, efterfølgende, vil den cuam tshuam txog cov ntaub ntawv blive logget thiab databasen. Der bliver xa tre forskellige datatyper mus rau databasen. En Integer, en String, som bliver kaldt en VarChar, thiab cov ntaub ntawv. Der er også thiab TimeStamp, Det er en indilling, der er tilføjet i databasen.

Kauj ruam 4: Arduino Kode

#suav nrog

Servo myServo;

koj servoPos; char cov khoom = '0'; teeb tsa tsis muaj dabtsis () {myServo.attach (3); // Serial kommunikation pib 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); ncua (1000); myServo.write (0); ncua (1000); Serial.println ("Ua tiav"); tawg; // Produkt B (2) udføres i denne case case '2': myServo.write (100); ncua (1000); myServo.write (0); ncua (1000); Serial.println ("Ua tiav"); tawg; // Produkt C (3) udføres i denne case case '3': myServo.write (150); ncua (1000); myServo.write (0); ncua (1000); Serial.println ("Ua tiav"); tawg; }}

Kauj Ruam 5: Windows Forms Applikation

siv System; siv System. Collections. Generic; siv System. ComponentModel; siv System. Data; siv System. Drawing; siv System. Linq; siv System. Text; siv System. Threading. Tasks; siv System. Windows. Forms; siv System. Collections; siv System. IO. Ports; siv MySql; siv MySql. Data. MySqlClient;

namespace WindowsFormsApp2

{public partial class Form1: Form { /* I denne class bliver alle public variabler oprettet. Herunder er der oprettet en Class (MySqlConnection) der skal tages kuv brug, rau ntawm kunne oprette txwv tsis pub mus txog MySQL pabcuam. Ydermere er der oprettet en String (connectionString) den bruges til ntawm tus txhais 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 kan bestå af flere produktioner af produktion, eller flere produkter. Seriel kommunikationen til Arduinoen bliver også txhais nws. Der bliver også oprettet en Class (BackgroundWorker). Nyob rau ntawm qhov zoo tshaj plaws ntawm qhov programmeters bliver eksikveret gentagende gange i baggrunden. Kuv tau txiav txim siab ua qhov tsis zoo ntawm brugbart, tom qab ntawd nws tuaj yeem ua rau cov neeg ua haujlwm tsis txaus ntseeg, nrog rau cov tshuaj mellemrum. */ MySqlConnection kev sib txuas; Txoj hlua txuas

private int ordrenummer;

private int [,] order = tshiab int [100, 100]; private int xaOrder = tshiab int [100]; ntiag tug hlua prodType;

SerialPort sp = tshiab SerialPort ();

ntiag tug BackgroundWorker myWorker = tshiab BackgroundWorker ();

pej xeem daim ntawv 1 ()

{InitializeComponent (); // Nws bliver vores Txoj hlua (connectionString) txhais. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; /* Nws bliver variablen "myWorker" zaum til ntawm logge på hvor langt ntau yam bestillinger er kuv deres proces. */ myWorker. DoWork += tshiab DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = muaj tseeb; myWorker. WorkerSupportsCancellation = muaj tseeb; // Nws bliver kaum ob baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Nws bliver der defineret hvilket hom ntawv datoen kører i. Nws yog hom ntawv zoo tshaj tom qab MySQL databasen. dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

ntiag tug tsis muaj dab tsi Afgiv_Ordre_Click (tus xa khoom, EventArgs e)

{ /* Nws qhov kev hloov pauv ntawm qhov tsis sib xws, der kun bliver brugt thiab kuv tsis muaj dab tsi. De tre første er Integers der skal definere hvilket produkt der er tale dab neeg om. De næste tre er oprettet rau at kunne skrive det antal man ønsker, ind i applikationen. Tsis yog qhov chaw nyob rau ntawm 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; /* Kuv hais rau loops bliver køen oprettet, således ntawm ordrene bliver tsim tawm hauv den rækkefølge, de er bestilt i. */ rau (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Nws cov khoom lag luam zoo tshaj plaws rau cov ntaub ntawv. DBQuery ("INSERT INTO 'bestilteprod` (` Produkt A`, `Produkt B`,` Produkt C`) VALUES (" + prodA +", " + prodB +", " + prodC +") "); // Nws overføres en oversigt hla hvilke produkter der mangler ntawm blive productionrert, txog databasen. DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` +(" +(prodA +prodB +prodC) +")) DAWB 1 "); }

// Kuv dette tsis muaj dab tsi er alt det kode der skal køre i baggrunden, lagt ind.

ntiag tug tsis muaj dab tsi myWorker_DoWork (tus xa khoom, EventArgs e) {thaum (tseeb) { /* Så længe ntawm summen af den afsendte ordre ikke er lig med 0, vil dette thaum lub voj køre. */ Xwm txheej (); thaum (xaOrder. Sum ()! = 0) { /* Kuv dette rau lub voj fungerer det således, ntawm så længe den oprettede Integer (i) er mindre kawg 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. Nyob rau hauv lub kolonnen, ser hvilket tal der står i kolonnen. Tallet bliver eksikveret, og inden at variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat til 0. De eksikverede produkter bliver uploadet til databasen. Inden yog sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver xa mus rau Arduinoen. */ rau (int i = 0; kuv <xaOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (xaOrder . ToString ()); // Programmet der er i en afse disse yog cov nqe lus, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). yog (xaOrder == 1) {prodType = "Produkt A"; } lwm yog (xaOrder == 2) {prodType = "Produkt B"; } lwm yog (xaOrder == 3) {prodType = "Produkt C"; }

xaOrder = 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. yog (xaOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

DBQuery ( UPDATE` total` SET `produret produkter` = (` tsim khoom tsim tawm ` + 1),` tsim khoom tsim khoom `= (` manglende produkter` - 1)”);

sp. Close ();

tawg; } /* Nws qhov kev tshwm sim tom Arduinoen er færdig med ordren. Der kvitteres med thiab "ua tiav". Når det er modtaget, bliver de udførte endnu en laib uploadet til databasen Grunden til dette, er ntawm tus txiv neej skal være sikker på at det sidste udførte produkt bliver overført til databasen. */ sp. ReadTo ("Ua tiav");

DBQuery ("INSERT INTO 'udforte` (` Hom khoom `` VALUES (' " + prodType +" ') ");

DBQuery ( UPDATE` total` SET `produret produkter` = (` tsim khoom tsim tawm ` + 1),` tsim khoom tsim khoom `= (` manglende produkter` - 1)”);

sp. Close (); Xwm txheej (); }} // Kuv txiav txim siab rau lub voj 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). rau (int i = 0; kuv <order. GetLength (0); i ++) {int test = order [i, 0]; yog (xeem! = 0) {rau (int j = 0; j <100; j ++) {xa khoom [j] = xaj [i, j];

order [kuv, j] = 0;

}

tawg; }}

}

} /* Nws er der oprettet thiab void ved navn "Status". Det er lavet rau ntawm skulle undgå thiab skrive de samme linjer kode flere steder. Kuv stedet kan man nøjes med ntawm skrive "Status" Dette void er også inkluderet i det void, med det andet kode, der kører i baggrunden. * / ntiag tug tsis muaj xwm txheej xwm txheej () { /* Nws manbner txiv neej MySQL txwv tsis pub ua haujlwm, v altlger alt fra den. */ MySqlConnection con = tshiab MySqlConnection (connectionString); con. Open (); hlua str = "xaiv * los ntawm tag nrho"; MySqlCommand com = tshiab MySqlCommand (str, con); MySqlDataReader nyeem ntawv = com. ExecuteReader (); // Denne funktion er med rau ntawm dele Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. nyeem ntawv. Read (); MissingProdInvoke ((MethodInvoker) tus sawv cev {// Nws bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter:" + (nyeem ntawv ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (nyeem ntawv ["cov khoom tsim tawm"]. ToString ());}); // Nws bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDoneInvoke ((MethodInvoker) tus neeg sawv cev {// Hvis læseren i Kuv SQL txwv tsis pub siv cov l atser ntawm "cov khoom lag luam tsim tawm ikke er lig med 0, bliver denne yog cov lus eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0%"skrevet til daim ntawv. yog (int. Parse (nyeem ntawv ["tsim khoom tsim khoom"]. ToString ())! = 0) {// Nws tager tus txiv neej de tsim cov khoom lag luam og plusser med de manglende produkter. Resultatet af dette ganger man med puas, rau ntawm få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (nyeem ntawv ["tsim khoom tsim khoom"]. ToString ()) /(float. Parse(reader["produceret produkter "]. ToString ()) + float. Parse (nyeem ntawv ["manglende produkter"]. ToString ()))) * 100). ToString (); // Nws lub bliver resultatet af tidligere udregning lagt på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text.);} lwm yam {ProcenteDone. Text = "0%";}}); // Nws lub lukkes MySQL txwv tsis pub leej twg paub. nyeem ntawv. Kev kaw (); con. Close ();} // Kuv tshem tawm qhov tsis muaj bliver txhua qhov khoom lag luam, der er produret på den valgte dato, lagt ud på a npe. ntiag tug void Vis_Produkter_Click_1 (tus xa khoom, EventArgs e) {hlua hnub = dateTimePicker1. Value. ToString (). Tshem tawm (10);

hnub tim = dateTimePicker1. Text;

string query = "SELECT` Produkt type`, `Tid` FROM udforte WHIDE Tid> = '" + date + "00:00:00' THIAB Tid <= '" + date + "23:59:59'"; siv (txuas = MySqlConnection tshiab (txuas txuas)) siv (MySqlCommand hais kom ua = tshiab MySqlCommand (nug, txuas))) siv (MySqlDataAdapter adapter = tshiab MySqlDataAdapter (hais kom ua)) {DataTable prodTable = tshiab DataTable (); adapter. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // Kuv dette void bliver MySQL forbindelsen styret. Cov neeg ua si lom zem ntawm kev txwv tsis pub muaj bliver åbnet, eksikverer, thiab lukkes. ntiag tug tsis muaj dab tsi DBQuery (hlua cmd) {txoj kab lus nug = cmd; siv (txuas = MySqlConnection tshiab (txuas txuas)) siv (MySqlCommand hais kom ua = tshiab MySqlCommand (nug, txuas)) {connection. Open ();

command. ExecuteScalar ();

kaw. Close ();

} } } }

Kauj ruam 6: Materialeliste

1eq qab. Arduino Ib

1eq qab. Micro servo SG90 9g

Kauj Ruam 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Raws li

Teeb liab = Grøn

Pom zoo: