Innholdsfortegnelse:

EAL-Industri4.0-RFID Dataopsamling Til Database: 10 Steps (with Pictures)
EAL-Industri4.0-RFID Dataopsamling Til Database: 10 Steps (with Pictures)

Video: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 Steps (with Pictures)

Video: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 Steps (with Pictures)
Video: Industry 4.0 Internet of Things, Technology Evolution & Big Data. How Technology Changes Our Lives 2024, November
Anonim
EAL-Industri4.0-RFID Dataopsamling Til Database
EAL-Industri4.0-RFID Dataopsamling Til Database

Dette prosjektet omhandler opsamling av vektdata, registrering av identiteter vha. RFID, lagring av data i en MySQL database vha. node-RED, samt fremvisning og behandling av de opsamlede dataene i et C# -program i form av en Windows Form Application. Vi forestiller oss følgende:

Vi har en produktionslinje som produsentleverpost i 200g foliebakker. Alle færdigbagte leverpostejer utstyres etter avkøling med et RFID -tag i plastlåget/etiketter, som inneholder et unikt ID (UID = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) for entydig identifikasjon av hver enkelt bakke leverpostej. Da færdigvægten av hver enkelt bakke leverpostej kan svinge (ansvarig av råvarer, fordampning i ovn mm), og da kunderne hver har og spesifikt krav færdigvægten, bruker UID -tagget til at knute hver enkelt leverpostej til en spesifikk lagerlokasjon på lageret, hvor det kan lagres leverpostejer til én spesifikke kunde. Kunderne er supermarkedskæder:

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

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

3. Aldi. Vægten på Aldis rabattpakke skal holde seg inne for +/- 15%, altså minimum 170g og maksimum 230g.

Der er således følgende sorteringer:

Område 0: utenfor rekkevidde

Område 1: minimum 190g/maksimum 210g

Rekkevidde2: minimum 180g/maksimum220g

Rekkevidde3: minimum 170g/maksimum 230g

Trinn 1: Opsamling Af Data for Vægt Samt Registrering Af UID

Opsamling Af Data for Vægt Samt Registrering Af UID
Opsamling Af Data for Vægt Samt Registrering Af UID

Til innsamling av data for vekt, samt registrering av RFID-koder er anvendt på Arduino MEGA2560 med en RFID-RC522 leser/skribent. Da vi ikke har noen vekt, simulerer vi data for vægten med et potmeter tilsluttet en analog inngang på Arduinoen.

Følgende innstilling er anvendt:

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

RFID-RC522 er tilsluttet Arduino-bord SPI-port på følgende måte:

SDA -> pin 53

SCK -> pin52

MOSI -> pin51

MISO-> pin50

IRQ -> NC

GND -> GND

RST -> pin5

3,3V -> 3,3V

De opsamlede data, for hhv. UID og vægten, sender på den serielle porten som en kommaseparert tekststreng videre til node-Red som står for den etterfølgende presentasjonen på et dashbord og lagring i en database.

Trinn 2: Arduino-program

I Arduino programmet inkluderer de to biblioteker SPI.h og MFRC522.h for at kunne bruke RFID læseren. Jeg starter av programmet initialiseres de anvendte variabelen. Der laves en instans av MFRC522. I Setup blokken initialiseres den serielle forbindelse, SPI porten og MFRC522. Derefter scannes etter RFID -koder. For ikke at sende det samme UID flere ganger etter hverandre, er der laget en stump kode som tjekker for dette. Når der er scannet et UID tag, loades arary nyUID med det nettopp læste UID. Hvis array nyUID er forskellig fra oldUID er der tale om et nytt UID som kan sendes på den serielle porten. Hvis nyUID og oldUID er ens, er der tale om samme UID -tag og UID'et skal ignoreres. Hvis der er tale om et nytt UID, sender UID'et på den serielle porten sammen med en verdi fra den serielle porten. Den analoge verdien skaleres til området 150-250. Data sender som en komma-separeret tekststreng. Som det siste ble satt oldUID = nyUID, således at koden klart kan lese og nyt RFID -tag.. Den siste funksjonen i programmet er den funksjonen som sammenligner 2 matriser. Funksjonene returnerer true hvis array'ne er ens, og false hvis array'ne er forskjellige.

#inkludere

#include // Dette programmet skanner RFID-kort ved hjelp av RDIF-RC522 leser/skriverkort. // UID leses, en analog pin leses. Analog verdi 0-1023 skaleres til 150-250. // UID og analog verdi sendes som kommaseparert tekst på seriell port ved bruk av 9600, N, 8, 1. // Det er tatt vare på å bare sende hver UID én gang på rad, // en ny UID må være tilstede før samme UID kan sendes på nytt. // Denne funksjonen implementeres i koden ved å sammenligne matriser: oldUID nyUID i funksjon array_cmp (oldUID , nyUID )

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Verdi = 0; String StringValue = "0000"; byte oldUID [4] = {}; byte nyUID [4] = {};

MFRC522 mfrc522 (SS_PIN, RST_PIN); // Lag MFRC522 -forekomst.

ugyldig oppsett ()

{Serial.begin (9600); // Start en seriell kommunikasjon SPI.begin (); // Start SPI -buss mfrc522. PCD_Init (); // Start MFRC522}

hulrom ()

{// Se etter nye kort hvis (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Velg ett av kortene hvis (! Mfrc522. PICC_ReadCardSerial ()) {return; } // last nyUID med UID -tag for (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// send UID -tag på seriell port for (byte i = 0; i 1000) {Value = 1000; } Verdi = (Verdi / 10) + 150; // send skalert analog verdi Serial.print (verdi); // send ny linje Serial.println (); // sett oldUID = nyUID for (byte z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // vent 1 sek forsinkelse (1000); }

// sammenligne 2 matriser …

boolsk array_cmp (byte a , byte b ) {bool test = true; // test hvert element for å være det samme. hvis bare en ikke er det, returner du false for (byte n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // hvis på byte ikke er lik, test = false} if (test == true) return true; ellers returner usann; }

Trinn 3: Node-RED, Lagring Af Data I Database

Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database
Node-RED, Lagring Af Data I Database

Følgende flyt er laget i node-RED:

COM4 er den serielle forbindelsen hvor data mottas fra Arduino bord. Funksjoner "Split and Get value" og "Split and Get UID" splitter tekststrengen ved kommaet og returnere hhv vægten og UID. Vægten bruker til fremvisning på dashboardet i et linechart og en skala. UID fremvises i et tekstfelt. Funksjoner test_sound advarer verbalt med sætningen "Out of range", hvis vægten er under 170g eller over 230g, dvs i område 0.

Del og få verdi:

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

temp = {nyttelast: (utgang [1])}; retur temp;

Del og få UID:

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

temp = {nyttelast: utgang [0]}; retur temp;

test_lyd:

var number = parseInt (msg.payload);

if (tall> 230 || nummer <170) {newMsg = {nyttelast: "Utenfor område"}; returner newMsg; } annet {newMsg = {nyttelast: ""}; returner newMsg; }

Funksjoner Split string "," indsætter et tidsstempel, UID og vægten i en database patedb.patelog.

var output = msg.payload.split (","); // del msg. payload med komma i array

UIDTag = output [0]; // første del til første posisjon [0] ValueTag = output [1]; // andre del til andre posisjon [1]

var m = {

emne: "INSERT INTO patedb.patelog (tidsstempel, UID, vekt) VERDIER ('"+ny dato (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; retur m;

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

Vert: lokal vert

Havn: 3306

Bruker: root

Database: patedb

Trinn 4: Database-design

Database-design
Database-design

Databasen patedb inneholder 4 tabeller

patelog er dataopsamlingstabellen, tilskrives data af node-RED og C# program

ordertable er en tabell som inneholder data om de genemførte ordrer, tilskrives data av C# programmet

kundetilpasset er og kundeegister

rangetable er en tabell som inneholder grønneværdierne for de i C# programmet benyttede områder.

Trinn 5: Patelog

Patelog
Patelog

Tabellen inneholder følgende 6 kolonner:

pateID (int) er primærnøkkel og inkrementeres automatisk.

Tidsstempel, UID og vekt er av typen varchar (med forskellig max lengde)

rangeNr er av typen tinyint (beregnes og tilføjes av C# program)

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

Node-RØD tilføyer ikke verdier til kolonnerne rangeNr og orderID. rangeNr og orderID tillader NULL verdier, det brukes i C# program til at detektere de rækker som skal tilskrives verdier for rangeNr og orderID

Trinn 6: Ordertable

Ordertable
Ordertable

ordertable inneholder 5 kolonner:

orderID (int) er det aktuelle ordrenummer

orderQuant (mediumint) er ordens pålydende antal

quantProduced (mediumint) er antall der rent faktisk er produceret på ordren. (Tælles af C# program)

comment (tinytext) er en eventuel kommentar til ordren.

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

Trinn 7: Tilpassbar

Tilpasset
Tilpasset

tilpasset inneholder 6 kolonner:

customerID (int) er primærnøkkel og auto inc.

navn, adresse, telefon, e -post (varchar) med forskellig max lengde

rangeNr (int)

Trinn 8: Rangetable

Rekkevidde
Rekkevidde

rangetable inneholder 3 kolonner:

rangeNr (int) er primærnøkkel og auto inc.

rangeMin (int)

rangeMax (int)

Trinn 9: C# -program

C# -program
C# -program

Når der produses en ordre leverpostej, er prosedyrer følgende:

Kundenummer, ordrenummer, ordreantal og en eventuel kommentar indtastes i C# program (i praksis overføres det digitalt fra virksomheten ordresystem. Produksjonen starter nå ved trykk på 'start'- knappen. Når en leverpostej er færdigproduceret og låget er montert, vejes den av Arduinoen (på et transportbånd) Samhørende verdier av UID og den aktuelle vekten sender serielt til node-RED, som viser de opsamlede dataene på dashbordet 'og samtidig skrives tidsstempel, UID og vekt i en ny rekke i patedb.patelog tabellen. tidspunkt ikke tilskrives verdier til rangeNr og orderID vil ha verdier NULL.

Med et timerinterval undersøger C# program patedb.patelogtabellen for nye tilkomne rækker med NULL verdier i rangeNr kolonnen. Når der er detektering en rekke med NULL verdi, beregnes rangeNr og det tilføjes sammen med aktuelle orderID. Når en ordre er produceret, avsluttes ordren ved trykk på”stop”- knappen. Når ordren avsluttes, tilføjes en rekke til patedb.ordertable med de aktuelle ordredata. Når en ordre er avsluttet, kan jeg samle data i patellog tabellen fremvises ved å trykke på de forskjellige knapper i gruppen Oppdater DataGridview. ordertable kan også vises, og der kan søges ordredata på individueller UID'er eller kundedata på individuelle ordrer.

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

navneområde show_data_from_database

{offentlig delklasse Form1: Skjema {MySqlConnection tilkobling = ny MySqlConnection ("datasource = localhost; brukernavn = root; passord = ''"); int RowNumber = 0; // Variabel for lagring av pateID -verdi int RangeNumber = 0; // Variabel for lagring av rangenumber int vekt = 0; // Variabel for lagring av vekten int OrderNr = 0; // Variabel for lagring av OrderNR int QuantProduced = 0; // Variabel for lagring av produsert mengde int NumberOfRows = 0; // antall rader med null.. bool ProdRunning = false; // Variabel som indikerer om start- og stoppknappene har blitt aktivert int limits = new int [6]; // initialize array int CustomerID; // Variabel for lagring av kunde -ID offentlig skjema1 () {InitializeComponent (); load_table (); // ring load_table}

ugyldig load_table ()

{MySqlCommand -kommando = ny MySqlCommand ("SELECT * FRA patedb.patelog ORDER BY tidsstempel DESC;", tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}

private void SetRowOrder ()

{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["tidsstempel"]. DisplayIndex = 1; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kan rekkefølgen av kolonner endres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kan rekkefølgen av kolonner endres}

private void GetData_Click (objektavsender, EventArgs e) // Leser databasetabell og bestillinger etter tidsstempel

{load_table (); }

private void btnRefreshUID_Click (objektavsender, EventArgs e) //

{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID;"; MySqlCommand -kommando = ny MySqlCommand (timeStr, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}

private void btnRefreshValue_Click (objektavsender, EventArgs e)

{string weightSort = "SELECT * FRA patedb.patelog ORDER BY CAST (weight AS SIGNED INTEGER);"; MySqlCommand -kommando = ny MySqlCommand (weightSort, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}

private void ChkNullBtn_Click (objektavsender, EventArgs e)

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

private void CheckTableForNull ()

{// Sjekk/sett tidsintervallet minimum 100 ms int i; int. TryParse (textTimer1. Text, ut i); hvis (i <100) {timer1. Stop (); i = 100; timer1. Interval = i; MessageBox. Show ("Minimumsverdi i 100mS"); timer1. Start (); } annet {timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); // Kontroller om noen rader med null er tilgjengelig i tabellen, returnerer antall rader i variabelen: NumberOfRows streng weightStr = ""; string chkNull = "VELG TELLE (*) FRA patedb.patelog HVOR rangeNR ER NULL ORDER AV pateID LIMIT 1;"; MySqlCommand -kommando = ny MySqlCommand (chkNull, tilkobling); prøv {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); tilkobling. Lukk (); } fangst (unntak ex) {MessageBox. Show (eks. melding); } endelig {if (NumberOfRows! = 0) {try {// Velger laveste pateID -nummer der rangeNr er NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR IS NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = nytt MySqlCommand (readID, tilkobling); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); // heltall !! tilkobling. Lukk (); } listPateID. Text = RowNumber. ToString (); // lese opp valgt PateID -nummer // Velger vekt fra valgt radnummer for radnummer = RowNumber. ToString (); string readweight = "VELG vekt FRA patedb.patelog WHERE pateID =" + rad; MySqlCommand cmdweight = ny MySqlCommand (lesevekt, tilkobling); {connection. Open (); weightStr = (streng) cmdweight. ExecuteScalar (); // streng !! tilkobling. Lukk (); } vekt = int. Parse (weightStr); // konvertere til int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; hvis (vekt> = grenser [0] && vekt = grenser [2] && vekt = grenser [4] && vekt <= grenser [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } fangst (unntak ex) {MessageBox. Show (eks. melding); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (objektavsender, EventArgs e) {if (ProdRunning == false) {int valtest; prøv {CustomerID = int. Parse (txtCustomerNr. Text); // read customerID} catch {MessageBox. Show ("Skriv inn produksjonsdata og trykk" start "-knappen."); }

string test = "SELECT COUNT (*) FRA patedb.customertable WHERE customerID ="+CustomerID;

MySqlCommand cmdtestcustomer = ny MySqlCommand (test, tilkobling); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // returnerer 0 hvis kunden ikke har forbindelse. Close (); } if (valtest == 1) // hvis kunden finnes i databasen - start produksjonen {prøv {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; timer1. Start (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (Unntak ex) {MessageBox. Show ("Skriv inn produksjonsdata og trykk på" start "-knappen."); }} else MessageBox. Show ("Kunden er ikke i databasen, prøv igjen"); } // ReadLimits (); }

private void ReadLimits ()

{// Leser grenser fra rangetable, område 1 til 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = nytt MySqlCommand (readmin, tilkobling); {connection. Open (); grenser [teller] = (int) cmdmin. ExecuteScalar (); teller = teller + 1; tilkobling. Lukk (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = ny MySqlCommand (readmax, tilkobling); {connection. Open (); grenser [teller] = (int) cmdmax. ExecuteScalar (); teller = teller + 1; tilkobling. Lukk (); }} // end for loop}

private void UpdateLog ()

{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); string Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Range+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = ny MySqlCommand (oppdatering, tilkobling); prøv {connection. Open (); updatecmd. ExecuteNonQuery (); tilkobling. Lukk (); } fangst (unntak ex) {MessageBox. Show (eks. melding); }}

private void btnStop_Click (objektavsender, EventArgs e)

{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("Ingen produksjon startet ennå. Skriv inn data og trykk på" start "-knappen"); }}

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 = nytt MySqlCommand (sett inn, tilkobling); prøv {connection. Open (); insertcmd. ExecuteNonQuery (); tilkobling. Lukk (); QuantProduced = 0; } fangst (unntak ex) {MessageBox. Show (eks. melding); }}

private void timer1_Tick (objektavsender, EventArgs e)

{CheckTableForNull (); load_table (); }

private void btnShowOrderTable_Click (objektavsender, EventArgs e)

{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }} else {MessageBox. Show ("Trykk på stopp for å se ordreTabell"); }}

private void btnShowOrderDetails_Click (objektavsender, EventArgs e)

{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '" + txtShowOrderDetails. Text +"' "); MySqlCommand -kommando = ny MySqlCommand (test, tilkobling); prøv {connection. Open (); MySqlDataAdapter adapter = ny MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); } tilkobling. Lukk (); } annet {MessageBox. Show ("Trykk på stopp for å se bestillingsdetaljer"); }}

private void btnShowCustomerDetails_Click (objektavsender, 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. customerID WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text +"' "); MySqlCommand -kommando = ny MySqlCommand (test, tilkobling); prøv {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = kommando; DataTable dbdataset = nytt DataTable (); adapter. Fyll (dbdataset); BindingSource bsource = ny BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Oppdater (dbdataset); } fangst (unntak ex) {MessageBox. Show (eks. melding); }} else {MessageBox. Show ("Trykk på stopp for å se kundedetaljer"); }}}

}

Anbefalt: