Modbus協議采用主從(cong) 式通信,日常使用較多的是Modbus RTU和Modbus TCP/IP兩(liang) 種。
比較常用的Modbus通信調試軟件有ModScan32和ModSim32。
ModScan32主要用來模擬主設備,它可以發送指令到從(cong) 設備(使用Modbus協議的智能儀(yi) 表等設備終端),從(cong) 機響應之後,就可以在界麵上返回相應寄存器的數據。
ModSim32用來模擬從(cong) 設備,它可以模擬采用Modbus協議的智能終端。
在和組態軟件交互的過程中,咱們(men) 的板子或者軟件一般作為(wei) 從(cong) 設備,為(wei) 了了解Modbus協議的具體(ti) 交互過程,我們(men) 今天來使用ModScan32軟件和串口助手來調試一下Modbus協議。
實現目標
-
熟悉ModScan32軟件的使用
-
串口助手模擬從(cong) 設備與(yu) ModScan32軟件進行數據交互
素材獲取
本文相關(guan) 軟件及Modbus協議手冊(ce) 的獲取方式在微信交流群內(nei) 發布。
測試前提
創建一對虛擬串口供調試使用。
我們(men) 這裏選擇COM4和COM5,使用這一對虛擬串口可以實現,COM4發送的數據可以轉發至COM5中,反過來,COM5發送的數據可以轉發到COM4中,通過這兩(liang) 個(ge) COM口可以實現數據的交互。
ModScan32軟件使用教程
ModScan32是一個(ge) 運行在Windows下,作為(wei) 在RTU或者ASCII傳(chuan) 輸模式下的Modbus協議主設備的應用程序。
把一個(ge) 或多個(ge) Modbus從(cong) 站設備通過串口,調製解調器或者網絡連接到電腦上,就可以使用ModScan 讀取和修改數據點。
打開軟件
雙擊ModScan32.exe打開軟件。
軟件界麵介紹
Number of Polls: 表示ModScan32軟件發送的數據包個(ge) 數;
Valid Slave Responses: 表示從(cong) 設備返回的應答個(ge) 數。
如果這兩(liang) 個(ge) 計數都在增加,表明數據通訊正常。
連接串口
首先要對安裝Modbus設備的串口通信參數進行配置,連接參數,串口選擇串口通信的串口,這裏選擇上麵一對虛擬串口中的COM4。
點擊協議選擇按鈕,在彈出對話框中設置Modbus傳(chuan) 輸模式,我們(men) 選擇RTU進行測試。
通信參數設置
通信參數包括:起始地址(Address)、Device Id、寄存器長度(Length)及讀取的功能代碼。
其中MODBUS Point Type(Modbus數據模型)包括以下四種:
- 01:COIL STATUS:讀寫開關量類型(DO),位操作,可用於設定端口輸出狀態,或者讀取該位的輸出狀態,常用於電磁閥輸出、MOSFET輸出、LED顯示等;
- 02:INPUT STATUS:讀開關量類型(DI),位操作,通過外部設定改變輸入狀態,可讀但是不可寫,常用於撥碼開關、接近開關等;
- 03:HOLDING REGISTER:保持寄存器,讀寫WORD類型,字操作,輸出參數或者保持參數,控製器運行時被設定的某些參數,可讀可寫,常用於模擬量輸出設定值、PID運行參數、變量閥輸出大小、傳感器報警上下限等;
- 04:INPUT REGISTER:輸入寄存器,讀WORD類型,字操作,輸入參數,控製器運行時從外部設備獲得的參數,可讀但是不可寫,常用於模擬量輸入。
根據硬件說明書(shu) 選擇具體(ti) 的Modbus數據模型。
連接
點擊菜單“連接設置”中的“連接”,彈出的界麵中配置好通訊參數之後,點擊“確定”,建立連接。
使用串口助手調試
查詢
主機ModScan32軟件發送讀從(cong) 機線圈寄存器當前狀態的指令,從(cong) 機(串口助手模擬從(cong) 機)收到的數據為(wei) :01 01 00 00 00 64 3D E1
此數據包為(wei) 讀取線圈寄存器的指令,具體(ti) 含義(yi) 為(wei) :
值 | |
---|---|
從機地址 | 0x01 |
功能碼 | 0x01 |
尋址地址 | 0x0000 |
寄存器數量 | 0x0064 |
CRC校驗碼 | 0x3DE1 |
應答
正常主機發送一個(ge) 數據包,我們(men) 要在一定時間內(nei) ,發送一個(ge) 固定格式的數據包作為(wei) 應答,否則會(hui) 提示超時“MODBUS Message TIME-OUT”或者接收的應答格式不正確“Received Invalid Response to MODBUS Query”或者提示校驗錯誤“Checksum Error in Response Message”等提示。
正確的應答包如下:
01 01 0D 08 00 00 00 00 00 00 00 00 00 00 00 00 AD E5
值 | |
---|---|
從機地址 | 0x01 |
功能碼 | 0x01 |
返回字節數 | 0x0D |
數據1 | 0x08 |
數據2 | 0x00 |
… | … |
CRC校驗碼 | 0xADE5 |
返回字節數N=讀取寄存器數量/8,如果餘(yu) 數不為(wei) 0,則N=N+1。
此實例中讀取寄存器的數量為(wei) 0x64,即100,100/8=12餘(yu) 4,所以N=12+1,即0x0D 。
返回數據的每一位對應線圈狀態,1-ON,0-OFF。
每一字節的數據的最低位代表最低地址的線圈狀態,如果不夠8位,字節高位填充為(wei) 0。
主機ModScan32軟件收到應答之後,寄存器地址0x0004位置的值被修改為(wei) 0x01,並且Valid Slave Responses計數+1。
將數據的第一個(ge) 字節0x08用二進製表示為(wei) 0b0000 1000,正好第四位為(wei) 1,跟我們(men) 應答返回的內(nei) 容一致。
同理,如果從(cong) 機返回數據包:01 01 0D FF 00 00 00 00 00 00 00 00 00 00 00 00 E6 53 ,代表寄存器00001~00008的線圈狀態都為(wei) ON:
主機設置線圈通斷狀態
請求
修改地址0001的值為(wei) 0x01的串口數據為(wei) :01 05 00 00 FF 00 8C 3A
MODBUS部分功能碼
功能碼 | 含義 | 寄存器地址 | 位操作/字操作 | 操作數量 |
---|---|---|---|---|
01 | 讀線圈狀態 | 00001-09999 | 位操作 | 單個或多個 |
02 | 讀離散輸入狀態 | 10001-19999 | 位操作 | 單個或多個 |
03 | 讀保持寄存器 | 40001-49999 | 字操作 | 單個或多個 |
04 | 讀輸入寄存器 | 30001-39999 | 字操作 | 單個或多個 |
05 | 寫單個線圈 | 00001-09999 | 位操作 | 單個 |
06 | 寫單個保持寄存器 | 40001-49999 | 字操作 | 單個 |
15 | 寫多個線圈 | 00001-09999 | 位操作 | 多個 |
16 | 寫多個保持寄存器 | 40001-49999 | 字操作 | 多個 |
功能碼可以分為(wei) 位操作和字操作兩(liang) 類。位操作的最小單位為(wei) bit,字操作的最小單位為(wei) WORD(兩(liang) 個(ge) 字節)。
由上表可知,主機修改某個(ge) 寄存器的值的功能碼為(wei) :0x05,即寫(xie) 單個(ge) 線圈,寫(xie) 單個(ge) 線圈的數據包的結構為(wei) :
值 | |
---|---|
從機地址 | 0x01 |
功能碼 | 0x05 |
輸出地址 | 0x0000 |
輸出值 | 0xFF00 |
CRC校驗碼 | 0x8C3A |
注意:設置某個(ge) 線圈值為(wei) ON的話,該值為(wei) 0xFF00,設置線圈值為(wei) OFF的話,該值為(wei) 0x0000。
應答
響應跟請求是一樣的數據包:01 05 00 00 FF 00 8C 3A
值 | |
---|---|
從機地址 | 0x01 |
功能碼 | 0x05 |
輸出地址 | 0x0000 |
輸出值 | 0xFF00 |
CRC校驗碼 | 0x8C3A |
總結
其實直接使用ModSim32軟件作為(wei) 從(cong) 機,ModScan32軟件作為(wei) 主機,二者進行數據通訊,這樣調試起來最便利了。
不過我們(men) 做這個(ge) 演示的目的是了解ModScan32軟件的工作過程,如果使用ModSim32軟件,看不明白工作過程。
使用串口助手的話,對於(yu) 整個(ge) 工作的過程比較清晰,也方便我們(men) 下一步自己編寫(xie) Modbus從(cong) 機軟件。
歡迎關注
小夥(huo) 伴們(men) 可關(guan) 注微信公眾(zhong) 號:18luck网站 ,與(yu) 更多同道中人一起成長。