Spisu treści:

EAL - Przemysłowy Internet - Fabrikshal: 7 kroków
EAL - Przemysłowy Internet - Fabrikshal: 7 kroków

Wideo: EAL - Przemysłowy Internet - Fabrikshal: 7 kroków

Wideo: EAL - Przemysłowy Internet - Fabrikshal: 7 kroków
Wideo: Дубай: земля миллиардеров 2024, Lipiec
Anonim
EAL - Przemysłowy Internet - Fabrikshal
EAL - Przemysłowy Internet - Fabrikshal
EAL - Przemysłowy Internet - Fabrikshal
EAL - Przemysłowy Internet - Fabrikshal
EAL - Przemysłowy Internet - Fabrikshal
EAL - Przemysłowy Internet - Fabrikshal

Teraz jest gotowy do pracy i wdrożenia i zautomatyzowania systemu dla zasady przemysłu 4.0. I denne opgave, er der lavet en lille symulacji af en fabrikshal. I hallen star der en servomotor, samt et par dioder. Udevendig, sidder der en RFID kortlæser, der skulle bruges til at lukke de relativee ind i fabrikshallen. Alt data, gemmes w bazie danych i Wampserver.

Krok 1: Kortlæser RFID

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

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. Zobacz, jak działa alternatywa dla styropianu w szeregowym porcie, w projektach Arduino Uno. Seryjnie przenieś, wejdź na stronę Arduinoens, aby uzyskać dostęp do innych aplikacji Windows Forms. I den sammenhæng er lyset også fravalgt.

Krok 2: Serwomotor (Anlæg)

Serwomotor (Anlæg)
Serwomotor (Anlæg)
Serwomotor (Anlæg)
Serwomotor (Anlæg)
Serwomotor (Anlæg)
Serwomotor (Anlæg)

Hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan Manufacturerer forskellige produkter. Zamówienie, samt antallet af de udførte produkty, bliver gemt w bazie danych MySQL. Motoren kan køre ud i tre forskellige pozycjoner. Wskaż symbole pozycji dla wszystkich produktów. Når produktet er færdigproduceret, kører motoren tilbage in nul position, og afventer nye ordrer. Det er meningen at man, via WPF applikationen kan afgive nye order til motoren. Alt hvad bliver producen bliver gemt w bazie danych MySQL.

Krok 3: Baza danych MySQL - Indhold

Baza danych MySQL - Indhold
Baza danych MySQL - Indhold
Baza danych MySQL - Indhold
Baza danych MySQL - Indhold
Baza danych MySQL - Indhold
Baza danych MySQL - Indhold

W bazie danych MySQL znajduje się wiele tabel. 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 table indenholder en oversigt over hvor mange producter der er producen, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende produkty er producen. Odnajduje aplikacje Windows Forms w złym stylu, które zawierają skale, wysyłają Arduinoen, same bazy danych. Når der bliver afgivet en ordrer, vil den bliver sendt til Arduinoen, efterfølgende, vil den related data blive logget in databasen. Der bliver sendt tre forskellige datatyper til databasen. En Integer, pl String, som bliver kaldt pl VarChar, w bazie danych. Der er også et TimeStamp, Det er en indstilling, der er tilføjet in databasen.

Krok 4: Kode Arduino

#włączać

Serwo myServo;

