Daftar Isi:

EAL - Industriel Internet - Fabrikshal: 7 Langkah
EAL - Industriel Internet - Fabrikshal: 7 Langkah

Video: EAL - Industriel Internet - Fabrikshal: 7 Langkah

Video: EAL - Industriel Internet - Fabrikshal: 7 Langkah
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, November
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 er blevet fået stillet til opgave at implementer et automatiseret system ud fra industri 4.0 prinsip. I denne opgave, er der lavet en lille simulation af en fabrikshal. Saya hallen står der en servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges til at lukke de relevane ind i fabrikshallen. Alt data, gemmes di database dan Wampserver.

Langkah 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 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. Serial porten, skal også bruges til Arduinoens ordrer, dan aplikasi Windows Forms. I den sammenhæng er lyset ogs fravalgt.

Langkah 2: Servomotor (Anlæg)

Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)
Servomotor (Anlæg)

Saya 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 database MySQL. Motoren kan køre ud i tre forskellige positioner. Posisi simboliserer 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 aplikasi WPF kan afgive nye ordrer til motoren. Alt hvad bliver producerret bliver gemt di database MySQL.

Langkah 3: Database MySQL - Indhold

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

I MySQL databasen vil der være tre tabeller. Pemegang pertama adalah produk terbaik, dan kudis. En anden tabel vil logge alle de udførte produkter. Den tredje, og sidste tabel indenholder en oversigt over hvor mange der er producer, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende produkter er producer. Det er Windows Forms applikationen der vil styre, hvad der skal sendes Arduinoen, samt databasen. Informasi lebih lanjut, terima dan pesan, kirim ke Arduino, seterusnya, data yang relevan dengan log dan database. Der bliver sendt tre forskellige datatyper til databasen. En Integer, en String, som bliver kaldt en VarChar, dan databasen. Der er ogs et TimeStamp, Det er en indstilling, der er tilføjet i databasen.

Langkah 4: Kode Arduino

#termasuk

Servo myServo;

int servoPos; grafik produk = '0'; void setup() { myServo.attach(3); // Komunikasi serial memulai Serial.begin(9600); } void loop() { // Menggunakan port serial produkt = Serial.read(); //Godkendelse af ingående ordrer switch(produkt) { // Produkt A (1) udføres i denne case case '1': myServo.write(50); penundaan (1000); myServo.write(0); penundaan (1000); Serial.println("Selesai"); merusak; // Produk B (2) udføres i denne case case '2': myServo.write(100); penundaan (1000); myServo.write(0); penundaan (1000); Serial.println("Selesai"); merusak; // Produk C (3) udføres i denne case case '3': myServo.write(150); penundaan (1000); myServo.write(0); penundaan (1000); Serial.println("Selesai"); merusak; } }

Langkah 5: Aplikasi Formulir Windows

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

namespace WindowsFormsApp2

{ public partial class Form1: Form { /* I denne class bliver alle public variabler oprettet. Di bawah er der oprettet en Class (MySqlConnection) der skal tages saya kasar, untuk di kunne oprette forbindelse til MySQL serveren. Anda dapat menggunakan String (connectionString) dan bruges hingga di definisikan hvilken bruger der skal på og password, dan database hvilken 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 produser af et produkt, eller flere produkter. Komunikasi serial sampai Arduinoen bliver dan tentukan sendiri. Der bliver også oprettet en Class (BackgroundWorker). Den gør at en bestemt del af programt bliver eksikveret gentagende gange i baggrunden. I dette tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ Koneksi MySqlConnection; koneksi stringString;

int ordrenummer pribadi;

private int[,] order = new int[100, 100]; private int sendOrder = new int[100]; prodType string pribadi;

SerialPort sp = SerialPort baru();

private BackgroundWorker myWorker = BackgroundWorker baru();

Formulir1 publik()

{ Inisialisasi Komponen(); //Bliver vores String (connectionString) defineret. connectionString = "server=192.168.1.100;userid=root;pwd=langeland;database=arduino;"; /* Variabel bliver nya "myWorker" duduk sampai di logge på hvor langt beragam beststillinger er i deres proses. */ myWorker. DoWork += new DoWorkEventHandler(myWorker_DoWork); myWorker. WorkerReportsProgress = benar; myWorker. WorkerSupportsCancellation = true; // Bliver self-nya baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync(); // Bliver der defineret hvilket format datoen kører i. Formatnya terbaik setelah database MySQL. dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click(pengirim objek, 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 produk 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 untuk di få en længde på den pågældende ordre. */ int produkA = 1; int produkB = 2; int produkC = 3; int prodA = int. Parse(prodAOrder. Teks); int prodB = int. Parse(prodBOrder. Teks); int prodC = int. Parse(prodCOrder. Teks); int orderLength = prodA + prodB + prodC; /* Saya disse for loops bliver køen oprettet, således at ordrene bliver producer 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; }

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

{ nomor urut = 0; } // Produk terbaiknya hingga databasen. DBQuery("INSERT INTO `bestilteprod`(`Produkt A`, `Produkt B`, `Produkt C`) VALUES (" + prodA + ", " + prodB + ", " + prodC + ")"); // 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(pengirim objek, 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. Variabel (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, dan inden at variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat til 0. De eksikverede produk bliver uploadet til databasen. Inden if sætningerne bliver communikationen 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. Buka(); sp. Write(sendingOrder. ToString()); // Programme 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 (sendingOrder == 1) { prodType = "Produkt A"; } else if(sendingOrder == 2) { prodType = "Produkt B"; } else if(sendingOrder == 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, 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. Tutup();

merusak; } /* Aventes der nya di Arduinoen er færdig med ordren. Der kvitteres med et "selesai". Tidak ada 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 produk bliver overfrt til databasen. */ sp. ReadTo("Selesai");

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

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

sp. Tutup(); 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 = order[i, 0]; if (uji != 0) { for (int j = 0; j < 100; j++) { sendOrder[j] = order[i, j];

urutan[i, j] = 0;

}

merusak; } }

}

} /* Her er der oprettet et void ved navn "Status". Det er lavet for at skulle undgå at skrive de samme linjer kode flere steder. Saya 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, dan eksikverer den forespørgsel. */ MySqlConnection con = new MySqlConnection(connectionString); con. Buka(); string str = "pilih * dari total"; MySqlCommand com = new MySqlCommand(str, con); Pembaca MySqlDataReader = com. ExecuteReader(); // Fungsi untuk di dele Baggrundskoden på en tråd i CPU'en, og en anden tråd til resten af koden. pembaca. Baca(); MissingProd. Invoke((MethodInvoker)delegate { // Her bliver de manglende produk, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produk: " + (reader["manglende produk"]. ToString()); OrdereProd. Text = "produkter lavet: " + (reader["produceret produkter"]. ToString()); }); // 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%" skrevet "0%" label.if (int. Parse(reader["produceret produkter"]. ToString()) != 0) { // Her tager man de producer produk og plusser med de manglende produkter. Resultatet af dette ganger man med seratus, untuk at få det ud i procent. ProcenteDone. Text = Math. Round((float. Parse(reader["produceret produk"]. ToString()) /(float. Parse(reader["produceret produkter"]. ToString()) + float. Parse(reader["manglende produkter"]. ToString()))) * 100). ToString(); // Hasil bliver nya setelah tidligere udregning lag di atas 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 producer på den valgte dato, lagt ud på a aplikasi private void Vis_Produkter_Click_1(pengirim objek, EventArgs e) { string date = dateTimePicker1. Value. ToString(). Remove(10);

tanggal = dateTimePicker1. Text;

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

dataGridView1. DataSource = prodTable;

}

} // Saya menemukan void bliver MySQL forbindelsen styret. Den fungerer således di forbindelsen bliver bnet, eksikverer, og lukkes. private void DBQuery(string cmd) { string query = cmd; using (koneksi = new MySqlConnection(connectionString)) using (MySqlCommand command = new MySqlCommand(query, connection)) { connection. Open();

perintah. ExecuteScalar();

koneksi. Tutup();

} } } }

Langkah 6: Daftar bahan

1 st. Arduino Uno

1 st. Servo mikro SG90 9g

Langkah 7: Fobindelsesdiagram / I/O Lliste

Diagram Fobindelses / I/O Lliste
Diagram Fobindelses / I/O Lliste

Motor servo:

+ = Rød

- = Urutkan

Sinyal = Grøn

Direkomendasikan: