Sisukord:
- Samm 1: Af -andmete ülekandmine Vægt Samt Af UID registreerimiseks
- Samm: Arduino programm
- 3. etapp: sõlme-punane, andmeedastuse andmestik
- 4. samm: andmebaasi kujundamine
- Samm: patelog
- 6. samm: tellitav
- 7. samm: kohandatav
- 8. samm: vahemik
- 9. samm: C# programm
Video: EAL-Industri4.0-RFID andmete kogumise andmebaas: 10 sammu (koos piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:50
Dette projekt omhandler opsamling af vægtdata, registreering af identiteter vha. RFID, kurnavad andmed ja en MySQL andmebaas vha. node-RED, samt fremvisning og behandling af de opsamlede data and et C# program i form af en Windows Form Application. Viimased metsamehed:
Vi har en produktionslinje som produrer leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres efter afkøling med et RFID tag in plasticlåget/labelen, som indeholder et unikt ID (UID = Unique Identifier, er en 32 bit bit code, 8 hexadecimale karakterer) entydig identifikation af hver 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 sper lager leverpostejer til én specificik kunde. Toidukaubad:
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 +/- 10%, vähemalt 180g ja maksimaalselt 220g.
3. Aldi. Vægten på Aldis soodushinnaga leverpostej skal holde sig inden +/- 15%, vähemalt 170g ja maksimum 230g.
Der er således følgende sorteringer:
Vahemik0: vahemikust väljas
Vahemik 1: vähemalt 190 g/maksimaalselt 210 g
Vahemik2: vähemalt 180 g/maksimaalselt 220 g
Vahemik 3: vähemalt 170 g/maksimaalselt 230 g
Samm 1: Af -andmete ülekandmine Vægt Samt Af UID registreerimiseks
Til opsamling af data for vægt, samst registreering af RFID tags er anvendt et Arduino MEGA2560 ja RFID-RC522 lugeja/kirjutaja. Da vi ikke har nogen vægt, simulerer vi data for vægten med et potmeter tilsluttet en analog indgang på Arduinoen.
Mugav opstilling er anvendt:
1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, kesktasemel või tilsluttet AN0
RFID-RC522 või Arduino tahvlid SPI port, mis on saadaval järgmiselt:
SDA -> tihvt 53
SCK -> pin52
MOSI -> pin51
MISO-> pin50
IRQ -> NC
GND -> GND
RST -> pin5
3.3V -> 3.3V
De opsamlede andmed, hhv. UID ja funktsioonid, saadab seriaaliporti, mis sisaldab komakohtade eraldiseisvaid tekste, mis on saadaval sõlme-Red som står for den efterfølgende præsentation på et armatuurlaual ja andmebaasis.
Samm: Arduino programm
Arduino programmeerib tindid raamatukogusse SPI.h og MFRC522.h, kus on saadaval RFID. Ma alustan programmeeritavat initsialiseerivat muutujat. Der laves in instans af MFRC522. I Seadistuste blokeerimise algseadistuste keelamine, SPI porten og MFRC522. Derefter skaneerimine ja RFID -sildid. For ikke at sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette. Kui kasutate skannimisvõrku ja UID -märgendit, laadib see mõne uue UID -i võrgu alla, kasutades UID -d. Hvis array nyUID er forskellig from oldUID er der tale om et now UID som can sendes på den serielle port. Hvis nyUID ja oldUID er ens, er der tale om samme UID tag and UID'et skal ignoreerib. Hvis der er tale om et now UID, saadab UID'et på den serielle port sammen med en læst værdi fra den serielle port. Analoog værdi skaleres til området 150-250. Andmed saadavad som en komma-separeret tekststreng. Kui otsustate vanaUID = nyUID, siis saate selle koodi ja klaveri juurde või nüüd RFID -märgendi. See funktsioon on programmeeritud funktsionaalsuse jaoks 2 massiivi jaoks. Funktionen returnerer true hvis array'ne er ens, og false hvis array'ne er forskellige.
#kaasake
#include // See programm skaneerib RFID-kaarte RDIF-RC522 lugeja/kirjutahvli abil. // UID loetakse, loetakse analoogpinge. Analoogväärtus 0-1023 skaleeritakse 150-250-ni. // UID ja analoogväärtus saadetakse komaeraldusega tekstina jadaportis, kasutades 9600, N, 8, 1. // Iga UID on saadetud ainult üks kord järjest, // uus UID tuleb enne sama UID uuesti saatmist. // Seda funktsiooni rakendatakse koodis, kui võrrelda massiive: oldUID nyUID funktsioonis array_cmp (oldUID , nyUID )
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int Väärtus = 0; String StringValue = "0000"; bait oldUID [4] = {}; bait nyUID [4] = {};
MFRC522 mfrc522 (SS_PIN, RST_PIN); // Loo eksemplar MFRC522.
tühine seadistus ()
{Serial.begin (9600); // jadaühenduse algatamine SPI.begin (); // SPI -siini algatamine mfrc522. PCD_Init (); // Alusta MFRC522}
tühine tsükkel ()
{// Otsige uusi kaarte, kui (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // Valige üks kaartidest, kui (! Mfrc522. PICC_ReadCardSerial ()) {return; } // laadige nyUID UID -märgendiga (bait i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // kui oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// saada UID -silt jadapordile (bait i = 0; i 1000) {Value = 1000; } Väärtus = (väärtus / 10) + 150; // saata skaleeritud analoogväärtus Serial.print (Value); // saata uusliin Serial.println (); // määrake oldUID = nyUID (bait z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // oota 1 sekund viivitus (1000); }
// võrdle 2 massiivi …
boolean array_cmp (bait a , bait b ) {bool test = true; // testige, et iga element oleks sama. kui ainult üks pole, tagastage vale (bait n = 0; n <4; n ++) {if (a [n]! = b [n]) test = false; // kui bait pole võrdne, test = vale} if (test == true) tagastavad tõese; muidu tagasta vale; }
3. etapp: sõlme-punane, andmeedastuse andmestik
Lülitusvoog on punane sõlme-punane:
COM4 on keelatud ja keelab andmeedastuse Arduino plaadilt. Funktsioon "Split and Get value" ja "Split and Get UID" splitter tekstid, mis on lisatud ja tagastatud, on saadaval ja UID. Vægten bruges til fremvisning på dashboardet et linechart og en scale. UID fremvises ja tekstivilt. Funktionen test_sound advarer verbalt med sætningen "Out of range", hvis vægten er under 170g eller over 230g, dvs i range 0.
Jagage ja hankige väärtus:
var väljund = msg.payload.split (',');
temp = {kasulik koormus: (väljund [1])}; tagasivoolutemperatuur;
Jagage ja hankige UID:
var väljund = msg.payload.split (",");
temp = {kasulik koormus: väljund [0]}; tagasivoolutemperatuur;
test_sound:
var number = parseInt (msg.payload);
if (number> 230 || number <170) {newMsg = {kasulik koormus: "Väljaspool vahemikku"}; tagasta uusMsg; } else {newMsg = {kasulik koormus: ""}; tagasta uusMsg; }
Funktsioon Jagatud string "," indsætter et timestamp, UID og vægten and en database patedb.patelog.
var väljund = msg.payload.split (","); // poolita sõnum.payload komaga massiiviks
UIDTag = väljund [0]; // esimene osa esimesse positsiooni [0] ValueTag = output [1]; // teine osa teisele positsioonile [1]
var m = {
teema: "INSERT INTO patedb.patelog (ajatempel, UID, kaal) VÄÄRTUSED ('"+uus kuupäev (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; tagasitulek m;
patelog er et MySQL -i andmebaas keelas som er sat op med følgende parameetri:
Host: localhost
Sadam: 3306
Kasutaja: root
Andmebaas: patedb
4. samm: andmebaasi kujundamine
Andmebaas patedb indeholder 4 tabeller
patelog er dataopsamlingstabellen, kuvab andmed sõlme-RED og C# programmetest
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.
Samm: patelog
Tabellen patelog indeholder folgende 6 kolonner:
pateID (int) er esmane võti ja tindiandmete automaatne.
Ajatempel, UID ja selle tüübi varchar (med forskellig max længde)
rangeNr er af typen tinyint (beregnes ja 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 mullaharija NULL værdier, det bruges i C# programmet til and detektere de rækker som skal tilskrives værdier for rangeNr og orderID
6. samm: tellitav
ordertable indeholder 5 kolonner:
orderID (int) er det aktuelle ordrenummer
orderQuant (mediumint) er ordens pålydende antal
quantProduced (mediumint) er antal der rent faktisk er produret på ordren. (Tælles af C# programmet)
kommentaar (tinytext) er en eventuel kommentar til ordren.
customerID (int) er det aktuelle kundenummer på ordren.
7. samm: kohandatav
customertable indeholder 6 kolonner:
kliendi ID (int) eriline võti ja auto inc.
nimi, aadress, telefon, e -post (varchar) med forskellig max længde
vahemikNr (int)
8. samm: vahemik
rangetable indeholder 3 kolonner:
rangeNr (int) er esmane võti ja auto inc.
vahemikMin (int)
rangeMax (int)
9. samm: C# programm
Når der produces en ordre leverpostej, er Procedur følgende:
Kundenummer, ordrenummer, ordreantal and en eventuel kommentar indtastes i C# programmet (i praksis overføres det digitalt from virksomhedens ordresystem. Produktionen startes nu ved tryk på 'start'- knappen. Når en leverpostej er færdigproduceret og lågeten a monte på et transportbånd) Samhørende Værdier af UID og den aktuelle vægt saadab serielt til node-RED, som viser de opsamlede data på armatuurlaual 'et. Samtidig skrives timestamp, UID og vægt i en ny række i patedb.patelog tabellen. Da der på nuv tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.
Med et timerinterval undergersger C# programmeeritud 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 produret, 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, can can de opsamlede data and 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å individueller UID'er eller kundedata på individuelle ordrer.
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 MySql. Data. MySqlClient;
nimeruum show_data_from_database
{avalik osaline klass Vorm1: vorm {MySqlConnection connection = new MySqlConnection ("datasource = localhost; kasutajanimi = juur; parool = ''"); int RidaNumber = 0; // Muutuja pateID väärtuse salvestamiseks int RangeNumber = 0; // Muutuja rangenumbri salvestamiseks int kaal = 0; // Muutuja kaalu salvestamiseks int OrderNr = 0; // Muutuja Tellimuse salvestamiseks int QuantProduced = 0; // Muutuja toodetud koguse salvestamiseks int NumberOfRows = 0; // nullidega ridade arv.. bool ProdRunning = false; // Muutuja, mis näitab, kas käivitus- ja lõpetamisnupud on aktiveeritud int limits = new int [6]; // initsialiseeri massiiv int CustomerID; // Muutuja kliendiID avaliku vormi salvestamiseks Form1 () {InitializeComponent (); load_table (); // helista load_table}
void load_table ()
{MySqlCommand käsk = new MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC;", ühendus); proovige {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }}
private void SetRowOrder ()
{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kan rækkefølgen af kolonner ændres dataGridView1. Columns ["timestamp"]. DisplayIndex = 1; // Her can 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 can rækkefølgen af kolonner ændres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her can rækkefølgen af kolonner ændres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kan rækkefølgen af kolonner ændres}
private void GetData_Click (objekti saatja, EventArgs e) // Loeb andmebaasi tabelit ja tellimusi ajatempli järgi
{load_table (); }
private void btnRefreshUID_Click (objekti saatja, EventArgs e) //
{string timeStr = "SELECT * FROM patedb.patelog ORDER BID UID;"; MySqlCommand käsk = uus MySqlCommand (timeStr, ühendus); proovige {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }}
private void btnRefreshValue_Click (objekti saatja, EventArgs e)
{string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST (kaal nagu SIGNED INTEGER);"; MySqlCommand käsk = new MySqlCommand (weightSort, connection); proovige {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }}
private void ChkNullBtn_Click (objekti saatja, EventArgs e)
{if (ProdRunning) {CheckTableForNull (); load_table (); }}
private void CheckTableForNull ()
{// Kontrollige/seadke taimerintervalli miinimum 100 ms int i; int. TryParse (textTimer1. Text, out i); if (i <100) {timer1. Stop (); i = 100; taimer1.intervall = i; MessageBox. Show ("Minimaalne väärtus i 100mS"); taimer1. Start (); } else {timer1. Interval = i; } textTimer1. Text = taimer1.intervall. ToString (); // Kontrollige, kas tabelis on mõni rida nulliga, tagastab muutuja ridade arvu: NumberOfRows string weightStr = ""; string chkNull = "SELECT COUNT (*) FROM patedb.patelog WHERE rangeNR ON NULL TELLIMUS pateid LIMIT 1;"; MySqlCommand käsk = uus MySqlCommand (chkNull, ühendus); proovige {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); ühendus. Sulge (); } saagi (erand erand) {MessageBox. Show (nt. sõnum); } lõpuks {if (NumberOfRows! = 0) {try {// Valib madalaima pasteedi numbri, kus vahemikNr on NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR ON NULL ORDER BET patey ASC LIMIT 1;"; MySqlCommand cmdID = uus MySqlCommand (readID, ühendus); {connection. Open (); RidaNumber = (int) cmdID. ExecuteScalar (); // täisarv !! ühendus. Sulge (); } listPateID. Text = RidaNumber. ToString (); // loeb ette valitud PateID numbri // Valib valitud roonumbri stringide kaalu = RowNumber. ToString (); string readweight = "VALI kaal FROM patedb.patelog WHERE pateID =" + rida; MySqlCommand cmdweight = uus MySqlCommand (lugemiskaal, ühendus); {connection. Open (); weightStr = (string) cmdweight. ExecuteScalar (); // String !! ühendus. Sulge (); } kaal = int. Pars (weightStr); // teisendada int txtWeight. Text = kaal. ToString (); // print int RangeNumber = 0; if (kaal> = piirid [0] && kaal = piirid [2] && kaal = piirid [4] && kaal <= piirid [5]) {Vahemiku arv = 3; }} txtRange. Text = Vahemiku number. ToString (); UpdateLog (); } saagi (erand erand) {MessageBox. Show (nt. sõnum); } QuantProduced = QuantProduced + 1; }}} private void btnStart_Click (objekti saatja, EventArgs e) {if (ProdRunning == false) {int valtest; try {CustomerID = int. Parse (txtCustomerNr. Text); // lugeda kliendiID} catch {MessageBox. Show ("Sisestage tootmisandmed ja vajutage nuppu" Start "."); }
string test = "SELECT COUNT (*) FROM patedb.customertable WHERE customerID ="+KliendiID;
MySqlCommand cmdtestcustomer = uus MySqlCommand (test, ühendus); {connection. Open (); valtest = Teisenda. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // tagastab 0, kui kliendil ühendust pole. Sulge (); } if (valtest == 1) // kui klient on andmebaasis olemas - alusta tootmist {try {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = tõsi; taimer1. Start (); textTimer1. Text = taimer1.intervall. ToString (); ReadLimits (); } catch (Exception ex) {MessageBox. Show ("Sisesta tootmisandmed ja vajuta nuppu" start "."); }} else MessageBox. Show ("Klient pole andmebaasis, proovige uuesti"); } // ReadLimits (); }
private void ReadLimits ()
{// Loeb piiranguid vahemiku tabelist, vahemik 1 kuni 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = uus MySqlCommand (readmin, ühendus); {connection. Open (); piirid [loendur] = (int) cmdmin. ExecuteScalar (); loendur = loendur + 1; ühendus. Sulge (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = uus MySqlCommand (readmax, ühendus); {connection. Open (); piirid [loendur] = (int) cmdmax. ExecuteScalar (); loendur = loendur + 1; ühendus. Sulge (); }} // lõpp silmuse jaoks}
private void UpdateLog ()
{// UPDATE rangeNR & orderID string Vahemik = RangeNumber. ToString (); string Tellimus = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+Vahemik+','+"orderID ="+OrderNr+"WHERE pateID ="+RidaNumber; MySqlCommand updatecmd = uus MySqlCommand (uuendus, ühendus); proovige {connection. Open (); updatecmd. ExecuteNonQuery (); ühendus. Sulge (); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }}
private void btnStop_Click (objekti saatja, EventArgs e)
{if (ProdRunning == true) {timer1. Stop (); ProdRunning = vale; UpdateOrderTable (); } else {MessageBox. Show ("Tootmist pole veel alustatud. Sisestage andmed ja vajutage nuppu" 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 = uus MySqlCommand (sisestus, ühendus); proovige {connection. Open (); insertcmd. ExecuteNonQuery (); ühendus. Sulge (); QuantProduced = 0; } saagi (erand erand) {MessageBox. Show (nt. sõnum); }}
private void timer1_Tick (objekti saatja, EventArgs e)
{CheckTableForNull (); load_table (); }
private void btnShowOrderTable_Click (objekti saatja, EventArgs e)
{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", ühendus); proovige {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }} else {MessageBox. Show ("Vajutage stopp -klahvi tellimustabeli tabamiseks"); }}
private void btnShowOrderDetails_Click (objekti saatja, 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 käsk = uus MySqlCommand (test, ühendus); proovige {connection. Open (); MySqlDataAdapter adapter = uus MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); } ühendus. Sulge (); } else {MessageBox. Show ("Tellimuse üksikasjade vaatamiseks vajutage stopp"); }}
private void btnShowCustomerDetails_Click (objekti saatja, 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 käsk = uus MySqlCommand (test, ühendus); proovige {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = käsk; DataTable dbdataset = new DataTable (); adapter. Fill (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } saagi (erand erand) {MessageBox. Show (nt. sõnum); }} else {MessageBox. Show ("Kliendi üksikasjade kuvamiseks vajutage stopp"); }}}
}
Soovitan:
Andmete hankimise ja andmete visualiseerimise süsteem MotoStudent elektrilise võidusõiduratta jaoks: 23 sammu
Andmete hankimise ja andmete visualiseerimise süsteem MotoStudent Electric Racing Bike jaoks: Andmete kogumise süsteem on riist- ja tarkvara kogum, mis töötab koos, et koguda andmeid välisanduritelt, salvestada ja töödelda neid hiljem, et neid oleks võimalik graafiliselt visualiseerida ja analüüsida, võimaldades inseneridel teha
Alaska andmebaas: 5 sammu (piltidega)
Alaska andmebaas: Alaska on kliimamuutuste edenemise äärel. Selle ainulaadne asukoht, kus üsna puutumatu maastik on asustatud mitmesuguste söekaevanduste kanalitega, võimaldab palju uurimisvõimalusi. Meie sõber Monty on arheoloog, kes aitab
Arduino andmebaas koos RTC, Nokia LCD ja kodeerijaga: 4 sammu
Arduino andmebaas RTC, Nokia LCD ja kodeerijaga: Osad: Arduino Nano või Arduino Pro Mini Nokia 5110 84x48 LCD DHT11 temperatuuri/niiskuse andur DS1307 või DS3231 RTC moodul koos sisseehitatud AT24C32 EEPROM Odav kodeerija 3 väljalülituskondensaatoriga Omadused: Nokia LCD-l põhinev GUI ja et
Cambus - linnabussi andmete kogumise süsteem: 8 sammu
Cambus - Linnabussi andmekogumissüsteem: Ühistranspordis teadaolevate probleemide ja raskuste hulgas puudub elanikkonnal reaalajas teave ja see on kõige vähem enesekindel. Ühistranspordibusside ülerahvastatus ajab eemale kasutajad, kes eelistavad kasutada oma sõidukeid, isegi
Arduino andmebaas: 8 sammu (piltidega)
Arduino Datalogger: Selles õpetuses teeme Arduino abil lihtsa andmelogija. Mõte on õppida Arduino kasutamise põhitõed teabe kogumiseks ja terminali printimiseks. Seda põhiseadistust saame kasutada mitmesuguste ülesannete täitmiseks. Alustamiseks