文章目录
- 0x01 读取线圈状态
- 0x02 读取输入状态
- 0x03 读取保持寄存器
- 0x04 读取输入寄存器
- 0x05 强制单线圈
- 0x06 设置单寄存器
- 0x07 读取异常状态(serial line only)
- 0x08 回送诊断校验(serial line only)
- 0x09 编程(用于484)
- 0x0A 控询(用于484)
- 0x0B 读取通信事件计数
- 0x0C 读取通信事件记录
- 0x0D 编程(184/384 484 584)
- 0x0E 控询(184/384 484 584)
- 0x0F 强制多线圈
- 0x10 预置多寄存器
- 0x11 报告从机标识
- 0x12 884和MICRD 84
- 0x13 重置通信链路
- 0x14 读取通用参数
- 0x15 写入通用参数
- 0x16 保持寄存器掩码
- 0x17 读写多寄存器
- 0x18 读取FIFO队列
- 22~64 保留,做扩展功能所用
- 65~72 保留,做用户的功能的扩展编码
- 73~119 非法功能
- 120~127 保留,做内部使用
- 128~255 保留,用于异常应答
协议格式(大端模式):
设备地址 | 功能码 | 数据 | CRC16 |
---|---|---|---|
1byte | 1byte | N byte | 2byte |
0x01 读取线圈状态
- 取得一组逻辑线圈的当前状态(ON/OFF)
主机发送
设备地址 | 功能码 | 开始地址 | 长度 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | 2byte | 2byte |
addr | 0x01 | 0x0000 ~0xFFFF | 1 ~ 200(0x7D0) | crc16 |
从机正常应答
设备地址 | 功能码 | 数据长度 | 线圈状态(bitmap) | CRC16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | n byte | 2byte |
addr | 0x01 | N* | N bitmap | crc16 |
- N* = 表示返回线圈数量总数 / 8,如果有余数,则N = N + 1
- 线圈状态为bitmap,即1byte表示8个线圈状态
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x01 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 开始地址高字节 | 开始地址低字节 | 长度高字节 | 长度低字节 |
---|---|---|---|---|
0x01 | 0x00 | 0x13 | 0x00 | 0x13 |
从机应答
功能码 | 数据长度 | 27~20线圈状态 | 35~28线圈状态 | 38~36线圈状态 |
---|---|---|---|---|
0x01 | 0x03 | 0xCD | 0x6B | 0x05 |
0x02 读取输入状态
- 获取一组开关输入的当前状态(ON/OFF)
主机发送
设备地址 | 功能码 | 开始地址 | 长度 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte |
addr | 0x02 | 0x0000 ~ 0xFFFF | 1 ~2000(0x7D0) | CRC16 |
从机正常应答
设备地址 | 功能码 | 数据长度 | 线圈状态(bitmap) | CRC16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | n byte | 2byte |
addr | 0x02 | N* | N* × 1byte | crc16 |
- N* = 表示返回输入状态总数 / 8,如果有余数,则N = N + 1
- 输入状态为bitmap,即1byte表示8个输入状态
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x02 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 开始地址高字节 | 开始地址低字节 | 数量高字节 | 数量低字节 |
---|---|---|---|---|
0x02 | 0x00 | 0xC4 | 0x00 | 0x16 |
从机应答
功能码 | 数据长度 | 204~197线圈状态 | 212~205线圈状态 | 218~3213线圈状态 |
---|---|---|---|---|
0x02 | 0x03 | 0xAC | 0xDB | 0x35 |
0x03 读取保持寄存器
- 读取一个或多个保持寄存器中的数据
主机发送
设备地址 | 功能码 | 寄存器起始地址 | 寄存器数量 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte |
addr | 0x03 | 0x0000 ~ 0xFFFF | 1 ~125(0x007D) | CRC16 |
从机正常应答
设备地址 | 功能码 | 数据长度(2*寄存器个数) | 寄存器数据 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | n byte | 2byte |
addr | 0x03 | N* × 2 | N* × 2byte | crc16 |
- N* = 读取寄存器数量
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x03 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 寄存器起始地址高字节 | 寄存器起始地址低字节 | 读取寄存器长度高字节 | 读取寄存器长度低字节 |
---|---|---|---|---|
0x03 | 0x00 | 0x6B | 0x00 | 0x3 |
从机应答
功能码 | 数据长度(2*寄存器数量) | 108寄存器数据高字节 | 108寄存器数据底字节 | 109寄存器数据高字节 | 109寄存器数据底字节 | 110寄存器数据高字节 | 110寄存器数据底字节 |
---|---|---|---|---|---|---|---|
0x03 | 0x06 | 0x02 | 0x2B | 0x00 | 0x00 | 0x00 | 0x64 |
0x04 读取输入寄存器
- 读取一个或多个输入寄存器的数据
主机发送
设备地址 | 功能码 | 寄存器起始地址 | 寄存器数量 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte |
addr | 0x04 | 0x0000 ~ 0xFFFF | 1 ~125(0x007D) | CRC16 |
从机正常应答
设备地址 | 功能码 | 数据长度(2*寄存器个数) | 寄存器数据 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | n byte | 2byte |
addr | 0x04 | N* × 2 | N* × 2byte | crc16 |
- N* = 读取寄存器数量
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x04 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 寄存器起始地址高字节 | 寄存器起始地址低字节 | 读取寄存器长度高字节 | 读取寄存器长度低字节 |
---|---|---|---|---|
0x04 | 0x00 | 0x08 | 0x00 | 0x1 |
从机应答
功能码 | 数据长度(2*寄存器数量) | 9寄存器数据高字节 | 9寄存器数据底字节 |
---|---|---|---|
0x04 | 0x02 | 0x00 | 0x0A |
0x05 强制单线圈
- 强制一个逻辑线圈的通断状态
主机发送
设备地址 | 功能码 | 线圈地址 | 数据 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte |
addr | 0x05 | 0x0000 ~ 0xFFFF | 0x0000 or 0xFF00 | CRC16 |
从机正常应答
设备地址 | 功能码 | 线圈地址 | 线圈状态 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | 2 byte | 2byte |
addr | 0x05 | 0x0000 ~ 0xFFFF | 0x0000 or 0xFF00 | crc16 |
- 0xFF00表示线圈ON,0x0000表示线圈OFF
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x05 + 0x80 | 0x01 or 0x02 or 0x03 or 0x03 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 开始地址高字节 | 开始地址低字节 | 数量高字节 | 数量低字节 |
---|---|---|---|---|
0x05 | 0x00 | 0xAC | 0xFF | 0x00 |
从机应答
功能码 | 开始地址高字节 | 开始地址低字节 | 线圈状态高字节 | 线圈状态底字节 |
---|---|---|---|---|
0x05 | 0x00 | 0xAC | 0xFF | 0x00 |
0x06 设置单寄存器
- 把数据装入一个保持寄存器中
主机发送
设备地址 | 功能码 | 寄存器地址 | 寄存器数据 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte |
addr | 0x06 | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | CRC16 |
从机正常应答
设备地址 | 功能码 | 寄存器地址 | 寄存器数据 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | 2 byte | 2byte |
addr | 0x06 | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x06 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 寄存器地址高字节 | 寄存器地址低字节 | 寄存器数据高字节 | 寄存器数据低字节 |
---|---|---|---|---|
0x06 | 0x00 | 0x01 | 0x00 | 0x3 |
从机应答
功能码 | 寄存器地址高字节 | 寄存器地址低字节 | 寄存器数据高字节 | 寄存器数据底字节 |
---|---|---|---|---|
0x06 | 0x00 | 0x01 | 0x00 | 0x3 |
0x07 读取异常状态(serial line only)
- 获取8个内部线圈的通断状态,这8个线圈的地址由控制器决定
主机发送
设备地址 | 功能码 | crc16 |
---|---|---|
1byte | 1byte | 2byte |
addr | 0x07 | CRC16 |
从机正常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1 byte | 2byte |
addr | 0x07 | 0x00 ~ 0xFF | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x07 + 0x80 | 0x01 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 |
---|
0x07 |
从机应答
功能码 | 异常数据 |
---|---|
0x07 | 0x6D |
0x08 回送诊断校验(serial line only)
- 把诊断校验报文送至从机,以对通信进行评鉴
主机发送
设备地址 | 功能码 | 子功能码 | 数据 | crc16 |
---|---|---|---|---|
1byte | 1byte | 2byte | N × 2byte | 2byte |
addr | 0x08 | CRC16 |
从机正常应答
设备地址 | 功能码 | 子功能码 | 数据 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | N × 2byte | 2byte |
addr | 0x08 | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x08 + 0x80 | 0x01 or 0x03 or 0x04 | crc16 |
子功能码列表
子功能码 | 描述 | 主机发送数据 | 从机返回数据 |
---|---|---|---|
0x0000 | 返回查询数据 | 数据 | 返回发送数据 |
0x0001 | 重新启动通信 | 0000(重新启动) or FF00(清零通信事件) | 0000 or FF00 |
0x0002 | 返回诊断寄存器 | 0000 | 诊断寄存器内容 |
0x0003 | 更改ASCII输入分隔符 | 分隔符( : ) | 返回分隔符 |
0x0004 | 强制Listen模式 | 0000 | 无数据返回 |
0x0005 ~ 0x09 | 保留 | ||
0x000A | 清零计数和诊断寄存器 | 0000 | 0000 |
0x000B | 返回消息计数 | 0000 | 消息总数 |
0x000C | 返回通信错误计数 | 0000 | CRC错误计数 |
0x000D | 返回异常计数 | 0000 | 返回异常计数 |
0x000E | 返回从机消息计数 | 0000 | 从机消息计数 |
0x000F | 返回从机无应答计数 | 0000 | 返回从机无应答计数 |
0x0010 | 返回从机NAK计数 | 0000 | 返回从机NAK计数 |
0x0011 | 返回从机busy计数 | 0000 | 返回从机busy计数 |
0x0012 | 返回字符overrun计数 | 0000 | 返回字符overrun计数 |
0x0013 | 保留 | ||
0x0014 | 清零overrun计数和标志 | 0000 | 0000 |
21~65535 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 子功能码高字节 | 子功能码低字节 | 数据高字节 | 数据低字节 |
---|---|---|---|---|
0x08 | 0x00 | 0x00 | 0xA5 | 0x37 |
从机应答
功能码 | 子功能码高字节 | 子功能码低字节 | 数据高字节 | 数据低字节 |
---|---|---|---|---|
0x08 | 0x00 | 0x00 | 0xA5 | 0x37 |
0x09 编程(用于484)
- 使主机模拟编程器作用,修改PC从机逻辑
0x0A 控询(用于484)
- 可使主机与一台正在执行长程序任务的从机通信,探询该从机是否已完成其操作任务,仅在含有功能码0x09的报文发送后,本功能码才发送
0x0B 读取通信事件计数
- 可使主机发出单询问,并随即判断操作是否成功,尤其是该命令或其他应答产生通信错误时
主机发送
设备地址 | 功能码 | crc16 |
---|---|---|
1byte | 1byte | 2byte |
addr | 0x0B | CRC16 |
从机正常应答
设备地址 | 功能码 | 状态 | 计数 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | 2byte | 2byte |
addr | 0x0B | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | crc16 |
- 返回状态0xFFFF表示正常通信
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x0B + 0x80 | 0x01 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 |
---|
0x0B |
从机应答
功能码 | 状态高字节 | 状态低字节 | 计数高字节 | 计数低字节 |
---|---|---|---|---|
0x08 | 0xFF | 0xFF | 0x01 | 0x08 |
0x0C 读取通信事件记录
- 可使主机检索每台从机的modbus事务处理通信事件记录,如果某项事务处理完成,记录会给出有关错误
主机发送
设备地址 | 功能码 | crc16 |
---|---|---|
1byte | 1byte | 2byte |
addr | 0x0C | CRC16 |
从机正常应答
设备地址 | 功能码 | 事件数量 | 状态 | 事件计数 | 消息计数 | 事件(N-6) | CRC16 |
---|---|---|---|---|---|---|---|
1byte | 1byte | 1 byte | 2byte | 2byte | 2byte | (N - 6) byte | 2byte |
addr | 0x0C | N* | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | crc16 |
- 返回状态0xFFFF表示正常通信
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x0C + 0x80 | 0x01 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 |
---|
0x0C |
从机应答
功能码 | 事件数量 | 状态高字节 | 状态底字节 | 事件计数高字节 | 事件计数底字节 | 消息计数高字节 | 消息计数底字节 | 事件0 | 事件1 |
---|---|---|---|---|---|---|---|---|---|
0x0C | 0x08 | 0x00 | 0x00 | 0x01 | 0x08 | 0x01 | 0x21 | 0x20 | 0x00 |
0x0D 编程(184/384 484 584)
- 使主机模拟编程器作用,修改PC从机逻辑
0x0E 控询(184/384 484 584)
- 可使主机与一台正在执行长程序任务的从机通信,探询该从机是否已完成其操作任务,仅在含有功能码0x0D的报文发送后,本功能码才发送
0x0F 强制多线圈
- 强制一串连续逻辑线圈的通断
主机发送
设备地址 | 功能码 | 开始地址 | 线圈数量 | 数据长度 | 数据 | CRC16 |
---|---|---|---|---|---|---|
1byte | 1byte | 2 byte | 2byte | 1byte | N* byte | 2byte |
addr | 0x0F | 0x0000 ~0xFFFF | 0x0001 ~0x07B0 | N* | crc16 |
从机正常应答
设备地址 | 功能码 | 开始地址 | 线圈数量 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | 2 byte | 2byte |
addr | 0x0F | 0x0000 ~0xFFFF | 0x0001 ~0x07B0 | crc16 |
- N* = 表示返回线圈数量总数 / 8,如果有余数,则N = N + 1
- 线圈状态为bitmap,即1byte表示8个线圈状态
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x0F + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 开始地址高字节 | 开始地址底字节 | 线圈数量高字节 | 线圈数量底字节 | 数据长度 | 数据高字节 | 数据底字节 |
---|---|---|---|---|---|---|---|
0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 |
从机应答
功能码 | 开始地址高字节 | 开始地址底字节 | 线圈数量高字节 | 线圈数量底字节 |
---|---|---|---|---|
0x0F | 0x00 | 0x13 | 0x00 | 0x0A |
0x10 预置多寄存器
- 把数据存储到一串连续的保持寄存器中
主机发送
设备地址 | 功能码 | 寄存器起始地址 | 寄存器数量 | 数据长度 | crc16 |
---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 1byte | 2byte |
addr | 0x10 | 0x0000 ~ 0xFFFF | 1 ~123(0x007B) | N* × 2 | CRC16 |
- N*=寄存器数量
从机正常应答
设备地址 | 功能码 | 寄存器起始地址 | 寄存器数据 | CRC16 |
---|---|---|---|---|
1byte | 1byte | 2 byte | 2 byte | 2byte |
addr | 0x10 | 0x0000 ~ 0xFFFF | 1 ~123(0x007B) | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x10 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 寄存器起始地址高字节 | 寄存器起始地址低字节 | 寄存器数量高字节 | 寄存器数量底字节 | 数据长度 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 |
---|---|---|---|---|---|---|---|---|---|
0x10 | 0x00 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x0A | 0x01 | 0x02 |
从机应答
功能码 | 寄存器起始地址高字节 | 寄存器起始地址低字节 | 寄存器数量高字节 | 寄存器数量底字节 |
---|---|---|---|---|
0x10 | 0x00 | 0x01 | 0x00 | 0x02 |
0x11 报告从机标识
- 可使主机判断编址从机的类型及该从机运行指示灯的状态
主机发送
设备地址 | 功能码 | crc16 |
---|---|---|
1byte | 1byte | 2byte |
addr | 0x11 | CRC16 |
从机正常应答
设备地址 | 功能码 | 数据长度 | server ID | 运行状态指示 | 其他数据 | CRC16 |
---|---|---|---|---|---|---|
1byte | 1byte | 1 byte | 1byte | 2byte | ||
addr | 0x11 | device specific | 0x00=OFF 0xFF=ON | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x11 + 0x80 | 0x01 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 |
---|
0x11 |
从机应答
功能码 | 数据长度 | server ID | 运行状态指示 | 其他数据 |
---|---|---|---|---|
0x11 | device specific | 0x00 or 0xFF | other data |
0x12 884和MICRD 84
- 使主机模拟编程器作用,修改PC状态逻辑
0x13 重置通信链路
- 发生非可修改错误后,使从机复位于已知状态,可重置顺序字节
0x14 读取通用参数
- 显示扩展存储器文件中的数据信息
主机发送
设备地址 | 功能码 | 数据长度 | 子请求1类型 | 子请求1 file编号 | 子请求1记录编号 | 子请求1记录长度 | … | 子请求n类型 | … | crc16 |
---|---|---|---|---|---|---|---|---|---|---|
1byte | 1byte | 1byte | 1byte | 2byte | 2byte | 2byte | 1byte | 2byte | ||
addr | 0x14 | 0x07 ~ 0xF5 | 06 | 0x0001~ 0xFFFF | 0x0000~0x270F | N | CRC16 |
从机正常应答
设备地址 | 功能码 | 应答数据长度 | 子请求1 file应答长度 | 子请求1 类型 | 子请求1记录数据 | … | 子请求n file应答长度 | … | CRC16 |
---|---|---|---|---|---|---|---|---|---|
1byte | 1byte | 1 byte | 1 byte | 1byte | N × 2 byte | 1byte | 2byte | ||
addr | 0x14 | 0x07 ~ 0xF5 | 0x07 ~ 0xF5 | 06 | data | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x14 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 数据长度 | 子请求1类型 | 子请求1 file编号高字节 | 子请求1 file编号底字节 | 子请求1记录编号高字节 | 子请求1记录编号高字节 | 子请求1记录长度高字节 | 子请求1记录长度底字节 | 子请求2类型 | 子请求2 file编号高字节 | 子请求2 file编号底字节 | 子请求2记录编号高字节 | 子请求2记录编号高字节 | 子请求2记录长度高字节 | 子请求2记录长度底字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x14 | 0x0E | 0x06 | 0x00 | 0x4 | 0x00 | 0x01 | 0x00 | 0x02 | 0x06 | 0x00 | 0x3 | 0x00 | 0x09 | 0x00 | 0x02 |
从机应答
功能码 | 应答数据长度 | 子请求1 file应答长度 | 子请求1 类型 | 子请求1记录数据高字节 | 子请求1记录数据底字节 | 子请求1记录数据高字节 | 子请求1记录数据底字节 | 子请求2 file应答长度 | 子请求2 类型 | 子请求2记录数据高字节 | 子请求2记录数据底字节 | 子请求2记录数据高字节 | 子请求2记录数据底字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x14 | 0x0C | 0x05 | 0x06 | 0x0D | 0xFE | 0x00 | 0x20 | 0x05 | 0x06 | 0x33 | 0xCD | 0x00 | 0x40 |
0x15 写入通用参数
- 把通用参数写入扩展存储文件或修改之
主机发送
设备地址 | 功能码 | 数据长度 | 子请求1类型 | 子请求1 file编号 | 子请求1记录编号 | 子请求1记录长度 | 数据 | … | 子请求n类型 | … | crc16 |
---|---|---|---|---|---|---|---|---|---|---|---|
1byte | 1byte | 1byte | 1byte | 2byte | 2byte | 2byte | N × 2 byte | 1byte | 2byte | ||
addr | 0x15 | 0x09 ~ 0xFB | 06 | 0x0001~ 0xFFFF | 0x0000~0x270F | N | CRC16 |
从机正常应答
设备地址 | 功能码 | 应答数据长度 | 子请求1类型 | 子请求1 file编号 | 子请求1记录编号 | 子请求1记录长度 | 数据 | … | 子请求n类型 | … | crc16 |
---|---|---|---|---|---|---|---|---|---|---|---|
1byte | 1byte | 1byte | 1byte | 2byte | 2byte | 2byte | N × 2 byte | 1byte | 2byte | ||
addr | 0x15 | 0x09 ~ 0xFB | 06 | 0x0001~ 0xFFFF | 0x0000~0x270F | N | CRC16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x15 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 or 0x08 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 数据长度 | 子请求1类型 | 子请求1 file编号高字节 | 子请求1 file编号底字节 | 子请求1记录编号高字节 | 子请求1记录编号高字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x15 | 0x0D | 0x06 | 0x00 | 0x4 | 0x00 | 0x07 | 0x00 | 0x03 | 0x06 | 0xAF | 0x04 | 0xBE | 0x10 | 0x0D |
从机应答
功能码 | 数据长度 | 子请求1类型 | 子请求1 file编号高字节 | 子请求1 file编号底字节 | 子请求1记录编号高字节 | 子请求1记录编号高字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x15 | 0x0D | 0x06 | 0x00 | 0x4 | 0x00 | 0x07 | 0x00 | 0x03 | 0x06 | 0xAF | 0x04 | 0xBE | 0x10 | 0x0D |
0x16 保持寄存器掩码
- 用于设置或清除寄存器中的某位
- (Current Contents AND And_Mask) OR (Or_Mask AND (NOT And_Mask))
主机发送
设备地址 | 功能码 | 参考地址(0对应1地址寄存器) | AND掩码 | OR掩码 | crc16 |
---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 1byte | 2byte |
addr | 0x16 | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | CRC16 |
从机正常应答
设备地址 | 功能码 | 参考地址 | AND掩码 | OR掩码 | crc16 |
---|---|---|---|---|---|
1byte | 1byte | 2 byte | 2 byte | 2byte | 2byte |
addr | 0x16 | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | 0x0000 ~ 0xFFFF | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x16 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 参考地址高字节 | 参考地址低字节 | AND掩码高字节 | AND掩码底字节 | OR掩码高字节 | OR掩码底字节 |
---|---|---|---|---|---|---|
0x16 | 0x00 | 0x04 | 0x00 | 0xF2 | 0x00 | 0x25 |
从机应答
功能码 | 参考地址高字节 | 参考地址低字节 | AND掩码高字节 | AND掩码底字节 | OR掩码高字节 | OR掩码底字节 |
---|---|---|---|---|---|---|
0x16 | 0x00 | 0x04 | 0x00 | 0xF2 | 0x00 | 0x25 |
0x17 读写多寄存器
- 在单个RTU中结合了读和写操作,而且写操作由于读操作
主机发送
设备地址 | 功能码 | 读寄存器起始地址 | 读寄存器数量 | 写寄存器起始地址 | 写寄存器数量 | 数据长度 | 数据 | crc16 |
---|---|---|---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 2byte | 2byte | 1byte | N* × 2 byte | 2byte |
addr | 0x17 | 0x0000 ~ 0xFFFF | 0x0001 ~ 0x007D | 0x0000 ~ 0xFFFF | 0x0000 ~ 0x0079 | N* ×2 | CRC16 |
- N*=写寄存器数量
从机正常应答
设备地址 | 功能码 | 数据长度 | 寄存器数据 | crc16 |
---|---|---|---|---|
1byte | 1byte | 1 byte | N* × 2 byte | 2byte |
addr | 0x17 | N* ×2 | crc16 |
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x17 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | 读寄存器开始地址高字节 | 读寄存器开始地址低字节 | 读寄存器数量高字节 | 读寄存器数量底字节 | 写寄存器开始地址高字节 | 写寄存器开始地址低字节 | 写寄存器数量高字节 | 写寄存器数量底字节 | 数据长度 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 | 数据高字节 | 数据底字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x17 | 0x00 | 0x03 | 0x00 | 0x06 | 0x00 | 0x0E | 0x00 | 0x03 | 0x06 | 0x00 | 0xFF | 0x00 | 0xFF | 0x00 | 0xFF |
从机应答
功能码 | 数据长度 | 读寄存器高字节 | 读寄存器低字节 | 读寄存器高字节 | 读寄存器低字节 | 读寄存器高字节 | 读寄存器低字节 | 读寄存器高字节 | 读寄存器低字节 | 读寄存器高字节 | 读寄存器低字节 | 读寄存器高字节 | 读寄存器低字节 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x17 | 0x0C | 0x00 | 0xFE | 0x0A | 0xCD | 0x00 | 0x01 | 0x00 | 0x03 | 0x00 | 0x0D | 0x00 | 0xFF |
0x18 读取FIFO队列
- 读取FIFO队列寄存器
主机发送
设备地址 | 功能码 | FIFO指针地址 | crc16 |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
addr | 0x18 | 0x0000 ~ 0xFFFF | CRC16 |
从机正常应答
设备地址 | 功能码 | 数据长度 | FIFO寄存器数量(<=31) | FIFO数据 | crc16 |
---|---|---|---|---|---|
1byte | 1byte | 2 byte | 2 byte | N* × 2byte | 2byte |
addr | 0x18 | N* | crc16 |
- N*=FIFO寄存器数量
从机异常应答
设备地址 | 功能码 | 异常数据 | CRC16 |
---|---|---|---|
1byte | 1byte | 1byte | 2byte |
addr | 0x18 + 0x80 | 0x01 or 0x02 or 0x03 or 0x04 | crc16 |
案例(设备地址和CRC16忽略不表)
主机请求
功能码 | FIFO指针地址高字节 | FIFO指针地址低字节 |
---|---|---|
0x18 | 0x04 | 0xDE |
从机应答
功能码 | 数据长度高字节 | 数据长度低字节 | FIFO寄存器数量高字节 | FIFO寄存器数量低字节 | 数据高字节 | 数据低字节 | 数据高字节 | 数据低字节 |
---|---|---|---|---|---|---|---|---|
0x18 | 0x00 | 0x06 | 0x00 | 0x02 | 0x01 | 0xB2 | 0x12 | 0x84 |