สารบัญ:

EAL-Industri4.0-RFID Dataopsamling Til Database: 10 ขั้นตอน (พร้อมรูปภาพ)
EAL-Industri4.0-RFID Dataopsamling Til Database: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Industry 4.0 Internet of Things, Technology Evolution & Big Data. How Technology Changes Our Lives 2024, กรกฎาคม
Anonim
EAL-Industri4.0-RFID Dataopsamling Til Database
EAL-Industri4.0-RFID Dataopsamling Til Database

Dette projekt omhandler opsamling af vægtdata, การลงทะเบียน af identiter vha. RFID ข้อมูล lagring af และฐานข้อมูล MySQL vha node-RED, samt fremvisning และ 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โปรดิวเซอร์ 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 = Unique Identifier, er en 32 bits kode, 8 hexadecimale karakterer) for entydigen identifike. 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 ระบุรายละเอียด leverpostejer til én specifik kunde. Kunderne er supermarkedskæder:

1. อิมมา Vægten på Irmas luksus leverpostej skal holde sig inden for +/- 5%, ขั้นต่ำ 190g และ maksimum 210g.

2. บรุกเซ่น. Vægten på Brugsens leverpostej skal holde sig inden for +/- 10%, ขั้นต่ำ 180g และ maksimum 220g.

3. อัลดี้ ส่วนลด Aldis leverpostej skal holde sig inden for +/- 15%, ขั้นต่ำ 170g และ maksimum 230g.

Der er således følgende sorteringer:

Range0: อยู่นอกช่วง

Range1: ขั้นต่ำ 190g/สูงสุด210g

Range2: ขั้นต่ำ 180g/สูงสุด220g

Range3: ขั้นต่ำ 170g/สูงสุด230g

ขั้นตอนที่ 1: Opsamling Af Data สำหรับ Vægt Samt การลงทะเบียน Af UID

Opsamling Af Data สำหรับ Vægt Samt การลงทะเบียน Af UID
Opsamling Af Data สำหรับ Vægt Samt การลงทะเบียน Af UID

สำหรับข้อมูล af สุ่มตัวอย่างสำหรับ vægt, samt การลงทะเบียน af แท็ก RFID สำหรับ Arduino MEGA2560 กับเครื่องอ่าน/เขียน RFID-RC522 Da vi ikke har nogen vægt, simulerer vi data for vægten med et potmeter tilsluttet en อนาล็อกสำหรับ Arduinoen.

Følgende opstilling er anvendt:

พอตเตอร์ 1 สต. 25k ต่อเส้น Yder-benene er tilsluttet hhv. GND และ +5V, มิดเทอร์เบเน็ตและ tilsluttet AN0

RFID-RC522 และบอร์ด Arduino ทั่วไป พอร์ต SPI สำหรับรุ่น:

SDA -> พิน 53

SCK -> pin52

MOSI ->pin51

MISO->pin50

IRQ ->NC

GND ->GND

RST -> pin5

3.3V -> 3.3V

แยกข้อมูลสำหรับ hhv. UID และ node-Red står for den efterfølgende præsentation på et dashboard og lagring i en database.

ขั้นตอนที่ 2: โปรแกรม Arduino

ฉันโปรแกรม Arduino หมึกเขียนถึงบรรณานุกรม SPI.h และ MFRC522.h สำหรับที่ kunne bruge RFID læseren ฉันเริ่ม af programmet initialiseres de anvendte ตัวแปร Der laves en instans af MFRC522. ฉันตั้งค่า blokken initialiseres den sirielle forbindelse, SPI porten og MFRC522 Derefter สแกนหลังจากแท็ก RFID สำหรับ ikke ที่ sende det samme UID afsted flere gange efter hinanden, er der lavet en stump kode som tjekker for dette เหนือกว่า 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 และ oldUID er ens, er der tale om samme UID tag และ UID'et skal ละเว้น 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. ที่คล้ายคลึงกัน værdi skaleres til området 150-250. ข้อมูลส่ง som en komma-separeret tekststreng. Som det sidste sættes oldUID = nyUID, เปิดใช้งานที่ klart til at læse et nyt RFID tag.. Den sidste funktion i programmet er den funktion som sammenligner 2 arrays. ผู้ส่งคืน Funktionen true hvis array'ne er ens, og false hvis array'ne er forskellige

#รวม

#include // โปรแกรมนี้สแกนการ์ด RFID โดยใช้บอร์ดอ่าน/เขียน RDIF-RC522 // อ่าน UID แล้ว อ่านพินอะนาล็อก ค่าอนาล็อก 0-1023 ถูกปรับขนาดเป็น 150-250 // UID และค่าแอนะล็อกถูกส่งเป็นข้อความที่คั่นด้วยเครื่องหมายจุลภาคบนพอร์ตอนุกรมโดยใช้ 9600, N, 8, 1 // ใช้ความระมัดระวังในการส่ง UID แต่ละอันเพียงครั้งเดียวในแถว // ต้องมี UID ใหม่ แสดงก่อนที่จะส่ง UID เดิมได้อีกครั้ง // ฟังก์ชันนี้ถูกนำไปใช้ในโค้ดโดยการเปรียบเทียบอาร์เรย์: oldUIDnyUID ในฟังก์ชัน array_cmp(oldUID, nyUID)

constexpr uint8_t RST_PIN = 5;

constexpr uint8_t SS_PIN = 53; int เซ็นเซอร์พิน = A0; ค่า int = 0; สตริง 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 สำหรับ (ไบต์ i = 0; i < mfrc522.uid.size; i++) { nyUID = mfrc522.uid.uidByte; } // if oldUIDnyUID if (!array_cmp (oldUID, nyUID)) { // ส่งแท็ก UID บนพอร์ตอนุกรมสำหรับ (ไบต์ i = 0; i 1000) { ค่า = 1,000; } มูลค่า = (มูลค่า / 10) + 150; // ส่งค่าอนาล็อกที่ปรับขนาดแล้ว Serial.print(Value); // ส่งขึ้นบรรทัดใหม่ Serial.println(); //set oldUID = nyUID สำหรับ (ไบต์ z = 0; z < 4; z++) oldUID[z] = nyUID[z]; } // รอ 1 วินาทีล่าช้า (1000); }

// เปรียบเทียบ 2 อาร์เรย์…

