Modbus协议功能码及格式解析
发布时间:
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