如果大家從事物聯網相關行業的開發或者運維,相信對于Modbus協議不會陌生。剛好我在平時運維工作中,也會因為需要排查問題而接觸到Modbus協議。本文就通過常用調試工具結合實例帶大家來解析Modbus協議,希望可以通過具體協議數據解析,讓大家加深對該協議的理解。
一、Modbus協議簡介
Modbus協議是應用于電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網絡(例如以太網)和其它設備之間可以通信。它已經成為一通用工業標準。有了它,不同廠商生產的控制設備可以連成工業網絡,進行集中監控。
此協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如果回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內容的公共格式。當在一Modbus網絡上通信時,此協議決定了每個控制器須要知道它們的設備地址,識別按地址發來的消息,決定要產生何種行動。如果需要回應,控制器將生成反饋信息并用Modbus協議發出。在其它網絡上,包含了Modbus協議的消息轉換為在此網絡上使用的幀或包結構。
此外,Modbus協議是Modicon公司(現在的施耐德電氣 Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標準(De facto),并且現在是工業電子設備之間常用的連接方式。
此協議是一個請求/應答協議,包括ASCII、RTU、TCP等版本。它定義了控制器能夠認識和使用的消息結構,而不管它們是通過何種硬件方式進行通信的。所以硬件接口可以是RS-232、RS-422、RS-485和以太網等設備。TCP和RTU是Modbus協議的兩種常見形式,其中TCP的使用頻率更高一些。
二、案例協議文檔
以下解析案例來自某廠家的溫濕度傳感器協議文檔。
(一)通訊參數 1、上位機串口設置 本溫濕度傳感器通訊數據幀格式采用固定的“N,8,1”格式,使用時請將串口設置成1位起始位,8位數據位,1位停止位,無奇偶校驗位。
2、數據寄存器地址
(二)應用舉例 1、應用舉例 (1)多個寄存器數據讀取 主機發送
子機響應 地址為1的傳感器收到上面的數據后,將會做出以下響應
(2)功能碼06應用舉例:將子機地址改為2,波特率改為19200
功能碼06時的子機響應:子機會將主機發來的數據原封返回。
三、協議解析
以下對上方溫濕度傳感器及其協議進行數據解析。以下環境均搭建完畢
(一)需要準備工具及其環境: 1、溫濕度傳感器設備一套; 2、485串口線一條(USB轉232線,再通過232轉485口接傳感器485口); 3、windows環境作為上位機軟件Modbus Poll運行環境; (二)Modbus協議數據解析舉例 1、讀取溫濕度傳感器的溫度的測量值 (1)打開上位機軟件Modbus Poll,如下圖所示:
(2)通過在上位機軟件中進行串口連接相關配置(根據自己實際電腦串口號進行配置),如下圖所示:
(3)在上位機軟件中設置讀取傳感器的相關參數,一般根據協議文檔中說明設置,如下圖對傳感器的溫度值進行讀取:
(4)打開日志進行記錄傳感器串口收發數據,方便我們等下轉化值進行比對,如下所示:
點擊Log按鈕還可以將串口收發數據保存在文件中,方便查看。
(5)完成以上設置后,即可讀取傳感器的溫度值,如下所示:
(6)執行讀取操作后,可以看到如下結果:
串口收發數據如下:
Tx:002-01 03 00 33 00 01 74 05
Rx:003-01 03 02 06 49 7A 12
根據協議文檔對上位機發送的串口數據01 03 00 33 00 01 74 05進行解析: 第一個字節01表示讀取地址為1的傳感器數據; 第二個字節03表示功能碼; 第三、第四個字節00 33表示從寄存器的地址0x0033開始讀; 第五、第六個字節00 01表示讀取寄存器的個數為1; 第七、第八個字節74 05表示CRC碼; 根據協議文檔對傳感器返回的串口數據01?03?02 06 49 7A 12進行解析: 第一個字節01表示485地址為1的傳感器進行回應; 第二個字節03表示功能碼對應3; 第三個字節02表示讀取一個寄存器對應2個字節數; 第四、第五兩個字節06 49表示寄存器地址為0x0033對應的內容,轉化為10進制等于1609,跟上位機軟件自動轉化的值一樣; 第六、第七兩個字節7A 12表示CRC碼; 2、讀取溫濕度傳感器的濕度、溫度、露點的測量值,即讀取3個寄存器地址所對應的值
(1)在上位機軟件中設置讀取傳感器的相關參數,一般根據協議文檔中說明設置,如下圖所示:
(2)開啟串口數據收發日志記錄
(3)執行讀取操作后,可以看到如下結果:
串口收發數據如下:
Tx:004-01 03 00 32 00 03 A4 04
Rx:005-01 03 06 0F 5A 06 50 00 E4 79 55
根據協議文檔對上位機發送的串口數據01 03 00 32 00 03 A4 04進行解析: 第一個字節01表示讀取地址為1的傳感器數據; 第二個字節03表示功能碼; 第三、第四個字節00 32表示從寄存器的地址0x0032開始讀; 第五、第六個字節00 03表示讀取寄存器的個數為3; 第七、第八個字節A4 04表示CRC碼; 根據協議文檔對傳感器返回的串口數據01 03 06 0F 5A 06 50 00 E4 79 55進行解析: 第一個字節01表示485地址為1的傳感器進行回應; 第二個字節03表示功能碼對應3; 第三個字節06表示讀取3個寄存器對應6個字節數; 第四、第五兩個字節0F 5A表示寄存器地址為0x0032對應的內容,轉化為10進制等于3930,跟上位機軟件自動轉化的值一樣; 第六、第七兩個字節06?50表示寄存器地址為0x0033對應的內容,轉化為10進制等于1616,跟上位機軟件自動轉化的值一樣; 第八、第九兩個字節00?E4表示寄存器地址為0x0034對應的內容,轉化為10進制等于228,跟上位機軟件自動轉化的值一樣; 第十、第十一兩個字節79 55表示CRC碼;
四、總結 到此,我們已經結合一款溫濕度傳感器的協議文檔,對它的Mudbus協議進行數據解析。其它產品的跟這個差不多,無非可能是參數指標多點。掌握其協議原理并且解析,可以有助于我們排查問題。比如客戶反饋溫濕度的值不準了,我們第一時間只能通過協議抓包解析,看看它底端的原始值是多少,才能知道不準的根本原因。 關于Mudbus協議數據轉化,我們經常在16進制與10進制之間進行轉化,下面給大家附上一些在線轉換工具網址。 https://jisuan5.com/hexadecimal-to-decimal/
審核編輯:黃飛
?
評論
查看更多