विषयसूची:
- चरण 1: Vægt Samt पंजीकरण Af UID. के लिए Afsamling Af डेटा
- चरण 2: अरुडिनो-प्रोग्राम
- चरण 3: नोड-रेड, लैगिंग एएफ डेटा I डेटाबेस
- चरण 4: डेटाबेस-डिज़ाइन
- चरण 5: पटेलोग
- चरण 6: ऑर्डरटेबल
- चरण 7: ग्राहक तालिका
- चरण 8: रेंजटेबल
- चरण 9: सी # कार्यक्रम
वीडियो: EAL-Industri4.0-RFID Dataopsamling Til Database: 10 कदम (चित्रों के साथ)
2024 लेखक: John Day | [email protected]. अंतिम बार संशोधित: 2024-01-30 09:23
डेटा प्रोजेक्ट ऑम्हैंडलर ऑप्समलिंग af vægtdata, afidentiteter vha का पंजीकरण। RFID, डेटा से पिछड़ रहा है और MySQL डेटाबेस vha। नोड-रेड, सैट फ्रेमविज़निंग और ऑप्समलेडे डेटा और सी # प्रोग्राम के बाद मैं विंडोज फॉर्म एप्लीकेशन के बाद फॉर्म करता हूं। वी फॉरेस्टिलर ओएस फॉल्गेंडे:
वि हर एन प्रोडक्शंसलिनजे सोम प्रोड्यूसर लीवरपोस्टेज आई 200 ग्राम फोलीबैकर। मेड और आरएफआईडी टैग और प्लास्टिक/गेट/लेबलन के बाद एले फ़ोर्डिगबैग्टे लीवरपोस्टेजर यूडस्टायर्स, कुछ इंडिहोल्डर और यूनिक्ट आईडी (यूआईडी = यूनिक आइडेंटिफ़ायर, एर एन 32 बिट कोड, 8 हेक्साडेसिमल कारक) लीवर एन्केल्ट बैक के बाद की पहचान के लिए। ड फोर्डिगवेटन एएफ हवर एनकेल्ट बक्के लीवरपोस्टेज कान स्विंगे (अफंगिग एएफ रिवरर, फॉरडैम्पिंग आई ओवीएन एमएम), ओग दा कुंदर्न हर एट स्पेसिफिक क्राव फर्डिगवेगटेन, ब्रुग्स यूआईडी टैगेट लैगरपोस्ट पर टिके हुए हैं। विशिष्ट कुंडे के लिए लीवरपोस्टेजर। कुंदर्न एर सुपरमार्केडस्केडर:
1. इरमा। Vægten på Irmas luksus लीवरपोस्टेज स्कल होल्ड सिग इंडेन +/- 5% के लिए, altså न्यूनतम 190g और अधिकतम 210g।
2. ब्रुगसेन। Vægten på Brugsens लीवरपोस्टेज स्केल होल्ड सिग इंडेन +/- 10%, altså न्यूनतम 180g और अधिकतम 220g।
3. एल्डी। Vægten på Aldis छूट लीवरपोस्टेज स्केल होल्ड सिग इंडेन +/- 15%, altså न्यूनतम 170g और अधिकतम 230g।
डेर एर सेलेडेस फोल्गेंडे सॉर्टरिंगर:
रेंज0: सीमा से बाहर
रेंज1: न्यूनतम 190g/अधिकतम210g
रेंज 2: न्यूनतम 180 ग्राम / अधिकतम 220 जी
रेंज 3: न्यूनतम 170 ग्राम / अधिकतम 230 जी
चरण 1: Vægt Samt पंजीकरण Af UID. के लिए Afsamling Af डेटा
vægt के लिए डेटा का ऑप्समलिंग करना, RFID टैग के लिए samt registrering er avendt en Arduino MEGA2560 med en RFID-RC522 रीडर/राइटर। डा vi ikke har nogen vægt, सिमुलर vi डेटा फॉर vægten med et potmeter tilsluttet en Analog indgang på Arduinoen.
Følgende opstilling और anvendt:
1 सेंट पॉटमीटर 25k लाइनært। येदर-बेनेने एर टिलस्लुटेट एचएचवी। GND और +5V, मिडटरबेनेट और टिलस्लुटेट AN0
RFID-RC522 और Arduino बोर्ड्स के लिए SPI पोर्ट pålgende मोड:
एसडीए -> पिन 53
एससीके -> पिन52
मोसी -> पिन51
मिसो-> पिन 50
आईआरक्यू -> एनसी
जीएनडी -> जीएनडी
आरएसटी -> पिन5
3.3V -> 3.3V
डी opsamlede डेटा, hhv के लिए। UID और vægten, den efterfølgende præsentation på et डैशबोर्ड और डेटाबेस में लैगिंग के लिए på den serielle port som en komma-separeret tekststreng videre til node-Red som står for den efterfølgende præsentation på et डैशबोर्ड भेजता है।
चरण 2: अरुडिनो-प्रोग्राम
मैं अरुडिनो प्रोग्राम इनक्लुडेरेस डे टू बिब्लियोटेकर एसपीआई.एच और एमएफआरसी५२२.एच के लिए कुन्ने ब्रुग आरएफआईडी एल सेरेन। मैंने प्रोग्राम इनिशियलाइज़र्स डे एवेंड वेरिएबल शुरू किया। MFRC522 के तुरंत बाद डर लगता है। I सेटअप ब्लोकेन इनिशियलाइज़र्स डेन सेरिएल फ़ॉरबिंडेल्स, एसपीआई पोर्टेन और एमएफआरसी५२२। RFID टैग के बाद स्कैन को निष्क्रिय करें। इकके एट सेंड डिट सैमे यूआईडी अफस्टेड फ्लेयर गंगे एफ्टर हिनडेन, एर डेर लवेट एन स्टंप कोड सोम टीजेकर फॉर डेट। न तो स्कैननेट और यूआईडी टैग के बारे में, न ही ढेर सारे nyUID med det netop læste UID को लोड करता है। पुराने यूआईडी के बारे में जानने के लिए और कुछ समय के लिए यूआईडी सोम कान सेरीले पोर्ट भेजता है। एचवीआईएस एनयूआईडी और ओल्डयूआईडी एर एन्स, एर डेर टेल ओम समे यूआईडी टैग और यूआईडी'ईटी स्केल इग्नोरर्स। 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 भेजता है। डेन एनालॉग वर्डी स्केलेरेस टिल ओम्रोडेट 150-250। डेटा कुछ समय के लिए भेजता है। सोम डेट सिडस्टे सेट ओल्डयूआईडी = एनवाईयूआईडी, सेलेड्स और कोडन क्लार्ट टिल एट लासे एट एनवाईटी आरएफआईडी टैग.. डेन सिडस्टे फंकशन आई प्रोग्रामेट एर डेन फंकशन सोम सैममेनलिगनर 2 एरेज़। फ़ंक्शन रिटर्नर ट्रू एचविस एरे'न एर एन्स, और फॉल्स एचविस एरे'ने फोरस्केलिज।
#शामिल
#include // यह प्रोग्राम RDIF-RC522 रीडर/राइटर बोर्ड का उपयोग करके RFID कार्ड स्कैन करता है। // यूआईडी पढ़ा जाता है, एक एनालॉग पिन पढ़ा जाता है। एनालॉग मान 0-1023 को 150-250 तक बढ़ाया गया है। // यूआईडी और एनालॉग वैल्यू को सीरियल पोर्ट पर कॉमा-सेपरेटेड टेक्स्ट के रूप में 9600, एन, 8, 1 का उपयोग करके भेजा जाता है। उसी यूआईडी को फिर से भेजे जाने से पहले मौजूद है। // यह फ़ंक्शन सरणियों की तुलना करके कोड में कार्यान्वित है: पुराने यूआईडी nyUID फ़ंक्शन में array_cmp (oldUID , nyUID )
constexpr uint8_t RST_PIN = 5;
constexpr uint8_t SS_PIN = 53; इंट सेंसरपिन = ए0; इंट वैल्यू = 0; स्ट्रिंग स्ट्रिंगवैल्यू = "0000"; बाइट पुराना यूआईडी [4] = {}; बाइट एनयूआईडी [4] = {};
एमएफआरसी 522 एमएफआरसी 522 (एसएस_पिन, आरएसटी_पिन); // MFRC522 उदाहरण बनाएं।
व्यर्थ व्यवस्था()
{ सीरियल.बेगिन (९६००); // सीरियल संचार शुरू करें SPI.begin (); // SPI बस mfrc522. PCD_Init () आरंभ करें; // MFRC522 आरंभ करें}
शून्य लूप ()
{// नए कार्ड की तलाश करें अगर (! mfrc522. PICC_IsNewCardPresent ()) {वापसी; } // कार्ड में से एक का चयन करें अगर (! mfrc522. PICC_ReadCardSerial ()) {वापसी; } // UID टैग के साथ nyUID लोड करें (बाइट i = 0; i <mfrc522.uid.size; i++) { nyUID = mfrc522.uid.uidByte; } // अगर पुराना यूआईडी nyUID अगर (! array_cmp (oldUID, nyUID)) {// के लिए सीरियल पोर्ट पर यूआईडी टैग भेजें (बाइट i = 0; i १०००) {मान = १०००; } मान = (मान / 10) + १५०; // स्केल किए गए एनालॉग वैल्यू सीरियल.प्रिंट (वैल्यू) भेजें; // न्यूलाइन भेजें Serial.println (); // पुराने यूआईडी = nyUID के लिए सेट करें (बाइट जेड = 0; जेड <4; जेड ++) पुराना यूआईडी [जेड] = एनयूयूआईडी [जेड]; } // प्रतीक्षा 1 सेकंड देरी (1000); }
// 2 सरणियों की तुलना करें …
बूलियन array_cmp (बाइट ए , बाइट बी ) {बूल टेस्ट = सच; // प्रत्येक तत्व को समान होने के लिए परीक्षण करें। अगर सिर्फ एक नहीं है, तो झूठी वापसी करें (बाइट एन = 0; एन <4; एन ++) {अगर (ए [एन]! = बी [एन]) परीक्षण = झूठा; // यदि बाइट बराबर नहीं है, तो परीक्षण = झूठा} अगर (परीक्षण == सत्य) सत्य लौटाता है; अन्यथा झूठी वापसी; }
चरण 3: नोड-रेड, लैगिंग एएफ डेटा I डेटाबेस
नोड-रेड में प्रवाहित करें:
Arduino बोर्डेट के लिए डेटा मॉडटेज के लिए COM4 एर डेन सीरिएल। कार्य "विभाजित करें और मूल्य प्राप्त करें" और "विभाजन और यूआईडी प्राप्त करें" स्प्लिटर तकनीक को संशोधित करें और इसे वापस करें और यूआईडी को वापस करें। वेग्टेन ब्रुग्स टिल फ़्रेमविज़निंग पीå डैशबोर्ड और लाइनचार्ट और एन स्केल। यूआईडी फ्रेमविज़ और टेकस्टफेल्ट। Funktionen test_sound advarer Verblet med sætningen "आउट ऑफ़ रेंज", hvis vægten er अंडर 170g eller ओवर 230g, DVs i रेंज 0.
विभाजित करें और मूल्य प्राप्त करें:
वर आउटपुट = msg.payload.split (',');
अस्थायी = {पेलोड: (आउटपुट [1])}; वापसी अस्थायी;
विभाजित करें और यूआईडी प्राप्त करें:
वर आउटपुट = msg.payload.split(", ");
अस्थायी = {पेलोड: आउटपुट [0]}; वापसी अस्थायी;
टेस्ट_साउंड:
वर संख्या = parseInt (msg.payload);
अगर (संख्या>२३० || संख्या<१७०) { newMsg = {पेलोड:"सीमा से बाहर"}; नया संदेश वापस करें; } और { newMsg = {पेलोड:""}; नया संदेश वापस करें; }
फ़ंकशन स्प्लिट स्ट्रिंग "," इंडिसेटर और टाइमस्टैम्प, यूआईडी और डेटाबेस में vægten i en डेटाबेस patedb.patelog।
वर आउटपुट = msg.payload.split(", "); // msg.payload को अल्पविराम द्वारा सरणी में विभाजित करें
यूआईडीटैग = आउटपुट [0]; // पहली स्थिति में पहला भाग [0] ValueTag = आउटपुट [1]; // दूसरा भाग दूसरे स्थान पर [1]
वर एम = {
विषय: "पेटेडब.पेटलॉग (टाइमस्टैम्प, यूआईडी, वजन) मूल्यों में डालें ('"+नई तिथि ()। toISOString ()+"', '"+ UIDtag +"', '"+ValueTag+"');" }; वापसी एम;
MySQL डेटाबेस में कुछ समय के लिए आवश्यक पैरामीटर शामिल हैं:
होस्ट: लोकलहोस्ट
पोर्ट: 3306
उपयोगकर्ता: जड़
डेटाबेस: patedb
चरण 4: डेटाबेस-डिज़ाइन
डाटाबेसन पाटेडब इंडेहोल्डर 4 टेबेलर
डेटाऑप्समलिंगस्टैबेलन, नोड-रेड और सी# प्रोग्राम के बाद डेटा को बेहतर बनाता है
ऑर्डरटेबल में किसी भी इंडेहोल्डर डेटा को ऑर्डर करने के लिए ऑर्डर किया जाता है, सी# प्रोग्राम के बाद डेटा टिलस्काइव करता है
कस्टमरटेबल एर एट कुंड्रेजिस्टर
डे आई सी# प्रोग्रामेट बेनिटेड रेंज के लिए टेबल सोम इंडेहोल्डर ग्रांसेवर्डिएर्न में रेंजटेबल।
चरण 5: पटेलोग
टैबलेन पेटेलॉग इंडेहोल्डर फोल्गेंडे 6 कोलोनर:
pateID (int) प्राथमिक कुंजी और ऑटोमैटिस्क को बढ़ाने के लिए।
टाइमस्टैम्प, यूआईडी और vægt er af typen varchar (मेड forskellig max længde)
टाइप किए गए टिनिंट के लिए रेंजएनआर (बेरेगनेस और सी# प्रोग्राम के बाद)
ऑर्डर आईडी एर एएफ टाइप इंट (ऑर्डर आईडी टिलफजेस एएफ सी # प्रोग्रामेट)
नोड-रेड टिल्फ़ोजर इक्के वर्डियर टिल कोलोनर्न रेंजNr और ऑर्डरआईडी। रेंज और ऑर्डर आईडी टिलडर न्यूल वर्डियर, डेट ब्रुग्स आई सी # प्रोग्राम टिल एट डिटेक्टेर डे रेकर सोम स्केल टिलस्काइव्स वर्डियर फॉर रेंजएनआर और ऑर्डरआईडी
चरण 6: ऑर्डरटेबल
ऑर्डरटेबल इंडहोल्डर 5 कोलोनर:
ऑर्डर आईडी (इंट) और एक्टूएल ऑर्ड्रेनमर के बारे में पता करें
ऑर्डरक्वांट (मध्यम) पॉलीडेन्डे एंटल को व्यवस्थित करता है
मात्रा उत्पादित (मध्यम) एर एंटल डेर रेंट फ़ैक्टिस और प्रोड्यूसर पीå ऑर्ड्रेन। (सी# प्रोग्राम के बाद से)
टिप्पणी (छोटा पाठ) और घटना पर टिप्पणी करें।
CustomerID (int) और इसे ठीक से परिभाषित करें।
चरण 7: ग्राहक तालिका
ग्राहक योग्य इंडहोल्डर 6 कॉलोनर:
ग्राहक आईडी (इंट) प्राथमिक कुंजी और ऑटो इंक।
नाम, पता, फोन, ईमेल (varchar) med forskellig max længde
रेंजएनआर (इंट)
चरण 8: रेंजटेबल
रेंजटेबल इंडहोल्डर 3 कोलोनर:
रेंजएनआर (इंट) प्राथमिक कुंजी और ऑटो इंक।
रेंजमिन (इंट)
रेंजमैक्स (इंट)
चरण 9: सी # कार्यक्रम
न ही प्रोड्यूसर्स एन ऑर्डर लीवरपोस्टेज, एर प्रोसैस्ड फोल्गेंडे:
कुंडेनमर, ऑर्ड्रेनमर, ऑर्ड्रेंटल और इन इवेंट कॉमेंटर इंटेस्ट्स आई सी# प्रोग्रामेट (आई प्रैक्सिस डिजिट डिजिट फ्रा विर्कसोमहेडेंस ऑर्ड्रेसिस्टम। प्रोडक्शन स्टार्ट न्यू वेद ट्राइक पी 'स्टार्ट'- कन्नपेन। på et Transportbånd) UID और den aktuelle vægt af serielt til node-RED, som viser de opsamlede data p' डैशबोर्ड 'et भेजता है। Samtidig skrives टाइमस्टैम्प, UID और vægt i n ny rækate i tabellen। tidspunkt ikke tilskrives værdier til RangeNr og orderID vil de have værdien NULL.
मेड और टाइमरइंटरवल अंडरस्कोर सी# प्रोग्राम patedb.patelogtabellen for nye tilkomne rækker med NULL værdier i rangeNr kolonnen। नोर डेर एर डिटेक्टेरेट एन रिक्के मेड न्यूल वर्डी, बेरेग्नेस रेंजन और डेट टिलफोजेस सैममेन मेड डिट एक्ट्यूएल ऑर्डरआईडी। नोर एन ऑर्ड्रे एर प्रोड्यूसर, अफस्लुट्स ऑर्ड्रेन वेद ट्राईक "स्टॉप" - नप्पन। न ही ऑर्ड्रेन अफस्लुट्स, टिल्फोजेस एन रिक्के टिल पेटेडब.ऑर्डरटेबल मेड डे एक्ट्यूएल ऑर्ड्रेडेटा। इसके अलावा और भी कुछ नहीं हुआ है, डेटा और डेटा का उपयोग किया जा सकता है और डेटा ग्रिडव्यू को अपडेट किया जा सकता है। ऑर्डरटेबल केन ऑग्स विज़, ओग डेर कान सोजेस ऑर्ड्रेडेटा पी, इंडिव्यूएलर यूआईडी'एर एलर कुंडेडेटा पी, इंडिविजुअल ऑर्डरर।
सिस्टम का उपयोग करना; System. Collections. Generic का उपयोग करना; System. ComponentModel का उपयोग करना; System. Data का उपयोग करना; System. Drawing का उपयोग करना; System. Linq का उपयोग करना; System. Text का उपयोग करना; System. Threading. Tasks का उपयोग करना; System. Windows. Forms का उपयोग करना; MySql. Data. MySqlClient का उपयोग करना;
नेमस्पेस शो_डेटा_फ्रॉम_डेटाबेस
{सार्वजनिक आंशिक वर्ग फॉर्म 1: फॉर्म {MySqlConnection कनेक्शन = नया MySqlConnection ("डेटा स्रोत = लोकलहोस्ट; उपयोगकर्ता नाम = रूट; पासवर्ड = ''"); int RowNumber = 0; // patID मान को संग्रहीत करने के लिए चर int RangeNumber = 0; // रेंजनंबर इंट वजन = 0 भंडारण के लिए चर; // भार को संग्रहीत करने के लिए चर int OrderNr = 0; // ऑर्डरएनआर इंट क्वांटप्रोड्यूस्ड = 0 को स्टोर करने के लिए वेरिएबल; // उत्पादित मात्रा को संग्रहीत करने के लिए चर int NumberOfRows = 0; // नल के साथ पंक्तियों की संख्या.. बूल ProdRunning = false; // वेरिएबल इंगित करता है कि प्रारंभ और रोकें बटन सक्रिय किए गए हैं int सीमाएं = नया int [6];// सरणी int ग्राहक आईडी प्रारंभ करें; // ग्राहक आईडी सार्वजनिक फॉर्म 1 () को संग्रहीत करने के लिए चर {InitializeComponent (); लोड_टेबल (); // कॉल लोड_टेबल}
शून्य लोड_टेबल ()
{MySqlCommand कमांड = नया MySqlCommand ("चयन करें * टाइमस्टैम्प DESC द्वारा patedb.patelog ऑर्डर से;", कनेक्शन); कोशिश करें {MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; सेटरोऑर्डर (); एडेप्टर। अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } }
निजी शून्य SetRowOrder ()
{dataGridView1. Columns["pateID"]. DisplayIndex = 0; // उसके कोलोनर ने डेटाग्रिड व्यू1.कॉलम ["टाइमस्टैम्प"] का पता लगाया। डिस्प्लेइंडेक्स = 1; // उसके कोलोनर ने डेटाग्रिड व्यू1.कॉलम ["यूआईडी"] का पता लगाया। डिस्प्लेइंडेक्स = 2; // उसके कोलोनर ने डेटा ग्रिड व्यू1.कॉलम ["वजन"] का पता लगाया। डिस्प्लेइंडेक्स = 3; // उसके कान rækkefølgen af kolonner ndres dataGridView1. Columns["rangeNr"]. DisplayIndex = 4; // उसके कोलोनर ने डेटाग्रिड व्यू1.कॉलम ["ऑर्डरआईडी"] का पता लगाया। डिस्प्लेइंडेक्स = 5; // उसके कान rækkefølgen af kolonner ndres }
निजी शून्य GetData_Click (ऑब्जेक्ट प्रेषक, EventArgs e) // टाइमस्टैम्प द्वारा डेटाबेस तालिका और आदेश पढ़ता है
{लोड_टेबल (); }
निजी शून्य btnRefreshUID_Click (ऑब्जेक्ट प्रेषक, EventArgs e) //
{स्ट्रिंग टाइमस्ट्र = "यूआईडी द्वारा patedb.patlog ऑर्डर से चुनें *"; MySqlCommand कमांड = नया MySqlCommand (timeStr, कनेक्शन); कोशिश करें {MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; सेटरोऑर्डर (); एडेप्टर.अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } }
निजी शून्य btnRefreshValue_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{स्ट्रिंग वेटसॉर्ट = "चयन करें * कास्ट द्वारा patedb.patlog ऑर्डर से (साइन किए गए इंटेगर के रूप में वजन);"; MySqlCommand कमांड = नया MySqlCommand (वेटसॉर्ट, कनेक्शन); कोशिश करें {MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; सेटरोऑर्डर (); एडेप्टर.अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } }
निजी शून्य ChkNullBtn_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{ अगर (प्रोडरनिंग) {चेकटेबलफॉरनल (); लोड_टेबल (); } }
निजी शून्य CheckTableForNull ()
{// चेक/सेट टाइमर अंतराल न्यूनतम १०० ms int i; int. TryParse(textTimer1. Text, out i); अगर (i <100) {timer1. Stop (); मैं = १००; टाइमर 1. अंतराल = मैं; MessageBox. Show ("न्यूनतम मूल्य मैं 100mS"); टाइमर 1. प्रारंभ (); } और { टाइमर1.अंतराल = मैं; } textTimer1. Text = timer1. Interval. ToString (); // जांचें कि क्या तालिका में उपलब्ध नल वाली कोई पंक्तियाँ, चर में पंक्तियों की संख्या लौटाती हैं: NumberOfRows string weightStr = ""; string chkNull = "patedb.patelog से COUNT(*) चुनें, जहां रेंजएनआर पाटिड लिमिट 1 द्वारा न्यूल ऑर्डर है;"; MySqlCommand कमांड = नया MySqlCommand (chkNull, कनेक्शन); कोशिश {कनेक्शन। ओपन (); NumberOfRows = Convert. ToInt32(command. ExecuteScalar ()); कनेक्शन। बंद करें (); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } अंत में { अगर (NumberOfRows != 0) { कोशिश करें {// सबसे कम pateID नंबर का चयन करता है जहां रेंजNr NULL स्ट्रिंग रीडआईडी है = "patedb.patelog से patID चुनें जहां रेंजNR pateID ASC LIMIT 1 द्वारा पूर्ण आदेश है;"; MySqlCommand cmdID = नया MySqlCommand (readID, कनेक्शन); {कनेक्शन। ओपन (); RowNumber = (int) cmdID. ExecuteScalar (); // पूर्णांक !! कनेक्शन। बंद करें (); } listPateID. Text = RowNumber. ToString (); // चयनित PateID संख्या पढ़ें // चयनित पंक्ति संख्या स्ट्रिंग पंक्ति से वजन का चयन करता है = RowNumber. ToString (); स्ट्रिंग रीडवेट = "patedb.patlog से वजन चुनें जहां pateID =" + पंक्ति; MySqlCommand cmdweight = नया MySqlCommand (रीडवेट, कनेक्शन); {कनेक्शन। ओपन (); weightStr = (स्ट्रिंग) cmdweight. ExecuteScalar (); //डोरी !! कनेक्शन। बंद करें (); } वजन = int. Parse (वेटस्ट्र); // int txtWeight. Text = weight. ToString () में कनवर्ट करें; // प्रिंट इंट रेंजनंबर = 0; अगर (वजन> = सीमा [0] && वजन = सीमा [2] && वजन = सीमा [4] && वजन <= सीमा [5]) {रेंज संख्या = 3; } } txtRange. Text = RangeNumber. ToString (); अपडेटलॉग (); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } क्वांटप्रोड्यूस्ड = क्वांटप्रोड्यूस्ड + १; } } } निजी शून्य btnStart_Click (ऑब्जेक्ट प्रेषक, EventArgs e) { if (ProdRunning == false) { int valtest; कोशिश करें { CustomerID = int. Parse(txtCustomerNr. Text); // ग्राहक आईडी पढ़ें} पकड़ें {MessageBox. Show ("उत्पादन डेटा दर्ज करें और 'प्रारंभ' बटन दबाएं।"); }
स्ट्रिंग परीक्षण = "patedb.customertable से COUNT(*) चुनें जहां ग्राहक आईडी ="+ग्राहक आईडी;
MySqlCommand cmdtestcustomer = नया MySqlCommand (परीक्षण, कनेक्शन); {कनेक्शन। ओपन (); valtest = Convert. ToInt32 (cmdtestcustomer. ExecuteScalar ()); // यदि ग्राहक कनेक्शन मौजूद नहीं है तो 0 लौटाता है। बंद करें (); } if (valtest==1) // यदि ग्राहक डेटाबेस में मौजूद है - उत्पादन शुरू करें {कोशिश करें {OrderNr = int. Parse(txtOrderNumber. Text); प्रोडरनिंग = सच; टाइमर 1. प्रारंभ (); textTimer1. Text = timer1. Interval. ToString (); रीडलिमिट्स (); } पकड़ (अपवाद पूर्व) {MessageBox. Show ("उत्पादन डेटा दर्ज करें और 'प्रारंभ' बटन दबाएं।"); } } और MessageBox. Show ("ग्राहक डेटाबेस में नहीं है, पुन: प्रयास करें"); } // रीडलिमिट्स (); }
निजी शून्य रीडलिमिट्स ()
{// रेंजटेबल से सीमाएं पढ़ता है, रेंज 1 से 3 इंट काउंटर = 0; के लिए (इंट रेंजएनआर = 1; रेंजएनआर <4; रेंजएनआर ++) {स्ट्रिंग रीडमिन = "पैटेडब से रेंजमिन चुनें। रेंजटेबल जहां रेंज एनआर =" + रेंज एनआर; MySqlCommand cmdmin = नया MySqlCommand (रीडमिन, कनेक्शन); {कनेक्शन। ओपन (); सीमाएं [काउंटर] = (int) cmdmin. ExecuteScalar (); काउंटर = काउंटर + 1; कनेक्शन। बंद करें (); } // MessageBox. Show (काउंटर। ToString ()); स्ट्रिंग रीडमैक्स = "पैटेडब से रेंजमैक्स चुनें। रेंजटेबल जहां रेंज एनआर =" + रेंज एनआर; MySqlCommand cmdmax = नया MySqlCommand (रीडमैक्स, कनेक्शन); {कनेक्शन। ओपन (); सीमाएं [काउंटर] = (int) cmdmax. ExecuteScalar (); काउंटर = काउंटर + 1; कनेक्शन। बंद करें (); } } // लूप के लिए अंत }
निजी शून्य अद्यतन लॉग ()
{// अद्यतन रेंजएनआर और ऑर्डरआईडी स्ट्रिंग रेंज = रेंजनंबर.टॉस्ट्रिंग (); स्ट्रिंग ऑर्डर = ऑर्डरएनआर। टोस्ट्रिंग (); स्ट्रिंग अपडेट = "अद्यतन patedb.patelog सेट रेंज एनआर = "+ रेंज +', '+" ऑर्डर आईडी = "+ ऑर्डर एनआर +" जहां पैटिड = "+ पंक्ति संख्या; MySqlCommand updatecmd = नया MySqlCommand (अपडेट, कनेक्शन); कोशिश {कनेक्शन। ओपन (); Updatecmd. ExecuteNonQuery (); कनेक्शन। बंद करें (); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } }
निजी शून्य btnStop_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{ अगर (ProdRunning == true) {timer1. Stop (); प्रोडरनिंग = झूठा; अपडेटऑर्डरटेबल (); } और { MessageBox. Show ("अभी तक कोई उत्पादन शुरू नहीं हुआ है। डेटा दर्ज करें और 'स्टार्ट' बटन दबाएं"); } }
निजी शून्य UpdateOrderTable ()
{ स्ट्रिंग इंसर्ट = "इन्सर्ट इनटू पेटेडब.ऑर्डरटेबल (ऑर्डरआईडी, ऑर्डरक्वांट, क्वांटप्रोड्यूस्ड, कमेंट, कस्टमरआईडी) वैल्यू ('" + this.txtOrderNumber. Text + "', '" + this.txtOrderQuant. Text + "', '"+ QuantProduced. ToString()+"', '"+this.txtComment. Text+"', '"+this.txtCustomerNr. Text+"');"; MySqlCommand insertcmd = नया MySqlCommand (सम्मिलित करें, कनेक्शन); कोशिश {कनेक्शन। ओपन (); insertcmd. ExecuteNonQuery (); कनेक्शन। बंद करें (); क्वांटप्रोड्यूस्ड = 0; } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } }
निजी शून्य टाइमर1_टिक (ऑब्जेक्ट प्रेषक, EventArgs e)
{चेकटेबलफॉरनल (); लोड_टेबल (); }
निजी शून्य btnShowOrderTable_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{ अगर (ProdRunning == false) {MySqlCommand कमांड = नया MySqlCommand ("चयन करें * ऑर्डर आईडी डीईएससी द्वारा patedb.ordertable ऑर्डर से;", कनेक्शन); कोशिश करें {MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; एडेप्टर.अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } } और { MessageBox. Show ("ऑर्डर टेबल को हटाने के लिए स्टॉप दबाएं"); } }
निजी शून्य btnShowOrderDetails_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{ if (ProdRunning == false) { string test = ("सेलेक्ट patedb.ordertable.orderID, orderQuant, quantProduced, comment, customerID FROM patedb.ordertable INNER JOIN patedb.patelog ON patedb.patelog.orderID= patedb.ordertable.orderID WHERE patedb.patlog. UID = '" + txtShowOrderDetails. Text + "'"); MySqlCommand कमांड = नया MySqlCommand (परीक्षण, कनेक्शन); कोशिश {कनेक्शन। ओपन (); MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; एडेप्टर.अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } कनेक्शन। बंद करें (); } और { MessageBox. Show ("आदेश विवरण देखने के लिए स्टॉप दबाएं"); } }
निजी शून्य btnShowCustomerDetails_Click (ऑब्जेक्ट प्रेषक, EventArgs e)
{ if (ProdRunning == false) { string test = ("patedb.customertable.customerID, name, address, phone, email, rangeNr FROM patedb.customertable INNER JOIN patedb.ordertable ON patedb.ordertable.customerID= patedb.customertable. ग्राहक आईडी जहां patedb.ordertable.orderID = '" + txtShowCustomerDetails. Text + "'"); MySqlCommand कमांड = नया MySqlCommand (परीक्षण, कनेक्शन); कोशिश करें {MySqlDataAdapter एडेप्टर = नया MySqlDataAdapter (); अनुकूलक। SelectCommand = आदेश; डेटाटेबल dbdataset = नया डेटाटेबल (); अनुकूलक। भरें (डीबीडेटासेट); बाइंडिंगसोर्स बीसोर्स = नया बाइंडिंगसोर्स (); bsource. DataSource = dbdataset; dataGridView1. DataSource = bsource; एडेप्टर.अपडेट (डीबीडेटासेट); } पकड़ें (अपवाद पूर्व) {MessageBox. Show(ex. Message); } } और { MessageBox. Show ("ग्राहक विवरण मिटाने के लिए स्टॉप दबाएं"); } } }
}
सिफारिश की:
Howto: रास्पबेरी पीआई 4 हेडलेस (वीएनसी) आरपीआई-इमेजर और चित्रों के साथ स्थापित करना: 7 चरण (चित्रों के साथ)
कैसे करें: आरपीआई-इमेजर और पिक्चर्स के साथ रास्पबेरी पीआई 4 हेडलेस (वीएनसी) स्थापित करना: मैं अपने ब्लॉग में मजेदार परियोजनाओं के एक समूह में इस रैप्सबेरी पीआई का उपयोग करने की योजना बना रहा हूं। जांचने के लिए स्वतंत्र हैं। मैं अपने रास्पबेरी पीआई का उपयोग करने में वापस आना चाहता था लेकिन मेरे पास मेरे नए स्थान पर कीबोर्ड या माउस नहीं था। जब से मैंने रास्पबेरी की स्थापना की थी, तब तक कुछ समय हो गया था
अलार्म घड़ी के साथ DIY स्मार्ट स्केल (वाई-फाई, ESP8266, Arduino IDE और Adafruit.io के साथ): 10 कदम (चित्रों के साथ)
अलार्म घड़ी के साथ DIY स्मार्ट स्केल (वाई-फाई, ESP8266, Arduino IDE और Adafruit.io के साथ): अपने पिछले प्रोजेक्ट में, मैंने वाई-फाई के साथ एक स्मार्ट बाथरूम स्केल विकसित किया था। यह उपयोगकर्ता के वजन को माप सकता है, इसे स्थानीय रूप से प्रदर्शित कर सकता है और इसे क्लाउड पर भेज सकता है। आप इसके बारे में अधिक जानकारी नीचे दिए गए लिंक पर प्राप्त कर सकते हैं:https://www.instructables.com/id/Wi-Fi-Smart-Scale-wi
टाइमर फंक्शन के साथ टीवी रिमोट के साथ घरेलू उपकरणों को कैसे नियंत्रित करें: 7 कदम (चित्रों के साथ)
टाइमर फंक्शन के साथ टीवी रिमोट के साथ घरेलू उपकरणों को कैसे नियंत्रित करें: उपभोक्ता बाजार में अपने परिचय के 25 वर्षों के बाद भी, हाल के दिनों में अवरक्त संचार अभी भी बहुत प्रासंगिक है। चाहे वह आपका 55 इंच का 4K टेलीविजन हो या आपकी कार का साउंड सिस्टम, हर चीज को हमारी प्रतिक्रिया के लिए एक IR रिमोट कंट्रोलर की आवश्यकता होती है
सिगफॉक्स के साथ डेड मैन अलर्ट के साथ बाइक ट्रैकिंग सिस्टम: 7 कदम (चित्रों के साथ)
सिगफॉक्स के साथ डेड मैन अलर्ट के साथ बाइक ट्रैकिंग सिस्टम: ट्रैकिंग और अलर्ट सुविधाओं के साथ बाइक सवारों के लिए सुरक्षा प्रणाली। दुर्घटना के मामले में जीपीएस स्थिति के साथ एक अलार्म भेजा जाता है। बाइक सवारों के लिए सुरक्षा जरूरी है, सड़क बाइक या माउंटेन बाइक दुर्घटनाएं होती हैं और जितनी जल्दी हो सके आपात स्थिति में
डायना इंग्लैंड के साथ प्रवाहकीय धागे के साथ कैसे सीना: 10 कदम (चित्रों के साथ)
डायना इंग्लैंड के साथ प्रवाहकीय धागे के साथ कैसे सीना: बिजली और फैशन का संयोजन! कठिनाई की डिग्री: अभी भी सीखने की अवधि: 45 मिनट सामग्री: सिलाई के लिए परिधान, प्रवाहकीय धागा, कैंची, दो एलईडी, सीआर 2032 घड़ी बैटरी, बीएस 7 बैटरी धारक, गायब स्याही पेन , सुई-नाक सरौता, आर