İçindekiler:

EAL - Endüstriyel İnternet - Fabrikshal: 7 Adım
EAL - Endüstriyel İnternet - Fabrikshal: 7 Adım

Video: EAL - Endüstriyel İnternet - Fabrikshal: 7 Adım

Video: EAL - Endüstriyel İnternet - Fabrikshal: 7 Adım
Video: Erfindungen aus Fulda - der erste Kleinwagen | Pioniere in Fulda | erlebnis hessen | doku 2024, Temmuz
Anonim
EAL - Endüstriyel İnternet - Fabrikshal
EAL - Endüstriyel İnternet - Fabrikshal
EAL - Endüstriyel İnternet - Fabrikshal
EAL - Endüstriyel İnternet - Fabrikshal
EAL - Endüstriyel İnternet - Fabrikshal
EAL - Endüstriyel İnternet - Fabrikshal

Industri 4.0 ilkesini uygulayan ve otomatize eden bir sistem. Ben denne opgave, er der lavet en lille simülasyon af en fabrikshal. Ben servo motor, samt et par dioder'ı hallen yıldız. Udevendig, sidder der en RFID kortlæser, der skulle bruges til, lukke de ilgilie ind i i fabrikshallen'de. Alt veriler, gemmes i en veritabanı i Wampserver.

Adım 1: RFID Kortlæser

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

Der er inkluderet ve RFID kortlæser. Hensigten er, ud fra de id numre der er på det kort, og den brik der er er med er skrevet ind i vores Arduino kodu. İlk ve son numaralar için en ayrıntılı bilgiler, en iyi ve en güvenli adresler, ilk ve son numaralar için geçerlidir.

Når kortlæseren verici 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 seri iletişim. Arduino Uno için derlenmiş seri bağlantı noktası, der er på projektets'deki ayrıntılar. Seriel porten, Arduinoens düzenine kadar skal også bruges, den vil få fra vores Windows Forms uygulaması. Ben sammenhæng er lyset også fravalgt.

Adım 2: Servomotor (Anlæg)

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

Arduino Uno'dan servo motor, der er styret. Den skalsimulere ve anlæg, der kan üreticisi forskellige produkter. Ordrerbeholdningen, samt antallet af de udførte produkter, bliver gemt ve MySQL veritabanı. Forskellige konumlandırıcı için motorlu araç. Hver pozisyon sembolleştirici tre forskellige produkter. Når produktet er færdigproduceret, kører motoren tilbage nul pozisyonu, ve afventer nye ordrer. Erkeklerde, WPF aplikasyonu aracılığıyla, motoren t e s ı r ı n ı n ı n e n e n e n e n e n e n e n e d e r e n e d e r e n e n e n e n e n e n e n e n e n e n e n e n e e n. MySQL veritabanında alt hvad bliver üreticisi bliver gemt.

Adım 3: MySQL Veritabanı - Indhold

MySQL Veritabanı - Indhold
MySQL Veritabanı - Indhold
MySQL Veritabanı - Indhold
MySQL Veritabanı - Indhold
MySQL Veritabanı - Indhold
MySQL Veritabanı - Indhold

I MySQL databasen vil der være tre tabeller. Den første tutucu, med hvilke produkter der er er bestilt, ve hvor yemlik. En anden tabel vil logge alle de udførte produkter. Dentje, ve sidste tabel hissedar ve yemlik üreticileri, ve üreticileri, ve yemliklerini denetleyen kişiler. Üretici ve üretici firmalar. Det er Windows Forms aplikationen der vil styre, hvad der skal Arduinoen, samt databasen gönderir. Arduinoen, efterfølgende, veri tabanından ilgili veri günlüğü ve veri tabanına gönder. Veri tabanı için veri tipi oluşturucuyu göndermek için der bliver. En Integer, tr String, som bliver kaldt en VarChar, i databasen. Der er også ve TimeStamp, Det er en indstilling, der er tilføjet ve databasen.

Adım 4: Arduino Kodu

#Dahil etmek

Servo myServo;

int servoPos; karakter ürünü = '0'; geçersiz kurulum() { myServo.attach(3); // Seri iletişim başlıyor Serial.begin(9600); } void loop() { // Seri port produkt = Serial.read(); //İlgili sipariş anahtarı(üretim) { // Ürün A (1) veri koruma durumu '1': myServo.write(50); gecikme(1000); myServo.write(0); gecikme(1000); Serial.println("Bitti"); kırmak; // Ürün B (2) udføres ve durum '2' durumu: myServo.write(100); gecikme(1000); myServo.write(0); gecikme(1000); Serial.println("Bitti"); kırmak; // Ürün C (3) udføres ve durum '3' durumu: myServo.write(150); gecikme(1000); myServo.write(0); gecikme(1000); Serial.println("Bitti"); kırmak; } }

Adım 5: Windows Forms Uygulaması

System'i kullanma;System. Collections. Generic'i kullanma; System. ComponentModel kullanarak; System. Data kullanarak; System. Drawing'i kullanarak; System. Linq kullanarak; System. Text'i kullanarak; System. Threading. Tasks kullanarak; System. Windows. Forms'u kullanarak; System. Collections'ı kullanarak; System. IO. Port'ları kullanarak; MySql kullanarak; MySql. Data. MySqlClient'i kullanarak;

ad alanı WindowsFormsApp2

{ public kısmi class Form1: Form { /* I denne class bliver alle public değişken oprettet. Herunder er der oprett en Class (MySqlConnection) der skal tages i brug, MySQL serveren için kunne oprette forbindelse için. Oprettet tr String (connectionString) den bruges 'da tanımlı hvilken bruger der skal på ve parola, ve hvilken veritabanı der er tale om. Der er oprett en tamsayı, i et 2d dizisi (sıra). Grunden til d er er en ordrer şirketinde en iyi üreticilerdendir. Arduino ile iletişim serileri onu tanımlıyor. Der bliver også oprettet en Class (BackgroundWorker). Den gør at en bestemt del af programt bliver eksikveret gentagende gange i baggrunden. Ben det tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ MySqlConnection bağlantısı; string bağlantıString;

özel int ordrenummer;

private int[,] sıra = yeni int[100, 100]; özel int sendOrder = yeni int[100]; özel dize prodType;

SerialPort sp = yeni SerialPort();

özel BackgroundWorker myWorker = new BackgroundWorker();

genel Form1()

{ Bileşeni Başlatma(); //Bliver vores String (connectionString) tanımlı. connectionString = "sunucu=192.168.1.100;userid=root;pwd=langeland;database=arduino;"; /* Onun bliver değişkeni "myWorker", çeşitli bestillinger er i deres süreçlerinde oturum açtı. */ myWorker. DoWork += yeni DoWorkEventHandler(myWorker_DoWork); myWorker. WorkerReportsProgress = doğru; myWorker. WorkerSupportsCancellation = true; // Her bliver benliği baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync(); // Onun bliver der defineret hvilket formatı datoen kører i. MySQL veritabanından sonra onun formatı en iyisidir. dateTimePicker1. CustomFormat = "yyyy-AA-gg"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

özel geçersiz Afgiv_Ordre_Click(nesne gönderici, EventArgs e)

{ /* Her er der oprette nogle değişkeni, der kun bliver brugt i dette void. De tre første er Tamsayılar der skal tanımlı hvilket produkt der er tale om. kunne skrive det antal man ønsker'de, ind i aplikationen'de de næste tre er oprettet. Den sidste er oprettet için en iyi længde på den pågældende ordre. */ int ürünA = 1; int ürünB = 2; int ürünC = 3; int prodA = int. Parse(prodAOOrder. Text); int prodB = int. Parse(prodBOOrder. Text); int prodC = int. Parse(prodCOorder. Text); int orderLength = prodA + prodB + prodC; /* Döngüler için bliver køen oprett, således at ordrene bliver Produceret i den rækkefølge, de er bestilt i. */ for (int prod1A = 0; prod1A < prodA; prod1A++) { sipariş[ordrenummer, prod1A] = produktA; }

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

için (int prod1C = (prodA + prodB); prod1C 99)

{ ordrenummer = 0; } // Veri tabanına kadar en iyi üretim alanları. DBQuery("INSERT INTO `bestilteprod`(`Produkt A`, `Produkt B`, `Produkt C`) DEĞERLER (" + prodA + ", " + prodB + ", " + prodC + ")"); // Veri tabanına kadar, blive prodüktörert'teki hvilke produkter der mangler üzerindeki denetimi ve denetimi. DBQuery("UPDATE `toplam` SET `manglende prodükter`= (`manglende prodükter` +(" + (prodA+prodB+prodC) + ")) NEREDE 1"); }

// Void er alt det kode der skal køre i baggrunden, gecikme ind.

private void myWorker_DoWork(object sender, EventArgs e) { while (true) { /* En son durum, 0, vil dette while loop køre. */ Durum(); while (sendingOrder. Sum() != 0) { /* I dete for loop fungerer det således, at så længe den oprettede Integer (i) er mindre end, vil det eksikvere. Değişken (i) temel değişkenler, dizilişler, temel değişkenler. Den kigger i kolonnen, ser hvilket tal der står i kolonnen. Tallet bliver eksikveret, og inden ve rykker videre til næste kolonne, bliver den pågældende kolonne sat til 0. Veri tabanına kadar eksikverede produkter bliver uploadet. Arduinoen'e göre daha iyi iletişim kurar, Arduino'ya gönderilir. */ for (int i = 0; i < sendOrder. Length; i++) { Status(); sp. BaudHızı = 9600; sp. PortAdı = "COM4"; sp. Open(); sp. Write(sendingOrder. ToString()); // Programmet der er i en af disse if deyimleri, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er ideğişkeni (i). if (sendingOrder == 1) { prodType = "Ürün A"; } else if(sendingOrder == 2) { prodType = "Ürün B"; } else if(sendingOrder == 3) { prodType = "Ürün C"; }

gönderenSipariş = 0;

// Arrayet samlet giver 0, bliver de udførte produkter uploadet i databasen, og komunikationen til Arduinoen, bliver lukket için eksik veri eksikliği. if (sendingOrder. Sum() == 0) { DBQuery("INSERT INTO `udforte`(`Produkt type`) DEĞERLER ('" + prodType + "')");

DBQuery("GÜNCELLEME 'toplam' SET 'üretici üretici'= ('üretici üretici' + 1), 'değişken üretici'= ('ürün üretici' - 1)");

sp. Kapat();

kırmak; } /* Arduinoen er færdig med ordren'deki ilgi alanları. Der kvitteres med ve "bitti". Veritabanlarına göre daha fazla bilgi, veri tabanına göre daha fazla bilgi için, veri tabanına göre daha fazla veri tabanına sahiptir. */ sp. ReadTo("Bitti");

DBQuery("INSERT INTO `udforte`(`Produkt type`) DEĞERLER ('" + prodType + "')");

DBQuery("GÜNCELLEME 'toplam' SET 'üretici üretici'= ('üretici üretici' + 1), 'değişken üretici'= ('ürün üretici' - 1)");

sp. Kapat(); Durum(); } } // 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 = sipariş[i, 0]; if (test != 0) { for (int j = 0; j < 100; j++) { sendOrder[j] = order[i, j];

sıra[i, j] = 0;

}

kırmak; } }

}

} /* Her er der oprett et void ved navn "Durum". Skrive de samme linjer kode flere steder'da skulle undgå'da det er lavet. Ben skrive'de "Durum" olarak tanımlıyorum. */ 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 = "toplamdan * seç"; MySqlCommand com = new MySqlCommand(str, con); MySqlDataReader okuyucu = com. ExecuteReader(); // Denne funktion er med for dele Baggrundskoden på en tråd i CPU'en, o en anden tråd til resten af kodden. okuyucu. Oku(); MissingProd. Invoke((MethodInvoker)delegate { // Her şeyi hazırlayan, en iyi ve en iyi prodüktiviteler, skrevet ve på applikationen.); OrdereProd. Text = "üretici lavet: " + (okuyucu["üretici üretici"]. ToString()); }); // Onun bliver der uygulayıcısı hvad procentbaren, skal udfyldes sonra. ProcenteDone. Invoke((MethodInvoker)delegate { // Hvis læseren i My SQL forbindelsen læser at "produceret produkter ikke er lig med 0, bliver denne if deyimi eksikveret. Hvis det er lig med 0, bliver der udskrevet "0%" etiket. if (int. Parse(reader["produceret produkter"]. ToString()) != 0) { // Her prodüktörün prodüktör ve produkter produkter. 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 bir bliver sonucu ve tidligere, procentbaren üzerinde gecikmeli. progressBar1. Value = Int32. Parse(ProcenteDone. Text); } else { ProcenteDone. Text = "0%"; } });// Onun MySQL forbindelsen. güncel veriler, gecikme ve geçmiş veriler uygulama private void Vis_Produkter_Click_1(nesne gönderici, EventArgs e) { string tarih = dateTimePicker1. Value. ToString(). Remove(10);

tarih = tarihTimePicker1. Text;

string sorgu = " 'Ürün tipi' SEÇ, 'Tid' udforte WHERE Tid >= '" + tarih + " 00:00:00' AND Tid <= '" + tarih + " 23:59:59'"; kullanarak (connection = new MySqlConnection(connectionString)) kullanarak (MySqlCommand komutu = new MySqlCommand(sorgu, bağlantı)) kullanarak (MySqlDataAdapter adaptörü = new MySqlDataAdapter(command)) { DataTable prodTable = new DataTable(); adaptör. Fill(prodTable);

dataGridView1. DataSource = prodTable;

}

} // Void bliver MySQL forbindelsen stilini tespit ediyorum. forbindelsen bliver åbnet'te fungerer således, eksikverer, og lukkes. private void DBQuery(string cmd) { string sorgu = cmd; kullanarak (connection = new MySqlConnection(connectionString)) kullanarak (MySqlCommand komutu = new MySqlCommand(sorgu, bağlantı)) { connection. Open();

komut. ExecuteScalar();

bağlantı. Kapat();

} } } }

Adım 6: Materyalist

1 stk. Arduino Uno

1 stk. Mikro servo SG90 9g

Adım 7: Fobindelses diyagramı / G/Ç Listesi

Fobindelses diyagramı / G/Ç Listesi
Fobindelses diyagramı / G/Ç Listesi

Servomotor:

+ = Rod

- = Sırala

Sinyal = Grøn

Önerilen: