جدول المحتويات:
- الخطوة 1: Opsamling Af Data for Vægt Samt Registrering Af UID
- الخطوة الثانية: برنامج اردوينو
- الخطوة 3: Node-RED و Lagring Af Data I Database
- الخطوة 4: تصميم قاعدة البيانات
- الخطوة 5: Patelog
- الخطوة 6: ترتيب الجدول
- الخطوة 7: قابل للتخصيص
- الخطوة 8: Rangetable
- الخطوة 9: برنامج C #
فيديو: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 خطوات (مع صور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:41
Dette projekt omhandler opsamling af vægtdata، registrering af Identiteter vha. RFID ، تتأخر عن البيانات في قاعدة بيانات MySQL vha. node-RED، samt fremvisning og behandling af de opsamlede data i et C # program I form af en Windows Form Application. Vi Forestiller OS Følgende:
Vi har en produktionslinje som producter leverpostej i 200g foliebakker. Alle færdigbagte leverpostejer udstyres efter afkøling med et RFID tag i plasticlåget / labelen، som indeholder et unikt ID (UID = معرف فريد ، أي 32 بت كود ، 8 سداسي عشري karakterer) للتعرف على الأشياء التي تحتاجها. 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 hpåre enkeltager leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:
1. إيرما. Vægten på Irmas luksus leverpostej skal Holde sig inden +/- 5٪ ، altså بحد أدنى 190 جم و 210 جم بحد أدنى.
2. بروغسن. Vægten på Brugsens leverpostej skal Holde sig inden +/- 10٪ ، altså بحد أدنى 180 جم و 220 جم بحد أدنى.
3. الدي. Vægten på Aldis خصم leverpostej skal Holde sig inden +/- 15٪ ، altså بحد أدنى 170 جرامًا و 230 جرام بحد أدنى.
فارز الفرز Der er således følgende:
Range0: خارج النطاق
النطاق 1: 190 جرام كحد أدنى / الحد الأقصى 210 جرام
Range2: بحد أدنى 180 جم / حد أقصى 220 جم
Range3: الحد الأدنى 170 جم / الحد الأقصى 230 جم
الخطوة 1: Opsamling Af Data for Vægt Samt Registrering Af UID
حتى يتم تشغيل البيانات من أجل vægt و samt Registering af rfid tags and anvendt en arduino MEGA2560 med en 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 طنجرة ضغط 25 كيلو lineært. Yder-benene er tilsluttet hhv. GND og + 5V ، midterbenet er tilsluttet AN0
RFID-RC522 er tilsluttet Arduino boardets SPI port på følgende måde:
SDA -> دبوس 53
SCK -> دبوس 52
موسي -> دبوس 51
ميسو-> دبوس 50
IRQ -> NC
GND -> GND
RST -> pin5
3.3 فولت -> 3.3 فولت
بيانات De opsamlede ، لـ hhv. UID og vægten ، يرسل كل من منفذ سلسلة إلى منفذ منفصل إلى نقطة وصول إلى العقدة الحمراء للتسجيل في لوحة القيادة ولوحة القيادة المتأخرة في قاعدة البيانات.
الخطوة الثانية: برنامج اردوينو
I Arduino programmet inkluderes de to biblioteker SPI.h og MFRC522.h for at kunne bruge RFID læseren. لقد بدأت في تشغيل متغير برمجة متغير. Der laves en instans af MFRC522. أقوم بإعداد إعدادات blokken initialiseres den serielle forbindelse ، و SPI porten og MFRC522. إلغاء الماسحات الضوئية علامات RFID. بالنسبة لـ 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 ، يقوم بتحميل 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 ، يرسل 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. ترسل البيانات som en komma -epareret tekststreng. بعض العناصر الجانبية القديمة UID = nyUID، således at koden klart til at læse et nyt rfid tag. Funktionen Returnerer true hvis array'ne er eng ، og false hvis array'ne er forskellige.
#يشمل
# تضمين // يقوم هذا البرنامج بمسح بطاقات RFID باستخدام لوحة القارئ / الكاتب RDIF-RC522. // تمت قراءة UID ، قراءة دبوس تمثيلي. تم قياس القيمة التناظرية 0-1023 إلى 150-250. // يتم إرسال UID والقيمة التناظرية كنص مفصول بفاصلة على المنفذ التسلسلي باستخدام 9600 ، N ، 8 ، 1. // تم الحرص على إرسال كل 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 () ؛ // Initiate SPI bus 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 على المنفذ التسلسلي لـ (byte i = 0؛ i 1000) {Value = 1000؛ } القيمة = (القيمة / 10) + 150 ؛ // إرسال القيمة التناظرية المقاسة Serial.print (القيمة) ؛ // send newline Serial.println () ؛ // تعيين oldUID = nyUID لـ (بايت z = 0 ؛ z <4 ؛ z ++) oldUID [z] = nyUID [z] ؛ } // انتظر تأخير 1 ثانية (1000) ؛ }
// مقارنة صفيفتين…
boolean array_cmp (byte a ، byte b ) {bool test = true؛ // اختبر كل عنصر ليكون هو نفسه. إذا لم يكن واحد فقط غير صحيح ، فقم بإرجاع خطأ لـ (بايت n = 0 ؛ n <4 ؛ n ++) {if (a [n]! = b [n]) test = false؛ // إذا كانت البايت لا تساوي ، test = false} إذا (test == true) تُرجع صحيحة ؛ آخر عودة كاذبة ؛ }
الخطوة 3: Node-RED و Lagring Af Data I Database
Følgende flow er lavet i node-RED:
COM4 er den serielle forbindelse hvor data modtages من Arduino boardet. Funktionerne "تقسيم والحصول على قيمة" انقسام والحصول على UID "الفاصل 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 "خارج النطاق" ، hvis vægten er under 170g eller over 230g ، dvs i range 0.
انقسام واحصل على القيمة:
var output = msg.payload.split ('،') ؛
temp = {payload: (output [1])} ؛ عودة درجة الحرارة
انقسام والحصول على UID:
var output = msg.payload.split ("،") ؛
temp = {الحمولة: الإخراج [0]} ؛ عودة درجة الحرارة
اختبار الصوت:
var number = parseInt (msg.payload) ؛
if (number> 230 || number <170) {newMsg = {payload: "Out of range"}؛ عودة newMsg ؛ } else {newMsg = {payload: ""}؛ عودة newMsg. }
Funktionen Split string "،" indsætter et timestamp، UID og vægten i en database patedb.patelog.
var output = msg.payload.split ("،") ؛ // تقسيم msg.payload بواسطة فاصلة إلى مصفوفة
UIDTag = الإخراج [0] ، // الجزء الأول في المركز الأول [0] ValueTag = الإخراج [1] ؛ // الجزء الثاني في المركز الثاني [1]
فار م = {
الموضوع: "INSERT INTO patedb.patelog (الطابع الزمني ، UID ، الوزن) VALUES ('" + new Date (). toISOString () + "'، '" + UIDTag + "'، '" + ValueTag + "')؛" } ؛ العودة م ؛
patelog er en MySQL database forbindelse som er sat op med følgende parametre:
المضيف: المضيف المحلي
المنفذ: 3306
المستخدم: الجذر
قاعدة البيانات: patedb
الخطوة 4: تصميم قاعدة البيانات
قاعدة بيانات patedb indeholder 4 tabeller
patelog er dataopsamlingstabellen، tilskrives data af node-RED og C # programmet
جدول الطلب ، جدول ، بعض البيانات المستقلة ، om de genemførte ordrer ، tilskrives data af C # programmet
قابل للتخصيص إيه وآخرون التسجيل
rangetable er en tabel som indeholder grænseværdierne for de i C # programmet benyttede ranges.
الخطوة 5: Patelog
تابلين باتيلوج إيندهولدر فولجيندي 6 كولونر:
pateID (int) أو المفتاح الأساسي والقرص التلقائي.
الطابع الزمني و UID و Vægt er af typen varchar (med forskellig max længde)
rangeNr af typen tinyint (beregnes og tilføjes af C # programmet)
معرف الطلب نوع int (معرف الطلب من C # programmet)
Node-RED tilføjer ikke værdier til kolonnerne rangeNr og orderID. rangeNr og orderID الحراثة NULL værdier ، det bruges i C # programmet til at detektere de rækker som skal tilskrives værdier for rangeNr og orderID
الخطوة 6: ترتيب الجدول
حامل جدول الطلب 5 كولونر:
معرف الطلب (int) أو كشف النظام
OrderQuant (متوسط) أو أمر pålydende antal
الكميات المنتجة (المتوسطة) أو تأجيرها أو المنتجين أو المنتجين. (Tælles af C # programmet)
تعليق (نص قصير) أو في وقت لاحق kommentar til ordren.
معرّف العميل (int) أو كشف aktuelle kundenummer på ordren.
الخطوة 7: قابل للتخصيص
الحافظة القابلة للتخصيص 6 كولونر:
customerID (int) er Primary key og auto inc.
الاسم والعنوان والهاتف والبريد الإلكتروني (varchar) med forskellig max længde
rangeNr (int)
الخطوة 8: Rangetable
Rangeetable indeholder 3 كولونر:
rangeNr (int) er الرئيسي key og auto inc.
المدى دقيقة (كثافة العمليات)
المدى ماكس (كثافة العمليات)
الخطوة 9: برنامج C #
Når der Produces 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. på et transportbånd) Samhørende værdier af UID og den aktuelle vægt يرسل سلسلة حتى العقدة الحمراء ، بعض البيانات المعروضة على لوحة القيادة 'et. tidspunkt ikke tilskrives værdier til rangeNr og orderID vil de have værdien NULL.
Med et timer interval underøger C # programmet patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen. Når der detekteret en række med NULL værdi، beregnes rangeNr og det tilføjes sammen med detktuelle orderID. Når en ordre er productet، 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. ترتيب الجدول كان أوجسا رؤيا ، أو دير كان سوج أوس أوريداتا باو فردي UID'er eller kundedata på individuelle ordrer.
باستخدام النظام باستخدام 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. مساحة الاسم show_data_from_database
{الصنف الجزئي العام Form1: النموذج {MySqlConnection connect = new MySqlConnection ("datasource = localhost؛ username = root؛ password = ''")؛ عدد int RowNumber = 0 ؛ // متغير لتخزين قيمة pateID int RangeNumber = 0 ؛ // متغير لتخزين وزن رقم المدى int = 0 ؛ // متغير لتخزين الوزن int OrderNr = 0 ؛ // متغير لتخزين OrderNR int QuantProduc = 0 ؛ // متغير لتخزين الكمية المنتجة int NumberOfRows = 0 ؛ // عدد الصفوف ذات القيم الخالية.. bool ProdRunning = false؛ // متغير يشير إلى ما إذا تم تنشيط أزرار البدء والإيقاف int limits = new int [6] ؛ // تهيئة المصفوفة int CustomerID؛ // متغير لتخزين customerID public Form1 () {InitializeComponent () ؛ load_table () ؛ // call load_table}
تحميل باطل ()
{MySqlCommand command = new MySqlCommand ("SELECT * FROM patedb.patelog ORDER BY timestamp DESC؛"، connection)؛ جرب {MySqlDataAdapter adaptor = new MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ SetRowOrder () ، محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }}
SetRowOrder () باطل خاص
{dataGridView1. Columns ["pateID"]. DisplayIndex = 0 ؛ // يمكن أن يكون لديك كلونر وكلمة بياناتGridView1. Columns ["الطابع الزمني"]. DisplayIndex = 1 ؛ // يمكن أن يكون لديك كلونر وكلمة بيانات GridView1. Columns ["UID"]. DisplayIndex = 2 ؛ // لها القدرة على القراءة والكتابة وبيانات GridView1. Columns ["الوزن"]. DisplayIndex = 3 ؛ // يمكن أن يكون لديك كلونر وكلمة بيانات GRridView1. Columns ["rangeNr"]. DisplayIndex = 4 ؛ // يمكن أن يكون لديك كلونر وكلمة بيانات GridView1. Columns ["معرف الطلب"]. DisplayIndex = 5 ؛ // Her kan rækkefølgen af kolonner ændres}
GetData_Click باطل خاص (مرسل الكائن ، EventArgs e) // يقرأ جدول قاعدة البيانات والأوامر حسب الطابع الزمني
{load_table ()؛ }
btnRefreshUID_Click باطل خاص (مرسل الكائن ، EventArgs e) //
{string timeStr = "SELECT * FROM patedb.patelog ORDER BY UID؛"؛ أمر MySqlCommand = جديد MySqlCommand (timeStr ، اتصال) ؛ جرب {MySqlDataAdapter adaptor = new MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ SetRowOrder () ، محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }}
btnRefreshValue_Click باطل خاص (كائن مرسل ، EventArgs e)
{string weightSort = "SELECT * FROM patedb.patelog ORDER BY CAST (الوزن AS SIGNED INTEGER)؛"؛ MySqlCommand command = new MySqlCommand (weightSort، connection) ؛ جرب {MySqlDataAdapter adaptor = new MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ SetRowOrder () ، محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }}
ChkNullBtn_Click باطل خاص (مرسل الكائن ، EventArgs e)
{if (ProdRunning) {CheckTableForNull () ، load_table () ؛ }}
CheckTableForNull () باطل خاص
{// Check / set timerinterval 100 مللي ثانية كحد أدنى int i ؛ int. TryParse (textTimer1. Text ، خارج i) ؛ إذا (i <100) {timer1. Stop () ؛ أنا = 100 ؛ timer1. Interval = أنا ؛ MessageBox. Show ("الحد الأدنى للقيمة i 100mS") ؛ الموقت 1. Start () ؛ } else {timer1. Interval = i؛ } textTimer1. Text = timer1. Interval. ToString () ، // تحقق مما إذا كانت هناك أي صفوف تحتوي على قيمة خالية في الجدول ، وترجع عدد الصفوف في المتغير: NumberOfRows string weightStr = ""؛ string chkNull = "SELECT COUNT (*) من patedb.patelog حيث rangeNR هو NULL ORDER BY pateID LIMIT 1؛"؛ أمر MySqlCommand = جديد MySqlCommand (chkNull ، اتصال) ؛ جرب {connection. Open () ، NumberOfRows = Convert. ToInt32 (command. ExecuteScalar ()) ، Connection. Close () ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ } أخيرًا {if (NumberOfRows! = 0) {try {// حدد أدنى رقم pateID حيث يكون rangeNr هو NULL string readID = "SELECT pateID FROM patedb.patelog WHERE rangeNR is NULL ORDER BY pateID ASC LIMIT 1؛"؛ MySqlCommand cmdID = جديد MySqlCommand (readID ، اتصال) ؛ {connection. Open () ؛ RowNumber = (int) cmdID. ExecuteScalar () ، //عدد صحيح!! Connection. Close () ؛ } listPateID. Text = RowNumber. ToString () ، // اقرأ رقم PateID المحدد // يختار الوزن من سلسلة rownumber المحددة row = RowNumber. ToString () ؛ سلسلة readweight = "حدد الوزن من patedb.patelog WHERE pateID =" + row؛ MySqlCommand cmdweight = جديد MySqlCommand (readweight ، اتصال) ؛ {connection. Open () ؛ weightStr = (سلسلة) cmdweight. ExecuteScalar () ؛ //سلسلة !! Connection. Close () ؛ } الوزن = int. Parse (weightStr) ؛ // التحويل إلى int txtWeight. Text = weight. ToString () ؛ // print int RangeNumber = 0 ؛ if (weight> = limits [0] && weight = limits [2] && weight = limits [4] && weight <= limits [5]) {RangeNumber = 3؛ }} txtRange. Text = RangeNumber. ToString () ، UpdateLog () ، } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ } QuantProduc = QuantProduct + 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 إذا لم يكن العميل موجودًا connection. Close () ؛ } if (valtest == 1) // إذا كان العميل موجودًا في قاعدة البيانات - ابدأ الإنتاج {try {OrderNr = int. Parse (txtOrderNumber. Text) ؛ ProdRunning = صحيح ، الموقت 1. Start () ؛ textTimer1. Text = timer1. Interval. ToString () ، ReadLimits () ، } catch (استثناءً) {MessageBox. Show ("أدخل بيانات الإنتاج واضغط زر" بدء ".")؛ }} else MessageBox. Show ("العميل ليس في قاعدة البيانات ، حاول مرة أخرى")؛ } // ReadLimits ()؛ }
ReadLimits () الفراغ الخاص
{// يقرأ الحدود من rangeetable ، النطاق 1 إلى 3 int counter = 0 ؛ لـ (int rangeNr = 1؛ rangeNr <4؛ rangeNr ++) {string readmin = "SELECT rangeMin FROM patedb.rangetable WHERE rangeNr =" + rangeNr؛ MySqlCommand cmdmin = جديد MySqlCommand (readmin ، اتصال) ؛ {connection. Open () ؛ حدود [عداد] = (int) cmdmin. ExecuteScalar () ؛ عداد = عداد + 1 ؛ Connection. Close () ؛ } // MessageBox. Show (counter. ToString ()) ، string readmax = "SELECT rangeMax from patedb.rangetable WHERE rangeNr =" + rangeNr؛ MySqlCommand cmdmax = جديد MySqlCommand (readmax ، اتصال) ؛ {connection. Open () ؛ حدود [عداد] = (int) cmdmax. ExecuteScalar () ؛ عداد = عداد + 1 ؛ Connection. Close () ؛ }} // end for loop}
UpdateLog باطل خاص ()
{// UPDATE rangeNR & orderID string = RangeNumber. ToString ()؛ سلسلة Order = OrderNr. ToString () ؛ string update = "UPDATE patedb.patelog SET rangeNr =" + Range + '،' + "orderID =" + OrderNr + "WHERE pateID =" + RowNumber؛ MySqlCommand updatecmd = جديد MySqlCommand (تحديث ، اتصال) ؛ جرب {connection. Open () ، updatecmd. ExecuteNonQuery () ، Connection. Close () ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }}
btnStop_Click باطل خاص (مرسل الكائن ، EventArgs e)
{if (ProdRunning == true) {timer1. Stop () ؛ ProdRunning = خطأ ، UpdateOrderTable () ، } else {MessageBox. Show ("لم يبدأ الإنتاج بعد. أدخل البيانات واضغط على زر" ابدأ ") ؛ }}
UpdateOrderTable () باطل خاص
{string insert = "INSERT INTO patedb.ordertable (orderID، orderQuant، quantProduc، comment، customerID) VALUES ('" + this.txtOrderNumber. Text + "'، '" + this.txtOrderQuant. Text + "'، '" + QuantProduc. ToString () + "'،'" + this.txtComment. Text + "'،'" + this.txtCustomerNr. Text + "')؛"؛ MySqlCommand insertcmd = جديد MySqlCommand (إدراج ، اتصال) ؛ جرب {connection. Open () ، insertcmd. ExecuteNonQuery () ، Connection. Close () ؛ أنتجت الكمية = 0 ؛ } catch (استثناء ex) {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؛"، connection)؛ جرب {MySqlDataAdapter adaptor = new MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }} else {MessageBox. Show ("Press stop to wiev orderTable")؛ }}
btnShowOrderDetails_Click باطل خاص (كائن المرسل ، EventArgs e)
{if (ProdRunning == false) {string test = ("SELECT patedb.ordertable.orderID، orderQuant، quantProduc، comment، customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID = patedb.ordertable.orderID WHERE patedb.patelog. UID = '"+ txtShowOrderDetails. Text +" "") ؛ MySqlCommand command = new MySqlCommand (اختبار ، اتصال) ؛ جرب {connection. Open () ، محول MySqlDataAdapter = جديد MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ } connection. Close () ؛ } else {MessageBox. Show ("اضغط على إيقاف لعرض تفاصيل الطلب")؛ }}
btnShowCustomerDetails_Click (كائن المرسل ، 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 command = new MySqlCommand (اختبار ، اتصال) ؛ جرب {MySqlDataAdapter adaptor = new MySqlDataAdapter () ؛ adaptor. SelectCommand = الأمر ؛ DataTable dbdataset = new DataTable () ، محول. ملء (dbdataset) ؛ BindingSource bsource = new BindingSource () ؛ bsource. DataSource = dbdataset ؛ dataGridView1. DataSource = bsource ؛ محول. تحديث (dbdataset) ؛ } catch (استثناء ex) {MessageBox. Show (ex. Message)؛ }} else {MessageBox. Show ("Press stop to wiev customer details")؛ }}}
}
موصى به:
حامل صور مع مكبر صوت مدمج: 7 خطوات (مع صور)
حامل صورة مع مكبر صوت مدمج: هذا مشروع رائع يجب القيام به خلال عطلة نهاية الأسبوع ، إذا كنت تريد أن تجعلك مكبر صوت خاص به يمكنه حمل الصور / البطاقات البريدية أو حتى قائمة المهام. كجزء من التصميم ، سنستخدم Raspberry Pi Zero W باعتباره قلب المشروع ، و
إطار صور LED على شكل قلب - اصنع هدية مثالية لعيد الحب أو عيد الميلاد: 7 خطوات (مع صور)
إطار صور قلب LED - اصنع هدية مثالية لعيد الحب أو عيد ميلاد: مرحبًا! في هذا الدليل ، سأوضح لك كيف يمكنك إنشاء إطار صور قلب LED رائع. لجميع عشاق الإلكترونيات! اصنع هدية مثالية لعيد الحب أو عيد الميلاد أو الذكرى السنوية لأحبائك! يمكنك مشاهدة الفيديو التوضيحي لهذا
إطار صور Raspberry Pi في أقل من 20 دقيقة: 10 خطوات (مع صور)
إطار صور Raspberry Pi في أقل من 20 دقيقة: نعم ، هذا إطار صور رقمي آخر! لكن انتظر ، إنه أكثر أناقة ، وربما يكون الأسرع في التجميع والركض
Dataopsamling Af Tyverialarm IIOT 4.0: 8 خطوات
Dataopsamling Af Tyverialarm IIOT 4.0: Dette projekt i faget IIOT er en videreudvikling af entyverialarm، som jeg har lavet på en Arduino and tidligere projekt. قم بالتسجيل في مشروع blevet fokuseret på lagring af de data، jeg får min tyverialarm، samt at lave et brugerinterface. د
إطار صور رقمي ، متصل بشبكة WiFi - Raspberry Pi: 4 خطوات (مع صور)
إطار صور رقمي ، مرتبط بشبكة WiFi - Raspberry Pi: هذا طريق سهل للغاية ومنخفض التكلفة لإطار صور رقمي - مع ميزة إضافة / إزالة الصور عبر WiFi عبر "النقر والسحب" باستخدام برنامج نقل ملفات (مجاني) . يمكن تشغيله بواسطة 4.50 جنيهات إسترلينية Pi Zero. يمكنك أيضًا نقل