Sisukord:

EAL - tööstuslik Internet - Fabrikshal: 7 sammu
EAL - tööstuslik Internet - Fabrikshal: 7 sammu

Video: EAL - tööstuslik Internet - Fabrikshal: 7 sammu

Video: EAL - tööstuslik Internet - Fabrikshal: 7 sammu
Video: Раскрываю секрет вкусного шашлыка от А до Я. Шашлык из баранины 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

Saad erbelle falleet stiilis kuni opgave ja rakendamise ja automaatse süsteemi ud fra industri 4.0 princippet. Ma ei tea, kas see on simulatsioon ja fabrikshal. I hallen står der en servomotor, samt et par dioder. Udevendig, sidder der en en RFID kortlæser, der skulle bruges til and lukke de relevante ind i fabrikshallen. Alternatiivsed andmed, pärlid ja andmebaas Wampserveris.

1. samm: RFID Kortlæser

RFID Korter
RFID Korter
RFID Korter
RFID Korter

In er inkluderet ja RFID korterisse. Hensigten er at ud fra de id numre der er på det kort, og den brik der er med skrevet ind i vores Arduino kode. Täpsemalt ja ilma korterite opfanger en brik eller et kort, kigger den på enhedens id-nummer, and 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 jah, når en enhed, der er godkendt af kortlæseren, bliver detekteret.

Kortlæseren bliver fjernet fra projektet, da den kører seriel communication. Det vil sige at der kan opstå forstyrrelser på den seriel port, der er på projektets Arduino Uno. Seriel porten, skal også bruges til Arduinoens ordrer, den vil få fra vores Windows Forms applikation. I den sammenhæng er lyset også fravalgt.

2. samm: servomootor (Anlæg)

Servomootor (Anlæg)
Servomootor (Anlæg)
Servomootor (Anlæg)
Servomootor (Anlæg)
Servomootor (Anlæg)
Servomootor (Anlæg)

I hallen er der en servomotor, der er styret af en Arduino Uno. Den skalsimulere et anlæg, der kan produrer forskellige produkter. Tellige, hankige antallet af de udførte toodetele, bliver gemt ja MySQL andmebaas. Mootor on võimeline reguleerima positsioneeri. Hveri positsiooni sümboliseerija tre forskellige produkter. Når produktet er færdigproduceret, kører motoren tilbage i nul position, og afventer nye ordrer. Määrake meningen at man, WPF -i rakenduste kaudu, mis võivad aidata teil tellida. Alt hvad bliver productret bliver gemt i et MySQL andmebaas.

3. samm: MySQL -i andmebaas - sisestage

MySQL andmebaas - peatage
MySQL andmebaas - peatage
MySQL andmebaas - peatage
MySQL andmebaas - peatage
MySQL andmebaas - peatage
MySQL andmebaas - peatage

Mul on MySQL -i andmebaas, mis sisaldab tabeleid. Täitsa hoidja ø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 en oversigt over hvor mange produkter der er produret, og hvor mange der mangler. Ydermere er der et tidspunkt på, hvornår de pågældende produkter er produret. Windowsi vormide rakenduste määramiseks kasutatakse stiili, hvad der skal saadab Arduinoeni, andmebaasi. Når der bliver afgivet en ordrer, vil den blive sendt till Arduinoen, efterfølgende, vil den relevante data blive logget and dataasen. Saate bliveri saata andmebaasi andmebaasi. En Integer, en String, som bliver kaldt en VarChar, and dataasen. Der er også et TimeStamp, täpsustage ja sisestage, leidke andmebaasid.

Samm: Arduino Kode

#kaasake

Servo myServo;

int servoPos; char produkt = '0'; void setup () {myServo.attach (3); // Sarjaühendus algab Serial.begin (9600); } void loop () {// Näete jadaporti produkt = Serial.read (); // Godkendelse af ingående ordrer switch (produkt) {// Produkt A (1) udføres i denne case case '1': myServo.write (50); viivitus (1000); myServo.write (0); viivitus (1000); Serial.println ("Valmis"); murda; // Produkt B (2) udføres i denne case case '2': myServo.write (100); viivitus (1000); myServo.write (0); viivitus (1000); Serial.println ("Valmis"); murda; // Produkt C (3) udføres i denne case case '3': myServo.write (150); viivitus (1000); myServo.write (0); viivitus (1000); Serial.println ("Valmis"); murda; }}

Samm: Windowsi vormide rakendamine

kasutades süsteemi; kasutades System. Collections. Generic; kasutades System. ComponentModel; kasutades System. Data; kasutades System. Drawing; kasutades System. Linq; kasutades System. Text; kasutades System. Threading. Tasks; kasutades System. Windows. Forms; kasutades System. Collections; kasutades System. IO. Ports; MySql kasutamine; kasutades MySql. Data. MySqlClient;

nimeruum WindowsFormsApp2

{avalik osaline klass Vorm1: vorm { /* I denne class bliver alle public variabler oprettet. Herunder er der oprettet en Class (MySqlConnection) der skals tages i brug, for at opnete keelatud kuni MySQL serveren. Ydermere er der oprettet et String (connectionString) on brüssel ja see on määratletud, kui see on parool, ja andmebaas on erinev. Kui arvutada täisarv, 2d massiiv (orde). Grunden til det er at en ordrer can bestå af flere produktioner af et produkt, eller flere produkter. Seriel kommunikationen to Arduinoen bliver også määratle teda. Der bliver også oprettet et Class (BackgroundWorker). Den gør ja en bestemt del af programmet bliver eksikveret gentagende gange i baggrunden. I dette tilfælde er det brugbart, da der kan blive oprettet nye ordrer, med korte mellemrum. */ MySqlConnection ühendus; string connectionString;

private int ordrenummer;

privaatne int [,] tellimus = uus int [100, 100]; private int sendOrder = new int [100]; privaatstring prodType;

SerialPort sp = uus SerialPort ();

private BackgroundWorker myWorker = uus BackgroundWorker ();

avalik vorm1 ()

{InitializeComponent (); // Tema bliver vores String (connectionString) määratlus. connectionString = "server = 192.168.1.100; userid = root; pwd = langeland; database = arduino;"; /* Tema mull muutuja "myWorker" istus kuni logge på hvor langt mitmekesine parimad ja eriprotsessid. */ myWorker. DoWork += uus DoWorkEventHandler (myWorker_DoWork); myWorker. WorkerReportsProgress = true; myWorker. WorkerSupportsCancellation = true; // Her bliver selve baggrundsgennemløbet eksikveret. myWorker. RunWorkerAsync (); // Her bliver der defineret hvilket format datoen kører i. Tema vorming on parim pärast MySQL -i andmebaasi. dateTimePicker1. CustomFormat = "yyyy-MM-dd"; dateTimePicker1. Format = DateTimePickerFormat. Custom; }

private void Afgiv_Ordre_Click (objekti saatja, EventArgs e)

{ /* Tema 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 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 järjekordPikkus = prodA + prodB + prodC; /* I disse for silmused bliver køen oprettet, således at ordrene bliver produret i den rækkefølge, de er bestilt i. */ jaoks (int prod1A = 0; prod1A <prodA; prod1A ++) {order [ordrenummer, prod1A] = produktA; }

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

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

{ordrenummer = 0; } // Her overføres de bestilte produkter til andmebaas. DBQuery ("INSERT INTO` bestilteprod` (`Produkt A`,` Produkt B`, `Produkt C`) VÄÄRTUSED (" + prodA + "," + prodB + "," + prodC + ")"); // Her overføres en oversigt over hvilke produkter der mangler at blive produrert, till andmebaas. 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 (objekti saatja, EventArgs e) {while (true) { /* Så længe at summen af den afsendte ordre ikke er lig med 0, vil dette while loop køre. */ Olek (); while (sendOrder. 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. 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 and variablen rykker videre til næste kolonne, bliver den pågældende kolonne sat 0. kuni. Inden if sætningerne bliver kommunikationen to Arduinoen åbnet, and den afgivet ordre bliver sendt til Arduinoen. */ jaoks (int i = 0; i <sendOrder. Length; i ++) {Olek (); sp. BaudRate = 9600; sp. PortName = "COM4"; sp. Avatud (); sp. Write (sendOrder . ToString ()); // Programmet der er i en af disse if laused, vil blive eksikveret, afhængig af hvilket tal fra et til tre der er i variablen (i). if (sendOrder == 1) {prodType = "Produkt A"; } else if (sendOrder == 2) {prodType = "Produkt B"; } muu if (sendOrder == 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 dataas, og communicationation to Arduinoen, bliver lukket. if (sendOrder. Sum () == 0) {DBQuery ("INSERT INTO` udforte` (`Produkt type`) VALUES ('" + prodType + "')");

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

sp. Sule ();

murda; } /* Tema afventes der at Arduinoen er færdig med ordren. Der kvitteres med et "valmis". Kui soovite täpsemat moodulit, bliver de udførte endnu ja gang uploading to databaseas Grunden til dette, er at man skal være sikker på at det sideste udførte product bliver overført to databaseasen. */ sp. ReadTo ("Valmis");

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

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

sp. Sule (); Staatus (); }} // 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). jaoks (int i = 0; i <order. GetLength (0); i ++) {int test = order [i, 0]; if (test! = 0) {for (int j = 0; j <100; j ++) {sendOrder [j] = järjekord [i, j];

järjekord [i, j] = 0;

}

murda; }}

}

} /* Her 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 () { /* Tema isiklik MySQL -i keeld on keelatud, see on saadaval ka tabeli derivaatides, aga ka eksikverer den forepørgsel. */ MySqlConnection con = uus MySqlConnection (connectionString); con. Open (); string str = "vali * kokku"; MySqlCommand com = uus MySqlCommand (str, con); MySqlDataReader lugeja = 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. lugeja. Loe (); MissingProd. Invoke ((MethodInvoker) delegaat {// Her bliver de manglende produkter, samt produkter der er lavet, skrevet ud på applikationen. MissingProd. Text = "manglende produkter:" + (lugeja ["manglende produkter"]. ToString ()); OrdereProd. Text = "produkter lavet:" + (lugeja ["productionret produkter"]. ToString ());}); // Her bliver der implementeret hvad procentbaren, skal udfyldes efter. ProcenteDone. Invoke ((MethodInvoker) delegaat {// Hvis læseren i My SQL keelatud læser at "productionret produkter ikke er lig med 0, bliver denne if utasítás eksikveret. Hvis det er lig med 0, bliver der udskrevet" 0%"skrevet til etikett. if (int. Parse (lugeja ["productionret produkter"]. ToString ())! = 0) {// Her tager man de productionret produkter og plusser med de manglende produkter. Resultatet af dette ganger man med sada, for at få det ud i procent. ProcenteDone. Text = Math. Round ((float. Parse (lugeja ["productionret produkter"]. ToString ()) /(float. Parse(reader["produceret produkter "]. ToString ()) + float. Parse (lugeja ["manglende produkter"]. ToString ()))) * 100). ToString (); // Her bliver result to af tidligere udregning lagt over på percentbaren. progressBar1. Value = Int32. Parse (ProcenteDone. Text);} else {ProcenteDone. Text = "0%";}}); // Tema lukud MySQL keelatud. reader. Close (); con. Close ();} // I dette void bliver alle produkter, der er produret på den valgte dato, lagt ud på a pplikationen. private void Vis_Produkter_Click_1 (objekti saatja, EventArgs e) {string date = dateTimePicker1. Value. ToString (). Eemalda (10);

date = dateTimePicker1. Text;

string query = "SELECT` Produkt type`, `Tid` FROM udforte WHERE Tid> = '" + date + "00:00:00' AND Tid <= '" + date + "23:59:59'"; kasutades (ühendus = uus MySqlConnection (ühendusString)) kasutades (MySqlCommand käsk = uus MySqlCommand (päring, ühendus)) kasutades (MySqlDataAdapter adapter = uus MySqlDataAdapter (käsk)) {DataTable prodTable = new DataTable (); adapter. Fill (prodTable);

dataGridView1. DataSource = prodTable;

}

} // I dette void bliver MySQL keelatud stiilis. Den fungerer således at keelatud bliver åbnet, eksikverer, og lukkes. private void DBQuery (string cmd) {stringi päring = cmd; kasutades (ühendus = uus MySqlConnection (ühendusString)) kasutades (MySqlCommand käsk = uus MySqlCommand (päring, ühendus)) {connection. Open ();

käsk. ExecuteScalar ();

ühendus. Sulge ();

} } } }

6. samm: Materialeliste

1 stk Arduino Uno

1 stk Mikroservo SG90 9g

Samm 7: Fobindelsesdiagram / I / O Lliste

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

Servomootor:

+ = Rød

- = Sorteeri

Signaal = Grøn

Soovitan: