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