Kazalo:

EAL - Industriel Internet - Fabrikshal: 7 korakov
EAL - Industriel Internet - Fabrikshal: 7 korakov

Video: EAL - Industriel Internet - Fabrikshal: 7 korakov

Video: EAL - Industriel Internet - Fabrikshal: 7 korakov
Video: Машинное обучение для разработчиков Java: переход на стек технологий ИИ. 2024, Julij
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 načelo. I denne opgave, 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. Nadomestni podatki, dragulji in zbirka podatkov v Wampserverju.

Korak: RFID Kortlæser

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

To je vključeno v RFID kortler. 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 dajalec adgang, så tændes lyset in 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å projektits Arduino Uno. Seriel porten, skal også bruges to Arduinoens ordrer, den vil få fra vores app Windows Forms. I den sammenhæng er lyset også fravalgt.

2. korak: Servomotor (Anlæg)

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

Hallen er der servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan Producer forskellige produkter. Naročite, prenesite antallet za združljive produkte, poiščite več podatkov v bazi podatkov MySQL. Motoren kan køre ud in tre forskellige pozicioner. Hver symboliserer tre forskeskelige produkter. Når produktet er færdigproduceret, kører motoren tilbage i nul position, afventer nye ordrer. Če želite to narediti, uporabite aplikacijo WPF, ki jo lahko naročite do motorena. Alt hvad bliver proizvaja bližver gemt v bazi podatkov MySQL.

3. korak: Baza podatkov MySQL - Indhold

Baza podatkov MySQL - Indhold
Baza podatkov MySQL - Indhold
Baza podatkov MySQL - Indhold
Baza podatkov MySQL - Indhold
Baza podatkov MySQL - Indhold
Baza podatkov MySQL - Indhold

Imam zbirko podatkov MySQL, ki je namenjena označevanju. Den første nosilec ø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. V aplikaciji Windows Forms, ki je namenjena stilom, je treba poslati Arduinoen, samo zbirko podatkov. Når der bliver afgivet en ordrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relevante data blive logget in databasen. Der bliver sendt tre forskellige datatyper til databasen. En Integer, en String, som bliver kaldt in VarChar, in podatkovna zbirka. Der er også et TimeStamp, Det er en indstilling, der er tilføjet in databasen.

4. korak: Arduino Kode

