协议帧
事物处理标识| 协议标识| 长度| 从机地址| 功能码| 数据
0x00 00| 0x00 00| 0x00 08| 0x01| 0x0F| 0x00 14 0x00 01 0x01 0x01
-
事物处理标识(占2字节)
区分不同报文,请求和应答的一组报文有相同的事物处理标识。每次通信之后应当自增。 -
协议标识(占2字节)
0x0000 表示ModBus TCP -
长度(占1个字节)
表示之后还有多少字节 -
从机地址(占1个字节)
表示设备地址(多个设备接一个总线) -
功能码(占1个字节)
功能码部分定义如下:
功能码 | 描述 | 访问类型 | PLC地址 | 数据类型 | 操作数量 |
---|---|---|---|---|---|
0x01 | 线圈 | 读 | 00001-09999 | 位 | 单/多 |
0x02 | 离散输入 | 读 | 10001-19999 | 位 | 单/多 |
0x03 | 保持寄存器 | 读 | 40001-49999 | 字 | 单/多 |
0x04 | 输入寄存器 | 读 | 30001-39999 | 字 | 单/多 |
0x05 | 线圈 | 写 | 00001-09999 | 位 | 单 |
0x06 | 保持寄存器 | 写 | 40001-49999 | 字 | 单 |
0x0F | 线圈 | 写 | 00001-09999 | 位 | 多 |
0x10 | 保持寄存器 | 写 | 40001-49999 | 字 | 多 |
-
寄存器起始地址
表示寄存器地址 -
数据部分
写请求数据帧
寄存器首地址|写个数|长度|值
0x0014|0x0001| 0x01|0x01
- 寄存器首地址(占两个字节),表示此次操作从哪个寄存器开始
- 写个数占(两个字节),表示批量操作多少个寄存器。例如首地址为0x0014,写个数为0x0002,则表示同时写0x0014和0x0015两个寄存器。
- 长度(占一个字节),表示该字节后还有多少字节。
- 值表示要写入的值。如果功能码是位操作,则值需要被拆成位赋值。例如写首地址为0x0014,写个数为0x0002。写字节为0x01,值为0x02。由于0x02用位表示为
00000010
,赋值后寄存器的结果为0x0014为0,0x0015为1。
写响应数据帧:
寄存器首地址|写个数
0x0014|0x0001
- 寄存器首地址(占两个字节),表示此次操作从哪个寄存器开始
- 写个数(占两个字节),表示此次操作了多少个寄存器。
读请求数据帧
寄存器首地址|读个数
0x0014|0x0001
- 寄存器首地址(占两个字节),表示此次操作从哪个寄存器开始读
- 读个数(占两个字节),表示要求读多少个寄存器。
读响应数据帧
读状态|读取值
0x01|0x01
- 读状态表示读操作是否成功。0x01表示成功,0x02表示失败。
- 读取值表示读操作获取的值。如果功能码是位操作,那么读取的值也需要按位解析。例如从0x0014开始读取两个寄存器值。假设读到的值为0x03,那么表示0x0014和0x0015的值均为1。