Taula de continguts:

EAL - Industriel Internet - Fabrikshal: 7 passos
EAL - Industriel Internet - Fabrikshal: 7 passos

Vídeo: EAL - Industriel Internet - Fabrikshal: 7 passos

Vídeo: EAL - Industriel Internet - Fabrikshal: 7 passos
Vídeo: Pioneers in Fulda | experience hesse | documentary 2024, Desembre
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 er blevet fået stillet til opgave at implementere and automatiseret system ud fra industrial 4.0 princippet. I denne opgave, er der lavet en lille simulation 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. Dades altes, gemmes i bases de dades i Wampserver.

Pas 1: RFID Kortlæser

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

Inclou un fitxer RFID. 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 overens med det der er skrevet ind 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 seriel port, der er på projektets Arduino Uno. Seriel porten, skal også bruges til Arduinoens ordrer, den vil få fra vores Windows Forms application. I den sammenhæng er lyset også fravalgt.

Pas 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. Es tracta d'un producte de fabricació i fabricació de productes exclusius. Ordrerbeholdningen, samt antallet af of udførte products, bliver gemt i in MySQL database. Motoren kan køre ud i tre forskellige positioner. Simbolitzador de la seva posició entre tres productes. Når produktet er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Det er meningen at man, via WPF applikationen kan afgive nye ordrer til motoren. Hi ha una gran quantitat de productes de bliver en la base de dades MySQL.

Pas 3: base de dades MySQL: Indhold

Base de dades MySQL: Indhold
Base de dades MySQL: Indhold
Base de dades MySQL: Indhold
Base de dades MySQL: Indhold
Base de dades MySQL: Indhold
Base de dades MySQL: Indhold

I MySQL databasen vil der være tre tabeller. El millor titular d'aquest producte és amb productes excel·lents, així com la seva manxa. En anden tabel vil logge alle de udførte products. Den tredje, og sidste tabel indenholder in oversigt over hvor mange products der er produceret, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende productors er produceret. Detectar els formularis de Windows aplicats al vil styre, hvad der skal sendes Arduinoen, samt databasen. Når der bliver afgivet 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 databasen. En Integer, en String, som bliver kaldt en VarChar, i databasen. Der er også et TimeStamp, Det er en indstilling, der er tilføjet i databasen.

Pas 4: Arduino Kode

#incloure

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // La comunicació en sèrie inicia Serial.begin (9600); } void loop () {// Llegir des del port sèrie produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) udføres i denne case case '1': myServo.write (50); retard (1000); myServo.write (0); retard (1000); Serial.println ("Fet"); trencar; // Produkt B (2) udføres i denne case case '2': myServo.write (100); retard (1000); myServo.write (0); retard (1000); Serial.println ("Fet"); trencar; // Produkt C (3) udføres i denne case case '3': myServo.write (150); retard (1000); myServo.write (0); retard (1000); Serial.println ("Fet"); trencar; }}

Pas 5: aplicació de Windows Forms

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

espai de noms WindowsFormsApp2

{public partial class Form1: Form {/ * I denne class bliver alle public 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 en integer, i et 2d array (orde). Grunden til det er at en ordrer kan bestå by flere products by et product, eller flere products. Seriel kommunikationen til Arduinoen bliver også defineret her. Der bliver også oprettet en Class (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. * / MySqlConnection connection; string connectionString;

privat int ordrenummer;

private int [,] order = new int [100, 100]; private int SendOrder = new int [100]; cadena privada prodType;

SerialPort sp = new SerialPort ();

private BackgroundWorker myWorker = new BackgroundWorker ();

formulari públic 1 ()

{InitializeComponent (); // El seu bliver vores definició de String (connectionString). connectionString = "servidor = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; / * Her bliver variablen "myWorker" sat till logge på hvor langt diverse bestillinger er i deres process. * / myWorker. DoWork + = new DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // El seu bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datesen kører i. El seu millor format és la base de dades MySQL. dateTimePicker1. CustomFormat = "aaaa-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click (remitent d'objectes, 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 applikationen. Den sidste er oprettet for at 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; / * 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 ++) {order [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Her overføres of bestilte products to databasen. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VALUES (" + prodA + "," + prodB + "," + prodC + ")"); // Her overføres in oversigt over hvilke produkter der mangler at blive producerert, 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. */ Estat(); while (leavingOrder. 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 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 and variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat til 0. De productes especialitzats bliver uploadet fins a la data. Inden if sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. * / for (int i = 0; i <SendOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (SendOrder . ToString ()); // Programmet der er i en af disse if statement, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). if (SendOrder == 1) {prodType = "Produkt A"; } else if (SendOrder == 2) {prodType = "Produkt B"; } else if (SendOrder == 3) {prodType = "Produkt C"; }

SendOrder = 0;

// Når hele den eksikverede række i arrayet samlet giver 0, bliver de udførte products uploader i databasen, og communicationation til Arduinoen, bliver lukket. if (SendOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

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

sp. Close ();

trencar; } / * 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 ("Fet");

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

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

sp. Close (); Estat(); }} // 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 = order [i, 0]; if (prova! = 0) {per (int j = 0; j <100; j ++) {enviarOrdre [j] = ordre [i, j];

ordre [i, j] = 0;

}

trencar; }}

}

} / * Her er der oprettet et void ved navn "Status". Det er lavet for at skulle undgå at skrive de samme linjer kode flere steder. I stedet kan man nøjes med at skrive "Status" Dette void er også includeer 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 = new MySqlConnection (connectionString); con. Open (); string str = "select * from total"; MySqlCommand com = new MySqlCommand (str, con); MySqlDataReader reader = 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. lector. Llegeix (); MissingProd. Invoke ((MethodInvoker) delegat {// Her bliver de manglende products, samt products der er lavet, skrevet ud på aplikationen. MissingProd. Text = "manglende products:" + (reader ["manglende products"]. ToString ()); OrdereProd. Text = "product lavet:" + (reader ["produceret produkter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. Delegat de ProcenteDone. Invoke ((MethodInvoker) {// Hvis læseren i My SQL forbindelsen læser at "produceret products product 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 (reader ["produceret produkter"]. ToString ())! = 0) {// Her tager man de produceret produkter og plusser med de manglende products. Resultatet af dette ganger man med hundred, for at 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);} else {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL forbindelsen. reader. Close (); con. Close ();} // I dette void bliver all products, der er produceret på den valgte dates, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (remitent d'objectes, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Remove (10);

data = dataTimePicker1. Text;

string query = "SELECT` Produkt type`, `Tid` FROM udforte WHID Tid> = '" + date + "00:00:00' AND Tid <= '" + date + "23:59:59'"; using (connection = new MySqlConnection (connectionString)) using (MySqlCommand command = new MySqlCommand (consulta, connexió)) using (MySqlDataAdapter adapter = new MySqlDataAdapter (command)) {DataTable prodTable = new DataTable (); adapter. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // I dette void bliver MySQL forbindelsen styret. Den fungerer således at forbindelsen bliver åbnet, eksikverer, og lukkes. private void DBQuery (string cmd) {string query = cmd; using (connection = new MySqlConnection (connectionString)) using (MySqlCommand command = new MySqlCommand (consulta, connexió)) {connection. Open ();

command. ExecuteScalar ();

connection. Close ();

} } } }

Pas 6: Materialeliste

1 stk. Arduino Uno

1 stk. Micro servo SG90 9g

Pas 7: Fobindelsesdiagram / I / O Lliste

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

Servomotor:

+ = Rød

- = Ordena

Senyal = Grøn

Recomanat: