Modbus RTU 協議 模擬 測試
阿新 • • 發佈:2021-09-08
模擬工具
模擬工具選用
模擬前準備
- 下載Configure Virtual Serial Port Driver,該工具用於建立一對虛擬視窗,代表一根RS232線,博主虛擬了COM1和COM2
- 關於COM1和COM2, 任何一頭用於ModbusSlave,另一頭是串列埠模擬工具,將用於模擬,Up主將Slave監聽於COM1
模擬工具選用 Modbus Slave
模擬工具用法
- 點選Connection
- 連線方式選擇串列埠,串列埠協議自己定義,當前預設
Modbus Slave 如何設定暫存器數量
- 點選SetUp, 點選Slave Denifinition
- 彈出畫面可以修改裝置站點號 1,Function選擇03,Holding Register,暫存器地址自定義,博主將修改
成0-30,並可以選擇預設暫存器顯示行數,現在10行點選OK
Modbus Slave 修改資料顯示
- 可以選擇列,也可以選擇單元格, 右鍵Format,點選Signed(有符號10進位制),UnSigned(無符號10進位制),Hex(16進位制),Binary(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校驗符說明,
- 用於校驗命令完整性,網上由生成CRC的C#程式碼,和頁面工具,先已下圖命令說明
01 01 48 00 00 10 2A 66中01 01 48 00 00是指令,2A 66是CRC校驗碼
- 可以在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 |