2012-12-31 5 views
5

मैं & पढ़ने के लिए मॉड्यूलस डेटा को कई I/O उपकरणों से पढ़ने के लिए, सी # प्रोजेक्ट में एनमोडबस का उपयोग कर रहा हूं। मैं कार्यक्रम में मॉडबस टीसीपी/आईपी प्रोटोकॉल (मोडबसआईपमास्टर आदि ..) का उपयोग कर रहा हूं।मॉडबस कस्टम संदेश और उप-फ़ंक्शन (एनमोडबस, टीसीपी, सबफंक्शन)

मैंने डिवाइसों (मॉडबस गेटवे के माध्यम से) के साथ सफलतापूर्वक संवाद किया है और डिवाइस से डेटा तक पहुंचने के लिए डिफ़ॉल्ट विधियों (जैसे सामान्य मॉडबस फ़ंक्शन जैसे रीडहोल्डिंग रजिस्ट्रार, लिखितकोइल्स) का उपयोग कर सकते हैं, और उन्हें वापस लिख सकते हैं। फिलहाल, मैं जो कर सकता हूं वह डिफ़ॉल्ट एनएमडबस विधियां हैं जो आम तौर पर इस्तेमाल किए गए मॉडबस कोड (1, 2, 3, 4 आदि ..) का पर्दाफाश करते हैं।

मैं दो कठिनाइयां हो सकती हैं:

1) मैं उप कार्यों/हे उपकरणों की सेटिंग और अतिरिक्त जानकारी 70 (0x46), और की Modbus कोड के तहत पहुँचा जा सकता है देखते हैं जो मैं सेटिंग्स को पढ़ने और/या लिखने के लिए उपयोग करने की आवश्यकता होगी।

उदाहरण के लिए, Func 07 (0x46), उप func 6 (0x06), मॉड्यूल की संचार सेटिंग्स सेट करने के लिए उपयोग किया जा सकता है। इस उदाहरण में 7 बाइट्स जानकारी भेजी जा सकती है जो सेटिंग्स लेते हैं (जैसे बॉड रेट इत्यादि ...)

एनएमडबस के पास इस 'कस्टम' फ़ंक्शन कोड (70) के लिए कोई विशिष्ट विधि नहीं है। तो, जो मैं समझता हूं, उससे किसी को NModbus की कस्टममेसेज सुविधा का उपयोग करने की आवश्यकता होती है। मैंने कस्टम मैसेज को निष्पादित करने का प्रयास किया है, और सामान्य मॉडबस फ़ंक्शन कोड (उदा। 1 या 2) का उपयोग करते समय मैं उसी परिणाम को प्राप्त कर सकता हूं जैसे कि मैं एनमोडबस के डिफ़ॉल्ट तरीकों का उपयोग कर रहा था (यानी कस्टम मैसेज अब तक काम कर रहा है)।

जब मैं सामान्य लोगों के अलावा फ़ंक्शन कोड का प्रयास करता हूं (उदा। 1, 2, 3 ...) मुझे सभी प्रकार के अपवाद मिलते हैं। इसके अलावा, मुझे नहीं पता कि मुझे संदेश के साथ सब-फ़ंक्शन कैसे भेजना चाहिए!

जब मैंने फ़ंक्शन कोड के बाद उपखंड जोड़ा (उदाहरण के लिए 70 के बाद 70), और डेटा मुझे प्राप्त करने के माध्यम से भेजता है, अपवाद। कृपया मुझे इस क्षेत्र में विशेषज्ञों से वास्तव में मदद की ज़रूरत है। । क्वेरी डेटा क्षेत्र में निहित एक मूल्य नहीं है - 3:

"प्रकार के अपवाद 'Modbus.SlaveException' फेंक दिया गया था फंक्शन कोड: 198 अपवाद कोड

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

2) दूसरी समस्या है भेजने ASCII 232 रुपये Modbus के माध्यम से संदेश, आदेश में एक 232 रुपये उपकरण है जो एक मॉड्यूल जो Modbus परिवर्तित करने की क्षमता है की COM1 से जुड़ा है को नियंत्रित करने के संदेश। दूसरे शब्दों में, मैं मॉड्यूलस गेटवे के साथ संवाद करने की योजना बना रहा हूं, अपने COM1 को ASCII डेटा भेजने के लिए, जो बदले में डेटा को आरएस -223 में अनुवाद करता है और फिर आरएस -223 डिवाइस के साथ संचार करता है। अनुवाद गेटवे के अंदर आंतरिक होने के लिए है, इसलिए मुझे यह जानने की जरूरत है कि पृथ्वी पर मैं इन संदेशों को कैसे भेज सकता हूं, जो लंबाई में भिन्न होते हैं।मुझे नहीं पता कि यह कैसे संभव है, और कहां से शुरू करना है।

+0

क्या आपको प्रश्न 2 का कोई समाधान मिला? – Norbert

+0

मेरी इच्छा है कि मैं मदद कर सकता हूं, मैंने अतीत में मॉडबस किया है, लेकिन यह सब घर से उगाया गया था, नीचे-पर-नंगे-धातु सामान, कभी भी एनएमडबस का उपयोग नहीं किया गया ... –

उत्तर

0

भाग - एनमोडबस आपको एक टीसीपी या यूडीपी क्लाइंट पर एएससीआईआई मास्टर बनाने की अनुमति देता है।

using (TcpClient client = new TcpClient("127.0.0.1", 502)) 
{ 
    ModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client); 

    // Use the master here 
} 

प्रश्न के पहले भाग के संबंध में, NModbus मूल बातें के लिए अच्छा है, लेकिन यह अमूर्त की एक परत है कि यह मनमाने ढंग से बढ़ाया जा करने की अनुमति होगी का अभाव है। इसका मेरा अनुभव समाप्त हो गया जब मुझे पता चला कि इसे GetServerId फ़ंक्शन को जोड़ने और जोड़ने के लिए महत्वपूर्ण संशोधन की आवश्यकता होगी, भले ही यह मॉडबस आरटीयू के विनिर्देश का हिस्सा हो। मेरा समाधान ग्राउंड अप से इसे फिर से कार्यान्वित करना था, (जिसने मुझे एनएमडबस स्रोत को पहले स्थान पर संकलित करने और चलाने के लिए कम समय लिया, क्योंकि लॉगिंग के लिए तीसरे भाग पुस्तकालयों पर निर्भरता के कारण & IENumerable के लिए अनुपलब्ध एक्सटेंशन वर्ग)।

संबंधित मुद्दे