अमूर्त
यहां हम एक शेल स्क्रिप्ट का उपयोग करके मोड और जुबस कोड के रूप में बाइंडिंग करके मोडबस-आरटीयू प्रोटोकॉल को लागू करने के लिए एक विधि का वर्णन करते हैं। चर्चा की गई पद्धति का उपयोग अन्य स्ट्रीमिंग प्रोटोकॉल को लागू करने के लिए किया जा सकता है, जहां एक सीमित वातावरण (राउटर) में बाइट सरणियों के साथ काम करना आवश्यक है।

तीन लाइन का विचार
अधीर के लिए मैं मुख्य विचार दिखाता हूं:
printf "\x00\x03\x00\x00\x00\x01\x85\xDB" > $tty ( dd if=$tty of=$ans count=256 2> /dev/null ) & /usr/bin/sleep $timeout; kill $! echo "[`hexdump -ve '1/1 "%d,"' $ans | sed 's/\(.*\),/\1/'`]"
कार्य
शुरू करने के लिए, हम लक्ष्यों को निर्धारित करेंगे। मान लीजिए कि हमारे पास OpenWrt फर्मवेयर जैसे TL-MR3020 के साथ एक राउटर है और हमें मॉड्यूबस-आरटू प्रोटोकॉल का उपयोग करके तीसरे पक्ष के डिवाइस को नियंत्रित करने के लिए इसका उपयोग करने की आवश्यकता है। हम इस तरह के डिवाइस को राउटर से जोड़ने के लिए विकल्पों पर विचार नहीं करेंगे (उनमें से कई हैं), लेकिन इस तरह के बंडल के लिए नियंत्रण सॉफ्टवेयर लिखने के संभावित तरीकों पर विचार करें।
पहली बात जो दिमाग में आती है वह है लिबमबडस का उपयोग, लेकिन इसके लिए आपको सी प्रोग्राम लिखने की जरूरत है, इसे संकलित करें। संकलन के साथ किसी भी समाधान के लिए उन्नत कार्य कौशल, उपयुक्त सॉफ्टवेयर की उपलब्धता और यहां तक कि एक ओएस की आवश्यकता होती है। सामान्य तौर पर, यह एक विकल्प के रूप में, व्यापक उपयोग के लिए एक विकल्प नहीं है।
दूसरी चीज़ जो आप आज़मा सकते हैं, वह है OpenWrt में उपलब्ध स्क्रिप्टिंग इंजन। उदाहरण के लिए, लुआ। अन्य हैं, लेकिन फिर से समस्याएं हैं। आपको उनका अध्ययन करने की आवश्यकता है, यदि आप नहीं जानते हैं, लेकिन यह इतना बुरा नहीं है। TL-MR3020 राउटर पर बहुत कम खाली स्थान है, शाब्दिक रूप से 1 एमबी तक। यदि आप स्क्रिप्ट पैकेज निर्भरता के साथ स्थापित करते हैं, तो बस कुछ और के लिए पर्याप्त स्थान नहीं हो सकता है।
विभिन्न विकल्पों के माध्यम से क्रमिक रूप से, मैंने यहां देखा:
कुछ काला जादू: बैश, सीजीआई और फ़ाइल अपलोड । यह छोटा लेख एक फ़ाइल को एक स्क्रिप्ट डाउनलोड करने का उदाहरण देता है जिसमें मेरी जैसी सीमाएँ हैं। संक्षेप में, हम अस्थायी फ़ाइल का उपयोग किए बिना सीधे एक फ़ाइल के लिए एक अनुरोध से एक द्विआधारी धारा को डंप करने के लिए
dd कमांड का उपयोग देखते हैं। यह कोड हमारी समस्या को हल करने के लिए एकदम सही उम्मीदवार है।
निर्णय
अब हम उन तीन पंक्तियों का विश्लेषण करेंगे जिन्हें मैंने ऊपर उद्धृत किया है।
चरण 1 मोडबस-आरटू प्रोटोकॉल को लागू करने के लिए, हमें एक अनुरोध बनाने और एक प्रतिक्रिया प्राप्त करने की आवश्यकता है। यह अनुरोध बाइट्स की एक सरणी के रूप में जारी किया जाना चाहिए। इस उद्देश्य के लिए हम प्रिंटफ और आउटपुट पुनर्निर्देशन का उपयोग करते हैं:
printf "\x00\x03\x00\x00\x00\x01\x85\xDB" > $tty
चरण 2 ठीक है, हमने एक अनुरोध भेजा है, लेकिन प्रतिक्रिया कैसे प्राप्त करें? हम इन उद्देश्यों के लिए
रीड का उपयोग नहीं कर पाएंगे, जैसा कि शून्य बाइट्स के साथ यह कमांड फ्रेंडली नहीं है। हम ऊपर दिए गए
dd कमांड के साथ ट्रिक का उपयोग करते हैं और प्राप्त डेटा को एक फाइल में सेव करते हैं। लेकिन एक बात है, लेकिन जब से आपको प्राप्त बाइट्स की सटीक संख्या निर्दिष्ट करने की आवश्यकता है। हम लूप में बाइट द्वारा स्क्रिप्ट में पैकेज को पार्स करने में सक्षम नहीं होंगे (आकार प्राप्त किया जा सकता है), क्योंकि बस समय की सबसे अधिक संभावना नहीं है। आप पैकेज के अधिकतम आकार (256 बाइट्स) को निर्दिष्ट करके स्थिति से बाहर निकल सकते हैं, लेकिन
dd जम जाएगा और कम आने पर स्वागत की प्रतीक्षा करेगा। और यहां हम अंतिम चाल बनाते हैं:
अनावश्यक देरी के बिना बैश में टाइमआउट करें ( dd if=$tty of=$ans count=256 2> /dev/null ) & /usr/bin/sleep $timeout; kill $!
या तो:
timeout $timeout dd if=$tty of=$ans count=256 2> /dev/null
दूसरे विकल्प के लिए टाइमआउट का उपयोग करने के लिए लगभग 60 केबीएच की आवश्यकता होती है और "निशुल्क" समाधान होने पर हम इसका उपयोग नहीं करेंगे। इस तरह के कमांड के काम के परिणामस्वरूप, हमें प्राप्त डेटा के साथ एक फ़ाइल मिलती है।
चरण 3 हम प्राप्त बाइट सरणी को कुछ सुविधाजनक प्रारूप में प्रिंट करते हैं:
echo "[`hexdump -ve '1/1 "%d,"' $ans | sed 's/\(.*\),/\1/'`]"
यह कोड दशमलव में प्रत्येक बाइट का प्रतिनिधित्व करता है, उनके बीच अल्पविराम सम्मिलित करता है, अंतिम अल्पविराम को हटाता है, और उन्हें वर्ग कोष्ठक में लपेटता है। यह json में एक सरणी है और इसे आसानी से js array (JSON.parse) (या आमतौर पर $ .post ('' json 'पैरामीटर) के लिए) में बदला जा सकता है।
यदि आपके पास निर्दिष्ट राउटर और टर्मिनल तक पहुंच है, तो आप इन चरणों को usb-com एडेप्टर और पीसी के लिए एक शून्य मॉडेम के माध्यम से राउटर को जोड़कर जांच सकते हैं। मोडबस डिवाइस के रूप में, आप एक एमुलेटर का उपयोग कर सकते हैं, उदाहरण के लिए:
मोडबस स्लेव ।
जावास्क्रिप्ट कहाँ से आता है?
पर्यवेक्षक पाठक पूछ सकता है: "लेकिन शेल स्क्रिप्ट में भेजे जाने वाले डेटा के लिए सीआरसी कैसे पढ़ें?" मुझे लगता है कि यह नहीं लगता (मुझे केवल स्ट्रिंग्स के लिए और फिर बैश पर गणना मिली, लेकिन हमारे पास दुभाषिया का एक छोटा संस्करण है)। इस कार्य को "ऊपरी" स्तर, अर्थात् HTML पृष्ठ द्वारा निपटाया जाएगा, जो पोस्ट अनुरोध का उपयोग करके स्क्रिप्ट को कॉल करता है। यह मुश्किल नहीं है, यहां उदाहरण से कोड का एक टुकड़ा है, जिसके बारे में मैं नीचे चर्चा करूंगा, जो क्वेरी को निष्पादित करने के लिए जिम्मेदार है (jQuery का उपयोग करके):
Post: function( slaveid, func, bytes ) { var self = this;
चेकसम को ही एक सारणीबद्ध विधि माना जाता है। मैं टेबल नहीं दूंगा, वे दोनों नेटवर्क और उदाहरण में हैं, और कोड स्वयं मानक है:
crc16: function( data ) { var hi = 0xFF; var lo = 0xFF; var i; for (var j = 0, l = data.length; j < l; ++j) { i = lo ^ data[j]; lo = hi ^ CRC_HI[i]; hi = CRC_LO[i]; } return hi << 8 | lo; }
उदाहरण
यह केवल एक ठोस उदाहरण दिखाने के लिए बनी हुई है। यह स्पष्ट रूप से करना आसान नहीं है, इसलिए मैं वैकल्पिक साइबरवर्ट फर्मवेयर के लिए अपने मॉड्यूल का संदर्भ देता हूं:
साइबरवार्ट मोडबस मॉड्यूल । वहां आप मॉड्यूल के स्रोत कोड के साथ नवीनतम संग्रह डाउनलोड कर सकते हैं, साथ ही साथ अन्य संबंधित दस्तावेज भी।
एक उदाहरण इस तरह दिखता है:
1. प्राप्त करते समय त्रुटि।

2. हम 10 रजिस्टर पढ़ते हैं।

निष्कर्ष
उदाहरण के लिए, संग्रह में स्रोत modbus.js होगा, जो प्रोटोकॉल की सभी कार्यक्षमता को लागू करता है। प्राप्त डेटा अभी भी Modbus.Register [] संपत्ति में स्थित है। मैंने
MBAXP मोडबस RTU / ASCII ActiveX नियंत्रण के ActiveX घटक के साथ समानता से इस विकल्प को किया। यदि आप इसके लिए सहायता पढ़ते हैं, तो आप कोड के संगठन को समझेंगे।
उदाहरण अभी भी अंतिम रूप दिया जा रहा है, इसलिए वर्तमान विवरण पुराना हो सकता है।
अनुपूरक [06/11/2014]कार्यों और उनके आवधिक निष्पादन के लिए जोड़ा गया समर्थन। उनके ओवरले को लेकर समस्या थी।

संदर्भ
1.
मोडबस एप्लिकेशन प्रोटोकॉल V1.1b3 (पीडीएफ)2.
रूसी में मोडबस प्रोटोकॉल का विवरण (डॉक्टर)3.
साइबरवार्ट मॉड्यूल "मोडबस" (उदाहरण)