文章目录
- 01 读线圈状态
- 示例
- 02 读输入位状态
- 示例
- 03 读保持寄存器
- 示例
- 04 读输入寄存器
- 示例
- 05 写单个线圈
- 示例
- 06 写单个保持寄存器
- 示例
- 15 写多个线圈
- 示例
- 16 写多个保持寄存器
- 示例
01 读线圈状态
读取从机的线圈状态(ON/OFF),位操作。
例:请求从机设备17读00020-00056线圈。其中00020-00056为线圈的寄存器信息地址,这些线圈的寄存器寻址地址为0019 – 0055,共访问37个线圈。
描述 | Hex |
从机地址 | 11 |
功能码 | 01 |
起始地址(高) | 00 |
起始地址(低) | 13 |
线圈数量(高) | 00 |
线圈数量(低) | 25 |
CRC校验(高) | |
CRC校验(低) |
响应:响应信息中的各线圈的状态与数据区的每一位的值相对应,1代表ON;0代表OFF。若返回的线圈数不是8的倍数,则在最后的数据字节未使用的位中全部填充0,字节数区说明全部数据的字节数。
描述 | Hex |
从机地址 | 11 |
功能码 | 01 |
返回字节数 | 05 |
数据1(线圈00027-线圈00020) | CD |
数据2(线圈00035-线圈00028) | 6B |
数据3(线圈00043-线圈00036) | B2 |
数据4(线圈00051-线圈00044) | 0E |
数据5(线圈00056-线圈00052) | 1B |
CRC校验(高) | |
CRC校验(低) |
使用Modbus Slave、Modbus Slave和Virtual Serial Port Driver,三个工具进行modbus通信模拟
示例
发送 读取从00地址开始后8个线圈的状态
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 线圈数量(高) | 线圈数量(低) | CRC校验(高) | CRC校验(低) |
01 | 01 | 00 | 00 | 00 | 08 | 3D | CC |
回复 00到07的线圈的状态都是off
从机地址 | 功能码 | 返回字节数 | 数据1 | CRC校验(高) | CRC校验(低) |
01 | 01 | 01 | 00 | 51 | 88 |
Tx: 01 01 00 00 00 08 3D CC
Rx: 01 01 01 00 51 88
发送 读取从01地址开始后4个线圈的状态
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 线圈数量(高) | 线圈数量(低) | CRC校验(高) | CRC校验(低) |
01 | 01 | 00 | 01 | 00 | 04 | 6C | 09 |
回复 01到04的线圈的状态分别是on on on off
从机地址 | 功能码 | 返回字节数 | 数据1 | CRC校验(高) | CRC校验(低) |
01 | 01 | 01 | 07 | 10 | 4A |
Tx: 01 01 00 01 00 04 6C 09
Rx: 01 01 01 07 10 4A
02 读输入位状态
读取从机的输入状态(ON/OFF),位操作。
用法同上
示例
发送 读取从00地址开始后8个输入位的状态
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 输入位数量(高) | 输入位数量(低) | CRC校验(高) | CRC校验(低) |
01 | 02 | 00 | 00 | 00 | 08 | 79 | CC |
回复 00到07的输入位的状态都是off
从机地址 | 功能码 | 返回字节数 | 数据1 | CRC校验(高) | CRC校验(低) |
01 | 02 | 01 | 00 | A1 | 88 |
Tx: 01 02 00 00 00 08 79 CC
Rx: 01 02 01 00 A1 88
发送 读取从01地址开始后4个的状态
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 输入位数量(高) | 输入位数量(低) | CRC校验(高) | CRC校验(低) |
01 | 02 | 00 | 01 | 00 | 04 | 28 | 09 |
回复 01到04的输入位的状态分别是on on on off
从机地址 | 功能码 | 返回字节数 | 数据1 | CRC校验(高) | CRC校验(低) |
01 | 02 | 01 | 07 | E0 | 4A |
Tx: 01 02 00 01 00 04 28 09
Rx: 01 02 01 07 E0 4A
03 读保持寄存器
读取从机的保持寄存器,一个寄存器两个字节,字操作。
例:请求从机设备17的0x13,0x14,0x15三个寄存器的数据
描述 | Hex |
从机地址 | 11 |
功能码 | 03 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 13 |
寄存器数量(高) | 00 |
寄存器数量(低) | 03 |
CRC校验(高) | |
CRC校验(低) |
响应:
描述 | Hex |
从机地址 | 11 |
功能码 | 03 |
返回字节数 | 06 |
数据1(寄存器0x13高位) | CD |
数据1(寄存器0x13低位) | 6B |
数据2(寄存器0x14高位) | 6B |
数据2(寄存器0x14低位) | 6B |
数据3(寄存器0x15高位) | 6B |
数据3(寄存器0x15低位) | 6B |
CRC校验(高) | |
CRC校验(低) |
示例
发送 读取从00地址开始后8个保持寄存器的值
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器数量(高) | 寄存器数量(低) | CRC校验(高) | CRC校验(低) |
01 | 03 | 00 | 00 | 00 | 08 | 44 | 0C |
回复 00到07的保持寄存器的值都为0x0000
从机地址 | 功能码 | 返回字节数 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | CRC校验(高) | CRC校验(低) |
01 | 03 | 10 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | E4 | 59 |
Tx: 01 03 00 00 00 08 44 0C
Rx: 01 03 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E4 59
04 读输入寄存器
读取从机的输入寄存器,一个寄存器两个字节,字操作。
用法同上
示例
发送 读取从00地址开始后8个寄存器的值
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器数量(高) | 寄存器数量(低) | CRC校验(高) | CRC校验(低) |
01 | 04 | 00 | 00 | 00 | 08 | F1 | CC |
回复 00到07的寄存器的值都为0x0000
从机地址 | 功能码 | 返回字节数 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | CRC校验(高) | CRC校验(低) |
01 | 04 | 10 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 55 | 2C |
Tx: 01 04 00 00 00 08 F1 CC
Rx: 01 04 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 2C
05 写单个线圈
ff00h为写1,0000h为写0。
例:把地址为0的线圈写1
描述 | Hex |
从机地址 | 11 |
功能码 | 05 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 00 |
线圈值(高) | ff |
线圈值(低) | 00 |
CRC校验(高) | |
CRC校验(低) |
响应:
描述 | Hex |
从机地址 | 11 |
功能码 | 05 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 00 |
线圈值(高) | ff |
线圈值(低) | 00 |
CRC校验(高) | |
CRC校验(低) |
示例
发送 把地址为1的线圈写0
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 线圈值(高) | 线圈值(低) | CRC校验(高) | CRC校验(低) |
01 | 05 | 00 | 01 | 00 | 00 | 9C | 0A |
响应
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 线圈值(高) | 线圈值(低) | CRC校验(高) | CRC校验(低) |
01 | 05 | 00 | 01 | 00 | 00 | 9C | 0A |
Tx: 01 05 00 01 00 00 9C 0A
Rx: 01 05 00 01 00 00 9C 0A
06 写单个保持寄存器
写从机的保持寄存器,一个寄存器两个字节,字操作。
例:往地址为0的寄存器写1
描述 | Hex |
从机地址 | 11 |
功能码 | 06 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 00 |
寄存器值(高) | 00 |
寄存器值(低) | 01 |
CRC校验(高) | |
CRC校验(低) |
响应:
描述 | Hex |
从机地址 | 11 |
功能码 | 06 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 00 |
寄存器值(高) | 00 |
寄存器值(低) | 01 |
CRC校验(高) | |
CRC校验(低) |
示例
发送 把地址为1的线圈写1
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器值(高) | 寄存器值(低) | CRC校验(高) | CRC校验(低) |
01 | 06 | 00 | 01 | 00 | 01 | 19 | CA |
响应
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器值(高) | 寄存器值(低) | CRC校验(高) | CRC校验(低) |
01 | 06 | 00 | 01 | 00 | 01 | 19 | CA |
Tx: 01 06 00 01 00 01 19 CA
Rx: 01 06 00 01 00 01 19 CA
15 写多个线圈
写从机的多个线圈,位操作。
例:请求从机设备17写00020-00030线圈,未使用位补0。
描述 | Hex |
从机地址 | 11 |
功能码 | 0f |
起始地址(高) | 00 |
起始地址(低) | 13 |
线圈数量(高) | 00 |
线圈数量(低) | 0a |
字节数 | 04 |
数据1(线圈27-20) | 00 |
数据2(线圈29-28) | 00 |
CRC校验(高) | |
CRC校验(低) |
响应:
描述 | Hex |
从机地址 | 11 |
功能码 | 0f |
起始地址(高) | 00 |
起始地址(低) | 13 |
线圈数量(高) | 00 |
线圈数量(低) | 0a |
CRC校验(高) | |
CRC校验(低) |
示例
发送
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 线圈数量(高) | 线圈数量(低) | 字节数 | 数据1 | CRC校验(高) | CRC校验(低) |
01 | 0F | 00 | 01 | 00 | 08 | 01 | 37 | 82 | 83 |
响应
从机地址 | 功能码 | 起始地址(高) | 起始地址(低) | 线圈数量(高) | 线圈数量(低) | CRC校验(高) | CRC校验(低) |
01 | 0F | 00 | 01 | 00 | 08 | 05 | CD |
Tx: 01 0F 00 01 00 08 01 37 82 83
Rx: 01 0F 00 01 00 08 05 CD
16 写多个保持寄存器
写从机的保持寄存器,一个寄存器两个字节,字操作。
例:往地址0x13,0x14的寄存器写值
描述 | Hex |
从机地址 | 11 |
功能码 | 10 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 13 |
寄存器数量(高) | 00 |
寄存器数量(低) | 02 |
字节数 | 04 |
数据1(高位) | 00 |
数据1(低位) | 00 |
数据2(高位) | 00 |
数据2(低位) | 00 |
CRC校验(高) | |
CRC校验(低) |
响应:
描述 | Hex |
从机地址 | 11 |
功能码 | 10 |
寄存器起始地址(高) | 00 |
寄存器起始地址(低) | 13 |
寄存器数量(高) | 00 |
寄存器数量(低) | 02 |
CRC校验(高) | |
CRC校验(低) |
示例
发送 往01 02地址分别写入0x1122 0x3344
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器数量(高) | 寄存器数量(低) | 字节数 | 数据1(高位) | 数据1(高位) | 数据2(高位) | 数据2(高位) | CRC校验(高) | CRC校验(低) |
01 | 10 | 00 | 01 | 00 | 02 | 04 | 11 | 22 | 33 | 44 | 83 | 96 |
响应
从机地址 | 功能码 | 寄存器起始地址(高) | 寄存器起始地址(低) | 寄存器数量(高) | 寄存器数量(低) | CRC校验(高) | CRC校验(低) |
01 | 10 | 00 | 01 | 00 | 02 | 10 | 08 |
Tx: 01 10 00 01 00 02 04 11 22 33 44 83 96
Rx: 01 10 00 01 00 02 10 08