Indholdsfortegnelse:

EAL - Industriel Internet - Fabrikshal: 7 trin
EAL - Industriel Internet - Fabrikshal: 7 trin

Video: EAL - Industriel Internet - Fabrikshal: 7 trin

Video: EAL - Industriel Internet - Fabrikshal: 7 trin
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Juli
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 blev blevet stillet til opgave at implementere og automatisere systemet fra industri 4.0 princippet. Jeg denne opgave, der er lavet en lille simulering 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. Alt data, gemmes i en database i Wampserver.

Trin 1: RFID Kortlæser

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

Der er inkluderet i 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 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 sammen med det der er skrevet i koden.

Når kortlæseren giver adgang, så tændes lyset i 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 serielle port, der er på projektets Arduino Uno. Seriel porten, skal også bruges til Arduinoens ordrer, der vil få fra vores Windows Forms -applikationer. Jeg den sammenhæng er lyset også fravalgt.

Trin 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 og anlæg, der kan producere forskellige produkter. Ordrerbeholdningen, samt at finde de udførte produkter, bliver gemt i en MySQL -database. Motoren kan køre ud og tre forskellige positioner. Hver position symboliserer tre forskellige produkter. Når produktet er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Det er meningen at man, via WPF applikationer kan afgive nye ordrer til motoren. Alt hvad bliver produceret bliver gemt i en MySQL -database.

Trin 3: MySQL Database - Indhold

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

I MySQL -databasen vil der være tre tabeller. Den første holder øje med hvilke produkter der er bedst, 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 og på et tidspunkt, hvor de sidste produkter er produceret. Det er Windows Forms applikationer der vil styre, hvad der skal sende Arduinoen, samt databasen. Når der bliver givet en ordrer, vil den blive sendt til Arduinoen, efterfølgende, vil den relevante data blive logget i databasen. Der bliver sendt tre forskellige datatyper til databaser. Et heltal, en streng, som bliver kaldt i VarChar, i databasen. Der er også et TimeStamp, Det er en indstilling, der er tilføjet i databasen.

Trin 4: Arduino Kode

#omfatte

Servo myServo;

int servoPos; char produkt = '0'; ugyldig opsætning () {myServo.attach (3); // Seriel kommunikation starter Serial.begin (9600); } void loop () {// Læsning fra seriel port produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) kommer i denne case '1': myServo.write (50); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Udført"); pause; // Produkt B (2) udføres i denne case case '2': myServo.write (100); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Udført"); pause; // Produkt C (3) angives i denne sag '3': myServo.write (150); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Udført"); pause; }}

Trin 5: Windows -formularapplikation

ved hjælp af System; ved hjælp af System. Collections. Generic; ved hjælp af System. ComponentModel; ved hjælp af System. Data; ved hjælp af System. Drawing; ved hjælp af System. Linq; ved hjælp af System. Text; ved hjælp af System. Threading. Tasks; ved hjælp af System. Windows. Forms; ved hjælp af System. Collections; ved hjælp af System. IO. Ports; ved hjælp af MySql; ved hjælp af MySql. Data. MySqlClient;

navneområde WindowsFormsApp2

{public delvis klasse Form1: Form { /* I denne klasse bliver alle offentlige variabler oprettet. Herunder er der oprettet en Class (MySqlConnection) der skal tages i brug, for at kunne oprette forbindelse til MySQL -serveren. Ydermere er der oprettet en String (connectionString) den bruges til at definere hvilken bruger der skal på og password, og hvilken database der er tale om. Der er oprettet et helt tal, i et 2d array (orde). Grunden til det er at en ordrer kan bestå af flere produktioner af et produkt, eller flere produkter. Seriel kommunikation til Arduinoen bliver også defineret af hende. Der bliver også oprettet en Class (BackgroundWorker). Den gør at en bestemt del af programmet bliver eksikveret gentagende gange i baggrunden. I denne tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ MySqlConnection -forbindelse; string connectionString;

private int ordrenummer;

private int [,] ordre = ny int [100, 100]; private int sendingOrder = ny int [100]; private streng prodType;

SerialPort sp = ny SerialPort ();

private BackgroundWorker myWorker = ny BackgroundWorker ();

offentlig form1 ()

{InitializeComponent (); // Her bliver vores String (connectionString) defineret. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; /* Her bliver variablen "myWorker" sat til at logge på hvor langt diverse bestillinger er i deres proces. */ myWorker. DoWork += ny DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datoen kører i. Hendes format er bestemt efter MySQL -databasen. dateTimePicker1. CustomFormat = "åååå-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click (objekt afsender, EventArgs e)

{ /* Her er der 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 applikationer. Den sidste er oprettet for at få en længde på den nødvendige 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 loops 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 ++) {ordre [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Hendes overleverede de bedste produkter til databaser. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VÆRDIER (" + prodA + "," + prodB + "," + prodC + ")"); // Hendes overføres og oversigt over hvilke produkter der mangler at blive producent, til databasen. DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` +(" +(prodA +prodB +prodC) +")) WHERE 1 "); }

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

private void myWorker_DoWork (object sender, EventArgs e) {while (true) { /* Så længe at summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre. */ Status (); 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. Variablen (i) kigger på den nødvendige 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 nødvendige kolonne sat til 0. De eksikverede produkter bliver uploadet til databasen. Inden hvis sætningerne bliver kommunikation til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i <sendingOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (senderOrder . ToString ()); // Programmet der er i en af disse if statements, vil blive eksikveret, og kan derfor gøre noget fra et til tre der er i variablen (i). hvis (sendingOrder == 1) {prodType = "Produkt A"; } ellers hvis (senderOrder == 2) {prodType = "Produkt B"; } ellers hvis (senderOrder == 3) {prodType = "Produkt C"; }

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

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

sp. Close ();

pause; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". Når det er modtaget, bliver de udførte endnu en gang uploadet til databasen Grunden til dette, er at man skal være sikker på at det sidste udførte produkt bliver overført til databasen. */ sp. ReadTo ("Udført");

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

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

sp. Close (); Status (); }} // 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 = ordre [i, 0]; hvis (test! = 0) {for (int j = 0; j <100; j ++) {sendingOrder [j] = ordre [i, j];

ordre [i, j] = 0;

}

pause; }}

}

} /* Her er der oprettet et void ved navn "Status". Det er lavet for at undgå at 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 kode, der kører i baggrunden. * / private void Status () { /* Her åbner man MySQL forbindelsen, vælger alt fra den tabel der hedder total, og eksikverer den forespørgsel. */ MySqlConnection con = ny MySqlConnection (connectionString); con. Open (); string str = "vælg * fra total"; MySqlCommand com = ny MySqlCommand (str, con); MySqlDataReader -læser = com. ExecuteReader (); // Denne funktion er med for at dele Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. reader. Read (); MissingProd. Invoke ((MethodInvoker) delegeret {// Her bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationer. MissingProd. Text = "manglende produkter:" + (reader ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (læser ["producentprodukter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, der skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegeret {// Hvis læseren i My SQL forbindelsen læser at "produceret produkter ikke er lig med 0, bliver denne hvis statement eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0%"skrevet til label. if (int. Parse (reader ["produceret products"]. ToString ()) = 0) {// Her tager man de produceret produkter og plusser med de manglende produkter. Resultatet af dette gange man med hundred, for at få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (læser ["produceret produkter"]. ToString ()) /(float. Parse(reader ["produceret produkter "]. ToString ()) + float. Parse (læser ["manglende produkter"]. ToString ())) * 100). ToString (); // Her bliver resultater af tidligere udregning lagt over på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void bliver alle produkter, der er produceret på den valgte dato, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (objektafsender, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Fjern (10);

date = dateTimePicker1. Text;

string query = "VÆLG` Produkttype`, `Tid` FRA udforte HVOR Tid> = '" + dato + "00:00:00' OG Tid <= '" + dato + "23:59:59'"; ved hjælp af (forbindelse = ny MySqlConnection (connectionString)) ved hjælp af (MySqlCommand -kommando = ny MySqlCommand (forespørgsel, forbindelse)) ved hjælp af (MySqlDataAdapter adapter = ny MySqlDataAdapter (kommando)) {DataTable prodTable = ny DataTable (); adapter. Fyld (prodTable);

dataGridView1. DataSource = prodTable;

}

} // I dette void bliver MySQL forbindelsen styret. Den fungerer således at forbindelser bliver åbnet, eksikverer og lukkes. private void DBQuery (string cmd) {string query = cmd; ved hjælp af (forbindelse = ny MySqlConnection (connectionString)) ved hjælp af (MySqlCommand -kommando = ny MySqlCommand (forespørgsel, forbindelse)) {connection. Open ();

command. ExecuteScalar ();

forbindelse. Luk ();

} } } }

Trin 6: Materialeliste

1 stk. Arduino Uno

1 stk. Micro servo SG90 9g

Trin 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Sorter

Signal = Grøn

Anbefalede: