สารบัญ:

EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal: 7 ขั้นตอน
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal: 7 ขั้นตอน

วีดีโอ: EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal: 7 ขั้นตอน

วีดีโอ: EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal: 7 ขั้นตอน
วีดีโอ: What is the Industrial Internet of Things (IIoT)? 2024, พฤศจิกายน
Anonim
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal
EAL - อินเทอร์เน็ตอุตสาหกรรม - Fabrikshal

อ้างอิงจาก blevet fået stillet til opgave at implementere et automatiseret system ud fra industri 4.0 princippet. ฉัน denne opgave, er der lavet en lille simulation af en fabrikshal ฉันรู้ดีว่าเซอร์โวมอเตอร์, samt et par dioder Udevendig, sidder der en RFID kortlæser, der skulle bruges til at lukke de excellente ind i fabrikshallen. เข้าสู่ระบบ ข้อมูล Alt, gemmes และฐานข้อมูล i Wampserver

ขั้นตอนที่ 1: RFID Kortlæser

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

Der er inkluderet และ RFID kortlæser. Hensigten er at ud fra de id numre der er på det kort, og den brik der er er med er er skrevet ind i vores Arduino โค้ด. ข้อมูลที่อยู่ด้านล่าง 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 giver adgang, så tændes lyset และ 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. ตรวจสอบรายละเอียดที่ der kan opstå forstyrrelser på den seriel port, der er på projektets Arduino Uno. ซีเรียล porten, skal også bruges til Arduinoens ordrer, den vil få fra vores Windows Forms applikation. ฉัน den sammenhæng er lyset også fravalgt.

ขั้นตอนที่ 2: เซอร์โวมอเตอร์ (Anlæg)

เซอร์โวมอเตอร์ (Anlæg)
เซอร์โวมอเตอร์ (Anlæg)
เซอร์โวมอเตอร์ (Anlæg)
เซอร์โวมอเตอร์ (Anlæg)
เซอร์โวมอเตอร์ (Anlæg)
เซอร์โวมอเตอร์ (Anlæg)

ฉันขอแสดงความยินดีกับเซอร์โวมอเตอร์และ Arduino Uno Den skalsimulere et anlæg, der kan โปรดิวเซอร์ forskellige produkter. ลำดับที่ถือตาม, samt antallet af de udførte produkter, bliver gemt i en MySQL database. Motoren kan køre ud i tre forskellige ตำแหน่ง Hver ตำแหน่ง symboliserer tre forskellige produkter. ผลิตภัณฑ์ที่มีอยู่ er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Det er meningen at man, ผ่าน WPF applikationen kan afgive nye ordrer til motoren. Alt hvad bliver โปรดิวเซอร์et bliver gemt ในฐานข้อมูล MySQL

ขั้นตอนที่ 3: ฐานข้อมูล MySQL - Indhold

ฐานข้อมูล MySQL - Indhold
ฐานข้อมูล MySQL - Indhold
ฐานข้อมูล MySQL - Indhold
ฐานข้อมูล MySQL - Indhold
ฐานข้อมูล MySQL - Indhold
ฐานข้อมูล MySQL - Indhold

ฉันฐานข้อมูล MySQLn vil der være tre tabeller ผู้ถือครอง øje med hvilke ผลิตภัณฑ์ der er bestilt, og hvor mange En anden tabel vil logge ผลิตภัณฑ์ทั้งหมด Den tredje, og sidste tabel indenholder en oversigt over hvor mange produkter der er Producet, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende ผลิตและผลิต ตรวจหา Windows Forms แอปพลิเคชันสำหรับ vil styre, hvad der skal sendes Arduinoen, samt databasen. มากกว่า bliver afgivet en ordrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relatede data blive logget i databasen. Der bliver sendt tre forskellige datatyper til databasen. En Integer, en String, som bliver kaldt en VarChar, ฉันฐานข้อมูล Der også et TimeStamp, Det er en indstilling, der er tilføjet i ฐานข้อมูล

ขั้นตอนที่ 4: Arduino Kode

#รวม

เซอร์โว myServo;

int servoPos; ผลิตภัณฑ์ถ่าน = '0'; การตั้งค่าเป็นโมฆะ () { myServo.attach (3); // คอมมูนิเคชันแบบอนุกรมเริ่ม Serial.begin(9600); } void loop() { // Læsning fra serial port produkt = Serial.read(); // Godkendelse af ingående ordrer switch (ผลิตภัณฑ์) { // ผลิตภัณฑ์ (1) udføres i denne case case '1': myServo.write (50); ล่าช้า (1000); myServo.write(0); ล่าช้า (1000); Serial.println("เสร็จสิ้น"); หยุดพัก; // ผลิตภัณฑ์ B (2) udføres i denne case case '2': myServo.write(100); ล่าช้า (1000); myServo.write(0); ล่าช้า (1000); Serial.println("เสร็จสิ้น"); หยุดพัก; // ผลิตภัณฑ์ C (3) udføres i denne case case '3': myServo.write(150); ล่าช้า (1000); myServo.write(0); ล่าช้า (1000); Serial.println("เสร็จสิ้น"); หยุดพัก; } }

ขั้นตอนที่ 5: แอปพลิเคชันแบบฟอร์ม Windows

การใช้ระบบ การใช้ System. Collections. Generic ใช้ System. ComponentModel; ใช้ System. Data; ใช้ System. Drawing; ใช้ System. Linq; ใช้ System. Text; ใช้ System. Threading. Tasks; ใช้ System. Windows. Forms; ใช้ System. Collections; ใช้ System. IO. Ports; ใช้ MySql; ใช้ MySql. Data. MySqlClient;

เนมสเปซ WindowsFormsApp2

{ คลาสบางส่วนสาธารณะ Form1: แบบฟอร์ม { /* I denne class bliver alle public variabler oprettet. ใช้งานร่วมกันระหว่างคลาส (MySqlConnection) และใช้งานสำหรับเซิร์ฟเวอร์ MySQL Ydermere er der oprettet en String (connectionString) ที่ตัวเลือกที่กำหนด hvilken bruger der skal på og password, og hvilken database der er tale om. Der er oprettet en integer, i และ 2d array (orde) Grunden til det er at en ordrer kan bestå af flere produktioner af et ผลิตภัณฑ์, eller flere produkter. Seriel kommunikationen til Arduinoen bliver også defineret เธอ Der bliver også oprettet en Class (BackgroundWorker). Den gør ที่ en bestemt del af programmet bliver eksikveret gentagende gange และ baggrunden ฉันพบ tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ การเชื่อมต่อ MySqlConnection; การเชื่อมต่อสตริงสตริง;

int orrenummer ส่วนตัว;

int ส่วนตัว[,] order = new int[100, 100]; int ส่วนตัว sendOrder = new int[100]; สตริงส่วนตัว prodType;

SerialPort sp = SerialPort ใหม่ ();

BackgroundWorker ส่วนตัว myWorker = BackgroundWorker ใหม่ ();

แบบฟอร์มสาธารณะ1()

{ InitializeComponent (); //ความสดใสของเธอ vores String (connectionString) defineret connectionString = "เซิร์ฟเวอร์=192.168.1.100;userid=root;pwd=langeland;database=arduino;"; /* ตัวแปร bliver ของเธอ "myWorker" นั่งอยู่ที่ logge på hvor langt variety bestillinger er i deres proces. */ myWorker. DoWork += DoWorkEventHandler ใหม่ (myWorker_DoWork); myWorker. WorkerReportsProgress = จริง; myWorker. WorkerSupportsCancellation = true; // ตัวเธอชัดเจน myWorker. RunWorkerAsync(); // her bliver der defineret hvilket format datoen kører i. รูปแบบของเธอดีที่สุดหลังจากฐานข้อมูล MySQL dateTimePicker1. CustomFormat = "ปปปป-ดด-วว"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

โมฆะส่วนตัว Afgiv_Ordre_Click (ผู้ส่งวัตถุ EventArgs e)

{ /* เธอ er der oprettet nogle variabler, der kun bliver brugt i dette void. จาก tre første er Integers der skal definere hvilket ผลิตภัณฑ์จากเรื่อง 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; ผลิตภัณฑ์ intB = 2; ผลิตภัณฑ์ intC = 3; int prodA = int. Parse (prodAOrder. Text); int prodB = int. Parse (prodBOrder. Text); int prodC = int. Parse (prodCOrder. Text); int ลำดับความยาว = prodA + prodB + prodC; /* ฉัน disse for loops bliver køen oprettet, således at ordrene bliver Producet i den rækkefølge, de er bestilt i. */ สำหรับ (int prod1A = 0; prod1A < prodA; prod1A++) { สั่งซื้อ [ordrenummer, prod1A] = produktA; }

สำหรับ (int prod1B = (prodA); prod1B < (prodB + prodA); prod1B ++) { สั่งซื้อ [ordrenummer, prod1B] = produktB; }

สำหรับ (int prod1C = (prodA + prodB); prod1C 99)

{ orrenummer = 0; } // ผลิตภัณฑ์ที่เกินความสามารถของเธอ til databasen. DBQuery("INSERT INTO `bestilteprod`(`Produkt A`, `Produkt B`, `Produkt C`) ค่านิยม (" + prodA + ", " + prodB + ", " + prodC + ")"); // overføres en oversigt over hvilke produkter der mangler at blive Producert, til databasen. DBQuery("อัปเดต `ทั้งหมด' SET `manglende ผลิตภัณฑ์`= (`manglende produkter` +(" + (prodA+prodB+prodC) + ")) WHERE 1"); }

// ฉันเห็นว่าเป็นโมฆะ er alt det kode der skal køre i baggrunden, lagt ind.

โมฆะส่วนตัว myWorker_DoWork (ผู้ส่งวัตถุ EventArgs e) { ในขณะที่ (จริง) { /* อยู่ที่ summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre */ สถานะ(); while (sendingOrder. Sum() != 0) { /* I dette for loop fungerer det således, at så længe den oprettede Integer (i) er mindre end længden på den afgivet ordre, vil det eksikvere. ตัวแปร (i) kigger på den pågældende række i arrayet, der på nuværende tidspunkt arbejdes i. Den kigger ฉัน kolonnen, ser hvilket tal der står ฉัน kolonnen. Tallet bliver eksikveret, และ 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. ระบุถ้า sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ สำหรับ (int i = 0; i < sendOrder. Length; i++) { สถานะ (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open(); sp. Write(sendingOrder. ToString()); // Programmet der er i en af disse ifงบ, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). ถ้า (sendingOrder == 1) { prodType = "Produkt A"; } else if(sendingOrder == 2) { prodType = "Produkt B"; } else if(sendingOrder == 3) { prodType = "Produkt C"; }

sendOrder = 0;

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

DBQuery("UPDATE `ผลรวม' SET `produceret produkter`= (`produceret produkter' + 1), `manglende produkter`= (`manglende produkter' - 1)");

sp.ปิด();

หยุดพัก; } /* เธอทำงานที่ Arduinoen er færdig med ordren Der kvitteres med et "เสร็จสิ้น" ไม่มีข้อมูล, ข้อมูลล่าสุด, อัปโหลดไฟล์ udførte endnu en gang อัปโหลดจนถึงฐานข้อมูล Grunden til dette, er at man skal være sikker på at det sidste udførte produkt bliver overført til databasen. */ sp. ReadTo("เสร็จสิ้น");

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

DBQuery("UPDATE `ผลรวม' SET `produceret produkter`= (`produceret produkter` + 1), `manglende produkter`= (`manglende produkter' - 1)");

sp.ปิด(); สถานะ(); } } // ฉันเคยดู 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). สำหรับ (int i = 0; i < order. GetLength(0); i++) { int test = order [i, 0]; ถ้า (ทดสอบ != 0) { สำหรับ (int j = 0; j < 100; j++) { sendOrder[j] = สั่งซื้อ [i, j];

ลำดับ[i, j] = 0;

}

หยุดพัก; } }

}

} /* Her er der oprettet et void ved navn "สถานะ" Det er lavet สำหรับ ที่ skulle undgå ที่ 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() { /* Her åbner man MySQL forbindelsen, vælger alt fra den tabel der hedder total, และ eksikverer den forespørgsel. */ MySqlConnection con = MySqlConnection ใหม่ (connectionString); คอน.เปิด(); string str = "เลือก * จากทั้งหมด"; MySqlCommand com = MySqlCommand ใหม่ (str, con); เครื่องอ่าน MySqlDataReader = com. ExecuteReader (); // Denne funktion er med for at dele Baggrundskoden på en tråd i CPU'en, และen tråd til resten af koden. reader. Read(); MissingProd. Invoke ((MethodInvoker) delegate { // Her bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter: " + (reader ["manglende")); OrdereProd. Text = "produkter lavet: " + (reader["produceret produkter"]. ToString()); }); // her bliver der implementeret hvad procentbaren, skal udfyldes เอฟเตอร์ ProcenteDone. Invoke ((MethodInvoker) delegate { // Hvis læseren i SQL ของฉัน forbindelsen læser ที่ "produkter ikke er lig med 0, bliver denne if statement eksikveret. Hvis det er lig med 0, bliver der til udskrevet" label. if (int. Parse(reader["produceret produkter"]. ToString()) != 0) { // her tager man de Producet produkter og plusser med de manglende produkter. Resultatet af dette ganger man med 100 สำหรับ 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(); // Her bliver resultatet af tidligere udregning lagt over på procentbaren. ProgressBar1. Value = Int32. Parse(ProcenteDone. Text)); } อื่น { ProcenteDone. Text = "0%"; } }); // เธอ lukkes MySQL forbindelsen. reader. Close(); con. Close(); } // ฉันพบว่าเป็นโมฆะ bliver alle produkter, der er Producet på den valgte dato, lagt ud på a แอพพลิเคชั่น โมฆะส่วนตัว Vis_Produkter_Click_1 (ผู้ส่งวัตถุ EventArgs e) { วันที่สตริง = dateTimePicker1. Value. ToString (). ลบ (10);

