Innholdsfortegnelse:

EAL - Industriel Internet - Fabrikshal: 7 trinn
EAL - Industriel Internet - Fabrikshal: 7 trinn

Video: EAL - Industriel Internet - Fabrikshal: 7 trinn

Video: EAL - Industriel Internet - Fabrikshal: 7 trinn
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 ble jeg fortsatt tilgjengelig for å implementere og automatisere systemet fra industri 4.0 -prinsippet. Jeg har gitt opp, er der laget en liten simulering av en fabrikshal. I hallen står der en servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle brukes til at det er relevant for fabrikken. Alt data, gemmes og en database i Wampserver.

Trinn 1: RFID Kortlæser

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

Der er inkludert en RFID kortlæser. Hensigten er at ud fra de id numre der er på det kort, og den brik der er med er skrevet i vår Arduino kode. Det kan gjøres når kortlæseren oppfyller en brikk eller et kort, og den kan deles på enhetens ID-nummer, og godkjenner først når nummeret stemmer sammen med det som er skrevet i koden.

Når kortlæseren gir adgang, så tændes lyset i fabrikken. Lyset slukkes igen, når en enhet, der er godkjent av kortlæseren, blir detekteret.

Kortlæseren blir fjernet fra prosjektet, da den kører seriel kommunikasjon. Det vil si at der kan oppstå forstyrrelser på den serielle porten, der er på prosjektets Arduino Uno. Seriel porten, skal også brukes til Arduinoens ordrer, den vil få fra våre Windows Forms -applikasjoner. Jeg den sammenheng er lyset også fravalgt.

Trinn 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 produsere forskjellige produkter. Ordrerbeholdningen, samt å finne de utførte produkter, blir gemt i en MySQL -database. Motoren kan kjøre ut og tre forskjellige posisjoneringer. Hver posisjon symboliserer tre forskjellige produkter. Når produktet er færdigproduceret, kjører motoren tilbake i nul posisjon, og avventer nye ordrer. Det er meningen at man, via WPF -applikasjoner kan få nye ordrer til motoren. Alt hva blir produsent blir gemt i en MySQL -database.

Trinn 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 bestilt, og hvor mange. En annen tabell vil logge alle de utførte produktene. Den tredje, og den siste tabellen inneholder en oversikt over hvor mange produkter der er produsent, og hvor mange der mangler. Ydermere er der og tidspunkt på, hvor de siste produktene er produsent. Det er Windows Forms applikasjoner der vil styre, hvad der skal sende Arduinoen, samt databasen. Når der blir avgivet en ordrer, vil den bli sendt til Arduinoen, etterfølgende, vil den relevante data bli logget i databasen. Der blir sendt tre forskjellige datatyper til databaser. Et heltall, en streng, som blir kaldt i VarChar, i databasen. Der er også et TimeStamp, Det er en innstilling, der det tilføyes i databasen.

Trinn 4: Arduino Kode

#inkludere

Servo myServo;

int servoPos; char produkt = '0'; ugyldig oppsett () {myServo.attach (3); // Seriell kommunikasjon starter Serial.begin (9600); } void loop () {// Læsning fra seriell port produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) kommer i denne saken '1': myServo.write (50); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Ferdig"); gå i stykker; // Produkt B (2) brukes i denne saken '2': myServo.write (100); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Ferdig"); gå i stykker; // Produkt C (3) brukes i denne saken '3': myServo.write (150); forsinkelse (1000); myServo.write (0); forsinkelse (1000); Serial.println ("Ferdig"); gå i stykker; }}

Trinn 5: Windows Forms -applikasjon

bruker System; bruker System. Collections. Generic; bruker System. ComponentModel; bruker System. Data; bruker System. Drawing; bruker System. Linq; bruker System. Text; bruk av System. Threading. Tasks; bruker System. Windows. Forms; bruk av System. Collections; bruker System. IO. Ports; bruker MySql; bruker MySql. Data. MySqlClient;

navneområde WindowsFormsApp2

{offentlig delklasse Form1: Skjema { /* I denne klassen blir alle offentlige variabler opprettet. Herunder er der opprettet en Class (MySqlConnection) der skal tages i brug, for at kunne opprette forbindelse til MySQL -serveren. Ydermere er der opprettet en String (connectionString) som kan brukes til å definere hvilken bruker som skal på og passord, og hvilken database der er tale om. Der er opprettet en integer, i et 2d array (orde). Grunden til det er en ordrer kan bestå av flere produksjoner av et produkt, eller flere produkter. Seriel kommunikasjon til Arduinoen blir også definert av henne. Der blir også opprettet en Class (BackgroundWorker). Den gjør at en bestemt del av programmet blir eksikveret gentagende gange i bakgrunn. I dette tilfellet er det brukbart, da det kan bli opprettet nye ordrer, med korte mellomrum. */ MySqlConnection -tilkobling; 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 skjema1 ()

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

private void Afgiv_Ordre_Click (objektavsender, EventArgs e)

{ /* Her er der opprettet noen variabler, der kan bli brukt i dette void. De tre første er Integers der skal definere hvilket produkt der er tale om. De neste tre er opprettet for at jeg kan skrive det antall mennesker som søker, kan brukes i applikasjoner. Den siste er opprettet for at få en lengde 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 blir køen oprettet, således at ordrene blir produceret i den rekkefø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; } // Hennes overføringer av bestilte produkter til databaser. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VERDIER (" + prodA + "," + prodB + "," + prodC + ")"); // Hennes oversider og oversikt over hvilke produkter der mangler at bli produsent, til databasen. DBQuery ("UPDATE` total` SET `manglende produkter` = (` manglende produkter` +(" +(prodA +prodB +prodC) +")) WHERE 1 "); }

// I dette void er alt det kode der skal kjøre i bakgrunn, lagt inn.

private void myWorker_DoWork (object sender, EventArgs e) {while (true) { /* Så lenge at summen av den afsendte ordre ikke er lig med 0, vil dette while loop kjøre. */ Status (); while (sendingOrder. Sum ()! = 0) { /* I dette for loop fungerer det således, at så lenge den oprettede Integer (i) er mindre end lengden på den afgivet ordre, vil det eksikvere. Variablen (i) kigger på den nødvendige rekkefølgen i arrayet, som på nåværende tidspunkt arbeides i. Den kigger i kolonnen, ser hvilket tal der står i kolonnen. Tallet blir eksikveret, og innen at variablen rykker videre til neste kolonne, blir den aktive kolonnen satt til 0. De eksikverede produktene blir lastet opp til databasen. Inden hvis sætninger blir kommunikasjon til Arduinoen åbnet, og den avgivet ordre blir sendt til 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 bli eksikveret, og kan gjøre noe fra et til tre der er i variablen (i). if (sendingOrder == 1) {prodType = "Produkt A"; } annet hvis (sendingOrder == 2) {prodType = "Produkt B"; } annet hvis (sendingOrder == 3) {prodType = "Produkt C"; }

sendingOrder = 0;

// Når hele den eksikverede rekke i arrayet samlet giver 0, blir de utførte produktene lastet opp i databasen, og komunikationen til Arduinoen, blir lukket. if (sendingOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

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

sp. Close ();

gå i stykker; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". Når det er mottatt, blir de utførte enda en gang lastet opp til databasen Grunden til dette, er at man skal være sikker på at det siste utførte produktet blir overført til databasen. */ sp. ReadTo ("Ferdig");

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

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

sp. Close (); Status(); }} // I dette for loop blir der lagt en ny rekke med ordre til eksikvering, når den foregående rekke er eksikveret (summen av foregående rekke er lig med 0). for (int i = 0; i <order. GetLength (0); i ++) {int test = ordre [i, 0]; if (test! = 0) {for (int j = 0; j <100; j ++) {sendingOrder [j] = ordre [i, j];

rekkefølge [i, j] = 0;

}

gå i stykker; }}

}

} /* Her er der opprettet et void ved navn "Status". Det er laget for at jeg ikke trenger å skrive de samme linjekodene flere steder. I stedet kan man nøkles med skrive "Status" Dette er også inkludert i det void, med andre koder, der jeg lager i bakgrunnen. * / private void Status () { /* Her åpner man MySQL forbindelsen, vælger alt fra den tabellen der hedder total, og eksikverer den forespørgsel. */ MySqlConnection con = ny MySqlConnection (connectionString); con. Open (); string str = "velg * fra totalt"; MySqlCommand com = nytt MySqlCommand (str, con); MySqlDataReader -leser = com. ExecuteReader (); // Denne funksjonen er med for å dele Baggrundskoden på en tråd i CPU'en, og en annen tråd til resten av koden. reader. Read (); MissingProd. Invoke ((MethodInvoker) delegat {// Her blir de manglende produkter, samt produkter der er laget, skrevet ut på applikasjoner. MissingProd. Text = "manglende produkter:" + (reader ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter laget:" + (leser ["produsentprodukter"]. ToString ());}); // Her blir der implementeret hvad procentbaren, skal utfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegat {// Hvis læseren i My SQL forbindelsen læser at "produsent produkter ikke er lig med 0, blir denne hvis uttalelse eksikveret. Hvis det er lig med 0, blir der udskrevet" 0%"skrevet til label. if (int. Parse (reader ["produceret products"]. ToString ()) = 0) {// Her tar man de produceret produkter og plusser med de manglende produkter. Resultatet av dette ganger man med hundre, for kl. få det ut i prosent. ProcenteDone. Text = Math. Round ((float. Parse (leser ["produsentprodukter"]. ToString ()) /(float. Parse(reader ["produceret produkter "]. ToString ()) + float. Parse (leser ["manglende produkter"]. ToString ())) * 100). ToString (); // Her blir resultatet av tidligere utregning lagt over på prosentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void blir alle produkter, der er produsent på den valgte dato, lagt ut på a pplikationen. private void Vis_Produkter_Click_1 (objektavsender, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Fjern (10);

date = dateTimePicker1. Text;

string query = "VELG` Produkttype`, `Tid` FRA udforte HVOR Tid> = '" + dato + "00:00:00' OG Tid <= '" + dato + "23:59:59'"; bruker (tilkobling = ny MySqlConnection (connectionString)) ved hjelp av (MySqlCommand -kommando = ny MySqlCommand (forespørsel, tilkobling)) ved hjelp av (MySqlDataAdapter -adapter = ny MySqlDataAdapter (kommando)) {DataTable prodTable = new DataTable (); adapter. Fyll (prodTable);

dataGridView1. DataSource = prodTable;

}

} // I dette void blir MySQL forbindelsen styret. Den fungerer således at forbindelser blir åbnet, eksikverer, og lukkes. private void DBQuery (string cmd) {string query = cmd; bruker (tilkobling = ny MySqlConnection (connectionString)) ved hjelp av (MySqlCommand -kommando = ny MySqlCommand (forespørsel, tilkobling)) {connection. Open ();

command. ExecuteScalar ();

tilkobling. Lukk ();

} } } }

Trinn 6: Materialeliste

1 stk. Arduino Uno

1 stk. Micro servo SG90 9g

Trinn 7: Fobindelsesdiagram / I / O Lliste

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

Servo motor:

+ = Rød

- = Sorter

Signal = Grøn

Anbefalt: