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