下面我們就來列舉一些常見問題。不管你是新手,使用者還是開發者,相信多多少少都遇到過Modbus 通信問題。
一 串口參數配置問題。
易錯指數:☆☆☆☆☆
排查指數:☆
這類問題,雖然容易出錯,但也容易排查。
一般來說,我們要進行Modbus通信,最先查看的就是串口參數了。
也就五個參數。
通信類型:RS232,一般是RX,TX,GND三根線。485常見是(+),(-)兩根線,也有接GND的,這樣就是三根線了。所以有時候看到三根線的通信,未必就是232,也有可能是485的。
波特率:這個,如果設置不對,就會通信不上。這個好像也沒什么好說的。
數據位:如果是Modbus RTU的話,數據位只能是8。如果是ASCII的話,就沒有關系了,通信雙方保持一致就行了。
停止位:這個如果協議是ASCII的話,要注意看對方設備的參數是否是2個停止位。
校驗位:這個一般容易出錯的點在于,有時候即便校驗位不匹配,偶爾能通信,容易造成混淆。
所以該類問題主要是一小心容易設置錯誤,不過,排查起來也很快。
解決方案:把參數配置正常即可。
二 接線問題
易錯指數:☆☆☆☆
排查指數:☆☆
接線問題我們可以從232和485兩種分析一下。
232的通信呢,是RX接TX。TX接RX。GND接GND的。
RX:接收。
TX:發送。
GND:地線。
接收對發送,發送對接收,地相連。
常見的幾種錯誤接法:
1)RX接RX, TX接TX,GND接GND的。
如果沒學過串口通信,接線一看,RX對RX,TX對TX,沒毛病呀,當年接閉路電視也是這樣接的呀。
2)RX接TX,TX接RX。沒接GND的。
這種情況呢,如果兩個設備某種情況共地的話,是可以通信上的。但如果設備用了隔離地,那就不好說了。
筆者就遇到過有客戶在用的時候,沒有接地,然后還和筆者說,為什么以前我不用接地也可以通信上,換新的設備為什么要接地。
3)RX接TX,TX接RX,也接了GND的。但是,一個是TTL電平的,一個是CMOS電平的。
這樣是不行的。怎么樣通俗一點講呢。
TTL電平,可以理解為可以從CPU引腳直接出來的。而CMOS電平呢,是經過一定的電平轉換的,簡單地說,就是兩種電平屬性不一樣,原則上是不能直接接在一起的。
這種情況,就需要一個TTL轉CMOS,或者是TTL轉232.
如果是485的通信呢,也是有接錯的。
不過,485一般就兩根線。A對A,B對B。也就兩種可能,接錯了,大不了反一下再試一下。所以也好排查。
這里補充一點,有的朋友可能從事相關行業比較晚,有些高級一點的485,可以做到A,B線不用區分,也就是正接反接都能自適應的。不過要記住,不是所有的設備都能自適應,使用時還是要留個心眼。
解決方案:把線接正確即可。
三 用法問題
易錯指數:☆☆☆
排查指數:☆☆
這類問題呢,比較雜。
Modbus協議呢,主要的參數有站號,功能碼,地址和長度。
在這幾個參數中,也是容易出錯。
站號: 站號一般錯的可能性比較小,因為站號對不上,直接通信不上。
功能碼:這個功能碼,在前面的協議介紹呢,無非就是讀和寫。
對于讀來說,并沒有區分單讀和多讀。但是對于寫來說,就有單寫和多讀了。
比如寫字寄存器,可以用06H功能碼,也可以用10H功能碼。10H功能碼是多寫,多寫當然包含寫一個了。
于是就會出現有些控制器,壓根就沒有做單寫的功能,直接不支持06功能碼。
對于這種情況的解決方案是:要么讓從站設備支持06功能,要么主站設備在寫的時候,使用的是10H功能碼,不使用06H功能碼。
地址:對于沒有的地址,自然是訪問不到了。
這種情況往往需要對從設備進行排查。有時候遇到同一個系列,但不同型號的PLC,控制器,就會出現地址寄存器不一樣的情況。
如果明確從站設備沒有相應的地址,則主站設備不需要訪問不存在的地址即可。
長度:也就是寄存器個數。
這個寄存器個數呢,也分兩種。
一種是從站設備所能支持最大的訪問個數。比如主站訪問個數16的時候可以,訪問個數為32的時候不行,那就有可能是從站設備壓根就不支持到32個數寄存器一起訪問了。
另一種是跨寄存器訪問。
比如從設備有4X1寄存器,4X3寄存器,4X2就是沒有。
然后主站訪問4X1地址,訪問個數為三個。這種情況下,有些從設備就不會回復或者報錯,因為從站設備認為4X2沒有,不能訪問。
用法還有就是在Modbus的485通信里,有且只能有一個主站。如果在485里,有多個主站,就會造成通信異常的。
四 協議高低字節問題。
易錯指數:☆☆
排查指數:☆☆☆
在Modbus RTU的報文中呢,地址和個數,還有CRC校驗,都是一個字,也就是兩個字節表示的,當然還有數據也是字單位的。
因為在實現過程中,有些做控制器的編程的時候,因為種種原因,將高低字節處理反了,那就會造成通信上的問題。
地址的高低字節反了:表現為通信不上或者數據對應不上。
個數的高低字節反了:讀一個,就變成了讀256個,好家伙,控制器直接反應不過來了。通信自然也出問題了。
數據的高低字節反了:數據錯亂。比如PLC里的值為1,然后主站讀到顯示的是256。如果是浮點數,那亂的更離譜。
前面幾個倒還好,CRC校驗這個就不好查了。因為CRC很難直接看出對還是錯,有沒有反。
有些從控制器呢,它自己對接收到的報文,不進行CRC判斷,然后回復的報文里,CRC校驗高低字節是反的,甚至是錯的,這個就比較難查了。
這不綜合排查指數給出三顆星不過分呀。
五 時間類問題
易錯指數:☆☆☆
排查指數:☆☆☆☆
這類問題呢,錯起來讓人頭疼,查起來讓人更頭疼。
在串口通信里,串口發送數據流是要花時間的,PLC控制器收到報文后,也是要花時間處理的。如果在時間控制上,沒有注意好,就會造成通信問題的。
以9600波特率來說,一個字節大概花1ms的時間進行傳輸。如果讀20個字寄存器,對方回復40多個字節,也就是光報文傳輸的時間都要40ms了。PLC收到報文要時間,處理數據要花時間,回復報文要花時間,這里面就涉及很多時間了。
不過,我們在通信過程中,一般只關心兩個時間。
1)回復時間。
當主控制器發送報文之后,PLC要等多久才進行回復,也就是可以理解為,主控制器需要等多久才能收到PLC的報文。
比如PLC回復需要500ms的時間,主控制器就等了400ms,就認為PLC沒有回復了,就判斷超時了。然后就開始發送下一個請求了。
造成的影響就是主控制器讀取數據超時,或者表現數據數據串包吧。
舉例:
主控制器發送讀4X1的報文,等了300ms沒收到數據,就判斷為超時。
主控制器緊接著發送讀4X2的報文,等了200ms。也就是PLC在第500ms的時候,回復了讀4X1的報文。
主控制器將PLC回復4X1的報文,誤判斷為是讀4X2的。就會造成4X2的數據顯示為4X1的,導致數據串包了。
這種情況的解決方案就是要確認PLC控制器的回復時間(響應時間)。
2)通信間隔時間。
這個時間指的是,當主控制器發送一次請求,PLC控制器也回復了。在完成這一次通信請求之后,主控制器間隔多久發下一次請求。這個可以稱為通信間隔時間。
有些PLC控制器在完成一次請求之后,是不能接受太快的請求的,需要休息一段時間的。
比如,有些PLC控制器,在收到主控制器的寫命令之后,是先回復報文給主控制器,表示收到寫命令了,然后再去執行相應的寫操作。在PLC控制器還沒有處理好寫命令的時候,這時候主控制器再發送新的請求,PLC控制器可能就響應不過來了,造成該次的通信超時。
所以這個時間也是需要注意的,稍微不注意,就會出錯。
六 干擾問題
易錯指數:☆☆
排查指數:☆☆☆☆
有時候呀,配置沒問題,軟件沒問題,甚至在辦公室通信好好的,放到現場,就是出現通信問題。你是否也遇過呢。
如果沒有遇到過,也沒有關系,聽我給你編,哦,不是,是編寫的編,容我編輯一下。
為什么會有干擾呢。這就得從通信本質出發了。
通信用的是線,通信過程,靠的是電平為高為低來表示不同的數據,實質主是一個電信號的傳輸。電信號,一會高,一會低,不同的波特率,也就是頻率不一樣了,可以類比于交流電的傳輸了。
這么講,可能有些干。
比如485的數據在傳輸中,應該類似于這種方波形式的,能比較明顯的看到0和1的數據。
如果存在干擾,可能波形就會變成這樣了。
那一般干擾源可能有哪些呢。
1)某些功率比較大的設備啟動或停止
在通信過程中,某些功率比較大的設備啟動或停止,使通信雙方的設備的電源產生了一定的抖動,然后因為電路設計沒考慮到電源抖動或者抖動太大,穩壓電路部分效果不理想,就會影響到通信。
這種影響是伴隨有設備的啟動或停止,看起來還稍微有些規律。
2)還有可能就是供電本身的問題
特別是RS232的形式,因為是使用共地傳輸,容易生產共模干擾,抗噪聲和抗干擾能力相對較弱
比如是9V或者24供電,但是存在較大的紋波,這個就會干擾到串口通信。
3)現場如果有變頻器,那變頻器在工作的時候,也容易產生干擾,使通信不穩定。
4)485接地了,但是那個地線有干擾或者有漏電,反而影響了通信。
七 波特率誤差問題
易錯指數:☆
排查指數:☆☆☆☆☆
要了解這個問題,我們就得聊一下波特率是怎么來的。
CPU一般都會有一個晶振,常見的有12M晶振,11.0592M或者更高的晶振。我們就舉例12M和11.0592M晶振吧。這是一個主頻率。波特率呢就是通過這個主頻通過分頻分出來的了。這就有一個分頻比。
也就是有的單片機,控制器,計算出來的波特率,也許并不是正好就是這個數值,是有一定的誤差的。
那么這種誤差會帶來什么效果呢。
數據會錯亂,比如0xAA變變成0xAB。
就會表現為數據收發出現異常,導致通信不上,而且查起來也很難查。
明明參數配置正確,用法也沒有問題,接線也正常,用第三方串口工具抓數據一看,數據也都正常,就是通信不上。
這種情況,就得借助示波器來分析了。具體怎么用示波器分析呢,請見下一篇進階篇介紹了。
八 疑難雜癥
易錯指數:?????
排查指數:?????
既然是疑難雜癥,那就不合適在入門篇講解了,想進一步了解的同學,咱們進階篇見。
在進階篇主要講485上的modbus,以及筆者積累的一些常用的排查方法,工具等介紹,順便再分享一些典型的出差案例,帶你走入簡單又神奇的Modbus 通信。
評論