Isi kandungan:

EAL - Industriel Internet - Fabrikshal: 7 Langkah
EAL - Industriel Internet - Fabrikshal: 7 Langkah

Video: EAL - Industriel Internet - Fabrikshal: 7 Langkah

Video: EAL - Industriel Internet - Fabrikshal: 7 Langkah
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Julai
Anonim
EAL - Internetel Industri - Fabrikshal
EAL - Internetel Industri - Fabrikshal
EAL - Internetel Industri - Fabrikshal
EAL - Internetel Industri - Fabrikshal
EAL - Internetel Industri - Fabrikshal
EAL - Internetel Industri - Fabrikshal

Der er blvet f stillet stillet til opgave at implementere et automatiseret system ud fra industri 4.0 prinsipal. Saya menolak opgave, simulasi er der lavet en lille af en fabrikshal. Saya memperhatikan servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges hingga di lukke de relatede ind i fabrikshallen. Data Alt, permata dan pangkalan data i Wampserver.

Langkah 1: RFID Kortlæser

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

Der er inkluderet dan 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 kod. 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 over med med der der skrevet ind i koden.

N kr kortlæseren pemberi adgang, så tændes lyset i fabrikken. Lyset slukkes igen, når en eneded, 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 applikation. Saya den sammenhæng er lyset også fravalgt.

Langkah 2: Servomotor (Anlæg)

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

Saya mengetuai servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan pengeluar produk forskellige. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt i dan pangkalan data MySQL. Motoren kan køre ud i tre forskellige kedudukan. Hver position simboliserer tre forskellige produkter. N produkr produktet er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Det det meningen pada lelaki, melalui WPF applikationen kan afgive nye ordrer til motoren. Alt hvad bliver prodetet bliver gemt di pangkalan data MySQL.

Langkah 3: Pangkalan Data MySQL - Indhold

Pangkalan Data MySQL - Indhold
Pangkalan Data MySQL - Indhold
Pangkalan Data MySQL - Indhold
Pangkalan Data MySQL - Indhold
Pangkalan Data MySQL - Indhold
Pangkalan Data MySQL - Indhold

Pangkalan data MySQL vil der være tre tabeller. Pemegang den første øje med hvilke produkter der er bestilt, og hvor mange. En anden jadual vil logge alle de udførte produkter. Den tredje, og sidste tabel indenholder en oversigt over hvor mange produkter der er produser, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende produkter er produser. Deter Windows Forms applikationen der vil styre, hvad der skal sendes Arduinoen, samt databaseasen. N derr der bliver afgivet en ordrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relevan data blive logget i databaseasen. Der bliver sendt tre forskellige datatyper til databaseasen. En Integer, en String, som bliver kaldt en VarChar, saya pangkalan data. Der er også et TimeStamp, Det er enstilling, der er tilføjet i pangkalan data.

Langkah 4: Arduino Kode

#sertakan

Servo myServo;

int servoPos; char produkt = '0'; batal persediaan () {myServo.attach (3); // Serial kommunikation bermula Serial.begin (9600); } gelung kekosongan () {// 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); kelewatan (1000); myServo.write (0); kelewatan (1000); Serial.println ("Selesai"); rehat; // Produkt B (2) udføres i denne case case '2': myServo.write (100); kelewatan (1000); myServo.write (0); kelewatan (1000); Serial.println ("Selesai"); rehat; // Produkt C (3) udføres i denne case case '3': myServo.write (150); kelewatan (1000); myServo.write (0); kelewatan (1000); Serial.println ("Selesai"); rehat; }}

Langkah 5: Aplikasi Bentuk Windows

menggunakan Sistem; menggunakan System. Collections. Generic; menggunakan System. ComponentModel; menggunakan System. Data; menggunakan System. Drawing; menggunakan System. Linq; menggunakan System. Text; menggunakan System. Threading. Tasks; menggunakan System. Windows. Forms; menggunakan System. Collections; menggunakan System. IO. Ports; menggunakan MySql; menggunakan 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 tag yang saya brugi, kerana di kunne oprette banindelse til MySQL serveren. Ydermere er der oprettet en String (connectionString) den bruges sehinggalah pada definisi hvilken bruger der skal pg og password, og hvilken database der er tale om. Der er oprettet en integer, i et 2d array (orde). Grunden til det er di en ordrer kan bestå af flere produktioner af et produkt, eller flere produkter. Seriel kommunikationen til Arduinoen bliver også defineret dia. Der bliver også oprettet dalam Kelas (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. * / Sambungan MySql; sambungan rentetanString;

int ordrenummer swasta;

int peribadi [,] pesanan = int baru [100, 100]; int peribadi sendOrder = int baru [100]; prodType rentetan peribadi;

SerialPort sp = SerialPort baru ();

BackgroundWorker peribadi myWorker = BackgroundWorker baru ();

borang awam 1 ()

{InitializeComponent (); // Kegigihannya mempunyai definisi String (connectionString). connectionString = "pelayan = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; / * Pemboleh ubahnya "myWorker" duduk di logge på hvor langt pelbagai jenis bestillinger er i deres proces. * / myWorker. DoWork + = DoWorkEventHandler baru (myWorker_DoWork); myWorker. WorkerReportsProgress = benar; myWorker. WorkerSupportsCancellation = benar; // Bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Bliver der defineret format hvilket datoen kører i. Formatnya yang terbaik menggunakan pangkalan data MySQL. dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

kekosongan peribadi Afgiv_Ordre_Click (penghantar objek, EventArgs e)

{/ * Pemboleh ubah nogle er der der oprettetnya, 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 untuk di kunne skrive det antal man ønsker, ind i applikationen. Den sidste er oprettet untuk di 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; / * Saya mencari gelung bliver køen oprettet, sledes di ordrene bliver prodetet i den rækkefølge, de er bestilt i. * / untuk (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Lebih banyak produk terbaik dari pangkalan data. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) NILAI (" + prodA + "," + prodB + "," + prodC + ")"); // Keterangannya yang berlebihan dan berlebihan terhadap produk produk der mangler di blive produser, til dataasen. DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` + ("+ (prodA + prodB + prodC) +")) DI MANA 1 "); }

// Saya mengetepikan kekosongan dan mengesan kode der skal køre i baggrunden, lagt ind.

kekosongan peribadi myWorker_DoWork (pengirim objek, EventArgs e) {sementara (benar) {/ * Lihat di summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre. * / Status (); sementara (pengirimanOrder. Sum ()! = 0) {/ * Saya mencari untuk loop fungerer det sledles, di s den 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 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 jika sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. * / untuk (int i = 0; i <pengirimanOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Buka (); sp. Write (sendOrder . ToString ()); // Programme der er i en afse if statement, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). if (pengirimanOrder == 1) {prodType = "Produkt A"; } lain jika (pengirimanOrder == 2) {prodType = "Produkt B"; } lain jika (pengirimanOrder == 3) {prodType = "Produkt C"; }

sendOrder = 0;

// Nér hele den eksikverede række i arrayet samlet pemberi 0, bliver de udførte produkter uploadet i databaseasen, og komunikationen til Arduinoen, bliver lukket. if (pengirimanOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) NILAI ('" + prodType + "')");

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

sp. Tutup ();

rehat; } / * Kejadiannya di Arduinoen er færdig med ordren. Der kvitteres med et "selesai". Ntr det er modtaget, bliver de udførte endnu en gang uploadet til databaseasen Grunden til dette, er at man skal v sikre sikker på at det sidste udførte produkt bliver overført til databaseasen. * / sp. ReadTo ("Selesai");

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

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

sp. Tutup (); Status (); }} // Saya mencari untuk loop bliver der lagt en ny række med ordre til eksikvering, n denr den foregående række er eksikveret (summen af foregående række er lig med 0). untuk (int i = 0; i <order. GetLength (0); i ++) {int test = pesanan [i, 0]; jika (ujian! = 0) {untuk (int j = 0; j <100; j ++) {pengirimanOrder [j] = pesanan [i, j];

pesanan [i, j] = 0;

}

rehat; }}

}

} / * Her der der oprettet et void ned "Status". Det er lavet untuk di skulle undgå di 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 code, der kører i baggrunden. * / Status kekosongan persendirian () {/ * MySQL yang dilarang oleh lelakinya yang lebih baik, lebih banyak dari jadual dan jumlah yang lebih rendah, atau eksikverer den forespørgsel. * / MySqlConnection con = MySqlConnection baru (connectionString); con. Buka (); string str = "pilih * dari jumlah keseluruhan"; MySqlCommand com = MySqlCommand baru (str, con); Pembaca MySqlDataReader = com. ExecuteReader (); // Denne funktion er med for at dele Baggrundskoden på en tråd i CPU'en, og en anden tren to rest rest af koden. pembaca. Baca (); Perwakilan MissingProd. Invoke ((MethodInvoker) {// Blitter de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter:" + (reader ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (pembaca ["produser produkter"]. ToString ());}); // Bliver der implementeret hvad procentbaren, skal udfyldes efter. Perwakilan ProcenteDone. Invoke ((MethodInvoker) {// Hvis læseren i SQL saya melarang lsser di "produser produkter ikke er lig med 0, bliver denne if statement eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0% "skrevet til label. if (int. Parse (pembaca ["produser produkter"]. ToString ())! = 0) {// Tager man de pengeluar produkter og plusser med de manglende produkter. Resultatet af dette ganger man med ratus, untuk pada få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (reader ["produser produkter"]. ToString ()) /(float. Parse(reader["produceret produkter "]. ToString ()) + float. Parse (pembaca ["manglende produkter"]. ToString ()))) * 100). ToString (); // Hasil kilauannya selepas tidligere udregning lag over på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} lain-lain {ProcenteDone. Text = "0%";}}); // Lukkes MySQL banindelsen. reader. Close (); con. Close ();} // Saya mengesan void bliver alle produkter, der er produser på den valgte dato, lagt ud på a pplikationen. kekosongan peribadi Vis_Produkter_Click_1 (penghantar objek, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Buang (10);

tarikh = dateTimePicker1. Teks;

string query = "SELECT` Produkt type`, `Tid` FROM udforte WHERE Tid> = '" + date + "00:00:00' DAN Tid <= '" + tarikh + "23:59:59'"; menggunakan (sambungan = MySqlConnection baru (connectionString)) menggunakan (perintah MySqlCommand = MySqlCommand baru (pertanyaan, sambungan)) menggunakan (penyesuai MySqlDataAdapter = MySqlDataAdapter baru (arahan)) {DataTable prodTable = baru DataTable (); penyesuai. Isi (prodTable);

dataGridView1. DataSource = prodTable;

}

} // Saya mengetepikan void blitter MySQL. Den fungerer sleed di banindelsen bliver åbnet, eksikverer, og lukkes. kekosongan peribadi DBQuery (string cmd) {string query = cmd; menggunakan (sambungan = MySqlConnection baru (connectionString)) menggunakan (perintah MySqlCommand = MySqlCommand baru (pertanyaan, sambungan)) {sambungan. Buka ();

arahan. ExecuteScalar ();

sambungan. Tutup ();

} } } }

Langkah 6: Materialeliste

1 stk. Arduino Uno

1 stk. Mikro servo SG90 9g

Langkah 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Susun

Isyarat = Grøn

Disyorkan: