INHOUDSOPGAWE:

EAL - Industriel Internet - Fabrikshal: 7 stappe
EAL - Industriel Internet - Fabrikshal: 7 stappe

Video: EAL - Industriel Internet - Fabrikshal: 7 stappe

Video: EAL - Industriel Internet - Fabrikshal: 7 stappe
Video: System Of A Down - Toxicity (Official HD Video) 2024, Julie
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

Daar is nog steeds 'n stelsel vir die implementering van 'n automatisering van 'n 4.0 -beginsel. Ek het hierdie opgawe gemaak, en daar word 'n klein simulasie van 'n fabriek gemaak. Ek staan daar en servomotor, en et par dioder. Uitsonderlik, sidder der en RFID -kortlæser, wat daaroor gebruik kan word om relevante sake in die fabriek te behaal. Al die gegewens, eienskappe en databases in Wampserver.

Stap 1: RFID -kortlæser

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

Daar is 'n kombinasie van RFID -kortlesers. Hensigten is at ud fra de id numre der is in die kort, en die brik daar is med geskryf in ons Arduino kode. Dit kan gedoen word wanneer kortlæseren 'n brik of et kort kan opneem, en die eenheids ID-nommer kan eers goedgekeur word wanneer die nommer stemme ooreenstem met dit wat in die kode geskryf is.

Wanneer kortlæseren giver toegang, kan ons dit in fabriek lys. Lyset slukkes igen, wanneer en eenheid, daar is goedkeuring van kortlæseren, word detekteret.

Kortlæseren word verwydering van die projek, wat die kommunikasie van seriele kommunikasie moontlik maak. Dit is een van die belangrikste oplossings vir die seriële poort, en daar is projekte vir Arduino Uno. Seriele kan ook gebruik word vir Arduinoens -programme, en dit kan van ons Windows -vorms -toepassings verkry word. Ek het saamhang dat dit ook fravalgt is.

Stap 2: Servomotor (aanleg)

Servomotor (aanleg)
Servomotor (aanleg)
Servomotor (aanleg)
Servomotor (aanleg)
Servomotor (aanleg)
Servomotor (aanleg)

Ek het 'n servomotor, 'n bestuurder van 'n Arduino Uno. Die skalsimulere en die vervaardiging van verskillende produkte. Ordrerbeholdningen, en algehele uit die uitgevoerde produkte, word gemy in 'n MySQL -databasis. Motors kan verskillende posisies gebruik. Elke posisie simboliseer drie verskillende produkte. Wanneer die produk 'n volledige vervaardigingsproses het, kan die motor in my posisie teruggehou word en kan u nuwe posisies bekom. Dit is 'n mening oor die mens, via WPF -toepassings kan u nuwe motorbestuurders kry. Alles wat produsent word, word gemt in 'n MySQL -databasis.

Stap 3: MySQL -databasis - Behou

MySQL -databasis - Behou
MySQL -databasis - Behou
MySQL -databasis - Behou
MySQL -databasis - Behou
MySQL -databasis - Behou
MySQL -databasis - Behou

Ek MySQL databasis sal daar drie tabelle wees. Die eerste houer kan gebruik word vir watter produkte daar bestel, en hoe baie. En 'n ander tabel sal al die uitgemaakte produkte aanteken. Die derde en laaste tabel bevat 'n oorsig oor hoeveel produkte daar vervaardig word, en hoeveel mangels daar is. Ydermere is daar en vir 'n tyd waarop die produkte by die produksie kom. Dit is 'n vorm van Windows -toepassings wat u wil stuur, wat ons vir u kan stuur, asook databasisse. Wanneer daar 'n gegewe en gegewens word, sal dit na Arduinoen gestuur word, en daarna sal die relevante data logget in databases word. Daar word drie verskillende gegewens vir databasisse gestuur. 'N Heelgetal, 'n String, wat in VarChar, in die databasis gekald word. Daar is ook 'n tydstamp, 'n instelling en 'n databasis.

Stap 4: Arduino Kode

#insluit

Servo myServo;

int servoPos; char produkt = '0'; ongeldige opstelling () {myServo.attach (3); // Seriële kommunikasie begin Serial.begin (9600); } leemte -lus () {// Uitvoer van seriële poortprodukt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) word in hierdie geval '1' gebruik: myServo.write (50); vertraging (1000); myServo.write (0); vertraging (1000); Serial.println ("Klaar"); breek; // Produk B (2) verskyn in hierdie geval '2': myServo.write (100); vertraging (1000); myServo.write (0); vertraging (1000); Serial.println ("Klaar"); breek; // Produkt C (3) word in hierdie geval '3' gebruik: myServo.write (150); vertraging (1000); myServo.write (0); vertraging (1000); Serial.println ("Klaar"); breek; }}

Stap 5: Windows Forms -toepassing

met behulp van System; met behulp van System. Collections. Generic; met behulp van System. ComponentModel; met behulp van System. Data; met behulp van System. Teken; met behulp van System. Linq; met behulp van System. Text; met behulp van System. Threading. Tasks; met behulp van System. Windows. Forms; met behulp van System. Collections; met behulp van System. IO. Ports; met behulp van MySql; met behulp van MySql. Data. MySqlClient;

naamruimte WindowsFormsApp2

{openbare gedeeltelike klas Vorm1: Vorm { /* Hierdie klas word alle publieke veranderlikes opgestel. Hieronder is daar 'n oprigting in die klas (MySqlConnection) wat ek kan gebruik om 'n verbinding te maak met MySQL -bedieners. Daar word 'n opstel en 'n string (verbindingString) gebruik om te bepaal watter gebruikers die wagwoord kan gebruik, en watter databasis daar is. Daar word 'n heelgetal opgestel, en 'n 2d -skikking (orde). Ons kan meer as een produksie of produk of meer produkte bestel. Reëlkommunikasie totdat Arduinoen haar ook definieer. Daar word ook 'n klas (BackgroundWorker) opgestel. Dit kan 'n definitiewe deel van die program in die agtergrond word. Ek kan in hierdie gevalle 'n brug gebruik, wat 'n nuwe ordrer kan oprig met kort tussenrum. */ MySqlConnection -verbinding; string connectionString;

private int ordrenummer;

private int [,] order = nuwe int [100, 100]; private int sendingOrder = nuwe int [100]; private string prodType;

SerialPort sp = nuwe SerialPort ();

private BackgroundWorker myWorker = nuwe BackgroundWorker ();

openbare vorm1 ()

{InitializeComponent (); // Haar word ons String (connectionString) definieret. connectionString = "bediener = 192.168.1.100; userid = root; pwd = langeland; databasis = arduino;"; /* Haar veranderlike "myWorker" het tot dusver 'n aantekening gemaak oor hoe ver uiteenlopende bestillers dit kan doen. */ myWorker. DoWork += nuwe DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Haar word eintlik baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Haar word der defineret watter formaat datoen kører i. Dit is beslis bepaal na MySQL -databasis. dateTimePicker1. CustomFormat = "jjjj-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private leegte Afgiv_Ordre_Click (voorwerp sender, EventArgs e)

{ /* Hier is 'n paar veranderlikes wat in hierdie leegstelling gebruik kan word. Die eerste eerste is dat heelgetalle 'n spesifieke produk daaroor moet vertel. Die volgende drie is opgerig vir 'n aantal skryfbehoeftes, en kan ek inskryf. Die laaste is opgestel om 'n maksimum lengte van die bestaande ordre te kry. */ 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); int orderLength = prodA + prodB + prodC; /* I dis for loops bliver køen oprettet, dus at ordrene bliver produceret in the reeksfølge, de er bestilt i. */ for (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Haar beste produkte vir databasisse word aangebied. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) WAARDES (" + prodA + "," + prodB + "," + prodC + ")"); // Haar oorkoepelende en oorsig oor watter produkte daar ontbreek, kan tot databasisse lei. DBQuery ("UPDATE` totaal` SET `manglende produkte` = (` manglende produkte` +(" +(prodA +prodB +prodC) +")) WAAR 1 "); }

// Ek kan dit in die agtergrond vir die agtergrond laat plaas, wat in die indeling geplaas word.

private void myWorker_DoWork (object sender, EventArgs e) {while (true) { /* Så lenge at summen of the afsendte ordre not er lig with 0, vil this while loop drive. */ Status (); while (sendingOrder. Sum ()! = 0) { /* I dette for loop works det also, at so long the oprettede Integer (i) is less end endden on the afgivet ordre, vil it eksikvere. Variablen (i) kan die reeks in die reeks in die reeks plaasvind, wat tans plaasvind. Die kigger in kolonnen, wat ons in die kolonne kan sien. Tallet word eksikveret, en kan ook veranderlik ryker word tot die volgende kolonne, en dit word moontlik tot 0. Die eksekverede produkte word opgelaai na databasisse. Inderdaad, as die komende kommunikasie met Arduinoen oopgemaak word, en die gegewens ordre word na Arduinoen gestuur. */ for (int i = 0; i <sendingOrder. Length; i ++) {Status (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Open (); sp. Write (sendingOrder . ToString ()); // Programme der er i en of these if statements, vil blive eksikveret, kan veroorsaak dat ek iets van et tot tre der in variablen (i) kan hê. if (sendingOrder == 1) {prodType = "Produkt A"; } anders as (sendingOrder == 2) {prodType = "Produkt B"; } anders as (sendingOrder == 3) {prodType = "Produkt C"; }

sendingOrder = 0;

// Wanneer die hele reeks in 'n reeks geskenke geverf word 0, word die uitgevoerde produkte in databases opgelaai, en kan dit vir Arduinoen gekombineer word. if (sendingOrder. Sum () == 0) {DBQuery ("INVOER IN` udforte` (`Produkt tipe`) WAARDES ('" + prodType + "')");

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

sp. Close ();

breek; } /* Her afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "done". Wanneer dit ontvang word, word die uitvoer nog meer gegenereer vir databasisse. */ sp. ReadTo ("Klaar");

DBQuery ("INSERT IN` udforte` (`Produkt type`) WAARDES ('" + prodType + "')");

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

sp. Close (); Status (); }} // // I dette for lus word daar 'n nuwe reeks met ordre tot eksikvering, wanneer die voorgaande reeks ereksikveret word (summen of foregående series is lig with 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 ++) {sendingOrder [j] = order [i, j];

bestelling [i, j] = 0;

}

breek; }}

}

} /* Hier is die naam en status van die status "ongeldig". Daar word gemaak dat dit moontlik is om dieselfde lynkode meer plekke te skryf. Ek kan in plaas daarvan 'n status met 'status' noem, en dit kan ook in void, met ander kodes en agtergronde ingesluit word. * / private void Status () { /* Haar openingsman MySQL -verbindings, kies al die tabelle van die totale totaal, en ekseer die voorspørgsel. */ MySqlConnection con = nuwe MySqlConnection (connectionString); con. Open (); string str = "kies * uit totaal"; MySqlCommand com = nuwe MySqlCommand (str, con); MySqlDataReader reader = com. ExecuteReader (); // Hierdie funksie is ook geskik vir die deel van 'n draad in CPU en 'n ander draad vir die res van die kode. leser. Lees (); MissingProd. Invoke ((MethodInvoker) afgevaardigde {// Her word de manglende products, samt products der is made, written out on applikationen. MissingProd. Text = "manglende products:" + (reader ["manglende products"]. ToString ()); OrdereProd. Text = "produkte gemaak:" + (reader ["produceret products"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) afgevaardigde {// As ek in my SQL -verbindings lees by "produceret products not are lig with 0, blir this if statement eksikveret. If it is lig with 0, bliver der udskrevet" 0%"geskryf label. if (int. Parse (reader ["produceret products"]. ToString ())! = 0) {// Her tager man the produceret products and plusser with the manglende products. Resultaten of this times man with hundred, for at få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (reader ["produceret products"]. ToString ()) /(float. Parse(reader["produceret products "]. ToString ()) + float. Parse (reader ["manglende produkter"]. ToString ()))) * 100). ToString (); // Haar resultate word vroeër opgespoor oor persentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} anders {ProcenteDone. Text = "0%";}}); // Her lukkes MySQL verbindelsen. reader. Close (); con. Close ();} // I dette void blir alle produkter, der is produceret op die valgte dato, lagt ud på a pplikationen. private leemte Vis_Produkter_Click_1 (voorwerp sender, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Verwyder (10);

date = dateTimePicker1. Text;

string query = "SELECT 'Produkt type`,` Tid` FROM udforte WHERE Tid> =' " + date +" 00:00:00 'AND Tid <=' " + date +" 23:59:59 '"; met behulp van (verbinding = nuwe MySqlConnection (connectionString)) met behulp van (MySqlCommand -opdrag = nuwe MySqlCommand (navraag, verbinding)) met behulp van (MySqlDataAdapter -adapter = nuwe MySqlDataAdapter (opdrag)) {DataTable prodTable = nuwe DataTable (); adapter. Vul (prodTabel);

dataGridView1. DataSource = prodTable;

}

} // Ek maak dit leeg om MySQL -verbindings te bestuur. Die funksies dus om verbindings word oop, eksikver en lukkes. private leegte DBQuery (string cmd) {string query = cmd; met behulp van (verbinding = nuwe MySqlConnection (connectionString)) met behulp van (MySqlCommand -opdrag = nuwe MySqlCommand (navraag, verbinding)) {connection. Open ();

command. ExecuteScalar ();

verbinding. Close ();

} } } }

Stap 6: Materiaallys

1 stk. Arduino Uno

1 stk. Mikro servo SG90 9g

Stap 7: Fobindelsesdiagram / I / O -lys

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

Servomotor:

+ = Rød

- = Sorteer

Sein = Grøn

Aanbeveel: