大家好,我是情報小哥~
最近使用modbus協(xié)議與第三方設備進行通信,有幾點在這里小結(jié)分享一些,也避免大家以后掉坑,本文不做系統(tǒng)的modbus協(xié)議解說,僅對使用過程中遇到的問題和注意事項進行描述,以基于RS485的modbus-RTU為例進行講解:
1、字節(jié)序問題
modbus采用大端字節(jié)序進行報文傳輸,這個非常重要,字節(jié)序不正確則對多字節(jié)數(shù)據(jù)無法解析和組拼。
這里所說的大端字節(jié)序表示:一個數(shù)據(jù)的高字節(jié)將被優(yōu)先發(fā)送,如一個word大小的數(shù)據(jù)為0x1234,那么在modbus協(xié)議打包成一幀數(shù)據(jù)進行發(fā)送的時候在規(guī)定數(shù)據(jù)域中先發(fā)送0x12,然后發(fā)送0x34,其他多字節(jié)數(shù)據(jù)類型、CRC16校驗也是類似的傳輸順序。
總線上的發(fā)送與接收方都要遵循大端的字節(jié)序發(fā)送格式。
2、單播與廣播
在modbus總線上采用單播和廣播的方式進行通信,同一總線上一般都只有一個主機、多個從機;在同一時間內(nèi)一個主機可以通過地址區(qū)分與想要的從機通信,這邊是單播方式;同時modbus總線也可以一個主機以廣播的方式與多個從機進行通信。
平時我們也稱這種通信方式為主從通信(Maser/Slave),主機發(fā)送請求消息,當從機接收到正確消息后響應請求返回給主機;同時主機也可以直接發(fā)消息修改從機的數(shù)據(jù),實現(xiàn)主從數(shù)據(jù)的雙向讀寫。
3、與PLC通信協(xié)議
具體與什么設備通信,只是不同的設備所支持的功能碼不同,或相關的叫法和習慣不同,具體需要根據(jù)相應的設備來進行區(qū)分了,但都符合modbus協(xié)議標準。
在跟PLC進行通信的時候其給過來的協(xié)議會指明相應的PLC地址而此地址與實際發(fā)送modbus報文數(shù)據(jù)幀中的寄存器等地址并不是一致的。
如上圖所示PLC工程師一般都會以PLC地址為基礎給出協(xié)議,而很多其他軟件工程師對接的時候,以為PLC地址(也叫PLC的存儲地址)便是modbus報文數(shù)據(jù)幀中的寄存器地址,其實兩者并不相等。
像西門子的PLC地址其每個功能碼所對應的modbus報文地址都是從0開始,即從0x0000~0xFFFF;所以你可以把PLC地址看成是一種絕對地址,而modbus報文地址僅僅只是在該功能碼下的一個相對地址。
如采用03H功能碼讀取PLC存儲地址是40002的寄存器,而此時modbus報文中的寄存器地址為01。
3、線圈和寄存器的理解
由于早期PLC對于一些布爾量均是用于控制一些繼電器或者接觸器等等,這些器件主要是通過線圈來進行吸合與彈開,后面叫法也就沿用下來了,同時線圈分配輸入線圈和輸出線圈,跟我們平時MCU的IO引腳的電平讀寫有點類似。
而對于一些非bool類型的數(shù)據(jù)均采用寄存器的概念來繼續(xù)傳輸,相信這樣便可以對PLC中的這些名字進一步理解了。
4、RS485終端電阻
對于較長距離的RS485通信,采用線型連接并增加終端120Ω匹配電阻來降低干擾增加總線通信的穩(wěn)定性,如下圖所示:
最 后
好了,這里小哥就簡單介紹了最近使用modbus的一些踩坑筆記,記得關注學習哦。
-
數(shù)據(jù)
+關注
關注
8文章
7243瀏覽量
91050 -
MODBUS
+關注
關注
28文章
2026瀏覽量
78989 -
字節(jié)
+關注
關注
0文章
42瀏覽量
14047
發(fā)布評論請先 登錄
評論