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