#vključi

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Zaporedna komunikacija zažene Serial.begin (9600); } void loop () {// Pogled na serijska vrata produkt = Serial.read (); // Dokument o izbiri stika za naročanje (produkt) {// Izdelek A (1) primer in zadeva primera '1': myServo.write (50); zamuda (1000); myServo.write (0); zamuda (1000); Serial.println ("Končano"); prekiniti; // Produkt B (2) primer primera '2': myServo.write (100); zamuda (1000); myServo.write (0); zamuda (1000); Serial.println ("Končano"); prekiniti; // Produkt C (3) primer primera '3': myServo.write (150); zamuda (1000); myServo.write (0); zamuda (1000); Serial.println ("Končano"); prekiniti; }}

5. korak: Aplikacija Windows Forms

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

imenski prostor WindowsFormsApp2

{javni delni razred Form1: Obrazec { /* I denne class bliver alle public variabler oprettet. Preverite, ali je razred (MySqlConnection) nameščen na spletnih straneh in v večini primerov, ker je na voljo za namestitev MySQL. Ydermere er der oprettet en String (connectionString) den bruges do definirate 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 produktioner af et produkt, eller flere produkter. Seriel kommunikationen til Arduinoen se bližje definira. 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. */ Povezava MySqlConnection; string connectionString;

zasebni int ordrenummer;

private int [,] order = nov int [100, 100]; private int sendOrder = nov int [100]; zasebni niz prodType;

SerialPort sp = nov SerialPort ();

zasebno BackgroundWorker myWorker = nov BackgroundWorker ();

javni obrazec1 ()

{InitializeComponent (); // Njen bliver vores String (connectionString) defineret. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; /* Njena bližnja spremenljivka "myWorker" je sedela v dnevniku, ko je pisala na različne načine. */ myWorker. DoWork += nov DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = res; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datoen kører i. Njena oblika je osnova za bazo podatkov MySQL. dateTimePicker1. CustomFormat = "llll-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

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

{ /* Her er 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 ++) {vrstni red [ordrenummer, prod1B] = produktB; }

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

{ordrenummer = 0; } // Njene previsoke produkcije do podatkovne zbirke. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VREDNOSTI (" + 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) +")) KJE 1 "); }

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

private void myWorker_DoWork (pošiljatelj objektov, EventArgs e) {while (true) { /* Poiščite in povlecite povzetek na dan, ko je uredba ikke, ki je označena z 0, vi dette medtem ko zanka køre. */ Stanje(); medtem ko (sendOrder. Sum ()! = 0) { /* I dette for fungerer zanke det således, at så længe den oprettede Integer (i) er mindre end længden på den afgivet ordre, vil det eksikvere. Spremenljivka (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 in variann rykker videe til næste kolonne, bliver den pågældende kolonne sat till 0. De eksikverede produkter bliver uploadet to databasen. Inden če sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i <sendOrder. 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 = "Produkt A"; } else if (sendOrder == 2) {prodType = "Produkt B"; } else if (sendOrder == 3) {prodType = "Produkt C"; }

sendOrder = 0;

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

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

sp. Zapri ();

prekiniti; } /* Njeni afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "končano". Nír 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 bazo podatkov. */ sp. ReadTo ("Končano");

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

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

sp. Zapri (); Stanje(); }} // 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]; če (test! = 0) {za (int j = 0; j <100; j ++) {pošiljanje naročila [j] = naročilo [i, j];

vrstni red [i, j] = 0;

}

prekiniti; }}

}

} /* Njen 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 () { /* Njen moški moški MySQL je forbindelsen, vnesel drugo al tabelo za hedder total, og eksikverer den forespørgsel. */ MySqlConnection con = nov MySqlConnection (connectionString); con. Open (); string str = "izberite * od skupnega števila"; MySqlCommand com = nov MySqlCommand (str, con); Bralnik MySqlDataReader = com. ExecuteReader (); // Denne funktion er med for for at Baggrundskoden på en tråd in CPU'en, og en anden tråd til resten af koden. bralec. 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:" + (bralec ["produceret produkter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke (((MethodInvoker) delegate label. if (int. Parse (reader ["produceret produkter"]. ToString ())! = 0) {// Njen tager man de produceret produkter og plusser med de manglende produkter. Rezultat af dette ganger man med sto, za pri få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (bralec ["produceret produkter"]. ToString ()) /(float. Parse(reader["produceret produkter "]. ToString ()) + float.);} else {ProcenteDone. Text = "0%";}}); // Njena luknja MySQL forbindelsen. reader. Close (); con. Close ();} // Zavrnem void bliver ALL produkter, der er produceret 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 (). Odstrani (10);

date = dateTimePicker1. Text;

string query = "SELECT` Vrsta izdelka`, `Tid` FROM udforte WHERE Tid> = '" + datum + "00:00:00' IN Tid <= '" + datum + "23:59:59'"; z uporabo (connection = new MySqlConnection (connectionString)) z uporabo (MySqlCommand ukaz = new MySqlCommand (poizvedba, povezava)) z uporabo (MySqlDataAdapter adapter = new MySqlDataAdapter (ukaz)) {DataTable prodTable = new DataTable (); adapter. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // Zavračam void bliver MySQL za forbindelsen styret. Den fungerer således at forbindelsen bliver åbnet, eksikverer, og lukkes. zasebna praznina DBQuery (niz cmd) {niz poizvedbe = cmd; z uporabo (connection = new MySqlConnection (connectionString)) z uporabo (MySqlCommand ukaz = nov MySqlCommand (poizvedba, povezava)) {connection. Open ();

command. ExecuteScalar ();

povezava. Zapri ();

} } } }

6. korak: Materialeliste

1 stk Arduino Uno

1 stk Mikro servo SG90 9g

7. korak: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Razvrsti

Signal = Grøn

Priporočena: