Modbus协议详解:寄存器通信过程全解析
在工业自动化领域,Modbus协议是实现设备间通信的基石。它简单、高效且广泛应用。今天,我们将深入探讨Modbus协议的核心——寄存器的通信过程。通过详细的表格和示例,帮助你快速掌握Modbus协议的精髓。
一、Modbus协议简介
Modbus协议是一种基于串行通信的协议,最初由施耐德电气于1979年开发,用于连接PLC和计算机。如今,它已成为工业自动化中最广泛使用的协议之一,适用于各种设备,包括传感器、执行器和变频器等。
Modbus协议的核心是主从通信模式。主设备(如计算机或HMI)发送请求命令,从设备(如PLC或传感器)根据请求返回相应的数据。这种通信模式简单高效,易于实现。
二、Modbus通信参数说明
在Modbus通信中,每个请求和响应都包含以下关键参数:
1. 设备地址
- 用途:标识从设备的地址,用于区分不同的设备。
- 格式:通常为1字节,范围为1到247(0x01到0xF7)。
2. 功能码
- 用途:指定操作类型,例如读取寄存器或写入寄存器。
- 格式:通常为1字节,例如:
- 功能码01:读取线圈状态
- 功能码02:读取离散输入状态
- 功能码03:读取保持寄存器
- 功能码04:读取输入寄存器
- 功能码05:写单个线圈
- 功能码06:写单个保持寄存器
- 功能码15:写多个线圈
- 功能码16:写多个保持寄存器
3. 寄存器地址
- 用途:指定要操作的寄存器地址。
- 格式:通常为2字节,范围为0x0000到0xFFFF。
4. 数据
- 用途:对于写入操作,包含要写入的数据;对于读取操作,返回读取的数据。
- 格式:根据具体寄存器类型和功能码,数据格式可能不同。例如:
- 线圈寄存器:布尔值(0或1)
- 输入寄存器和保持寄存器:16位整数或浮点数
三、寄存器通信过程详细解析
(一)离散输入寄存器(Discrete Input Register)
离散输入寄存器用于读取设备的离散输入状态,例如传感器信号或按钮状态。这些寄存器是只读的,存储布尔值(0或1)。
操作类型 | 功能码 | 主设备发送数据 | 从设备返回数据 | 说明 |
---|---|---|---|---|
读取离散输入寄存器 | 02 | 设备地址 + 02 + 起始寄存器地址 + 寄存器数量 | 设备地址 + 02 + 数据字节长度 + 离散输入状态 | 读取离散输入寄存器的状态,返回数据为布尔值(0或1)。 |
示例 | 02 | 01 + 02 + 0000 + 0001 | 01 + 02 + 01 + 01 | 读取设备地址为01的第0个离散输入寄存器,返回状态为1(开启)。 |
(二)输入寄存器(Input Register)
输入寄存器用于存储模拟输入信号的值,例如温度、压力或电流等传感器的测量值。这些寄存器也是只读的,存储16位或32位的整数或浮点数。
操作类型 | 功能码 | 主设备发送数据 | 从设备返回数据 | 说明 |
---|---|---|---|---|
读取输入寄存器 | 04 | 设备地址 + 04 + 起始寄存器地址 + 寄存器数量 | 设备地址 + 04 + 数据字节长度 + 寄存器值 | 读取输入寄存器的值,返回数据为16位整数或浮点数。 |
示例 | 04 | 01 + 04 + 0000 + 0001 | 01 + 04 + 02 + 000A | 读取设备地址为01的第0个输入寄存器,返回值为10(十六进制0x0A)。 |
(三)保持寄存器(Holding Register)
保持寄存器是最通用的寄存器类型,用于存储设备的配置参数、控制命令或执行器状态等。这些寄存器是可读写的,存储各种类型的数值。
操作类型 | 功能码 | 主设备发送数据 | 从设备返回数据 | 说明 |
---|---|---|---|---|
读取保持寄存器 | 03 | 设备地址 + 03 + 起始寄存器地址 + 寄存器数量 | 设备地址 + 03 + 数据字节长度 + 寄存器值 | 读取保持寄存器的值,返回数据为16位整数或浮点数。 |
示例 | 03 | 01 + 03 + 0000 + 0001 | 01 + 03 + 02 + 0014 | 读取设备地址为01的第0个保持寄存器,返回值为20(十六进制0x14)。 |
写单个保持寄存器 | 06 | 设备地址 + 06 + 寄存器地址 + 寄存器值 | 设备地址 + 06 + 寄存器地址 + 寄存器值 | 写入单个保持寄存器的值,返回数据与发送数据相同。 |
示例 | 06 | 01 + 06 + 0000 + 001E | 01 + 06 + 0000 + 001E | 写入设备地址为01的第0个保持寄存器,值为30(十六进制0x1E)。 |
写多个保持寄存器 | 10 | 设备地址 + 10 + 起始寄存器地址 + 寄存器数量 + 字节计数 + 寄存器值 | 设备地址 + 10 + 起始寄存器地址 + 寄存器数量 | 写入多个保持寄存器的值,返回数据为起始地址和数量。 |
示例 | 10 | 01 + 10 + 0000 + 0002 + 04 + 001E 0028 | 01 + 10 + 0000 + 0002 | 写入设备地址为01的第0和第1个保持寄存器,值分别为30和40。 |
(四)线圈寄存器(Coil Register)
线圈寄存器用于控制设备的输出状态,例如继电器的开关或电磁阀的通断。这些寄存器是可读写的,存储布尔值(0或1)。
操作类型 | 功能码 | 主设备发送数据 | 从设备返回数据 | 说明 |
---|---|---|---|---|
读取线圈寄存器 | 01 | 设备地址 + 01 + 起始寄存器地址 + 寄存器数量 | 设备地址 + 01 + 数据字节长度 + 线圈状态 | 读取线圈寄存器的状态,返回数据为布尔值(0或1)。 |
示例 | 01 | 01 + 01 + 0000 + 0001 | 01 + 01 + 01 + 00 | 读取设备地址为01的第0个线圈寄存器,返回状态为0(关闭)。 |
写单个线圈寄存器 | 05 | 设备地址 + 05 + 寄存器地址 + 状态值(FF00或0000) | 设备地址 + 05 + 寄存器地址 + 状态值 | 写入单个线圈寄存器的状态,返回数据与发送数据相同。 |
示例 | 05 | 01 + 05 + 0000 + FF00 | 01 + 05 + 0000 + FF00 | 写入设备地址为01的第0个线圈寄存器,状态为1(开启)。 |
写多个线圈寄存器 | 15 | 设备地址 + 15 + 起始寄存器地址 + 寄存器数量 + 字节计数 + 线圈状态 | 设备地址 + 15 + 起始寄存器地址 + 寄存器数量 | 写入多个线圈寄存器的状态,返回数据为起始地址和数量。 |
示例 | 15 | 01 + 15 + 0000 + 0002 + 02 + 03 | 01 + 15 + 0000 + 0002 | 写入设备地址为01的第0和第1个线圈寄存器,状态分别为1和1(二进制00000011)。 |
四、总结
通过以上表格和示例,你可以清晰地了解每种寄存器的通信过程和数据格式。希望这些信息能帮助你更好地理解和使用Modbus协议。
如果你对Modbus协议还有其他疑问,欢迎在评论区留言,我们一起探讨!