תוכן עניינים:
- שלב 1: נתוני אוסף של Opsamling לרישום VID Samt
- שלב 2: תוכנית Arduino
- שלב 3: Node-RED, מאגר נתונים של מסד נתונים I
- שלב 4: עיצוב מסד נתונים
- שלב 5: Patelog
- שלב 6: ניתן להפעלה
- שלב 7: ניתן להתאמה אישית
- שלב 8: לוח טווח
- שלב 9: תוכנית C#
וִידֵאוֹ: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 שלבים (עם תמונות)
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:17
זוהי הפרויקט שמטרתו להבחין במשקל נתונים, רישום זהויות. RFID, פיגור הנתונים ואני en MySQL database vha. node-RED, samt fremvisning וטיפול של נתוני opsamlede ותוכנת C# שאני יוצר ביישום Windows Form. Vi forestiller או:
אנו מציעים יצרן של מפיקים בעבודת 200 גרם foliebakker. כל מכשירי חיבור למכשירים עם תגי RFID עם תגיות פלסטיק/תוויות, הכוללות מזהה ייחודי (UID = מזהה ייחודי, הוא בעל 32 סיביות קוד, 8 תכונות הקסדצימליות) לכל זיהוי כל אחד ואחת. Da færdigvægten of each enkelt bakke leverpostej can svinge (אחריות של råvarer, fordampning i ovn mm), and da kunderne each have and specific krav krav færdigvægten, Brug UID tagget to at knute each enkelt leverpostej to a specific lagerlokation on lageret, hvor der kun lagres Leverpostejer til one specific kunde. Kunderne er supermarkedskæder:
1. אירמה. כמות התערוכות היוקרתיות של חג המולד אמורה להישאר בתוספת של +/- 5%, כלומר מינימום 190 גרם וגבוהה ביותר של 210 גרם.
2. ברוגסן. Vægten on Brugsens leverpostej will keep sig inside for +/- 10%, כלומר מינימום 180g ו- maksimum 220g.
3. אלדי. מבצע הנחה על אלדיס צריך להישאר בתוספת של +/- 15%, כך מינימום 170 גרם ומקסימום 230 גרם.
Der er således følgende sorteringer:
טווח 0: מחוץ לטווח
טווח 1: מינימום 190 גרם/מקסימום 210 גרם
טווח 2: מינימום 180 גרם/מקסימום 220 גרם
טווח 3: מינימום 170 גרם/מקסימום 230 גרם
שלב 1: נתוני אוסף של Opsamling לרישום VID Samt
ניתן לאסוף נתונים עבור משקל, ולרשום רישומים של תגי RFID בשימוש ב- Arduino MEGA2560 עם קורא/כותב RFID-RC522. Da vi ikke har any weight, סימולר vi data for vægten med et potmeter tilsluttet en analog analoge on Arduinoen.
הגדרת אופציה מיושמת:
1 stk potmeter 25k lineært. Yder-benene er tilsluttet hhv. GND og +5V, midterbenet er tilsluttet AN0
RFID-RC522 er tilsluttet לוחות Arduino SPI port בכמה אופנים:
SDA -> סיכה 53
SCK -> pin52
MOSI -> pin51
MISO-> pin50
IRQ -> NC
GND -> GND
RST -> pin5
3.3V -> 3.3V
נתוני De opsamlede, עבור hhv. UID וגם vægten, נשלח על נמל serielle כקודם להפריד טקסט אחר אל node-Red כי עומד אחר ההצגה הבאה על לוח המחוונים והמאגר של מסד נתונים.
שלב 2: תוכנית Arduino
אני ארדואינו תוכנית כוללת את הביבליוטקר SPI.h og MFRC522.h עבור או יכול להשתמש RFID læseren. אני מתחיל את משתנה התוכנה המתאימה. Der laves en instans af MFRC522. אני מגדיר אתחול האתחול של Serielle Connection, SPI Porten ו- MFRC522. לאחר מכן scannes efter תגי RFID. For not at sende det samme UID afsted flere gange efter hverandre, there is made and stump code som tjekker for dette. כאשר der er scannet et UID tag, loades arary nyUID med det בדיוק læste UID. אם מערך nyUID הוא מידע על oldUID, שם ניתן לרכוש ולשנות UID שיכול לשלוח את הנמל הסרלי. אם nyUID og oldUID הוא ens, er der tale om אותו UID tag ו- UID'et צריך להתעלם. אם יש לך UID, אתה יכול לשלוח UID'et על port serielle יחד עם ערך משמעותי מה port serielle. הערך האנלוגי של הסביבה 150-250. הנתונים שולחים מסמך טקסט אחד. Som det sidste s put oldUID = nyUID, således at koden klart to read and nyt RFID tag.. Den last function in program is the function as comparer 2 arrays. פונקציות מחזירות true אם array'ne er ens, ו- false if array'ne er different.
#לִכלוֹל
#include // תוכנית זו סורקת כרטיסי RFID באמצעות לוח קורא/כותב RDIF-RC522. // קוראים UID, קוראים סיכה אנלוגית. ערך אנלוגי 0-1023 משתנה ל -150-250. // ערך ה- UID והערך האנלוגי נשלח כטקסט המופרד בפסיקים ביציאה טורית באמצעות 9600, N, 8, 1. // יש להקפיד לשלוח כל UID פעם אחת ברציפות, // UID חייב להיות קיים לפני שניתן לשלוח שוב את אותו UID. // פונקציה זו מיושמת בקוד על ידי השוואת מערכים: oldUID nyUID בפונקציה array_cmp (oldUID , nyUID )
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; int sensorPin = A0; int ערך = 0; String StringValue = "0000"; בתים oldUID [4] = {}; בתים nyUID [4] = {};
MFRC522 mfrc522 (SS_PIN, RST_PIN); // צור מופע MFRC522.
הגדרת חלל ()
{Serial.begin (9600); // ליזום תקשורת טורית SPI.begin (); // ליזום אוטובוס SPI mfrc522. PCD_Init (); // התחל MFRC522}
לולאת חלל ()
{// חפש כרטיסים חדשים אם (! Mfrc522. PICC_IsNewCardPresent ()) {return; } // בחר אחד מהכרטיסים אם (! Mfrc522. PICC_ReadCardSerial ()) {return; } // טען nyUID עם תג UID עבור (byte i = 0; i <mfrc522.uid.size; i ++) {nyUID = mfrc522.uid.uidByte ; } // if oldUID nyUID if (! array_cmp (oldUID, nyUID)) {// שלח תג UID ביציאה טורית עבור (בת i = 0; i 1000) {Value = 1000; } ערך = (ערך / 10) + 150; // שלח ערך אנלוגי בקנה מידה Serial.print (ערך); // שלח newline Serial.println (); // הגדר oldUID = nyUID עבור (בת z = 0; z <4; z ++) oldUID [z] = nyUID [z]; } // המתן איחור של 1 שניות (1000); }
// השווה 2 מערכים …
array_cmp בוליאני (בייט a , בת ב ) {bool test = true; // בדוק כל רכיב להיות זהה. אם רק אחד אינו, החזר false עבור (בתים n = 0; n <4; n ++) {אם (a [n]! = b [n]) test = false; // אם על בתים לא שווה, test = false} אם (test == true) החזר נכון; אחרת להחזיר שקר; }
שלב 3: Node-RED, מאגר נתונים של מסד נתונים I
הזרימה הבאה נכתבה בצומת אדום:
COM4 הוא קשר רציף לכמה נתונים מקבלים מהארדואינו. פונקציונליות "פיצול וקבל ערך" ומפצל "ספליט וקבל UID" מפעל טקסטים שנשלח באמצעות פקודות וחזורים של hhv vægten ו- UID. Vægten bruges to fremvisning on dashboardet in et linechart and in scale. UID fremvises i et tekstfelt. פונקציות test_sound advarer verbalt med sætningen "מחוץ לטווח", אם משקל מתחת ל -170 גרם או מעל 230 גרם, dvs i טווח 0.
פיצול וקבל ערך:
פלט var = msg.payload.split (',');
temp = {מטען: (פלט [1])}; טמפ 'החזרה;
פיצול וקבל UID:
var output = msg.payload.split (",");
temp = {מטען: פלט [0]}; טמפ 'החזרה;
test_sound:
var number = parseInt (msg.payload);
if (מספר> 230 || מספר <170) {newMsg = {מטען: "מחוץ לטווח"}; החזר newMsg; } אחר {newMsg = {מטען: ""}; החזר newMsg; }
Funktions Split string "," indsætter and timestamp, UID and vægten in a database patedb.patelog.
var output = msg.payload.split (","); // פיצול msg.payload לפי פסיק למערך
UIDTag = פלט [0]; // חלק ראשון למיקום הראשון [0] ValueTag = output [1]; // חלק שני לתפקיד שני [1]
var m = {
topic: "INSERT INTO patedb.patelog (חותמת זמן, UID, משקל) VALUES ('"+תאריך חדש (). toISOString ()+"', '"+UIDTag+"', '"+ValueTag+"');" }; החזר מ;
patelog er en database של MySQL יכול להתחבר לאחד הפרמטרים הבאים:
מארח: מארח מקומי
נמל: 3306
משתמש: root
מסד נתונים: patedb
שלב 4: עיצוב מסד נתונים
Databasen patedb מכיל 4 טבלרים
patelog er dataopsamlingstabellen, tilskrives data af node-RED og C# תוכנית
ניתן להזמין נתונים בטבלה הכוללת נתונים על הגנריות המבוססות על כתובות, עדכיירים של C# התוכנית
לקוחות מותאמים אישית ורשומים
טווח טווחים הוא טבלה המכילה ירקות עבור טווחי התוכנית.
שלב 5: Patelog
Tabellen patelog כולל folgende 6 קולונרים:
pateID (int) הוא המפתח הראשי והדגמים אוטומטיים.
חותמת זמן, UID & משקל הוא מסוג סוגי varchar (med forskellig max length)
rangeNr er of type tinyint (beregnes and tilføjes af C# program)
orderID er af typen int (orderID tilføjes af C# program)
Node-RED לא יכול להעריך את טווח הקולונר. rangeNr og orderID tillader NULL værdier, det Bruce in C# program til at detektere de rækker som skal tilskrives valuier for rangeNr and orderID
שלב 6: ניתן להפעלה
Ordertable מכיל 5 קולונר:
orderID (int) er det aktuelle ordrenummer
orderQuant (mediumint) er ordens pålydende antal
quantProduced (mediumint) הוא מספר השכירות בפועל. (Tælles af C# תכנית)
comment (tinytext) הוא הערה לאירוע לשירויות.
customerID (int) הוא נתון הלקוח הנוכחי על סדר היום.
שלב 7: ניתן להתאמה אישית
התאמה אישית מכילה 6 קולונרים:
customerID (int) הוא מפתח ראשי og auto inc.
שם, כתובת, טלפון, דוא ל (varchar) med forskellig max lengde
rangeNr (int)
שלב 8: לוח טווח
לוח טווחים מכיל 3 קולונרים:
rangeNr (int) הוא מפתח ראשי og inc.
rangeMin (int)
טווח מקס (int)
שלב 9: תוכנית C#
כאשר שם הפיקוחים וההנחיות הם הפרוצדורות הבאות:
Kundenummer, ordrenummer, ordreantal og en eventuel comment indtastes i C# program (i practice overases det digitalt from enterpriseens ordresystem. Productions startes nu ved tryk on 'start'- knappen. When en leverpostej is færdigproduceret and låget is monteret, vejes den of Arduinoen (på et transportbånd) Samhørende værdier of UID and the relevant weight sendes serielt til node-RED, which viser the opsamlede data on dashboard 'et. הזמן לא יכול לקבל ערך לטווחNr והזמנה מזהה יש ערך NULL.
Med et timerinterval undersøger C# program patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. כאשר יש לזהות מספר רב של NULL ערך, טווח הערכות והמקרים יחד עם ההזמנה הנוכחית. כאשר en ordre er produceret, afsluttes ordren ved tryk på”stop”- knappen. כאשר ordren avsluttes, tilføjes en row til patedb.ordertable med aktual ordredata. כאשר ניתן לסיים את הנתונים, אני יכול לאסוף נתונים בפתוחים ולפתוח את התצוגה על מנת ללחוץ על קבצים שונים של קבוצת עדכוני DataGridview. ניתן להזמין גם להופיע, ולרשותם ניתן למצוא מידע על יחידות UID'er או לקוח נתונים על פרטים אישיים.
באמצעות מערכת; שימוש ב- System. Collections. Generic; באמצעות System. ComponentModel; שימוש ב- System. Data; שימוש ב- System. Drawing; באמצעות System. Linq; שימוש ב- System. Text; שימוש ב- System. Threading. Tasks; שימוש ב- System. Windows. Forms; באמצעות MySql. Data. MySqlClient;
מרחב שמות show_data_from_database
{מחלקה ציבורית חלקית טופס 1: טופס {חיבור MySqlConnection = MySqlConnection חדש ("מקור מידע = localhost; שם משתמש = root; סיסמא = ''"); int RowNumber = 0; // משתנה לאחסון ערך pateID int RangeNumber = 0; // משתנה לאחסון משקל rangenumber = 0; // משתנה לאחסון המשקל int OrderNr = 0; // משתנה לאחסון OrderNR int QuantProduced = 0; // משתנה לאחסון הכמות המיוצרת int NumberOfRows = 0; // מספר שורות עם null.. bool ProdRunning = false; // משתנה המציין אם לחצני ההתחלה והעצירה הופעלו int גבולות = חדש int [6]; // לאתחל מערך int CustomerID; // משתנה לאחסון customerID public Form1 () {InitializeComponent (); load_table (); // להתקשר load_table}
void load_table ()
{פקודה MySqlCommand = MySqlCommand חדש ("SELECT * מתוך patedb.patelog ORDER BY חותמת זמן DESC;", חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}
חלל פרטי SetRowOrder ()
{dataGridView1. Columns ["pateID"]. DisplayIndex = 0; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["חותמת זמן"]. DisplayIndex = 1; // Her kansequfølgen of kolonner Changres dataGridView1. Columns ["UID"]. DisplayIndex = 2; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["weight"]. DisplayIndex = 3; // Her kansequfølgen of kolonner Changres dataGridView1. Columns ["rangeNr"]. DisplayIndex = 4; // Her kansequfølgen of colonner Changres dataGridView1. Columns ["orderID"]. DisplayIndex = 5; // Her kansequfølgen af kolonner ændres}
חלל פרטי GetData_Click (שולח אובייקט, EventArgs e) // קורא טבלת מסדי נתונים והזמנות לפי חותמת זמן
{load_table (); }
חלל פרטי btnRefreshUID_Click (שולח אובייקט, EventArgs e) //
{string timeStr = "SELECT * מתוך patedb.patelog הזמנה לפי UID;"; פקודת MySqlCommand = MySqlCommand חדשה (timeStr, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}
void פרטי btnRefreshValue_Click (שולח אובייקט, EventArgs e)
{string weightSort = "SELECT * מתוך patedb.patelog הזמנה לפי קסטה (משקל כפי שנחתם אינטגר);"; פקודת MySqlCommand = MySqlCommand חדשה (משקלSort, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder (); מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}
חלל פרטי ChkNullBtn_Click (שולח אובייקט, EventArgs e)
{if (ProdRunning) {CheckTableForNull (); load_table (); }}
חלל פרטי CheckTableForNull ()
{// בדוק/הגדר מרווח זמן מינימלי 100 ms int i; int. TryParse (textTimer1. Text, out i); אם (i <100) {timer1. Stop (); i = 100; טיימר 1. מרווח = i; MessageBox. Show ("ערך מינימלי i 100mS"); טיימר 1. התחל (); } אחר {טיימר1.אינטרוול = i; } textTimer1. Text = timer1. Interval. ToString (); // בדוק אם שורות עם null זמינות בטבלה מחזירות את מספר השורות במשתנה: NumberOfRows string stringStr = ""; string chkNull = "בחירת ספירה (*) מתוך patedb.patelog היכן הטווח NR הוא הזמנה אפסית לפי הגבלת pateID 1;"; פקודת MySqlCommand = MySqlCommand חדשה (chkNull, חיבור); נסה {connection. Open (); NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()); connection. Close (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } לבסוף {if (NumberOfRows! = 0) {try {// בוחר את המספר הנמוך ביותר של pateID שבו rangeNr הוא NULL string readID = "SELECT pateID מתוך patedb.patelog WHERE rangeNR הוא NULL ORDER לפי pateID ASC LIMIT 1;"; MySqlCommand cmdID = MySqlCommand חדש (readID, חיבור); {connection. Open (); RowNumber = (int) cmdID. ExecuteScalar (); //מספר שלם!! connection. Close (); } listPateID. Text = RowNumber. ToString (); // לקרוא את מספר ה- PateID שנבחר // בוחר משקל משורת המחרוזות מספר מס 'rown = RowNumber. ToString (); string readweight = "בחר משקל מתוך patedb.patelog WHERE pateID =" + שורה; MySqlCommand cmdweight = MySqlCommand חדש (משקל קל, חיבור); {connection. Open (); weightStr = (string) cmdweight. ExecuteScalar (); // מחרוזת !! connection. Close (); } משקל = int. Parse (weightStr); // להמיר int txtWeight. Text = weight. ToString (); // print int RangeNumber = 0; אם (משקל> = גבולות [0] && משקל = גבולות [2] && משקל = גבולות [4] && משקל <= גבולות [5]) {RangeNumber = 3; }} txtRange. Text = RangeNumber. ToString (); UpdateLog (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } QuantProduced = QuantProduced + 1; }}} חלל פרטי btnStart_Click (שולח אובייקט, EventArgs e) {if (ProdRunning == false) {int valtest; נסה {CustomerID = int. Parse (txtCustomerNr. Text); // read customerID} catch {MessageBox. Show ("הזן נתוני ייצור ולחץ על כפתור 'התחל'."); }
string test = "SELECT COUNT (*) FROM patedb.customertable WHERE customerID ="+CustomerID;
MySqlCommand cmdtestcustomer = MySqlCommand חדש (בדיקה, חיבור); {connection. Open (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // מחזירה 0 אם הלקוח אינו קיים חיבור.סגור (); } if (valtest == 1) // אם קיים לקוח במסד הנתונים - התחל בייצור {נסה {OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = true; טיימר 1. התחל (); textTimer1. Text = timer1. Interval. ToString (); ReadLimits (); } catch (יוצא מן הכלל) {MessageBox. Show ("הזן נתוני ייצור ולחץ על כפתור 'התחל'."); }} else MessageBox. Show ("הלקוח אינו במסד הנתונים, נסה שוב"); } // ReadLimits (); }
חלוקות פרטיות של ReadLimits ()
{// קורא גבולות מטווח טווח, טווח 1 עד 3 int counter = 0; for (int rangeNr = 1; rangeNr <4; rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr ="+rangeNr; MySqlCommand cmdmin = MySqlCommand חדש (readmin, חיבור); {connection. Open (); גבולות [counter] = (int) cmdmin. ExecuteScalar (); מונה = מונה + 1; connection. Close (); } // MessageBox. Show (counter. ToString ()); string readmax = "SELECT rangeMax FROM patedb.rangetable WHERE rangeNr =" + rangeNr; MySqlCommand cmdmax = MySqlCommand חדש (מקס קריאה, חיבור); {connection. Open (); גבולות [counter] = (int) cmdmax. ExecuteScalar (); מונה = מונה + 1; connection. Close (); }} // סוף עבור לולאה}
UpdateLog פרטי חלל ()
{// UPDATE rangeNR & orderID string Range = RangeNumber. ToString (); string Order = OrderNr. ToString (); string update = "UPDATE patedb.patelog SET rangeNr ="+טווח+','+"orderID ="+OrderNr+"WHERE pateID ="+RowNumber; MySqlCommand updatecmd = MySqlCommand חדש (עדכון, חיבור); נסה {connection. Open (); updatecmd. ExecuteNonQuery (); connection. Close (); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}
חלל פרטי btnStop_Click (שולח אובייקט, EventArgs e)
{if (ProdRunning == true) {timer1. Stop (); ProdRunning = false; UpdateOrderTable (); } else {MessageBox. Show ("עדיין לא החלה הפקה. הזן נתונים ולחץ על כפתור" התחל "); }}
פרטי חלל 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 = MySqlCommand חדש (הכנס, חיבור); נסה {connection. Open (); insertcmd. ExecuteNonQuery (); connection. Close (); QuantProduced = 0; } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }}
טיימר חלל פרטי 1_Tick (שולח אובייקט, EventArgs e)
{CheckTableForNull (); load_table (); }
חלל פרטי btnShowOrderTable_Click (שולח אובייקט, EventArgs e)
{if (ProdRunning == false) {MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("לחץ על עצור כדי לראות סדר טבלה"); }}
private void btnShowOrderDetails_Click (שולח אובייקט, 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 = MySqlCommand חדשה (בדיקה, חיבור); נסה {connection. Open (); מתאם MySqlDataAdapter = MySqlDataAdapter חדש (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); } connection. Close (); } else {MessageBox. Show ("הקש על עצור לצפייה בפרטי ההזמנה"); }}
private void btnShowCustomerDetails_Click (שולח אובייקט, EventArgs e)
{if (ProdRunning == false) {string test = ("SELECT patedb.customertable.customerID, שם, כתובת, טלפון, דוא"ל, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID = patedb.customertable. customerID WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text +"' "); פקודת MySqlCommand = MySqlCommand חדשה (בדיקה, חיבור); נסה {MySqlDataAdapter adapter = new MySqlDataAdapter (); adapter. SelectCommand = פקודה; DataTable dbdataset = DataTable חדש (); מתאם. מילוי (dbdataset); BindingSource bsource = new BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; מתאם. עדכון (dbdataset); } catch (יוצא מן הכלל) {MessageBox. Show (ex. Message); }} else {MessageBox. Show ("לחץ על עצור כדי לצפות בפרטי הלקוח"); }}}
}
מוּמלָץ:
EAL - איסוף נתוני GPS בתעשייה 4.0 ברכב RC: 4 שלבים
EAL - איסוף נתוני GPS בתעשייה 4.0 במכונית RC: במדריך זה נדבר על האופן שבו אנו מתקינים מודול GPS במכונית RC ופרסמנו את הנתונים שנאספו לדף אינטרנט לצורך ניהול קל. בעבר הכנו מדריך כיצד יצרנו את מכונית ה- RC שלנו, שתוכלו למצוא כאן. זה משתמש ב
Dataopsamling Af Tyverialarm IIOT 4.0: 8 שלבים
Dataopsamling Af Tyverialarm IIOT 4.0: פרויקט זה של IIOT יינתן להרחבה על כל מערכת, וכמו כן יש לי מבנה על ארדואינו וקודם בעבר. הפרויקט הזה מתמקד בלחץ על הנתונים, ואני מקבל ממרחק של כמה וכמה משתמשים. D
EAL- מוטבע - נעילת שילוב: 4 שלבים
EAL- מוטבע- נעילת שילוב: פרויקט זה הוא פרויקט בית ספר אחד, אותו עשיתי כדי לבחור נושא 2.1 C-תכנות ב- EAL. זו הפעם הראשונה, כשעשיתי פרויקט ארדואינו ותכנות C. זהו פרויקט, שמציג מנעול משולב. מנעול משולב
EAL - תכנות משובץ: מערבל סוכריות 1000: 9 שלבים
EAL - תכנות משובץ: מיקסר קנדי 1000: לפרויקט שלנו בארדואינו החלטנו להכין מיקסר לממתקים. הרעיון הוא שהמשתמש יכול ללחוץ על כפתור ואז המנועים יתחילו להוציא את הממתק לקערה, וכאשר התוכנית תפעל, היא תיפסק. הטיוטה הראשונה
EAL-Industry 4.0-Smart Rocket: 8 שלבים (עם תמונות)
EAL-Industry 4.0-Smart Rocket: זהו פרויקט בית ספרי, שנעשה על Erhversakademiet Lilleb æ lt בדנמרק. הפרויקט נעשה בכיתה בשם "Industri 4.0". המשימה היא להטמיע מערכת אוטומטית מהתעשייה 4.0. עקרונות. המערכת צריכה להיות מסוגלת ל