Modbus協(xié)議(二)
03ModbusRTU讀保持寄存器(多個字)
ModbusRTU協(xié)議按照下列模式發(fā)送報文
| 地址 | 功能碼 | 起始地址高位 起始地址低位 | 讀取寄存器數(shù)量高位 讀取寄存器數(shù)量低位 | CRC16 校驗碼 |
|---|---|---|---|---|
| 0x01 | 0x03 | 0x00 0x00 | 0x00 0x06 | 0xC5 0xC8 |
| 從站1 | 讀保持寄存器 | 從寄存器0開始 | 讀取6個 | CRC16校驗 |
發(fā)送
010300000006C5C8
收到反饋
01 03 0C 00 01 00 02 00 03 00 2C 02 2B 00 00 5D 9A
反饋分析
| 字段 | 地址 | 功能碼 | 接下來的數(shù)據(jù)部分字節(jié)數(shù) | 字節(jié)1 字節(jié)2 | 字節(jié)3 字節(jié)4 | 字節(jié)5 字節(jié)6 | 字節(jié)7 字節(jié)8 | 字節(jié)9 字節(jié)10 | 字節(jié)11 字節(jié)12 | CRC校驗16 |
|---|---|---|---|---|---|---|---|---|---|---|
| 值 | 01 | 03 | 0C | 00 01 | 00 02 | 00 03 | 00 2C | 02 2B | 00 00 | 5D 9A |
| 含義 | 從站1 | 讀保持寄存器 | 后續(xù)數(shù)據(jù)有0C:12個字節(jié) | 0001:1 | 0002:2 | 0003:3 | 002C:32+12=44 | 022B:16 * 16 * 2+16 * 2+11=555 | 0000:0 | CRC16校驗 |
那對應的保持寄存器的值分別就是
| 寄存器地址 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 值 | 1 | 2 | 3 | 44 | 555 | 0 |
串口調試軟件截圖

Modsim截圖

04Modbus讀取輸入寄存器
與03保持寄存器相同
05Modbus寫單個線圈
ModbusRTU協(xié)議按照下列模式發(fā)送報文
| 地址 | 功能碼 | 起始地址高位 起始地址低位 | 寫入值 | CRC16 校驗碼 |
|---|---|---|---|---|
| 0x01 | 0x05 | 0x00 0x00 | 0xFF 0x00 | 0x8C 0x3A |
| 從站1 | 寫單個線圈 | 線圈地址0 | 寫入TRUE | CRC16校驗 |
發(fā)送
01050000FF008C3A
收到反饋
01 05 00 00 FF 00 8C 3A
說明寫入成功。
串口調試軟件截圖

ModSim截圖

06ModbusRTU寫單個保持寄存器
ModbusRTU協(xié)議按照下列模式發(fā)送報文
| 地址 | 功能碼 | 起始地址高位 起始地址低位 | 寫入值高位 寫入值數(shù)量低位 | CRC16 校驗碼 |
|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 0x00 | 0x00 0x01 | 0x48 0x0A |
| 從站1 | 寫入單個保持寄存器 | 寄存器地址0 | 寫入1 | CRC16 校驗碼 |
表格中的就是,對從站地址為1的設備的地址為0的保持寄存器(功能碼06)寫入1,發(fā)送的代碼為:
0x01 0x06 0x00 0x00 0x00 0x01 0x48 0x0A
0x前綴代表是十六進制數(shù),使用串口調試軟件發(fā)送,勾選HEX發(fā)送, 則在發(fā)送窗口把0X去掉,直接發(fā)送對應數(shù)值。
01 06 00 00 00 01 48 0A
使用ModSim作為ModbusRTU從站(server),使用串口調試軟件作為主站(client)對從站保持寄存器做寫入操作可見:

原本從站的保持寄存器0位的值為2,使用串口調試軟件發(fā)送上文數(shù)值

可以看到返回
01 06 00 00 00 01 48 0A
這就代表從站收到并響應,此時再看ModSim,

可以看到地址為1的寄存器值變?yōu)榱?.
10寫多個保持寄存器
ModbusRTU協(xié)議按照下列模式發(fā)送報文
| 地址 | 功能碼 | 起始地址高位 起始地址低位 | 寄存器數(shù)量高位 寄存器數(shù)量低位 | 字節(jié)數(shù) | 數(shù)據(jù)域 | CRC16 校驗碼 |
|---|---|---|---|---|---|---|
| 0x01 | 0x10 | 0x00 0x00 | 0x00 0x02 | 0x04 | 0x00 0x06 0x0A 0x16 | 0x94 0xC0 |
| 從站1 | 寫入多個保持寄存器 | 寄存器起始地址為0 | 寫入2個寄存器 | 數(shù)據(jù)域總字節(jié)數(shù)(寄存器數(shù)量2:22=4字節(jié)) | 0006 0A16:6 16 * 16 * 10+1 * 16 + 6 = 2582 | CRC16 校驗碼 |
使用串口調試軟件發(fā)送
0110000000020400060A1694C0
收到反饋
01 10 00 00 00 02 41 C8
軟件截圖

反饋內容分析
| 字段 | 地址 | 功能碼 | 起始地址 | 寄存器數(shù)量 | CRC校驗 |
|---|---|---|---|---|---|
| 值 | 01 | 10 | 00 00 | 00 02 | 41 C8 |
| 含義 | 從站1 | 寫入多個保持寄存器 | 從寄存器0開始 | 寫入2個寄存器數(shù)據(jù) | CRC校驗 |
0F寫多個線圈
ModbusRTU協(xié)議按照下列模式發(fā)送報文
| 地址 | 功能碼 | 起始地址高位 起始地址低位 | 線圈數(shù)量高位 線圈數(shù)量低位 | 字節(jié)數(shù) | 數(shù)據(jù)域 | CRC16 校驗碼 |
|---|---|---|---|---|---|---|
| 0x01 | 0x0F | 0x00 0x00 | 0x00 0x15 | 0x03 | 0x55 0x8E 0x38 | 0x19 0xD7 |
| 從站1 | 寫入多個線圈 | 線圈起始地址為0 | 15:16+5=21 寫入21個寄存器 | 數(shù)據(jù)域總字節(jié)數(shù)(線圈數(shù)量/8:21/8=>3字節(jié)) | 55 8E 38: 0101 0101, 1000 1110, 0011 1000 =>0011 1000 1000 1110 0101 0101 | CRC16 校驗碼 |
對應置ON的線圈
| 線圈編號 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ON/OFF | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
需湊滿字節(jié)數(shù),所以發(fā)送的線圈數(shù)量是8的整數(shù)倍。從左到右,字節(jié)數(shù)由低到高,但字節(jié)內部對應線圈(位)號則左高右低。另,由于前面線圈數(shù)確定是21,所以是從0-20,等下可以注意ModSim的21號線圈的數(shù)值有沒有寫入。
使用串口調試軟件發(fā)送
010F0000001503558E3819D7
收到反饋
01 0F 00 00 00 15 94 04
軟件截圖

ModSim截圖

可以看到ModSim的21號線圈是0,因為報文里定義了只寫21個線圈。
反饋內容分析
| 字段 | 地址 | 功能碼 | 起始地址 | 寄存器數(shù)量 | CRC校驗 |
|---|---|---|---|---|---|
| 值 | 01 | 0F | 00 00 | 00 15 | 94 04 |
| 含義 | 從站1 | 寫入多個線圈 | 從線圈0開始 | 寫入16+5=21個線圈的數(shù)據(jù) | CRC校驗 |

浙公網(wǎng)安備 33010602011771號