date = dateTimePicker1. Text;

ข้อความค้นหาสตริง = "เลือก 'ประเภทผลิตภัณฑ์', 'Tid' จาก udforte WHERE Tid >= '" + วันที่ + " 00:00:00 น. และ Tid <= '" + วันที่ + " 23:59:59'"; ใช้ (การเชื่อมต่อ = ใหม่ MySqlConnection (การเชื่อมต่อสตริง)) โดยใช้ (คำสั่ง MySqlCommand = ใหม่ MySqlCommand (แบบสอบถาม การเชื่อมต่อ)) โดยใช้ (อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (คำสั่ง)) { DataTable prodTable = ใหม่ DataTable (); อะแดปเตอร์เติม (prodTable);

dataGridView1. DataSource = prodTable;

}

} // ฉันเห็นว่าเป็นโมฆะ bliver MySQL forbindelsen styret. Den fungerer således ที่ forbindelsen bliver åbnet, eksikverer, og lukkes โมฆะส่วนตัว DBQuery (สตริง cmd) { ข้อความค้นหาสตริง = cmd; ใช้ (การเชื่อมต่อ = MySqlConnection ใหม่ (connectionString)) โดยใช้ (คำสั่ง MySqlCommand = ใหม่ MySqlCommand (แบบสอบถาม การเชื่อมต่อ)) { connection. Open ();

command. ExecuteScalar();

การเชื่อมต่อปิด ();

} } } }

ขั้นตอนที่ 6: Materialeliste

1 สต. Arduino Uno

1 สต. ไมโครเซอร์โว SG90 9g

ขั้นตอนที่ 7: Fobindelsesdiagram / I/O Lliste

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

เซอร์โวมอเตอร์:

+ = เรอด

- = เรียง

สัญญาณ = Grøn

แนะนำ: