在Modbus通信中,使用ModbusRTU還是比較多的,在使用Modbus的串口通信中,使用485的也是比較多,當然,出現問題比較多的還是485的。
那為什么485使用起來那么多問題,還是那么多人選擇使用485呢。
那就不得不講講485和232的區別了。
什么是全雙工?簡單地說,就像我們現在的手機打電話,兩個人可以同時說話的,只是我們習慣了一個人先說,另一個人再說。如果能力允許的話,兩個人完全可以同時說話,提高聊天效率的。
那半雙工呢,就像以前的對講機,先有一個說話,說完之后,還要加一句over,然后對方再按開關說話。完了還在補一句over。
而Modbus協議呢,從交互流程來說呢,是屬于一問一答的形式。
先由主站發起讀或者寫請求,從站收到命令之后,再作回復。因此,在這里,全雙工的優勢并不能發揮出來。
而RS232呢,只能一對一通信,RS485,可以做到一對多通信。這個一對多,指的是,在485總線網絡里,只能有一個主站,可以有多個從站。
在這一點上,如果主控制器需要接多個從控制器的,485的優勢就發揮出來了。
通信距離,RS232呢,一般是小于15米,也有說是小于20米的,筆者選擇保守一些,就小于15米吧。如果是按遵循EIA/TIA-232標準,然后最大線路對地電容量為2500pF,對100pF/m的電纜,則長為25米。所以取個保守點的值吧。
所以通信距離來說,RS485的優勢又勝了。
信號傳輸,RS232是共地傳輸的,因此也就決定了通信距離,共地傳輸呢,也容易有共模信號干擾。RS485是差分傳輸的,所以傳輸距離也長一些,也因此只需要兩根差分信號線就可以了,同時也決定其只能使用半雙工的形式。
RS422我們就暫時不介紹了。RS422是綜合了RS232和RS485的優點和缺點。
綜合來看呢,在很多場合用485就特別合適了。特別是需要一對多的情況,只能非485莫屬了。
既然說Modbus 的RS485可以一對多,那最多是允許接多少個設備呢。
聽過比較多的答案是32臺設備。
當然,這并不是絕對的,很多現場連10臺都達不到。有些現場也能超過32臺的。
那為什么是32呢。因為是官方Modbus 文檔說的,大家也就按這個標準回答了。
那官方說這個數字的依據是什么呢。
所允許的地址,設備使用RS485單元負載總量,以及所需要的線偏置。
其實這里面,實際還是看其負載總量。
簡單點說,具體看實際情況。理論只是理論。這可是很有用的廢話。
RS485要怎么接呢。
菊花鏈接法
這種接法是最常見,也是RS485建議使用的。
簡單點來說,就是A接A,B接B。一個接一個,手拉手式的。如果再畫下去,就會像一個菊花瓣的一樣的,所以就叫菊花鏈接法。
總線式接法
其實這種接法呢,一般只存在于圖片中,因為在實際的485接法中,很容易將總線式接成菊花鏈接法,因為主要都是一個接一個,手拉手。
誰會好端端地在總線上摳一個口出來,然后把線接上去呢。
或者你會問,那可以都把線從一個主控設備引出來呀。這么做的話,那又變成了星型接法了。
所以說RS485,很少看到有總線型接法的。
星型接法
簡單地說,就是所有的接線,都從一個地方出來。
星型接法呢,如果對于從設備少的話,比如只有兩三個,其實也還少,問題不大的。但是如果設備多了,比如七八個,甚至十個,估計主控的接線端子都扛不住了吧,得擰多大的一坨線端子,帶來隱患不說,又不美觀,而且看起來還不專業。
當然了,如果從設備多,都想使用星型接法,那在主控這端,可以加一個485集線器,這樣從設備都接到集線器這里,再由集線器和主控設備接起來。無端增加一個集線器,何必呢。
所以綜合來說,還是建議使用菊花鏈接法。最多也就兩個線接在一個端子上,也不會擰出一大坨線,稍微打扮一下,接線看起來還是比較美觀,而且還專業。
線接好了,我們就可以通信了。
Modbus的RS485通信,還有哪些要注意的么。
要正確使用Modbus 的RS485通信,還是有一些前提條件的。
在RS485總線上,只能有一個主站設備。主站設備沒有自己的站號。只有從站設備才有站號的概念。
在RS485總線上,Modbus 的從站設備,設備站號不能沖突,且不能為廣播站號0。
在RS485總線上,設備要上電,才能進行工作和通信。
這看起來就是一句廢話,但是筆者就是在一些現場中,遇到客戶忘了給設備上電,然后一直測試發現通信不上。
其實前提條件也不是很苛刻,不過,可能就會有讀者有疑惑的。
我們回到讀者提問環節。
1)在RS485總線上,Modbus 的從設備站號有限制呢,一定要按順序嘛。
Modbus的通信,是由主站發起的通信,要訪問的設備,是提前在主站設備設置的。
但是呢,有一些主控設備呢,支持動態站號掃描。
比如主控會在啟動的過程中,或者出現中斷異常之后,需要進行恢復,就會進行站號掃描。
簡單點說,就是從站1號,挨個請求,看哪個設備有回復。如果設備號設置太大,就會增加掃描時間或者通信恢復時間。比如設置站號250。掃描一個設備需要100ms左右,那得需要25秒才能掃描上。
所以,建議在使用中,站號盡量往小了設置,然后再依次增加。
2) 梁老師,你寫的文章水貨,哦,不是,干貨真多,能加你微信么。
這位同學,你的想法很可愛,這個嘛,一切看緣分,機緣巧合的話,總會遇到的。
3)在RS485中,是不是每個設備都要求一樣的波特率呢,如果遇到設備的波特率不一致怎么辦呢?
這個問題問得好。一般來說,乃至絕大多數而言,都要求RS485總線上的設備,串口參數都要一樣的,因為主站設備在通信過程中,一般不會動態修改串口參數。
當然,在一些特定的項目中,主控設備如果知道每個站號的具體串口參數,在輪訓訪問每個從站設備時,都進行相應的串口參數修改,也是可以的。不過,這樣的通用性就大大降低了,只能在一些特定的場合或項目中出現。
4)在RS485通信上,如果每個設備的響應時間不一樣,怎么處理呢?
這種情況呢,可以說是非常常見的。雖然在485上面掛的都是Modbus設備,但設備類型不一樣,有電表,單片機控制器,PLC,電腦,HMI等。還有每個從設備要采集的點數也不一樣,最關鍵的是,每個設備的響應時間不一致。比如有的設備10ms就能回復,有的設備要1000ms才能回復。
這意味著,主站的請求超時時間需要設置,以總線上最慢的那個設備為參考。包括通信間隔也是的。
比如主站訪問1號站的回來報文,2號站都能收的,并且,還有過濾掉。如果主站訪問1號太快太頻繁,導致2號接收不過來,過濾不及時,等到主站訪問2號設備的時候,2號就處理不過來,導致通信異常了。
如果條件允許的話,最好可以分組。比如通信比較快的話,放到一組里,通信比較慢的,放到另一個組。如果主控設備,只能一路485,那就沒有辦法了。
5)在RS485總線上,需要有兩個主控設備要進行數據采集怎么辦?能不能在兩個主站設備上實現一種算法,可以讓兩個主站跑Modbus呢。
原則來說,RS485總線上不允許出現兩個主站進行數據請求的。常見的解決方案是兩個主控設備接到一個Modbus 轉換器上,再由這個轉換器來完成485總線數據采集。不過,這個就增加了個轉換器,而且,如果兩個主站訪問太快,也會有可能出現響應不及時。
至于說,能不能實現一種算法,可以讓兩個Modbus主站進行訪問。
筆者之前就做過一個算法。也可以稱為Modbus多主站吧。
算法的思路呢,就是兩個主站有令牌環的概念,一個主站請求三到五次左右,然后把令牌交給另一個主站,另一個主站拿到令牌之后,進行訪問。這樣兩個主站輪訓采集,這樣同一個時刻,也只有一個主站進行訪問。
可惜的是,效果不是很理想,交換令牌環容易丟失,導致兩個主站要么有時候不訪問,有時候一起訪問。
原因有兩點吧,一個原因筆者的Modbus 多主站算法還沒有細化好。
另一個原因就是對于從設備來說,是不可更改的,主站之間的令牌交換通信,也會被從設備接收,從設備需要過濾多余額外的數據,對有些用單片機來說,這是很容易出錯的。
想到達到比較好的效果,還需要主站的通信請求不能太快,通信效率自然也下降了。
所以搞Modbus 多主站算法,還是不太可行的,比較難做到通用性,只能在一些特定的項目里使用,所以自然也就不會傳開了,也就沒有所謂的Modbus多主站了。
在485上面,能實現多主站通信的,目前比較好的,也就BACnet MSTP協議了。
評論
查看更多