1. 程式人生 > 其它 >Modbus RTU 協議 模擬 測試

Modbus RTU 協議 模擬 測試

模擬工具

模擬工具選用

模擬前準備

  1. 下載Configure Virtual Serial Port Driver,該工具用於建立一對虛擬視窗,代表一根RS232線,博主虛擬了COM1和COM2
  2. 關於COM1和COM2, 任何一頭用於ModbusSlave,另一頭是串列埠模擬工具,將用於模擬,Up主將Slave監聽於COM1

模擬工具選用 Modbus Slave

模擬工具用法

  1. 點選Connection
  2. 連線方式選擇串列埠,串列埠協議自己定義,當前預設

Modbus Slave 如何設定暫存器數量

  1. 點選SetUp, 點選Slave Denifinition
  2. 彈出畫面可以修改裝置站點號 1,Function選擇03,Holding Register,暫存器地址自定義,博主將修改
    成0-30,並可以選擇預設暫存器顯示行數,現在10行點選OK

Modbus Slave 修改資料顯示

  1. 可以選擇列,也可以選擇單元格, 右鍵Format,點選Signed(有符號10進位制),UnSigned(無符號10進位制),Hex(16進位制),Binary(2進位制)
  2. Alias 可填入列名, 點選單元格鍵入數字會彈出修改框

Modbus Slave 如何檢視傳送指令與回覆指令

點選Display,點選Communication

命令傳送工具

命令傳送工具選用通用串列埠工具,目前用的是串列埠工具除錯助手,虛擬COM隊是COM1<->COM2,COM1用於Slave,那串列埠工具除錯只能用於COM2

指令如何傳送,如下將傳送指令01 01 48 00 00 10 2A 66
,記得勾選16進位制傳送,16進位制顯示

Modbus RTU命令的CRC校驗符說明,

  1. 用於校驗命令完整性,網上由生成CRC的C#程式碼,和頁面工具,先已下圖命令說明
    01 01 48 00 00 10 2A 66中01 01 48 00 00是指令,2A 66是CRC校驗碼
  2. 可以在http://www.ip33.com/crc.html中獲取CRC校驗碼,記得選擇CRC-16/Modbus,而且生成的CRC是顛倒的,66 2A

測試已知命令

1. 01 功能碼:讀取線圈狀態

讀取線圈狀態,讀取一組邏輯線圈的當前狀態(ON/OFF)。


測試結果,好像與實際說明不匹配,推測我沒找到線圈模擬或者是Slave沒有模擬線圈

RX:01 01 48 00 00 10 2A 66
TX:01 81 01 81 90 

2. 02 功能碼:讀取輸入狀態

讀取輸入狀態,讀取一組開關輸入的當前狀態(ON/OFF),對應人機介面上地址型別IX,只讀型別


測試結果,返回結果好像與實際說明不匹配,Slave沒有開關?

RX:01 02 00 10 00 10 78 03
TX:01 82 01 81 60 

3. 03 功能碼:讀取保持暫存器

讀取保持暫存器,在一個或多個保持暫存器中取得當前二進位制,對應人機介面上地址型別4X


特地到Slave中鍵入暫存器值

輸出結果,與圖片中符合

RX:01 03 00 00 00 04 44 09
TX:01 03 08 00 04 00 05 00 01 00 02 CC 16 

4. 04 功能碼:讀取輸入暫存器

讀取輸人暫存器,在一個或多個輸入暫存器中取得當前二進位制值,對應人機介面上地址型別3X,只讀型別。


暫時不修改上圖的4512

輸出結果,好像不符合

RX:01 04 00 00 00 04 F1 C9
TX:01 84 01 82 C0 

5. 05 功能碼:強制(寫)單線圈

強制(與)單線圈,強制(與)一個邏輯線圈的通斷狀態(ON/OFF),對應人機介面上地址型別OX。


輸出結果,好像不符合

RX:01 05 48 00 FF 00 9B 9A
TX:01 85 01 83 50 
RX:01 05 48 00 00 00 DA 6A
TX:01 85 01 83 50

6. 06 功能碼,預置(寫)單暫存器

預置(寫)單暫存器,把具體二進位制值寫入一個保持暫存器,對應人機介面上地址型別4X.


與返回的符合

RX:01 06 00 00 00 08 88 0C
TX:01 06 00 00 00 08 88 0C 

7. 07 OF功能碼:強制(寫)多線圈

強制〔寫)多線,強制(寫)一串連續邏輯線圈的通斷狀態(ON/OFF),對應人機介面上地址型別0X



與返回不符合

RX:01 0F 48 00 00 09 02 FF 01 AD 48
TX:01 8F 01 85 F0 
RX:01 0F 48 00 00 09 02 00 00 2D 78
TX:01 8F 01 85 F0 

08. 10功能碼:預置(寫)多暫存器

預置(寫)多暫存器,把具體二進位制值與入一串連續的保持暫存器,對應人機介面地址型別4X


與返回符合

RX:01 10 00 00 00 03 06 00 0A 00 0B 00 0C 0F 46
TX:01 10 00 00 00 03 80 08 

測試結果

功能碼 名稱 示例指令 返回 結果
01 讀取線圈狀態 01 01 48 00 00 10 2A 66 01 81 01 81 90 NG
02 讀取輸入狀態 01 02 00 10 00 10 78 03 01 82 01 81 60 NG
03 讀取保持暫存器 01 03 00 00 00 04 44 09 01 03 08 00 04 00 05 00 01 00 02 CC 16 OK
04 讀取輸入暫存器 01 04 00 00 00 04 F1 C9 01 84 01 82 C0 NG
05 強制(寫)單線圈 01 05 48 00 FF 00 9B 9A 01 85 01 83 50 NG
05 強制(寫)單線圈 01 05 48 00 00 00 DA 6A 01 85 01 83 50 NG
06 預置(寫)單暫存器 01 06 00 00 00 08 88 0C 01 06 00 00 00 08 88 0C OK
OF 強制(寫)多線圈 01 0F 48 00 00 09 02 FF 01 AD 48 01 8F 01 85 F0 NG
OF 強制(寫)多線圈 01 0F 48 00 00 09 02 00 00 2D 78 01 8F 01 85 F0 NG
10 預置(寫)多暫存器 01 10 00 00 00 03 06 00 0A 00 0B 00 0C 0F 46 01 10 00 00 00 03 80 08 OK
沒有標記轉載的情況下,如果有更好的優化麻煩電郵[email protected]或者留言答覆,Thank You