บูลีน array_cmp (ไบต์ a , ไบต์ b ) { การทดสอบบูล = จริง; //ทดสอบแต่ละองค์ประกอบให้เหมือนกัน ถ้าไม่ใช่ ให้คืนค่าเท็จสำหรับ (ไบต์ n = 0; n < 4; n++) { if (a[n] != b[n]) test = false; // ถ้าไบต์ไม่เท่ากัน ให้ทดสอบ = false } ถ้า (ทดสอบ == จริง) คืนค่าจริง มิฉะนั้นจะคืนค่าเท็จ }

ขั้นตอนที่ 3: Node-RED, Lagging Af Data I Database

Node-RED, Lagging Af Data I ฐานข้อมูล
Node-RED, Lagging Af Data I ฐานข้อมูล
Node-RED, Lagging Af Data I ฐานข้อมูล
Node-RED, Lagging Af Data I ฐานข้อมูล

โฟลเกนเด โฟลว์ และ ลาเวต i node-RED:

COM4 er den serielle forbindelse hvor data modtages for Arduino boardet. Funktionerne "แยกและรับค่า" และ "แยกและรับ UID" ตัวแยก ใช้งานและส่งคืน hhv vægten og UID แชร์ จนถึง fremvisning แดชบอร์ดและแผนภูมิเส้นและขนาด UID fremvises ฉัน 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.

แยกและรับค่า:

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

temp = {เพย์โหลด:(เอาต์พุต[1])}; กลับอุณหภูมิ;

แยกและรับ UID:

เอาต์พุต var = msg.payload.split(", ");

temp = {payload:output[0]}; กลับอุณหภูมิ;

test_sound:

หมายเลข var = parseInt(msg.payload);

ถ้า (หมายเลข >230 || หมายเลข <170) { newMsg = {payload:"Out of range"}; กลับข้อความใหม่; } อื่น ๆ { newMsg = {เพย์โหลด:""}; กลับข้อความใหม่; }

Funktionen Split string ", " indsætter et timestamp, UID และ vægten ในฐานข้อมูล patedb.patelog

เอาต์พุต var = msg.payload.split(", "); //แยก msg.payload ด้วยเครื่องหมายจุลภาคลงใน array

UIDTag = เอาต์พุต[0]; //ส่วนแรกในตำแหน่งแรก [0] ValueTag = เอาต์พุต[1]; //ส่วนที่สองเข้าสู่ตำแหน่งที่สอง [1]

วาร์ ม = {

หัวข้อ: "INSERT INTO patedb.patelog (ประทับเวลา, UID, น้ำหนัก) VALUES('"+new Date().toISOString()+"', '"+ UIDTag +"', '"+ValueTag+"');" }; กลับม;

patelog er en ฐานข้อมูล MySQL forbindelse som er sat op med følgende parametre:

โฮสต์: localhost

พอร์ต: 3306

ผู้ใช้:root

ฐานข้อมูล: patedb

ขั้นตอนที่ 4: การออกแบบฐานข้อมูล

การออกแบบฐานข้อมูล
การออกแบบฐานข้อมูล

Databasen patedb indeholder 4 ตาราง

patelog er dataopsamlingstabellen, tilskrives data af node-RED และ C # programmet

ตารางการสั่งซื้อ ข้อมูลที่เกี่ยวข้อง ข้อมูลผู้ไม่เกี่ยวข้อง om de genemførte คำสั่ง tilskrives data af C# programmet

customertable er et kunderegister

rangetable er en tabel som indeholder grænseværdierne สำหรับ de i C # programmet benyttede ranges

ขั้นตอนที่ 5: Patelog

Patelog
Patelog

Tabellen patelog indeholder folgende 6 คอนเน็กเตอร์:

pateID (int) และคีย์หลักและ 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#)

orderID er af typen int (โปรแกรม orderID tilføjes af C#)

Node-RED tilføjer ikke værdier til kolonnerne rangeNr และ 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: ตารางการสั่งซื้อ

ตารางการสั่งซื้อ
ตารางการสั่งซื้อ

indeholder ที่สั่งซื้อได้ 5 โคลอนเนอร์:

orderID (int) er det aktuelle ordrenummer

orderQuant (ปานกลาง) er ordens pålydende antal

quantProduced (ปานกลาง) er antal der เช่า faktisk er Producet på ordren. (โปรแกรม Tælles af C#)

ความคิดเห็น (ข้อความเล็ก ๆ) er en eventuel kommentar til ordren.

รหัสลูกค้า (int) er det aktuelle kundenummer på ordren.

ขั้นตอนที่ 7: ตารางลูกค้า

ตารางลูกค้า
ตารางลูกค้า

ผู้ถือ indeholder ที่ลูกค้าต้องการได้ 6 โคลอนเนอร์:

รหัสลูกค้า (int) และคีย์หลัก og auto inc.

ชื่อ ที่อยู่ โทรศัพท์ อีเมล (varchar) med forskellig max længde

rangeNr (int)

ขั้นตอนที่ 8: Rangetable

Rangetable
Rangetable

rangetable indeholder 3 โคลอนเนอร์:

rangeNr (int) และคีย์หลัก og auto inc.

ช่วงต่ำสุด (int)

ช่วงสูงสุด (int)

ขั้นตอนที่ 9: โปรแกรม C#

โปรแกรม C#
โปรแกรม C#

Når der Produces en ordre leverpostej, er Proceduren følgende:

(เช่นเดิม, 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åj er får æn leverposte) สำหรับการขนส่ง) 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 nyated række i. tidspunkt ikke tilskrives værdier til rangeNr และ orderID vil de have værdien NULL.

โปรแกรมและช่วงเวลาภายใต้โปรแกรม C# patedb.patelogtabellen สำหรับ nye tilkomne rækker med NULL værdier i rangeNr kolonnen มากกว่า 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 Producet, afsluttes ordren ved tryk på”stop”- knappen. มากกว่า ordren afsluttes, tilføjes en række til patedb.ordertable med de aktuelle ordredata. เพิ่มเติมจาก afsluttet, kan kan de opsamlede data i patelog tabellen fremvises ved at trykke på de forskellige knapper i gruppen Update DataGridview. สั่งซื้อได้ที่ vises, og der kan søges ordredata på individueller 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

{ Form1 คลาสบางส่วนสาธารณะ: แบบฟอร์ม { การเชื่อมต่อ MySqlConnection = MySqlConnection ใหม่ ("แหล่งข้อมูล = localhost; ชื่อผู้ใช้ = root; รหัสผ่าน =''"); int RowNumber = 0; // ตัวแปรสำหรับเก็บค่า pateID int RangeNumber = 0; //ตัวแปรสำหรับเก็บ rangenumber int weight =0; // ตัวแปรสำหรับเก็บน้ำหนัก int OrderNr = 0; // ตัวแปรสำหรับจัดเก็บ OrderNR int QuantProduced = 0; //ตัวแปรสำหรับการจัดเก็บปริมาณที่ผลิต int NumberOfRows = 0; //จำนวนแถวที่มีค่าว่าง.. bool ProdRunning = false; //ตัวแปรระบุว่ามีการเปิดใช้งานปุ่มเริ่มต้นและหยุดหรือไม่ int limit = new int[6]; // เริ่มต้นอาร์เรย์ int CustomerID; // ตัวแปรสำหรับจัดเก็บ form1 สาธารณะของลูกค้า () { InitializeComponent (); load_table(); // เรียก load_table }

เป็นโมฆะ load_table()

{ คำสั่ง MySqlCommand = ใหม่ MySqlCommand ("เลือก * จาก patedb.patelog ORDER BY timestamp DESC;" การเชื่อมต่อ); ลอง { อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder(); adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } }

โมฆะส่วนตัว SetRowOrder()

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

โมฆะส่วนตัว GetData_Click (ผู้ส่งวัตถุ, EventArgs e) // อ่านตารางฐานข้อมูลและคำสั่งซื้อตามการประทับเวลา

{ load_table(); }

โมฆะส่วนตัว btnRefreshUID_Click (ผู้ส่งวัตถุ EventArgs e) //

{ สตริง timeStr = "เลือก * จาก patedb.patelog เรียงลำดับตาม UID;"; คำสั่ง MySqlCommand = MySqlCommand ใหม่ (timeStr, การเชื่อมต่อ); ลอง { อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder(); adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } }

โมฆะส่วนตัว btnRefreshValue_Click (ผู้ส่งวัตถุ EventArgs e)

{ สตริง weightSort = "เลือก * จาก patedb.patelog เรียงลำดับตามนักแสดง (น้ำหนักเป็นจำนวนเต็มลงนาม);"; คำสั่ง MySqlCommand = MySqlCommand ใหม่ (weightSort, การเชื่อมต่อ); ลอง { อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; SetRowOrder(); adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } }

โมฆะส่วนตัว ChkNullBtn_Click (ผู้ส่งวัตถุ EventArgs e)

{ ถ้า (ProdRunning) { CheckTableForNull (); load_table(); } }

โมฆะส่วนตัว CheckTableForNull()

{ //ตรวจสอบ/ตั้งค่าช่วงเวลาขั้นต่ำ 100 ms int i; int. TryParse(textTimer1. Text ออก i); ถ้า (i <100) { timer1. Stop(); ผม = 100; timer1. Interval = ผม; MessageBox. Show("ค่าต่ำสุดที่ 100mS"); timer1. Start(); } อื่น ๆ { timer1. Interval = i; } textTimer1. Text = timer1. Interval. ToString (); //ตรวจสอบว่าแถวใดมีค่า null ในตารางหรือไม่ คืนค่าจำนวนแถวในตัวแปร:NumberOfRows string weightStr = ""; string chkNull = "เลือก COUNT (*) จาก patedb.patelog โดยที่ rangeNR เป็น NULL ORDER โดย pateID LIMIT 1;"; คำสั่ง MySqlCommand = ใหม่ MySqlCommand (chkNull การเชื่อมต่อ); ลอง { การเชื่อมต่อเปิด (); NumberOfRows = Convert. ToInt32(command. ExecuteScalar()); การเชื่อมต่อปิด (); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } ในที่สุด { if (NumberOfRows != 0) { ลอง { //เลือกหมายเลข pateID ต่ำสุดที่ rangeNr เป็น NULL string readID = "เลือก pateID จาก patedb.patelog โดยที่ rangeNR เป็นค่า NULL ORDER BY pateID ASC LIMIT 1;"; MySqlCommand cmdID = MySqlCommand ใหม่ (readID, การเชื่อมต่อ); { การเชื่อมต่อเปิด (); RowNumber = (int) cmdID. ExecuteScalar (); //จำนวนเต็ม!! การเชื่อมต่อปิด (); } listPateID. Text = RowNumber. ToString(); // อ่านหมายเลข PateID ที่เลือก // เลือกน้ำหนักจากแถวสตริงหมายเลขแถวที่เลือก = RowNumber. ToString(); string readweight = "เลือกน้ำหนักจาก patedb.patelog โดยที่ pateID=" + แถว; MySqlCommand cmdweight = MySqlCommand ใหม่ (อ่านน้ำหนัก, การเชื่อมต่อ); { การเชื่อมต่อเปิด (); weightStr = (สตริง) cmdweight. ExecuteScalar (); //สตริง !! การเชื่อมต่อปิด (); } น้ำหนัก = int. Parse(weightStr); // แปลงเป็น int txtWeight. Text = weight. ToString(); // พิมพ์ Int RangeNumber = 0; ถ้า (น้ำหนัก>= ขีด จำกัด [0] && น้ำหนัก = ขีด จำกัด [2] && น้ำหนัก = ขีด จำกัด [4] && น้ำหนัก <= ขีด จำกัด [5]) { RangeNumber = 3; } } txtRange. Text = RangeNumber. ToString(); UpdateLog(); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } QuantProduced = QuantProduced + 1; } } } โมฆะส่วนตัว btnStart_Click (ผู้ส่งอ็อบเจ็กต์ EventArgs e) { if (ProdRunning == false) { int valtest; ลอง { CustomerID = int. Parse (txtCustomerNr. Text); // อ่านรหัสลูกค้า } จับ { MessageBox. Show ("ป้อนข้อมูลการผลิตและกดปุ่ม 'เริ่ม'"); }

การทดสอบสตริง = "เลือก COUNT (*) จาก patedb.customertable โดยที่ customerID ="+CustomerID;

MySqlCommand cmdtestcustomer = MySqlCommand ใหม่ (ทดสอบ เชื่อมต่อ); { การเชื่อมต่อเปิด (); valtest = Convert. ToInt32(cmdtestcustomer. ExecuteScalar()); // คืนค่า 0 หากลูกค้าไม่มีการเชื่อมต่อ ปิด (); } if (valtest==1) // หากลูกค้ามีอยู่ในฐานข้อมูล - เริ่มการผลิต { ลอง { OrderNr = int. Parse (txtOrderNumber. Text); ProdRunning = จริง; timer1. Start(); textTimer1. Text = timer1. Interval. ToString (); ขีดจำกัดการอ่าน (); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show ("ป้อนข้อมูลการผลิตและกดปุ่ม 'start'"); } } else MessageBox. Show("ลูกค้าไม่อยู่ในฐานข้อมูล โปรดลองอีกครั้ง"); } //ReadLimits(); }

โมฆะส่วนตัว ReadLimits()

{ // อ่านข้อ จำกัด จาก rangetable ช่วง 1 ถึง 3 int counter = 0; สำหรับ (int rangeNr = 1; rangeNr < 4; rangeNr ++) { สตริง readmin = "เลือก rangeMin จาก patedb.rangetable โดยที่ rangeNr=" + rangeNr; MySqlCommand cmdmin = MySqlCommand ใหม่ (readmin, การเชื่อมต่อ); { การเชื่อมต่อเปิด (); ขีดจำกัด[ตัวนับ] = (int)cmdmin. ExecuteScalar(); ตัวนับ = ตัวนับ + 1; การเชื่อมต่อปิด (); } // MessageBox. Show(counter. ToString()); สตริง readmax = "เลือก rangeMax จาก patedb.rangetable โดยที่ rangeNr=" + rangeNr; MySqlCommand cmdmax = MySqlCommand ใหม่ (readmax, การเชื่อมต่อ); { การเชื่อมต่อเปิด (); ขีดจำกัด[ตัวนับ] = (int)cmdmax. ExecuteScalar(); ตัวนับ = ตัวนับ + 1; การเชื่อมต่อปิด (); } } // จบการวนซ้ำ }

โมฆะส่วนตัว UpdateLog()

{ // อัปเดต rangeNR & สตริง orderID ช่วง = RangeNumber. ToString (); คำสั่งสตริง = OrderNr. ToString(); string update = "UPDATE patedb.patelog SET rangeNr= "+Range+', ' + "orderID= "+OrderNr+" WHERE pateID="+RowNumber; MySqlCommand updatecmd = ใหม่ MySqlCommand (อัปเดต, การเชื่อมต่อ); ลอง { การเชื่อมต่อเปิด (); updatecmd. ExecuteNonQuery(); การเชื่อมต่อปิด (); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } }

โมฆะส่วนตัว btnStop_Click (ผู้ส่งวัตถุ EventArgs e)

{ ถ้า (ProdRunning == จริง) { timer1. Stop(); ProdRunning = เท็จ; 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 (แทรก การเชื่อมต่อ); ลอง { การเชื่อมต่อเปิด (); แทรกcmd. ExecuteNonQuery(); การเชื่อมต่อปิด (); ปริมาณการผลิต = 0; } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } }

โมฆะส่วนตัว timer1_Tick (ผู้ส่งวัตถุ EventArgs e)

{ CheckTableForNull(); load_table(); }

โมฆะส่วนตัว btnShowOrderTable_Click (ผู้ส่งวัตถุ EventArgs e)

{ if (ProdRunning == false) { คำสั่ง MySqlCommand = ใหม่ MySqlCommand ("SELECT * FROM patedb.ordertable ORDER BY orderID DESC;", การเชื่อมต่อ); ลอง { อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } } else { MessageBox. Show("กดหยุดเพื่อสั่งซื้อตาราง"); } }

โมฆะส่วนตัว 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 ใหม่ (ทดสอบ, เชื่อมต่อ); ลอง { การเชื่อมต่อเปิด (); อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } การเชื่อมต่อ ปิด (); } else { MessageBox. Show("กดหยุดเพื่อดูรายละเอียดการสั่งซื้อ"); } }

โมฆะส่วนตัว btnShowCustomerDetails_Click (ผู้ส่งวัตถุ EventArgs e)

{ if (ProdRunning == false) { string test = ("SELECT patedb.customertable.customerID, ชื่อ, ที่อยู่, โทรศัพท์, อีเมล, rangeNr FROM patedb.customertable เข้าร่วม patedb.ordertable ON patedb.ordertable.customerID= patedb.customertable รหัสลูกค้า WHERE patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); คำสั่ง MySqlCommand = MySqlCommand ใหม่ (ทดสอบ, เชื่อมต่อ); ลอง { อะแดปเตอร์ MySqlDataAdapter = ใหม่ MySqlDataAdapter (); adapter. SelectCommand = คำสั่ง; DataTable dbdataset = ใหม่ DataTable (); อะแดปเตอร์เติม (dbdataset); BindingSource bsource = ใหม่ BindingSource (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; adapter. Update (dbdataset); } catch (ยกเว้นข้อยกเว้น) { MessageBox. Show (เช่น ข้อความ); } } else { MessageBox. Show("กดหยุดเพื่อดูรายละเอียดของลูกค้า"); } } }

}

แนะนำ: