Cuprins:

EAL-Industri4.0-RFID Dataopsamling Til Database: 10 pași (cu imagini)
EAL-Industri4.0-RFID Dataopsamling Til Database: 10 pași (cu imagini)

Video: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 pași (cu imagini)

Video: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 pași (cu imagini)
Video: Industry 4.0 Internet of Things, Technology Evolution & Big Data. How Technology Changes Our Lives 2024, Iulie
Anonim
EAL-Industri4.0-RFID Dataopsamling Til Database
EAL-Industri4.0-RFID Dataopsamling Til Database

Dette projekt omhandler opsamling af vægtdata, înregistrare după identitatea vha. RFID, lagring af data i în MySQL database vha. node-RED, în același timp, vă recomandăm să descărcați date despre programul de operare și programul C # în formularul Windows Form Application. Vi forestiller os følgende:

Vi har en produktionslinje som producerer leverpostej i 200g foliebakker. Toți færdigbagte leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget / labelen, som indeholder et unikt ID (UID = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) for entydig identificationing hover enkelt bakke leverpostej. Da færdigvægten af hver enkelt bakke leverpostej kan svinge (afhængig af råvarer, fordampning i ovn mm), og da kunderne hver har et specifikt krav færdigvægten, bruges UID tagget til at knytte hver enkelt leverpostej til en specifik lagerlokation på lager leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

1. Irma. Vægten på Irmas luksus leverpostej skal holde sig inden for +/- 5%, altså minimum 190g og maksimum 210g.

2. Brugsen. Vægten på Brugsens leverpostej skal holde sig inden for +/- 10%, alttså minimum 180g og maksimum 220g.

3. Aldi. Vægten på Aldis discount leverpostej skal holde sig inden for +/- 15%, altså minimum 170g og maksimum 230g.

Der er således følgende sorteringer:

Range0: out of range

Gama 1: minim 190g / maxim210g

Gama 2: minim 180g / maxim220g

Gama 3: minim 170g / maxim 230g

Pasul 1: Analizarea datelor Af pentru înregistrarea Vægt Samt Af UID

Analizarea datelor Af pentru înregistrarea Vægt Samt Af UID
Analizarea datelor Af pentru înregistrarea Vægt Samt Af UID

Până la examinarea datelor pentru înregistrări, înregistrarea simultană a etichetelor RFID este prezentată în Arduino MEGA2560 și în cititor / scriitor RFID-RC522. Da vi ikke har nogen vægt, simulerer vi data for vægten med et potmeter tilsluttet en analog indgang på Arduinoen.

Følgende opstilling er anvendt:

1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og + 5V, midterbenet er tilsluttet AN0

RFID-RC522 este un tablou Arduino care plătește portul SPI în fölgende:

SDA -> pinul 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3,3V -> 3,3V

De opsamlede date, pentru hhv. UID og vægten, sendes på den serielle port som en komma-separeret tekststreng videre til node-Red som står for den efterfølgende præsentation på et dashboard og lagring i en database.

Pasul 2: Arduino-program

Programul Arduino include bibliotecile SPI.h og MFRC522.h pentru at kunne bruge RFID læseren. Am pornit după inițializarea programelor de variabilă anvendată. Der laves en instans af MFRC522. I Setup blokken initialiseres in serielle forbindelse, SPI porten og MFRC522. Ulterior scanează după etichete RFID. For ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Når der er scannet et UID tag, loades arary nyUID med det netop læste UID. Hvis array nyUID er forskellig fra oldUID er der tale om et nyt UID som kan sendes på den serielle port. Hvis nyUID og oldUID er ens, er der tale om samme UID tag og UID'et skal ignoreres. Hvis der er tale om et nyt UID, sendes UID'et på den serielle port sammen med en læst værdi fra den serielle port. Den analoge værdi skaleres til området 150-250. Data sendes som in komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, således at koden klart til at læse et nyt RFID tag.. Den sidste funktion i programmet er den funktion som sammenligner 2 arrays. Funktionen returnerer true hvis array'ne er ens, og false hvis array'ne er forskellige.

#include

#include // Acest program scanează cardurile RFID utilizând placa de citire / scriere RDIF-RC522. // Se citește UID, se citește un pin analogic. Valoarea analogică 0-1023 este scalată la 150-250. // UID și valoarea analogică sunt trimise ca text separat prin virgulă pe portul serial folosind 9600, N, 8, 1. // S-a avut grijă ca fiecare UID să fie trimis o singură dată la rând, // un nou UID trebuie să fie prezent înainte ca același UID să poată fi trimis din nou. // Această funcție este implementată în cod prin compararea matricilor: oldUID nyUID în funcția array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Valoare = 0; String StringValue = "0000"; octet vechiUID [4] = {}; octet nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Creați o instanță MFRC522.

