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