Table des matières:
- Étape 1: RFID Kortlæser
- Étape 2: Servomoteur (Anlæg)
- Étape 3: Base de données MySQL - Indhold
- Étape 4: Arduino Kode
- Étape 5: Application des formulaires Windows
- Étape 6: Matérialiste
- Étape 7: Fobindelsesdiagram / I/O Lliste
Vidéo: EAL - Industriel Internet - Fabrikshal : 7 étapes
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:09
Der er blevet fået stillet til opgave at implementere et automatiseret system ud fra industri 4.0 princippet. Je 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 jusqu'à lukke de pertinentee ind i fabrikshallen. Alt data, gemmes i en base de données i Wampserver.
Étape 1: RFID Kortlæser
Der er inkluderet 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 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 first når det nummer stemmer overens med det der er skrevet ind i koden.
Ni 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 jusqu'à l'ordre Arduinoens, den vil få vores Windows Forms applikation. Je den sammenhæng er lyset også fravalgt.
Étape 2: Servomoteur (Anlæg)
Je hallen er der en servomoteur, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan producteur forskellige produkter. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt i en base de données MySQL. Motoren kan køre ud i tre forskellige positionneur. Hver position symboliserer tre forskellige produkter. Nr produktet er fordigproduceret, kører motoren tilbage i null position, og afventer nye order. Det er meningen at man, via WPF applikationen kan afgive nye ordrer til motoren. Alt hvad bliver producteuret bliver gemt i en base de données MySQL.
Étape 3: Base de données MySQL - Indhold
Je base de données MySQL vil der være tre tabeller. Den premier titulaire 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 et 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 ordre, vil den blive sendt til Arduinoen, efterfølgende, vil den pertinente 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.
Étape 4: Arduino Kode
#comprendre
Servo myServo;
int servoPos; car produit = '0'; void setup() { myServo.attach(3); // La communication en série démarre Serial.begin(9600); } void loop() { // Læsning fra serial port product = Serial.read(); //Godkendelse af ingående ordrer switch(produkt) { // Produkt A (1) udføres i denne case case '1': myServo.write(50); retard(1000); monServo.write(0); retard(1000); Serial.println("Terminé"); Pause; // Produkt B (2) udføres i denne case case '2': myServo.write(100); retard(1000); monServo.write(0); retard(1000); Serial.println("Terminé"); Pause; // Produkt C (3) udføres i denne case case '3': myServo.write(150); retard(1000); monServo.write(0); retard(1000); Serial.println("Terminé"); Pause; } }
Étape 5: Application des formulaires Windows
utilisation de System;utilisation de System. Collections. Generic; en utilisant System. ComponentModel; en utilisant System. Data; en utilisant System. Drawing; en utilisant System. Linq; en utilisant System. Text; en utilisant System. Threading. Tasks; en utilisant System. Windows. Forms; en utilisant System. Collections; en utilisant System. IO. Ports; en utilisant MySql; en utilisant MySql. Data. MySqlClient;
espace 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 kune 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å af flere produktioner af et produkt, eller flere produkter. Seriel kommunikationen til Arduinoen bliver også la définir. Der bliver også oprettet en Class (BackgroundWorker). Den gør at en bestemt del af programmet bliver eksikveret gentagende gange i baggrunden. Je dette tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ Connexion MySqlConnection; chaîne connectionString;
numéro d'ordre privé;
private int[,] order = new int[100, 100]; private int sendOrder = new int[100]; chaîne privée prodType;
SerialPort sp = nouveau SerialPort();
private BackgroundWorker myWorker = new BackgroundWorker();
publique Form1()
{ InitializeComponent(); // Son bliver vores String (connectionString) defineret. connectionString = "server=192.168.1.100;userid=root;pwd=langeland;database=arduino;"; /* Son bliver variablen "myWorker" s'est assis jusqu'à logge på hvor langt divers bestillinger er i deres process. */ myWorker. DoWork += new DoWorkEventHandler(myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Son bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync(); // Son bliver der defineret hvilket format datoen kører i. Son meilleur formatet après la base de données MySQL. dateTimePicker1. CustomFormat = "aaaa-MM-jj"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }
private void Afgiv_Ordre_Click (expéditeur d'objet, 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 produitA = 1; int produitB = 2; int produitC = 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; }
pour (int prod1C = (prodA + prodB); prod1C 99)
{ numéro d'ordre = 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å longe at summen af den afsendte order ikke er lig med 0, vil dette while loop køre. */ Statut(); while (sendingOrder. Sum() != 0) { /* I dette for loop fungerer det således, at så longe 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 at variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat til 0. De eksikverede produkter bliver uploadet til databasen. Inden if sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i < envoiOrder. Length; i++) { Status(); sp. BaudRate = 9600; sp. NomPort = "COM4"; sp. Open(); sp. Write(sendingOrder. ToString()); // Programmet der er i en af disse if instructions, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). if (sendingOrder == 1) { prodType = "Produkt A"; } else if(sendingOrder == 2) { prodType = "Produkt B"; } else if(sendingOrder == 3) { prodType = "Produkt C"; }
envoiOrdre = 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 `produceret produkter`= (`produceret produkter` + 1), `manglende produkter`= (`manglende produkter` - 1)");
sp. Fermer();
Pause; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". Ni 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 product bliver overført til databasen. */ sp. ReadTo("Terminé");
DBQuery("INSERT INTO `udforte`(`Produkt type`) VALUES ('" + prodType + "')");
DBQuery("UPDATE `total` SET `produceret produkter`= (`produceret produkter` + 1), `manglende produkter`= (`manglende produkter` - 1)");
sp. Fermer(); Statut(); } } // 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 (test != 0) { for (int j = 0; j < 100; j++) { envoiCommande[j] = commande[i, j];
ordre[i, j] = 0;
}
Pause; } }
}
} /* Her er der oprettet et void ved navn "Status". Det er lavet for at skulle undgå at skrive de samme linjer kode flere steder. Je 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() { /* Son 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 = "sélectionner * du total"; MySqlCommand com = new MySqlCommand(str, con); Lecteur MySqlDataReader = 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. lecteur. Lire(); 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()); }); // Son 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 statement eksikveret. Hvis det er lig med 0, bliver der" udskrevet "0% label. if (int. Parse(reader["produceret produkter"]. ToString()) != 0) { // Son tager man de producteuret produkter og plusser med de manglende produkter. Resultatet af dette ganger man med cent, 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(); // Son résultat bliver af tidligere udregning lagt sur 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(object sender, EventArgs e) { string date = dateTimePicker1. Value. ToString(). Remove(10);
date = dateTimePicker1. Text;
string query = "SELECT `Produkt type`, `Tid` FROM udforte WHERE Tid >= '" + date + " 00:00:00' AND Tid <= '" + date + " 23:59:59'"; using (connection = new MySqlConnection(connectionString)) using (MySqlCommand command = new MySqlCommand(query, connection)) 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(query, connection)) { connection. Open();
command. ExecuteScalar();
connexion. Fermer();
} } } }
Étape 6: Matérialiste
1 stk. Arduino Uno
1 stk. Micro servo SG90 9g
Étape 7: Fobindelsesdiagram / I/O Lliste
Servomoteur:
+ = Rød
- = Trier
Signal = Grøn
Conseillé:
EAL - Collecte de données GPS de l'industrie 4.0 sur une voiture Rc : 4 étapes
EAL - Collecte de données GPS de l'industrie 4.0 sur une voiture Rc : dans ce Instructable, nous allons parler de la façon dont nous avons configuré un module GPS sur une voiture RC et publié les données collectées sur une page Web pour un contrôle facile. Nous avons déjà fait une instructable sur la façon dont nous avons fait notre voiture RC, qui peut être trouvée ici. Ceci utilise e
EAL - Embedded - Serrure à combinaison : 4 étapes
EAL- Embedded - Combinaison Lock: Ce projet est un projet scolaire, que j'ai fait pour choisir le sujet 2.1 C-programmation dans l'EAL. C'est la première fois que je fais un projet Arduino et de la programmation C. C'est un projet, qui présente une serrure à combinaison. Une serrure à combinaison
EAL - Programmation embarquée : Candy Mixer 1000 : 9 étapes
EAL - Programmation embarquée : Candy Mixer 1000 : Pour notre projet en Arduino nous avons décidé de faire un mixeur pour bonbons. L'idée est que l'utilisateur puisse appuyer sur un bouton, puis les moteurs commenceront à éjecter les bonbons dans un bol, et lorsque le programme aura suivi son cours, il s'arrêtera. Le premier jet w
EAL - Climat intérieur intégré : 5 étapes
EAL - Climat intérieur intégré : Pour notre projet d'école, nous avons été chargés d'intégrer un arduino dans un système automatisé. Nous avons choisi de fabriquer un capteur de climat intérieur, qui peut détecter la température, l'humidité et le niveau de décibels à l'intérieur. Nous avons percé quelques trous dans l'armoire
EAL - SmartStorage : 3 étapes
EAL - SmartStorage : il s'agit d'un projet pour SmartStorage de Kasper Borger Tulinius