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