int serwoPos; znak produkt = '0'; void setup() { myServo.attach(3); // Komunikacja szeregowa uruchamia Serial.begin(9600); } void loop() { // Læsning fra serial port produkt = Serial.read(); //Godkendelse af ingående order switch(produkt) { // Produkt A (1) udføres w tej samej sprawie '1': myServo.write(50); opóźnienie (1000); myServo.write(0); opóźnienie (1000); Serial.println("Gotowe"); przerwa; // Produkt B (2) udføres i denne przypadek '2': myServo.write(100); opóźnienie (1000); myServo.write(0); opóźnienie (1000); Serial.println("Gotowe"); przerwa; // Produkt C (3) udføres i denne przypadek '3': myServo.write(150); opóźnienie (1000); mojeSerwo.write(0); opóźnienie (1000); Serial.println("Gotowe"); przerwa; } }

Krok 5: Aplikacja Windows Forms

za pomocą System; za pomocą System. Collections. Generic; przy użyciu System. ComponentModel; za pomocą System. Data; za pomocą System. Drawing; za pomocą System. Linq; za pomocą System. Text; za pomocą System. Threading. Tasks; za pomocą System. Windows. Forms; za pomocą System. Collections; za pomocą System. IO. Ports; za pomocą MySQL; przy użyciu MySql. Data. MySqlClient;

przestrzeń nazw WindowsFormsApp2

{ public częściowa klasa Form1: Form { /* To jest klasa bliver wszystkie publiczne zmienne 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 do det er i en order może być najlepszy we wszystkich innych produktach lub we wszystkich produktach. Seriel kommunikationen til Arduinoen bliver også defineret her. Der bliver også oprettet en Class (BackgroundWorker). Den grø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. */ połączenie MySqlConnection; ciąg połączenieString;

prywatny int ordrenummer;

private int[,] order = new int[100, 100]; prywatne int polecenie wysłania = nowe int[100]; prywatny łańcuch prodType;

SerialPort sp = nowy SerialPort();

prywatny BackgroundWorker myWorker = nowy BackgroundWorker();

publiczny formularz1()

{ InitializeComponent(); //Jej bliver vores String (connectionString) defineret. connectionString = "server=192.168.1.100;userid=root;pwd=langeland;database=arduino;"; /* Jej zmienna bliver „myWorker” siedziała aż do momentu, w którym znajduje się wiele różnych procesów tworzenia. */ myWorker. DoWork += new DoWorkEventHandler(myWorker_DoWork); myWorker. WorkerReportsProgress = prawda; myWorker. WorkerSupportsCancellation = true; // Jej bliver sam w sobie baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync(); // Jej bliver der defineret hvilket format datatoen kører i. Jej format jest najlepszy dzięki bazie danych MySQL. dateTimePicker1. CustomFormat = "rrrr-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click (nadawca obiektu, argumenty zdarzenia e)

{ /* Jej 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 dla 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(prodBOrz. Tekst); int prodC = int. Parse(prodCOrder. Text); int orderLength = prodA + prodB + prodC; /* Disse for loops bliver køen oprettet, således at ordrene bliver produceet i den rækkefølge, de er bestilt i. */ for (int prod1A = 0; prod1A < prodA; prod1A++) { zamówienie[liczba porządkowa, prod1A] = produktA; }

for (int prod1B = (prodA); prod1B < (prodB + prodA); prod1B++) { zamówienie[liczba porządkowa, prod1B] = produktB; }

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

{liczba porządkowa = 0; } // Her overføres de bestilte produkter til databasen. DBQuery("INSERT INTO `bestilteprod`(`Produkt A`, `Produkt B`, `Produkt C`) VALUES (" + prodA + ", " + prodB + ", " + prodC + ")"); // Jej overføres en oversigt over hvilke produkter der mangler at blive producenert, til databasen. DBQuery("UPDATE `total` SET `manglende producter`= (`manglende producter` +(" + (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) { /* Wydłuż i podsumuj odesłane zamówienie, które ma wartość 0, znajduje się podczas wykonywania pętli. */ Status(); while (sendingOrder. Sum() != 0) { /* Znajduję zapętlenie fungerer, które znajdują się w oczekiwaniu, na dłuższym etapie przewidzianym Integer (i) to pamiętaj o zakończeniu zadania na żądanie. 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 star i kolonnen. Tall bliver exikveret, i inden and variable rykker videre for the best collonne, Bliver den pågældende collonne sat do 0. Ekskluzowane produkty bliver przesłane do bazy danych. Inden if sætningerne bliver kommunikationen til Arduinoen åbnet, og den afgivet ordre bliver sendt til Arduinoen. */ for (int i = 0; i < WysyłanieZlecenia. Długość; i++) { Status(); sp. Szybkość transmisji = 9600; sp. PortName = "COM4"; sp. Otwórz(); sp. Write(SendingOrder. ToString()); // Programt der er i en af disse if disse if, 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"; }

WysyłanieOrder = 0;

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

DBQuery("AKTUALIZACJA 'całkowita' ZESTAW 'producent produkt'= ('produceret produkt' + 1), 'manglende produkt'= ('manglende produkt' - 1)");

sp. Zamknij();

przerwa; } /* Her afventes der at Arduinoen er færdig med ordren. Der kwitteres med et „zrobione”. 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 product bliver overført til databasen. */ sp. ReadTo("Gotowe");

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

DBQuery("AKTUALIZACJA 'całkowita' ZESTAW 'producent produkt'= ('produceret produkt' + 1), 'manglende produkt'= ('manglende produkt' - 1)");

sp. Zamknij(); Status(); } } // Znajduję się w pętli, aby przejść do następnego zadania z zaleceniem, aby uzyskać dodatkowe informacje, w przypadku wcześniejszego sprawdzenia (podsumowanie wcześniejszego zadania z 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++) { wysyłanieZamówienie[j] = zamówienie[i, j];

rząd[i, j] = 0;

}

przerwa; } }

}

} /* Jej 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å inkluderet i det void, med det andet kode, der kører i baggrunden. */ private void Status() { /* Jej dorosły człowiek MySQL połączył, dodawał inne tabele z całkowitą zawartością i sprawdzał wyniki. */ MySqlConnection con = new MySqlConnection(connectionString); con. Open(); string str = "wybierz * z sumy"; MySqlCommand com = new MySqlCommand(str, con); Czytnik MySqlDataReader = com. ExecuteReader(); // Ta funkcja jest dostępna w trybie Baggrundskoden w wersji tradycyjnej w CPU, og pl anden trad til resten af coden. czytelnik. Czytaj(); MissingProd. Invoke((MethodInvoker)delegate { // Jej bliver de manglande product, ten samt product er er er lavet, skrevet ud på applikationen. MissingProd. Text = "manglend producter: " + (czytnik["manglende product"]. ToString()); OrdereProd. Text = "Lawet produktu: " + (reader["produkt produktu"]. ToString()); }); // Jej bliver der implementer jest bardzo procentowy, można go znaleźć później. ProcenteDone. Invoke((MethodInvoker)deleguj { // W przypadku użycia metody My SQL w celu połączenia się z "produkcją produktu, który jest ustawiony na 0, jasnym, jeśli instrukcja jest wykonana. Jeśli jest ustawiony na 0, jasnym, że został utworzony do "0%" etykieta. if (int. Parse(reader["wyprodukowany produkt"]. ToString()) != 0) { // Jej tager man de producen producter og plusser med de manlende producter. Resultatet af dette ganger man med set, for at ProcenteDone. Text = Math. Round((float. Parse(reader["produkt produkcyjny"]. ToString()) /(float. Parse(reader["produkt produkcyjny"]. ToString()) + float. Parse(reader["manglende product"]. ToString()))) * 100). ToString();// Jej wynik bliver z opóźnieniem zmiany w procentach. progressBar1. Value = Int32. Parse(ProcenteDone. Text); } else { ProcenteDone. Text = "0%"; } });// Jej lukki MySQL połączyły się z czytnikiem. Close(); con. Close(); } // Znajduję nieważne bliver wszystkie produkty dla producenta på den valgte data, opóźnienie ud på a aplikacje. private void Vis_Produkter_Click_1(object sender, EventArgs e) { string date = dateTimePicker1. Value. ToString(). Remove(10);

data = dataTimePicker1. Text;

string query = "SELECT `Produkt type`, `Tid` FROM udforte WHERE Tid >= '" + data + " 00:00:00' AND Tid <= '" + data + " 23:59:59'"; using (connection = new MySqlConnection(connectionString)) using (MySqlCommand = new MySqlCommand(zapytanie, połączenie)) using (MySqlDataAdapter adapter = new MySqlDataAdapter(polecenie)) { DataTable prodTable = new DataTable(); adapter. Wypełnij(prodTable);

dataGridView1. DataSource = prodTable;

}

} // Znajduję void bliver MySQL forbindelsen styret. Den fungerer således i forbindelsen bliver åbnet, eksikverer, og lukkes. private void DBQuery(ciąg cmd) { ciąg zapytania = cmd; using (connection = new MySqlConnection(connectionString)) using (MySqlCommand polecenie = new MySqlCommand(zapytanie, połączenie)) { connection. Open();

polecenie. WykonajScalar();

połączenie. Zamknij();

} } } }

Krok 6: Lista materiałów

1 sztuka Arduino Uno

1 sztuka Mikro serwo SG90 9g

Krok 7: Fobindelsesdiagram / I/O Lliste

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

Siłownik:

+ = Rød

- = Sortuj

Sygnał = Grøn

Zalecana: