Índice:

EAL - Industriel Internet - Fabrikshal: 7 etapas
EAL - Industriel Internet - Fabrikshal: 7 etapas

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

Vídeo: EAL - Industriel Internet - Fabrikshal: 7 etapas
Vídeo: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Julho
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 to opgave at implementere et automatiseret system ud fra industri 4.0 princippet. I denne opgave, er der lavet en lille simulação af en fabrikshal. I hallen står der en servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges to at lukke de relevante ind i fabrikshallen. Dados alternativos, gemas em banco de dados no Wampserver.

Etapa 1: RFID Kortlæser

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

Der er inkluderet en RFID kortlæser. Hensigten er e 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 e 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 applikation. I den sammenhæng er lyset også fravalgt.

Etapa 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 et anlæg, der kan producerer forskellige produkter. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt i en MySQL database. Motoren kan køre ud i tre forskellige posicionador. 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 applikationen kan afgive nye ordrer til motoren. Alt hvad bliver produceret bliver gemt em banco de dados MySQL.

Etapa 3: Banco de dados MySQL - Indhold

Banco de dados MySQL - Indhold
Banco de dados MySQL - Indhold
Banco de dados MySQL - Indhold
Banco de dados MySQL - Indhold
Banco de dados MySQL - Indhold
Banco de dados MySQL - 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 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 et tidspunkt på, hvornår de pågældende produkter er produceret. Det er Windows Forms applikationen der vil styre, hvad der skal sendes Arduinoen, samt databasen. Når der bliver afgivet en ordrer, vil den blive sendt to Arduinoen, efterfølgende, vil den relevante data blive logget i databasen. Der bliver sendt tre forskellige datatyper to 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.

Etapa 4: Arduino Kode

#incluir

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Começa a comunicação em série Serial.begin (9600); } void loop () {// Læsning fra serial port produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produto A (1) udføres i denne case case '1': myServo.write (50); atraso (1000); myServo.write (0); atraso (1000); Serial.println ("Concluído"); pausa; // Produkt B (2) udføres i denne case case '2': myServo.write (100); atraso (1000); myServo.write (0); atraso (1000); Serial.println ("Concluído"); pausa; // Produkt C (3) udføres i denne case case '3': myServo.write (150); atraso (1000); myServo.write (0); atraso (1000); Serial.println ("Concluído"); pausa; }}

Etapa 5: Aplicação de Formulários do Windows

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

namespace WindowsFormsApp2

{public partial class Form1: Form {/ * I denne class bliver all public variabler oprettet. Aqui está o oprettet en Class (MySqlConnection) der skal tages i brug, for at kunne oprette to MySQL serveren. Ydermere er der oprettet en String (connectionString) den bruges até definir hvilken bruger der skal på password, e 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å af flere produktioner af et produkt, eller flere produkter. Seriel comunicação para Arduinoen bliver e defineret dela. Der bliver også oprettet en Class (BackgroundWorker). Den gør e 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. * / Conexão MySqlConnection; string connectionString;

private int ordrenummer;

int privado [,] ordem = novo int [100, 100]; int privado sendOrder = new int [100]; prodType da string privada;

SerialPort sp = novo SerialPort ();

private BackgroundWorker myWorker = new BackgroundWorker ();

public Form1 ()

{InitializeComponent (); // Seu bliver vores String (connectionString) defineret. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; / * Sua variável bliver "myWorker" sentou até logge på hvor langt diversos bestillinger er i deres proces. * / myWorker. DoWork + = new DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Sua bliver auto baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datoen kører i. Seu formato é melhor após o banco de dados MySQL. dateTimePicker1. CustomFormat = "aaaa-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click (objeto remetente, 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); comprimento da ordem int = prodA + prodB + prodC; / * Eu disse for loops bliver køen oprettet, således at ordrene bliver produceret i den rækkefølge, de er bestilt i. * / para (int prod1A = 0; prod1A <prodA; prod1A ++) {ordem [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Her overføres de bestilte produkter til databasen. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VALUES (" + prodA + "," + prodB + "," + prodC + ")"); // Her overføres en 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. */ Status(); while (sendOrder. 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 e variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat to 0. De eksikverede produkter bliver uploadet til databasen. Inden if sætningerne bliver kommunikationen to Arduinoen åbnet, and den afgivet ordre bliver sendt to 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 declarações, 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 produkter uploadet i databasen, e komunikationen til Arduinoen, bliver lukket. if (sendOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`tipo de produto`) VALUES ('" + prodType + "')");

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

sp. Close ();

pausa; } / * 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 to databasen Grunden to dette, er e man skal være sikker på e det sidste udførte produkt bliver overført to databasen. * / sp. ReadTo ("Concluído");

DBQuery ("INSERT INTO` udforte` (`Tipo de produto`) VALORES ('" + prodType + "')");

DBQuery ("UPDATE` total` SET `produceret produkter` = (` produceret produkter` + 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). para (int i = 0; i <pedido. Comprimento de obtenção (0); i ++) {teste interno = pedido [i, 0]; if (test! = 0) {for (int j = 0; j <100; j ++) {sendOrder [j] = pedido [i, j];

ordem [i, j] = 0;

}

pausa; }}

}

} / * Her er der oprettet et void ved navn "Status". Det er lavet for at skulle undgå em 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 = new MySqlConnection (connectionString); con. Open (); string str = "selecionar * do total"; MySqlCommand com = new MySqlCommand (str, con); Leitor MySqlDataReader = com. ExecuteReader (); // Denne funktion er med for at del Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. leitor. 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 produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (reader ["produceret produkter"]. ToString ());}); // Seu bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegate {// Hvis læseren i My SQL forbindelsen læser at "produceret produkter ikke er lig med 0, bliver denne if declaração eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0% "skrevet til label. if (int. Parse (reader ["produceret produkter"]. ToString ())! = 0) {// Seu tager man de produceret produkter og plusser med de manglende produkter. 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 (); // Seu bliver resultatet af tidligere udregning lagt over på procentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Seu lukkes MySQL proibido. reader. Close (); con. Close ();} // Eu detectei void bliver alle produkter, der er produceret på den valgte dato, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (objeto remetente, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Remove (10);

date = dateTimePicker1. Text;

string query = "SELECT` Tipo de produto`, `Tid` FROM udforte WHERE Tid> = '" + data + "00:00:00' AND Tid <= '" + data + "23:59:59'"; using (connection = new MySqlConnection (connectionString)) using (comando MySqlCommand = new MySqlCommand (query, connection)) using (MySqlDataAdapter adapter = new MySqlDataAdapter (command)) {DataTable prodTable = new DataTable (); adaptador. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // Eu detectei void bliver MySQL forbindelsen styret. Den fungerer således em forbindelsen bliver åbnet, eksikverer, og lukkes. private void DBQuery (string cmd) {string query = cmd; using (connection = new MySqlConnection (connectionString)) using (comando MySqlCommand = new MySqlCommand (query, connection)) {connection. Open ();

command. ExecuteScalar ();

conexão. Fechar ();

} } } }

Etapa 6: Materialeliste

1 stk. Arduino Uno

1 stk. Micro servo SG90 9g

Etapa 7: Fobindelsesdiagram / I / O Lliste

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

Servo-motor:

+ = Rød

- = Classificar

Sinal = Grøn

Recomendado: