湖北睿能电气有限公司-j9官方网址
发布时间:
2025-01-13
在工业自动化和设备通信中,modbus协议作为一种常见的串行通信协议,广泛应用于plc、传感器、变频器等设备之间的数据交换。modbus协议通过特定的功能码来实现不同的操作。今天,我们就来详细解析modbus协议的功能码及其格式。
一、modbus协议格式概述
modbus协议的数据格式主要包括以下部分:
- 地址域(address):
1字节,表示设备的地址。
- 功能码(function code):
1字节,表示要执行的操作类型。
- 数据域(data):
n字节,表示操作所需要的数据或响应的数据。
- crc校验(crc):
2字节,用于数据完整性校验。
modbus协议的基本数据格式如下:
| 地址域 | 功能码 | 数据域 | crc校验 |
二、常见modbus功能码及其含义
modbus协议支持多种功能码,每种功能码对应不同的操作或请求。以下是常见功能码的详细介绍:
1. 功能码0x01:读取线圈状态(read coils)
功能码0x01用于读取一个或多个线圈(coils)状态(开/关)。该操作允许主机获取从设备的输出状态。
- 请求格式:
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | crc校验 |
- 响应格式:
| 地址域 | 功能码 | 字节数(1字节) | 数据 | crc校验 |
数据:每个字节代表8个线圈的状态,按位表示(1为开,0为关)。
示例:主机请求读取地址为0x01设备的起始地址0x0000到0x0007的线圈状态。 请求:01 01 00 00 00 07 crc
响应:01 01 01 80 crc
表示设备0x01的线圈状态为:0x80(0b10000000)(即第一个线圈开,第二个线圈关,依此类推)。
2. 功能码0x02:读取离散输入状态(read discrete inputs)
功能码0x02用于读取一个或多个离散输入(discrete inputs)的状态。
- 请求格式:
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | crc校验 |
- 响应格式:
| 地址域 | 功能码 | 字节数(1字节) | 数据 | crc校验 |
示例:主机请求读取地址为0x01设备的起始地址0x0000到0x0007的离散输入状态。 请求:01 02 00 00 00 07 crc
响应:01 02 01 80 crc
表示设备0x01的离散输入状态为:0x80。
3. 功能码0x03:读取保持寄存器(read holding registers)
功能码0x03用于读取一个或多个保持寄存器的值。保持寄存器通常用于存储设备的配置参数或测量结果。
- 请求格式:
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | crc校验 |
- 响应格式:
| 地址域 | 功能码 | 字节数(1字节) | 数据(n字节) | crc校验 |
示例:主机请求读取设备0x01的起始地址0x0000的2个保持寄存器。 请求:01 03 00 00 00 02 crc
响应:01 03 04 00 01 00 02 crc
表示第一个寄存器的值为0x0001,第二个寄存器的值为0x0002。
4. 功能码0x04:读取输入寄存器(read input registers)
功能码0x04用于读取一个或多个输入寄存器的值。输入寄存器通常用于读取传感器等设备的测量数据。
- 请求格式:
| 地址域 | 功能码 | 起始地址(2字节) | 读取数量(2字节) | crc校验 |
- 响应格式:
| 地址域 | 功能码 | 字节数(1字节) | 数据(n字节) | crc校验 |
示例:主机请求读取设备0x01的输入寄存器值。 请求:01 04 00 00 00 02 crc
响应:01 04 04 00 01 00 02 crc
表示第一个输入寄存器的值为0x0001,第二个寄存器的值为0x0002。
5. 功能码0x05:强制单个线圈(force single coil)
功能码0x05用于强制设置单个线圈的状态为开或关。
请求格式:
| 地址域 | 功能码 | 起始地址(2字节) | 状态(2字节) | crc校验 |
状态:0xff00表示开,0x0000表示关。
响应格式:
| 地址域 | 功能码 | 起始地址(2字节) | 状态(2字节) | crc校验 |
示例:主机请求设置设备0x01的线圈0x0000为开状态。 请求:01 05 00 00 ff 00 crc
响应:01 05 00 00 ff 00 crc
6. 功能码0x06:写单个寄存器(write single register)
功能码0x06用于写入一个保持寄存器的值。
- 请求格式:
| 地址域 | 功能码 | 寄存器地址(2字节) | 数据(2字节) | crc校验 |
- 响应格式:
| 地址域 | 功能码 | 寄存器地址(2字节) | 数据(2字节) | crc校验 |
示例:主机请求写入设备0x01的保持寄存器地址0x0000,值为0x0001。 请求:01 06 00 00 00 01 crc
响应:01 06 00 00 00 01 crc