תוכן עניינים:

EAL - Industriel Internet - Fabrikshal: 7 שלבים
EAL - Industriel Internet - Fabrikshal: 7 שלבים

וִידֵאוֹ: EAL - Industriel Internet - Fabrikshal: 7 שלבים

וִידֵאוֹ: EAL - Industriel Internet - Fabrikshal: 7 שלבים
וִידֵאוֹ: Машинное обучение для разработчиков Java: переход на стек технологий ИИ. 2024, יולי
Anonim
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - אינטרנט Industriel - Fabrikshal
EAL - אינטרנט Industriel - Fabrikshal
EAL - Industriel Internet - Fabrikshal
EAL - Industriel Internet - Fabrikshal

עדיין לא קיבלתי עדיין מערכת יישום ואוטומטיות ממערכת התעשייה 4.0. אני לא נותן את זה, אני עושה סימולציות קטנות של יצרן. I hallen stands der en servomotor, samt et par dioder. Ude extern, sidder der en RFID kortlæser, der skulle bruges til at lukke de relevant ind ind fabrikshallen. נתוני Alt, gemmes ובמאגר נתונים ב- Wampserver.

שלב 1: RFID Kortlæser

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

Der is includedet in RFID kortlæser. Hensigten er at ud fra de id numre der er on the kort, og den brik der er med is written in i our Arduino code. זה יכול לעשות כשאפשר לקלצר את ההרשמה או לקצר את הקובץ במכשיר id-nummer, והאישור הראשון יהיה כאשר המספר מצביע על כך שהקבצים נכתבו בקוד.

כאשר קורטלנס נותן נותן גישה, כך שאפשר לייזס אותו במפעל. Lyset slukkes igen, wann en device, der er godkendt of kortlæseren, bliver detekteret.

Kortlæseren הופכת להיות מרוחקת מהפרויקט, da den kører seriel kommunikation. Det vil sige at der kan opstå forstyrrelser på den seriel port, der is on projectets Arduino Uno. Seriel porten, גם צריך להתארגן עבור Arduinoens ordrer, יהיה אפשר להשיג את יישומי Windows Forms שלנו. אני מכיר את האגודה גם ליכולות fravalgt.

שלב 2: Servomotor (Anlæg)

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

I hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere and anlæg, der can producerer different products. Ordrerbeholdningen, ועדיין מוצא את המוצרים המבוססים, הופך להיות מסמך במסד הנתונים של MySQL. מוטורן יכול להפעיל את המיקום. כל עמדה מסמלת שלושה מוצרים. כאשר המוצר הוא færdigproduceret, kører motoren back in nul position, and affventer new ordrer. מידע זה ניתן לאדם באמצעות WPF יישומים יכולים לתת מענה חדש לאתר. כל מה שיהיה מפיק הופך להיות נתון במסד הנתונים של MySQL.

שלב 3: מסד הנתונים MySQL - Indhold

מאגר MySQL - Indhold
מאגר MySQL - Indhold
מאגר MySQL - Indhold
מאגר MySQL - Indhold
מאגר MySQL - Indhold
מאגר MySQL - Indhold

I MySQL database will der være tre tabeller. Den first holder øje with which products der er bestilt, and hvor many. En anden table will logge all de udførte products. Den tredje, and last table indenholder en oversigt over how many products der is produceret, and how many der lackers. Ydermere er der and time on, how Zäit de same products are produceret. יש טפסים של יישומי Windows Forms לשם שימוש, מה צריך לשלוח Arduinoen, ועוד נתונים. כאשר ניתן לקבל מידע על אורדרו, אתה יכול לשלוח אותו לארדואינו, לאחר מכן, ונתונים רלוונטיים יהיו לוגטים במאגרי מידע. Der blir sent tre different dataatyper to databasen. מספר שלם, מחרוזת, מה שהופך להיות קולט ב- VarChar, ובמאגרי מידע. יש גם TimeStamp, זה יכול להיות אינפורמציה, ויש לי מידע על הנתונים.

שלב 4: Arduino Kode

#לִכלוֹל

סרוו myServo;

