在工作中,當我們採集採用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