概述
在Modbus中,寄存器通常用于存储数据值,并可以通过不同的功能码来读取或写入这些值。Modbus 协议定义了几种不同的寄存器类型,每种类型都有其特定的用途。今天我们来详细介绍Modbus中常见的几种寄存器类型。
- 线圈和离散输入通常用于表示二进制的状态,如开/关状态。
- 保持寄存器和输入寄存器用于存储数值数据,如温度、压力等。
- 寄存器地址以16位无符号整数表示的,从0x0000 (0) 开始,最大到0xFFFF (65535)。
一、线圈 (Coils)
1.1用途
用于表示二进制的状态(逻辑状态),如开关或继电器的位置,如ON/OFF或TRUE/FALSE。
1.2功能码
01 (Read Coils,读取线圈状态) 、05 (Write Single Coil,写单个线圈)、15(Write Multiple Coils,同时写入多个线圈的状态)。只读和可写两种。
1.2.1详解
1.2.1.1读取线圈 (Coils)
功能码 01 (Read Coils)
- 请求:发送一个包含起始地址和数量的请求。
- 响应:接收一个包含线圈状态的数据包。
- 数据格式:状态通常以位的形式存储在一个字节中,每个位对应一个线圈的状态。
1.2.1.2写入单个线圈
功能码 05 (Write Single Coil)
- 请求:发送一个包含线圈地址和期望状态的请求。
- 响应:接收一个确认写入成功的响应。
- 数据格式:状态通常以位的形式发送,ON 为 1,OFF 为 0。
1.2.1.3写入多个线圈
功能码 15 (Write Multiple Coils)
- 请求:发送一个包含起始地址、数量和期望状态的数据包。
- 响应:接收一个确认写入成功的响应。
- 数据格式:状态通常以位的形式发送,每个位对应一个线圈的状态。
1.3地址范围
通常从0x0000 (0) 开始,最大到0xFFFF (65535),但在实际应用中,线圈的地址范围可能会受到设备的限制。
1.4示例
如果我们要读取设备上的第1个线圈的状态,我们可以按照以下步骤来读取:
- 选择功能码:使用功能码 01 (Read Coils)。
- 确定地址:线圈的起始地址为 0x0000 (0)。
- 发送请求:发送一个包含起始地址 0x0000 和数量 1 的请求。
- 接收响应:接收包含线圈状态的数据包。
- 解析响应:解析数据包中的位状态,确定线圈是否为 ON 或 OFF。
1.5注意事项
- 地址映射:明确设备的线圈地址映射,不同的设备有不同的地址分配。
- 兼容性:检查设备手册以及确认它支持的功能码。
- 错误处理:处理可能会出现的通信错误或设备错误响应。
二、离散输入 (Discrete Inputs)
2.1用途
读取设备的状态信息,用于表示只读的二进制状态信息,例如传感器的状态、开关位置或其他布尔类型的输入。
2.2功能码
02 (Read Discrete Inputs,读取离散输入状态),用于从设备读取离散输入的状态。
2.3地址范围
通常从0x0000 (0) 开始,最大到0xFFFF (65535)。每个离散输入对应一个位,通常按字节组织,即每个字节包含8个离散输入。
2.4存储
离散输入通常存储在设备内部的RAM中,只读,不能通过Modbus写入。
2.5读取操作
通过功能码02读取离散输入的状态,请求中包括起始地址和要读取的数量。