在工作中,當我們采集采用RS485主從式半雙工通訊的傳感器時,會接觸到Modbus協議。有時我們手上沒有實物,只能通過協議文檔手冊,編寫完代碼后,自己用RS485來模擬發送驗證。下面就說說如何快速組裝數值發送驗證,以及解析數值。
標準Modbus協議結構如下:
主機發送讀寄存器協議數據結構形式為:
設備地址 1字節
讀寄存器命令 1字節
寄存器地址 2字節
讀寄存器個數 2字節
CRC校驗(低字節在前,高字節在后) 2字節
例(主機發送數據到傳感器):01 03 00 12 00 02 64 0E
解析:
01 表示設備地址
03 表示讀寄存器指令
00 12 表示寄存器的起始地址
00 02 表示讀取兩個寄存器
64 0E 表示CRC校驗碼
從機返回寄存器是數據結構形式為:
設備地址 1字節
讀寄存器命令 1字節
讀取字節個數 N字節
XX *N N個所讀取字節數據
CRC校驗(低字節在前,高字節在后)
例(傳感器發送回給主機):01 03 04 41 E6 28 F6 91 BE
解析:
01 表示設備地址
03 表示讀寄存器指令
04 表示有四個16進制數據
41 E6 28 F6 表示傳感器的有效數據
91 BE 表示CRC校驗碼
1.若廠家對傳感器的數據存儲采用標準單精度浮點數方式,則對于一串采集回來的16進制數據,要轉成浮點數是比較麻煩的,可以看下先用科學計數法方式存儲計算:
方式1:如解析上述的返回值41 E6 28 F6
計算 41 E6 28 F6 (采用科學計數法方式存儲計算)
轉為二進制:01000001111001100010100011110110?
紅色’0’:表示符號位,1為負,0為正
10000011:表示指數位,轉為十進制為2^0+2^1+2^7=131 131-127=4 說明指數位為4
則表示為((1.11001100010100011110110)*2^4)=11100. 1100010100011110110=
2^2+2^3+2^4. 2^-1+2^-2+…..=28.77
即41 E6 28 F6 轉為十進制為28.77
方式2:采用工具快速轉換,如下圖所示

有了該工具,想要自己模擬發送任意數值的modbus協議數據,也是非常方便的。
比如主機發送了01 03 00 12 00 02 64 0E 采集命令,想要模擬傳感器數值為12.34
通過工具轉換如下:

則可組裝modbus協議數據為01 03 04 41 45 70 A4 , 對于后面兩位crc校驗可以采用如下工具,可以得到:


可知組裝的完整mobdus協議數據為01 03 04 41 45 70 A4 DB A1
2.若廠家對傳感器的數據處理是采用16進制轉整數方式處理,就像如下圖所示:


這種形式的16進制傳感器數據,可以采用電腦的計算器快速計算得到。
如計算00 9B

16進制模擬負值,可以采用計算器
如模擬-50,計算器輸入如下0-50

再點擊計算器上的xor

則16進制FF CE 則表示負數-50
————————————————
版權聲明:本文轉載為CSDN博主「Psyduck_ing」的原創文章,遵循CC 4.0 BY-SA版權協議。
原文鏈接:https://blog.csdn.net/Psyduck_ing/article/details/101309744