int servoPos; char product = '0'; הגדרת void () {myServo.attach (3); // תקשורת סדרתית מתחילה את Serial.begin (9600); } void loop () {// Læsning fra product port product = Serial.read (); // Godkendelse of ingående ordrer switch (product) {// Product A (1) משתמשת במקרה זה '1': myServo.write (50); עיכוב (1000); myServo.write (0); עיכוב (1000); Serial.println ("בוצע"); לשבור; // מוצר B (2) מופיע במקרה זה '2': myServo.write (100); עיכוב (1000); myServo.write (0); עיכוב (1000); Serial.println ("בוצע"); לשבור; // מוצר C (3) מופיע במקרה זה '3': myServo.write (150); עיכוב (1000); myServo.write (0); עיכוב (1000); Serial.println ("בוצע"); לשבור; }}

שלב 5: יישום Windows Forms

באמצעות מערכת; שימוש ב- 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

{סוג חלק ציבורי טופס 1: טופס { /* כיתה זו הופכת את כל משתני הציבור למערכת. הוראות השימוש במכשיר (MySqlConnection) יוכלו להיעשות בבריכות, כך שניתן יהיה ליצור קשרים לשירות MySQL. Ydermere er der oprettet en String (connectionString) den bridges to at definere which user der skal på and password, and which database der is tale om. Der er oprettet en integer, i et array 2d (orde). Grunden til det er at en ordrer can bestå of flere produktioner of a product, or flere products. Seriel kommunikationen til Arduinoen תהיה גם מגדירה אותה. בנוסף, המחשב יוצר גם את הכיתה (BackgroundWorker). זה עושה את זה בהחלט על מנת להפוך את התוכנית לארוחת בוקר ברקע. אני מזהה את המקרה כי זה יכול להיות מבוגר, כיוון שאפשר יהיה להקים חדש אורדר, עם קצר בין. */ חיבור MySqlConnection; string stringString;

int private יום החופש;

int int [,] סדר = int [חדש, 100] חדש; int int sendingOrder = int [100] חדש; מחרוזת פרטית prodType;

SerialPort sp = SerialPort חדש ();

PrivateWorker פרטי myWorker = BackgroundWorker חדש ();

טופס ציבורי 1 ()

{InitializeComponent (); // הגדרה שלנו מחרוזת (connectionString). connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; /* ההופעה שלה משתנה "myWorker" ישב עד שהתרשמתי בהרבה מהו מגוון התכניות בהן. */ myWorker. DoWork += DoWorkEventHandler חדש (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync ();. הפורמט שלה מפורש בהחלט אחרי מסד הנתונים של MySQL. dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

חלל פרטי Afgiv_Ordre_Click (שולח אובייקט, EventArgs e)

{ /* Her is der oprettet some variabler, der kun blive used in this void. De tre first er Integers der skal definere איזה produkt der er tale om. אחרון העבודות על מנת לכתוב מספר אנשים מבקשים, מכילים יישומים. Den sidste er oprettet for at få en längde on the harder 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 dis for loops bliver køen oprettet, således at ordrene blir produceret i den rækkefølge, de er bestilt i. */ for (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

עבור (int prod1C = (prodA + prodB); prod1C 99)

{ordrenummer = 0; } // מוצרי המוצרים הטובים ביותר שלה לבסיס הנתונים. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Product B`, `Product C`) VALUES (" + prodA + "," + prodB + "," + prodC + ")"); // ההופעות וההסברים שלה על אילו מוצרים חסרים להיות מפיקים, למאגרי מידע. DBQuery ("UPDATE` total` SET `manglende products` = (` products manging` +(" +(prodA +prodB +prodC) +")) WHERE 1 "); }

// אני מזהה את כל הקוד שיש לרכב ברקע רקע.

private void myWorker_DoWork (שולח אובייקט, EventArgs e) {while (true) { /* Så הרבה at summen af den afsendte ordre ikke er lig med 0, vil dette while loop driver. */ סטטוס (); while (sendingOrder. Sum ()! = 0) { /* I dette for loop works det således, at så הרבה den oprettede Integer (i) er mindre end lengthden på den afgivet ordre, vil det eksikvere. Variablen (i) kigger on the same number in arrayet, der on present time arbejdes i. Den kigger i kolonnen, ser hvilket tal der står i kolonnen. Tallet יהיה eksikveret, and inden and variablen rykker next to next colonne, will be den column shared to 0. De eksikverede products gets uploadet to databasen. אם התוצאות יהיו תקשורתיות ל- Arduinoen åbnet, ו- den afgivet ordre will be sent to Arduinoen. */ for (int i = 0; i <sendingOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (sendingOrder . ToString ()); // Programmet der er i en af disse if statements, vil blive eksikveret, ואחראי על כמה tal fra et til tre der er i variablen (i). if (sendingOrder == 1) {prodType = "מוצר A"; } אחרת אם (sendingOrder == 2) {prodType = "Produkt B"; } אחרת אם (sendingOrder == 3) {prodType = "Produkt C"; }

sendingOrder = 0;

// כשאפשר להעביר את מספר המוצרים לרשת במערך כולל 0, הופכים את המוצרים שהועלו לאתר במאגרי מידע, ותקשורת עבור ארדואינון, הופכת ללוקטית. if (sendingOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`type product`) VALUES ('" + prodType + "')");

DBQuery ("UPDATE` total` SET `productset products` = (` products producer` + 1), `manglende products` = (` products manging` - 1) ");

sp. Close ();

לשבור; } /* Her avventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". כאשר זה יהיה מקובל, הופכים את המבצעים עוד לאפשר להעלות נתונים למסדי נתונים יסודיים לכך. */ sp. ReadTo ("בוצע");

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

DBQuery ("UPDATE` total` SET `productset products` = (` products producer` + 1), `manglende products` = (` products manging` - 1) ");

sp. Close (); סטָטוּס(); }}} / / I dette for loop הופך להיות נוסף על שורה חדשה עם הוראות לאקסיקוורציה, כאשר השורה הקודמת היא eksikveret. for (int i = 0; i <order. GetLength (0); i ++) {int test = order [i, 0]; if (test! = 0) {for (int j = 0; j <100; j ++) {sendingOrder [j] = order [i, j];

הזמנה [i, j] = 0;

}

לשבור; }}

}

} /* Her is der oprettet et void ved name "Status". Det er lavet for at hitta at skrive the same lines code flere locations. במקום זאת, ניתן לרכוש מכתבים אחרים על ידי "סטטוס". חלל זה כולל גם אני את זה בטירוף, עם עוד קודים אחרים. * / private void Status () { /* איש העסקים שלה ב- MySQL הקשרelsen, הכולל את כל השולחנות הכוללים, ו eksikverer den forespørgsel. */ MySqlConnection con = MySqlConnection חדש (connectionString); con. Open (); string str = "בחר * מתוך סך הכל"; MySqlCommand com = MySqlCommand חדש (str, con); קורא MySqlDataReader = com. ExecuteReader (); // Denne פונקציה היא med for at dele Baggrundskoden on en thread in CPU'en, and en anden thread for resten af koden. reader. Read (); נציג MissingProd. Invoke ((MethodInvoker) {// Her bliver de manglende products, samt products der er made, written ud on applikationen.); OrdereProd. Text = "מוצרים עשויים:" + (קורא ["מוצרים מפיקים"]. ToString ());}); // Her bliver der implementeret what percentbaren, skal udfyldes efter. נציג ProcenteDone. Invoke ((MethodInvoker) {// אם læseren i My SQL הקשרelsen læser at "produceret products not er lig with 0, blir this if statement eksikveret. label. if (int. Parse (reader ["produceret products"]. ToString ()) = 0) {// Her tar man de produceret products and plusser med de manglende products. Resultatet af dette ganger man with hundred, for at at get det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (reader ["produceret products"]. ToString ()) /(float. Parse(reader["produceret products "]. ToString ()) + float. Parse (קורא ["מוצרים מתקדמים"]. ToString ()))) 100). ToString (););} else {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void blir all products, der er produceret på den valgte dato, lagt ud på a pplikationen. חלל פרטי Vis_Produkter_Click_1 (שולח אובייקט, EventArgs e) {string date = dateTimePicker1. Value. ToString (). הסר (10);

date = dateTimePicker1. Text;

string query = "SELECT` type product`, `Tid` FRA udforte WHERE Tid> = '" + תאריך + "00:00:00' AND Tid <= '" + תאריך + "23:59:59'"; שימוש (חיבור = MySqlConnection חדש (connectionString)) באמצעות (פקודה MySqlCommand = MySqlCommand חדש (שאילתה, חיבור)) באמצעות (MySqlDataAdapter adapter = MySqlDataAdapter חדש (פקודה)) {DataTable prodTable = new DataTable (); מתאם. מילוי (prodTable);

dataGridView1. DataSource = prodTable;

}

} // אני מזהה את הרייד של MySQL. Den fungerer således at connectelsen blir åbnet, eksikverer, and lukkes. חלל פרטי DBQuery (מחרוזת cmd) {string query = cmd; שימוש (חיבור = MySqlConnection חדש (connectionString)) באמצעות (פקודה MySqlCommand = MySqlCommand חדש (שאילתה, חיבור)) {connection. Open ();

command. ExecuteScalar ();

connection. Close ();

} } } }

שלב 6: רשימת חומרים

1 stk. ארדואינו אונו

1 stk. מיקרו סרוו SG90 9 גרם

שלב 7: דיאגרמת Fobindelses / I / O Llist

דיאגרמת Fobindelses / I / O Lliste
דיאגרמת Fobindelses / I / O Lliste

Servomotor:

+ = רוד

- = מיין

אות = גרין

מוּמלָץ: