關於RS485總線通信協議開發注意事項

關於RS485總線通信協議開發注意事項

1       前言

近段時間發現我們系統在進行設備組態時,採用的串口複用方式在同一個RS485串口上掛載多個智能設備進行通信、監控。而往往在系統組態的時候就會發現部分設備通信不上,或者工程交付之後出現智能設備經常通信中斷的情況。本文描述RS485總線協議的工作原理,從根本上剖析導致以上問題的根本原因。

2       RS485總線硬件特點

2.1     拓撲結構

RS485總線一般採用111對多的組網方式,很少有多對多的場合,主要原因是RS485沒有總線仲裁,多對多會導致多個設備在總線上信號衝撞,最終無法正常通信。

2.2     總線掛載能力

RS485的總線掛載能力一般有三種等級,32節點(MAX485)、128節點(MAX1487)、256節點(MAX1483)。

3       RS485總線軟件特點

3.1     交互方式

RS485基本上採用一問一答的交互方式,主設備向從設備發送一條指令,從設備執行指令之後,返回一條應答命令。

特殊情況下,在數據交互不頻繁的場合中,爲了提高反應速度,也有從設備主動向主設備發送數據的用法。

3.2     地址

爲了區分主設備以及多個從設備,在交互的消息幀當中的從設備的地址是必需的,否則無法區分具體的設備。

如果一大堆從設備當中有地址相同的話,將導致通信異常。

3.3     校驗

RS485總線一般具備校驗,主要是因爲通信線路很長,存在干擾的可能性很大,校驗是對數據準確性的必要檢驗手段。

4       協議處理

4.1     幀結構分析

4.1.1 問題

早期485設備的處理器大多采用8爲低速單片機。在協議的解析處理上因資源受限,往往做得不是很完善,導致在多設備組網的情況下,發生通信異常的情況。

4.1.2 有起始符和結束符

SOH

ADDR

LEN

DATA0

………

DATAn

CRC

EOH

常用的SOH例如0x7E,EOH例如0x0D

特點是具備特殊定義的起始符和結束符,在接收端很容易判斷是否有接收到完整的數據幀。接收完畢後再進行後處理。後處理包括地址判斷、CRC校驗、以及協議解析。

4.1.3 無起始符

ADDR

LEN

DATA0

………

DATAn

CRC

因爲沒有起始符,很難判斷是否收到一個完整的數據幀,每收到一個字節都要處理一次。處理起來很痛苦,但是單片機程序恰恰相反,喜歡這麼做。

4.2     接收處理方法。

4.2.1 對於有起始符和結束符的協議來說,很少出問題,畢竟只要通過2個字符就可從總線上獲取一個完整的數據幀。如果總線上掛的設備都是這種協議的設備,很少發生故障。

4.2.2 對於沒有特殊字符的協議幀,處理起來比較麻煩,問題也比較多。

4.2.2.1  方法1

接收到第1個字符之後,就立刻判斷是否與本機地址匹配,如果不是,則停止接收數據,等待一段時間之後再接收。停止接收數據的目的在於丟掉該幀後續的數據。

特點:處理方式簡單,CPU開銷比較少。但是因爲停止接收的時間段一般是固定的且預留得比較寬,有可能在停止接收的這個時間段內收到屬於本機的數據幀,卻沒收到。

4.2.2.2  方法2

收到第1個字符之後,不立即處理,直到接收完整的長度描述符(LEN)後,再根據長度描述符定義的長度,接收完一幀之後再處理。處理包括地址判斷、CRC校驗、以及協議解析等。

特點:能很快的接收到完整的數據包,但是不是本地的數據包也接收進來了,對低端的CPU來說是個壓力。

4.2.2.3  方法3

收到1個字符之後,如果超過多長時間沒有接收到下一個字符,則認爲是數據包結束,對數據進行處理。

特點:和方法2類似,對低端的CPU來說是個壓力。另外的好處就是可以降低處理函數的複雜度,不需要計算數據包的長度,並依次接收。

但是字符超時的時間很難把控,如果雙發都是自己廠家的設備問題不大,如果接了很多品牌的設備,就會出現其他問題。

4.2.2.4  方法4

結合方法2和方法3,對CPU有一定的壓力,但是接收效果最好。響應迅速。

4.2.3 協議解析的錯誤做法

4.2.3.1  有些協議需要回送確認。例如控制檯。

4.2.3.2  有些協議智能在接收到正確的數據包之後才能回送。但是某些設備接收到了非法的數據之後也回送錯誤代碼應答,導致與總線其他廠家設備衝突。

 

4.3     帶來的問題

4.3.1 對於方法1,停止接收的時間段一般是固定的且預留得比較寬,有可能在停止接收的這個時間段內收到屬於本機的數據幀,卻沒收到。如過總線上數據量大的話,可能會一直存在這種問題,一直通信不上。

4.3.2 對於方法2,接收端是沒有問題的,但是可能會影響到使用了方法1和方法3的設備,因爲方法2接收得快,應答的也快。對於方法1而言,應答的2個數據包緊跟在一起,長度比較長,時間也比較長,有可能接收到中間的部分數據,結果是錯誤的。更嚴重的是,因爲接收到了錯誤的數據,從設備會回送一個錯誤應答,與原有的其他設備的正確數據衝突,導致所有的通信都失敗。

5       解決辦法

5.1     在協議組態的時候,因爲現場設備已經安裝好,並且很多並不是我們廠家的設備,讓其他廠家來配合我們調整程序並不現實,那麼可以通過一下方式來解決這些問題。

5.2     錯開波特率

不同廠家設備之間,使用不同的波特率,且錯開也大越好,例如兩個廠家都支持120038400,則一個廠家用最低的,另一個廠家用最高的。

5.3     增加命令之間的間隔時間

5.3.1 在同一個設備當中,需要讀取多條指令才能完成數據的採集,那麼在每條指令之間做個延時(200ms-500ms)。

5.3.2 在不同設備切換時,上述時間可以更長一點(500ms-2S)。

5.3.3 以上時間可以根據現場情況進行適當調整,多次測試,獲取最佳的時間,既要保證可靠的通信,又不能讓系統的響應速度受到明顯的影響。

5.4     歸零

發送指令之前,先清空接收緩衝區,預防累加有其他無效的數據。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章