मैं लिनक्स सिस्टम पर काम कर रहा हूं जो डेटा भेजने और प्राप्त करने के लिए मोडबस आरटीयू आरएस 485 का उपयोग कर रहा है। मेरा डिवाइस मास्टर है और बस "नवीनतम डेटा का अनुरोध करें" (8Bytes में 2Byte CRC शामिल है) हर 1 सेकंड में स्लेवर (अब से केवल 1 स्लेवर है) भेजें। जब स्लेवर को अनुरोध प्राप्त होता है, तो वे डेटा तैयार करेंगे (71Bytes में CRC शामिल है) और मास्टर को वापस भेज देंगे। मैं स्लेव का स्रोत नहीं देख सकता क्योंकि यह व्यावसायिक उत्पाद है। मास्टर और स्लेवर दोनों समान बॉड दर 38400 का उपयोग करते हैं।

नतीजा:

  1. मास्टर और स्लेवर के बीच संचार की जांच करते समय, कभी-कभी (औसत 1-2 घंटे) स्लेवर से डेटा कुछ पहले बाइट्स खो जाता है, और प्राप्त पहली बाइट को स्लेवर से भेजे गए अन्य मान के साथ संशोधित किया गया है (कभी-कभी केवल कुछ पहले बाइट्स खो जाते हैं)
  2. कभी-कभी स्लेवर से डेटा नहीं आता है (समय समाप्त हो जाता है लेकिन कोई डेटा प्राप्त नहीं होता है)। मैंने टाइमआउट को 500ms या 1sec तक बढ़ाने की कोशिश की लेकिन फिर भी बिना किसी बदलाव के होता है
  3. मैंने टेराटर्म के साथ संचार द्वारा स्लेवर का परीक्षण किया और ऊपर की तरह कोई त्रुटि नहीं है। भेजा और प्राप्त किया गया डेटा ठीक है। मास्टर के साथ, मैंने टेराटर्म के साथ भी परीक्षण किया और कोई त्रुटि नहीं है।
  4. जब मैं मास्टर और स्लेवर डेटा भेजने और प्राप्त करने के दौरान डेटा को पकड़ने की कोशिश करता हूं, जब समस्या होती है (कोई डेटा प्राप्त नहीं होता है या कुछ पहले बाइट खो जाते हैं) दोनों मास्टर पक्ष और मेरे पीसी पक्ष पर (पीसी पर डेटा बाइट टेराटर्म को पकड़ने का प्रयास करें) .

मेरा मानना ​​​​है कि समस्या मास्टर साइड पर है, और शायद सीरियल पोर्ट सेटिंग पर है, लेकिन मुझे नहीं पता कि कहां गलत थे। कृपया मदद करे।

मेरी खराब अंग्रेजी के लिए माफ़ करें!

-1
user1234 13 अक्टूबर 2021, 09:00
1
आपने न्यूनतम और पूर्ण उदाहरण के बजाय केवल कोड के टुकड़े पोस्ट किए हैं। सभी syscalls से रिटर्न कोड ठीक से हैंडल नहीं किए जाते हैं। कई पहचानकर्ता अपरिभाषित हैं, उदा। assW_buf में while( 0 < read( fd, &buf[0], sizeof(assW_buf)) ); बॉड्रेट को फर्जी new_options संरचना में सेट किया गया है। शून्य-आउट संरचना का उपयोग करके टर्मियोस आरंभीकरण अनुचित और अविश्वसनीय है। देखें टर्मिनल मोड को ठीक से सेट करना और POSIX ऑपरेटिंग सिस्टम के लिए सीरियल प्रोग्रामिंग गाइड
 – 
sawdust
14 अक्टूबर 2021, 01:30
मेरा मानना ​​है कि इस मामले में शून्य-आउट टर्मियोस संरचना कोई समस्या नहीं है, क्योंकि मुझे आपका लिंक भेजा गया था लेकिन कोई सुधार नहीं हुआ है। समस्या सॉफ़्टवेयर में नहीं हो सकती है। स्रोत कोड में अपरिभाषित चर के बारे में क्षमा करें, यह टाइपिंग गलती है, प्रोग्राम में कोई समस्या नहीं है और कृपया इसे अनदेखा करें।
 – 
user1234
14 अक्टूबर 2021, 04:35
1
"समस्या सॉफ़्टवेयर में नहीं हो सकती है। " - फिर यदि समस्या हार्डवेयर में है, तो टेराटर्म का उपयोग करने पर समस्या क्यों नहीं होती है? समस्या निवारण के लिए एक सामान्य नियम: यदि X को Y के साथ प्रतिस्थापित करने से लक्षण दूर हो जाते हैं, तो X को कारण के रूप में संदेह करें, Z के रूप में नहीं। लेकिन यदि आपको लगता है कि यह HW है, जैसा कि आपने नीचे टिप्पणी की है, तो आपकी पोस्ट इस साइट के लिए विषय से परे है।
 – 
sawdust
14 अक्टूबर 2021, 08:34
@sawdust: आपकी बात के लिए धन्यवाद। टेराटर्म में, मास्टर से प्राप्त डेटा से डेटा वापस भेजने का समय स्लेवर डिवाइस की तुलना में लंबा है (क्योंकि मैंने मार्को का उपयोग किया है और डेटा को संसाधित करने और वापस भेजने में 30-50ms लगते हैं)। मुझे लॉग जोड़ा गया और देखा गया कि कभी-कभी स्लेवर 1ms से कम डेटा भेजता है। और नीचे मेरी टिप्पणी के रूप में, मैं स्लेवर पर देरी का समय जोड़ता हूं और सुधार देखता हूं। मुझे यह जानने की जरूरत है कि RS485 बस चालक पर स्विचिंग मोड और ट्रांसमिट मोड को स्विच करने में आमतौर पर इसे टालने या ठीक करने में लंबा समय क्यों लगा। क्या आप मेरी मदद कर सकते हैं?
 – 
user1234
14 अक्टूबर 2021, 09:25

1 उत्तर

सबसे बढ़िया उत्तर

मैं RS485 बस के साथ बहुत काम करता था। और एक समस्या जो कभी-कभी सामने आती थी, वह आपके जैसी ही थी। चूंकि आरएस 485 आधा डुप्लेक्स बस है, वहां तंत्र है जो स्विचिंग मोड और ट्रांसमिशन मोड को आरएस 485 बस चालक पर स्विच करता है। और यह वास्तव में मेरी समस्याओं का कारण था।

जब मास्टर डिवाइस ने कुछ डेटा भेजा, तो बस ड्राइवर (मास्टर साइड पर) को मोड प्राप्त करने के लिए स्विच करने से पहले दास उत्तर देने के लिए तैयार था (और उत्तर दिया)। यह व्यवहार डेटा हानि के साथ समाप्त हुआ।

क्या मैं आपको आस्टसीलस्कप का उपयोग करके जांच करने का सुझाव दे सकता हूं, कि दास ने सही तरीके से डेटा भेजा है? यदि ऐसा है, तो संभवतः आपके पास करने के लिए बहुत अधिक विकल्प नहीं हैं, क्योंकि संभव समाधान हैं:

  • दास को स्वामी को उत्तर भेजने से पहले कुछ समय प्रतीक्षा करनी पड़ती है।
  • HW बदलें, कुछ RS485 ड्राइवर जो स्विचिंग मोड में तेज़ होंगे या विभिन्न बस का उपयोग करेंगे।
1
Vladislav 13 अक्टूबर 2021, 11:16
आपके उत्तर के लिए धन्यवाद। और मुझे विश्वास है कि आप सही हैं क्योंकि मैंने स्लेवर पक्ष पर मास्टर को डेटा वापस भेजने से पहले 5-10ms देरी जोड़ने की कोशिश की और सुधार देखा लेकिन फिर भी होता है। एक बात है जो मुझे समझ में नहीं आती है कि क्यों कभी-कभी बस चालक बहुत देर से रिसीव मोड में स्विच करता है? मेरा मानना ​​​​है कि अगर सामान्य रूप से मोड प्राप्त करने के लिए स्विच किया जाता है, तो कोई समस्या नहीं है। हो सकता है कि अन्य रुकावट या कुछ ऐसा जो स्विच मोड को प्रभावित कर सके। मैं हार्डवेयर नहीं बदल सकता, मुझे इस समस्या से बचने के लिए सॉफ़्टवेयर में कुछ पुनः भेजने और प्राप्त करने की आवश्यकता है, लेकिन मुझे कुछ भी करने से पहले मूल कारण जानने की आवश्यकता है। कृपया मदद करे।
 – 
user1234
14 अक्टूबर 2021, 04:29
सच कहूं तो मुझे कोई जानकारी नहीं है। यह इस बात पर निर्भर करता है कि आप RS485 को अपने कंप्यूटर से कनेक्ट करने के लिए किस HW का उपयोग कर रहे हैं। यह आपके द्वारा उपयोग किए जा रहे SW पर भी निर्भर हो सकता है। इन चीजों को आमतौर पर USB से UART (उदाहरण के लिए FT232) और फिर UART से RS485 ड्राइवर की तरह बनाया जाता है। इन RS485 ड्राइवर में UART को जोड़ने के लिए RX और TX है, RS485 को जोड़ने के लिए A और B और आमतौर पर FT232 द्वारा संचालित दिशा पिन है।
 – 
Vladislav
14 अक्टूबर 2021, 10:54
आपकी सहायता के लिए धन्यवाद। मैं आस्टसीलस्कप का उपयोग करके यह पता लगाने की कोशिश करूंगा कि समस्या किस तरफ है।
 – 
user1234
15 अक्टूबर 2021, 03:53