configurare nulă ()

{Serial.begin (9600); // Inițiați o comunicare serială SPI.begin (); // Lansați magistrala SPI mfrc522. PCD_Init (); // Inițiază MFRC522}

bucla nulă ()

{// Căutați cărți noi dacă (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Selectați una dintre cărți dacă (! Mfrc522. PICC_ReadCardSerial ()) {return; } // încărcați nyUID cu eticheta UID pentru (octet i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// trimite eticheta UID pe portul serial pentru (octet i = 0; i 1000) {Valoare = 1000; } Valoare = (Valoare / 10) + 150; // trimite valoarea analogică scalată Serial.print (Value); // trimite newline Serial.println (); // set oldUID = nyUID pentru (octet z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // așteptați 1 sec. întârziere (1000); }

// comparați 2 tablouri …

array_cmp boolean (octet a , octet b ) {test bool = adevărat; // testați fiecare element pentru a fi la fel. dacă doar unul nu este, returnează false pentru (octet n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // dacă pe octet nu este egal, test = false} if (test == true) returnează true; altfel returnează fals; }

Pasul 3: Node-RED, baza de date Lagring Af Data I

Node-RED, baza de date Lagring Af Data I
Node-RED, baza de date Lagring Af Data I
Node-RED, baza de date Lagring Af Data I
Node-RED, baza de date Lagring Af Data I

Fluxul de curgere este un toaletă roșu:

COM4 este interzisă serie de moduri de date pentru tableta Arduino. Funktionerne "Split and Get value" og "Split and Get UID" splitter teksstrengen ved kommaet og returnere hhv vægten og UID. Vægten bruges til fremvisning på dashboardet i et linechart og en scale. UID fremvises i et tekstfelt. Funktionen test_sound advarer verbalt med sætningen "Out of range", hvis vægten er under 170g eller over 230g, dvs i range 0.

Împarte și obține valoare:

var output = msg.payload.split (',');

temp = {sarcină utilă: (ieșire [1])}; revenire temp;

Împarte și obține UID:

var output = msg.payload.split (",");

temp = {sarcină utilă: ieșire [0]}; revenire temp;

sunet_test:

var number = parseInt (msg.payload);

if (număr> 230 || număr <170) {newMsg = {sarcină utilă: "În afara intervalului"}; returnează newMsg; } else {newMsg = {payload: ""}; returnează newMsg; }

Funktionen Split string "," indsætter and timestamp, UID og vægten i in database patedb.patelog.

var output = msg.payload.split (","); // împarte msg.payload de virgulă în matrice

UIDTag = ieșire [0]; // prima parte în prima poziție [0] ValueTag = ieșire [1]; // a doua parte în a doua poziție [1]

var m = {

subiect: "INSERT INTO patedb.patelog (timestamp, UID, weight) VALUE ('" + New date (). toISOString () + "', '" + UIDTag + "', '" + ValueTag + "');" }; retur m;

patelog er en MySQL database forbindelse som er sat op med følgende parametre:

Gazdă: localhost

Port: 3306

Utilizator: root

Baza de date: patedb

Pasul 4: Proiectarea bazei de date

Proiectare baze de date
Proiectare baze de date

Databasen patedb indeholder 4 tabeller

Jurnalul de date este modelul de date, tilskrives date din nod-RED și programul C #

ordertable er en tabel som indeholder data om de genemførte ordrer, tilskrives data af C # programmet

customertable er et kunderegister

rangetable er en tabel som indeholder grænseværdierne for de i C # programmet benyttede range.

Pasul 5: Patelog

Patelog
Patelog

Tabellen patelog indeholder folgende 6 kolonner:

pateID (int) er key key og inkrementeres automatisk.

Timestamp, UID & vægt er af typen varchar (med forskellig max længde)

rangeNr er af typen tinyint (beregnes og tilføjes af C # programmet)

orderID er af typen int (orderID tilføjes af C # programmet)

Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL værdier, det bruges i C # programmet til to detektere de rækker som skal tilskrives værdier for rangeNr og orderID

Pasul 6: comandabil

Comandabil
Comandabil

ordoldable indeholder 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antal der rent faktisk er produceret på ordren. (Tabelele programului C #)

comment (tinytext) er en eventuel kommentar til ordren.

customerID (int) er det aktuelle kundenummer på ordren.

Pasul 7: personalizabil

Personalizabil
Personalizabil

personalizabil indeholder 6 kolonner:

client ID (int) er cheie primară og auto inc.

nume, adresă, telefon, e-mail (varchar) med forskellig max længde

rangeNr (int)

Pasul 8: Rangetable

Rangetable
Rangetable

rangetable indeholder 3 kolonner:

rangeNr (int) er cheie primară og auto inc.

rangeMin (int)

rangeMax (int)

Pasul 9: programul C #

Programul C #
Programul C #

Når der produceres en ordre leverpostej, er proceduren følgende:

Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C # programmet (i praksis overføres det digitalt fra virksomhedens ordresystem. Produktionen startes nu ved tryk på 'start'- knappen. Når en leverpostej er færdigproduceret og lågeten monteret, v på et transportbånd) Samhørende værdier af UID og den aktuelle vægt sendes serielt til node-RED, som viser de opsamlede data på dashboard 'et. Samtidig skrives timestamp, UID og vægt i en ny række i patedb.patelog tabellvæ Da der. tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.

Med et timerinterval undersøger C # programmet patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. Når der er detekteret en række med NULL værdi, beregnes rangeNr og det tilføjes sammen med det aktuelle orderID. Når en ordre er produceret, afsluttes ordren ved tryk på”stop” - knappen. Når ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. Når en ordre er afsluttet, kan kan de opsamlede data i patelog tabellen fremvises ved at trykke på de forskellige knapper i gruppen Update DataGridview. ordertable kan også vises, og der kan søges ordredata på individualeller UID'er eller kundedata på individualelle ordrer.

folosind System; folosind System. Collections. Generic; folosind System. ComponentModel; folosind System. Data; folosind System. Drawing; folosind System. Linq; folosind System. Text; folosind System. Threading. Tasks; folosind System. Windows. Forms; folosind MySql. Data. MySqlClient;

spațiu de nume show_data_from_database

{public partial class Form1: Form {MySqlConnection connection = new MySqlConnection ("datasource = localhost; username = root; password = ''"); int RowNumber = 0; // Variabilă pentru stocarea valorii pateID int RangeNumber = 0; // Variabilă pentru stocarea numărului de rang greutate int = 0; // Variabilă pentru stocarea greutății int OrderNr = 0; // Variabilă pentru stocarea OrderNR int QuantProduced = 0; // Variabilă pentru stocarea cantității produse în NumberOfRows = 0; // numărul de rânduri cu valori nule.. bool ProdRunning = false; // Variabilă care indică dacă butoanele de pornire și oprire au fost activate int limite = new int [6]; // inițializează matricea int CustomerID; // Variabilă pentru stocarea client ID-ul public Form1 () {InitializeComponent (); load_table (); // apel load_table}

void load_table ()

{Comanda MySqlCommand = new MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", connection); încercați {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kan rækkefølgen af kolonner ændres}

private void GetData_Click (expeditor de obiect, EventArgs e) // Citește tabelul bazei de date și comenzile după Timestamp

{load_table (); }

private void btnRefreshUID_Click (expeditor obiect, EventArgs e) //

{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; Comanda MySqlCommand = new MySqlCommand (timeStr, conexiune); încercați {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnRefreshValue_Click (expeditor obiect, EventArgs e)

{string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST (weight as SIGNED INTEGER);"; Comanda MySqlCommand = new MySqlCommand (weightSort, conexiune); încercați {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; SetRowOrder (); adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void ChkNullBtn_Click (expeditor obiect, EventArgs e)

{if (ProdRunning) {CheckTableForNull (); load_table (); }}

private void CheckTableForNull ()

{// Verificați / setați intervalul de timp minim 100 ms int i; int. TryParse (textTimer1. Text, out i); if (i <100) {timer1. Stop (); i = 100; timer1. Interval = i; MessageBox. Show ("Valoare minimă i 100mS"); cronometru 1. Start (); } else {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Verificați dacă există rânduri cu nul disponibile în tabel, returnează numărul de rânduri din variabilă: NumberOfRows string weightStr = ""; șir chkNull = "SELECT COUNT (*) FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY PATEID LIMIT 1;"; Comanda MySqlCommand = new MySqlCommand (chkNull, conexiune); încercați {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); conexiune. Închidere (); } catch (Exception ex) {MessageBox. Show (ex. Message); } în cele din urmă {if (NumberOfRows! = 0) {try {// Selectează cel mai mic număr pateID unde rangeNr este NULL șir readID = "SELECT pateID DIN patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = new MySqlCommand (readID, conexiune); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); //întreg!! conexiune. Închidere (); } listPateID. Text = RowNumber. ToString (); // citește numărul PateID selectat // Selectează greutatea din șirul de rânduri selectat rând = RowNumber. ToString (); șir readweight = "SELECTează greutatea din patedb.patelog WHERE pateID =" + rând; MySqlCommand cmdweight = new MySqlCommand (readweight, conexiune); {connection. Open (); weightStr = (șir) cmdweight. ExecuteScalar (); // String !! conexiune. Închidere (); } greutate = int. Parse (weightStr); // convertiți în int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; if (greutate> = limite [0] && greutate = limite [2] && greutate = limite [4] && greutate <= limite [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (Exception ex) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (expeditor obiect, EventArgs e) {if (ProdRunning == false) {int valtest; încercați {CustomerID = int. Parse (txtCustomerNr. Text); // citiți customerID} catch {MessageBox. Show („Introduceți datele de producție și apăsați butonul„ start”.”); }

string test = "SELECT COUNT (*) FROM patedb.customertable WHERE clientID =" + ID client;

MySqlCommand cmdtestcustomer = new MySqlCommand (test, conexiune); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // returnează 0 dacă clientul nu există conexiune. Închidere (); } if (valtest == 1) // dacă clientul există în baza de date - începeți producția {încercați {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = adevărat; cronometru 1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show („Introduceți datele de producție și apăsați butonul„ start”.”); }} else MessageBox. Show ("Clientul nu este în baza de date, încercați din nou"); } // ReadLimits (); }

private void ReadLimits ()

{// Citește limitele de la rangetable, intervalul 1 la 3 contor int = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmin = new MySqlCommand (readmin, conexiune); {connection. Open (); limits [counter] = (int) cmdmin. ExecuteScalar (); contor = contor + 1; conexiune. Închidere (); } // MessageBox. Show (counter. ToString ()); șir readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = new MySqlCommand (readmax, conexiune); {connection. Open (); limits [counter] = (int) cmdmax. ExecuteScalar (); contor = contor + 1; conexiune. Închidere (); }} // sfârșit pentru buclă}

private nul UpdateLog ()

{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); șir Order = OrderNr. ToString (); șir de actualizare = "UPDATE patedb.patelog SET rangeNr =" + Range + ',' + "orderID =" + OrderNr + "WHERE pateID =" + RowNumber; MySqlCommand updatecmd = new MySqlCommand (actualizare, conexiune); încercați {connection. Open (); updatecmd. ExecuteNonQuery (); conexiune. Închidere (); } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void btnStop_Click (expeditor obiect, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("Nici o producție nu a început încă. Introduceți date și apăsați butonul" Start "); }}

private void UpdateOrderTable ()

{string insert = "INSERT INTO patedb.ordertable (orderID, orderQuant, quantProduced, comment, customerID) VALUES ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '" + QuantProduced. ToString () + "','" + this.txtComment. Text + "','" + this.txtCustomerNr. Text + "');"; MySqlCommand insertcmd = new MySqlCommand (insert, conexiune); încercați {connection. Open (); insertcmd. ExecuteNonQuery (); conexiune. Închidere (); QuantProduced = 0; } catch (Exception ex) {MessageBox. Show (ex. Message); }}

private void timer1_Tick (expeditor obiect, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (expeditor obiect, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", connection); încercați {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show („Apăsați pe stop pentru a comanda tabelul”); }}

private void btnShowOrderDetails_Click (expeditor obiect, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, clientID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '"+ txtShowOrderDetails. Text +"' "); Comanda MySqlCommand = new MySqlCommand (test, conexiune); încercați {connection. Open (); MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); } connection. Close (); } else {MessageBox. Show („Apăsați oprire pentru a vizualiza detaliile comenzii”); }}

private void btnShowCustomerDetails_Click (expeditor obiect, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.customertable.customerID, name, address, phone, email, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID = patedb.customertable. client ID UNDE patedb.ordertable.orderID = '"+ txtShowCustomerDetails. Text +"' "); Comanda MySqlCommand = new MySqlCommand (test, conexiune); încercați {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = comanda; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = sursă; adapter. Update (dbdataset); } catch (Exception ex) {MessageBox. Show (ex. Message); }} else {MessageBox. Show („Apăsați pe stop pentru a vedea detaliile clientului”); }}}

}

Recomandat: