MODBUS TCP
| 读寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x03 | |
| 6 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 7 | 寄存器个数 | 2个字节 | 高字节在前 | 
| 读寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x03 | |
| 6 | 数据长度 | 1个字节 | 寄存器个数*2 | |
| 7 | 数据 | 寄存器个数 *2个字节 | 每个寄存器 高字节在前 | 
| 写单个 寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x10 | |
| 6 | 寄存器地址 | 2个字节 | 高字节在前 | |
| 7 | 寄存器数值 | 2个字节 | 高字节在前 | 
| 写单个 寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x10 | |
| 6 | 寄存器地址 | 2个字节 | 高字节在前 | |
| 7 | 寄存器数值 | 2个字节 | 高字节在前 | 
| 写多个 寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x10 | |
| 6 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 7 | 寄存器个数 | 2个字节 | 高字节在前 | |
| 8 | 数据长度 | 1个字节 | 寄存器个数*2 | |
| 9 | 数据 | 寄存器个数 *2个字节 | 每个寄存器 高字节在前 | 
| 写多个 寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 0x10 | |
| 6 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 7 | 寄存器个数 | 2个字节 | 高字节在前 | 
| 错误返回 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 事务处理标识 | 2个字节 | 高字节在前 | |
| 2 | 协议标识 | 2个字节 | 高字节在前 | |
| 3 | 长度 | 2个字节 | 高字节在前 | |
| 4 | 单元标识 | 1个字节 | 0x00-0xff | |
| 5 | 功能码 | 1个字节 | 请求功能码+0x80 | |
| 6 | 错误码 | 1个字节 | 其代号见表格 | 
| 错误代码 | 错误代号 | 意义 | 
| 0x01 | 不支持该功能码 | |
| 0x02 | 越界 | |
| 0x03 | 寄存器数量超出范围 | |
| 0x04 | 读写错误 | 
MODBUS RTU
| 读寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x03 | |
| 3 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 4 | 寄存器个数 | 2个字节 | 高字节在前 | |
| 5 | CRC校验码 | 2个字节 | 低字节在前 | 
| 读寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x03 | |
| 3 | 数据长度 | 1个字节 | 寄存器个数*2 | |
| 4 | 数据 | 寄存器个数 *2个字节 | 每个寄存器 高字节在前 | |
| 5 | CRC校验码 | 2个字节 | 低字节在前 | 
| 写单个 寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x10 | |
| 3 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 4 | 寄存器数值 | 2个字节 | 高字节在前 | |
| 5 | CRC校验码 | 2个字节 | 低字节在前 | 
| 写单个 寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x10 | |
| 3 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 4 | 寄存器数值 | 2个字节 | 高字节在前 | |
| 5 | CRC校验码 | 2个字节 | 低字节在前 | 
| 写多个 寄存器 请求 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x10 | |
| 3 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 4 | 寄存器个数 | 2个字节 | 高字节在前 | |
| 5 | 数据长度 | 1个字节 | 寄存器个数*2 | |
| 6 | 数据 | 寄存器个数 *2个字节 | 每个寄存器 高字节在前 | |
| 7 | CRC校验码 | 2个字节 | 低字节在前 | 
| 写多个 寄存器 回应 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 0x10 | |
| 3 | 起始寄存器地址 | 2个字节 | 高字节在前 | |
| 4 | 寄存器个数 | 2个字节 | 高字节在前 | |
| 5 | CRC校验码 | 2个字节 | 低字节在前 | 
| 错误返回 | 序号 | 意义 | 所占字节 | 字节存放格式 | 
| 1 | 从设备地址 | 1个字节 | 0x00-0xff | |
| 2 | 功能码 | 1个字节 | 请求功能码+0x80 | |
| 3 | 错误码 | 1个字节 | 其代号见表格 | |
| 4 | CRC校验码 | 2个字节 | 低字节在前 | 
| 错误代码 | 错误代号 | 意义 | 
| 0x01 | 不支持该功能码 | |
| 0x02 | 越界 | |
| 0x03 | 寄存器数量超出范围 | |
| 0x04 | 读写错误 | 
MODBUS RTU 功能码
下面“线圈”,“寄存器”其实分别为“位变量”,“16位变量”。
| 功能码 | 意义 | 
| 0x01 | 读线圈 | 
| 0x02 | 读离散量输入 | 
| 0x03 | 读保持寄存器 | 
| 0x04 | 读输入寄存器 | 
| 0x05 | 写单个线圈 | 
| 0x06 | 写单个寄存器 | 
| 0x0F | 写多个线圈 | 
| 0x10 | 写多个寄存器 | 
Modbus RTU与Modbus TCP读指令对比
| MBAP报头文 | 地址码 | 功能 码 | 寄存器 地址 | 寄存器 数量 | CRC校验 | |
| RTU | 无 | 01 | 03 | 01 8E | 00 04 | 25 DE | 
| TCP | 00 00 00 00 00 06 00 | 无 | 03 | 01 8E | 00 04 | 无 | 
指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始读(03)四个(00 04)寄存器。
Modbus RTU与Modbus TCP写指令对比
| MBAP报头文 | 地址码 | 功能 码 | 寄存器 地址 | 寄存器 数量 | 数据 长度 | 正文 | CRC校验 | |
| RTU | 无 | 01 | 10 | 01 8E | 00 01 | 02 | 00 00 | A8 7E | 
| TCP | 00 00 00 00 00 09 00 | 无 | 10 | 01 8E | 00 01 | 02 | 00 00 | 无 | 
指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始写(10)一个(00 01)寄存器,具体数据长度为2个字节(02),数据正文内容为00 00(00 00)。