介绍 Modbus 的数据类型、地址表示方法和功能码
📘 Modbus 数据类型详解
1. 四种基本数据类型
| 数据类型 | 英文名称 | 地址范围 | 数据位数 | 读写能力 | 示例地址 | 特点 |
|---|---|---|---|---|---|---|
| 线圈 | Coils | 00001-09999 | 1位 (布尔) | 读/写 | 00001, 00002 | 用于开关量,如继电器、LED |
| 离散输入 | Discrete Inputs | 10001-19999 | 1位 (布尔) | 只读 | 10001, 10002 | 用于开关量输入,如传感器 |
| 输入寄存器 | Input Registers | 30001-39999 | 16位 (整数) | 只读 | 30001, 30002 | 用于模拟量输入,如温度 |
| 保持寄存器 | Holding Registers | 40001-49999 | 16位 (整数) | 读/写 | 40001, 40002 | 用于配置参数、控制变量 |
2. 地址表示方法详解
传统标准格式:
00001 = 线圈 1 (Coil #1)
10001 = 离散输入 1 (Discrete Input #1)
30001 = 输入寄存器 1 (Input Register #1)
40001 = 保持寄存器 1 (Holding Register #1)
简化格式:
00001 → 01, 02, 03...
10001 → 10001, 10002, 10003...
30001 → 30001, 30002, 30003...
40001 → 40001, 40002, 40003...
关于"D1000":
"D1000" 是 PLC 编程中的地址表示法,不是标准 Modbus 地址:
- D = Data Register(数据寄存器)
- 1000 = 寄存器编号
- 这是 欧姆龙、三菱等 PLC 品牌 的地址格式
对应关系:
D1000 (PLC) ≈ 41000 (Modbus) ← 通常是保持寄存器
D2000 (PLC) ≈ 42000 (Modbus)
常见 PLC 地址格式对照:
| PLC 格式 | 含义 | Modbus 对应 |
|---|---|---|
| X100 | 输入继电器 | 00100 (线圈) |
| Y200 | 输出继电器 | 00200 (线圈) |
| M300 | 内部辅助继电器 | 00300 (线圈) |
| D1000 | 数据寄存器 | 41000 (保持寄存器) |
| R2000 | 文件寄存器 | 42000 (保持寄存器) |
3. Modbus 功能码详解
读取功能码:
| 功能码 | 名称 | 读取数据类型 | 读写能力 | 用途 | 示例 |
|---|---|---|---|---|---|
| 01 | Read Coils | 线圈 (Coils) | 只读 | 读取开关状态 | 读取地址 00001-00100 |
| 02 | Read Discrete Inputs | 离散输入 | 只读 | 读取输入状态 | 读取地址 10001-10100 |
| 03 | Read Holding Registers | 保持寄存器 | 只读 | 读取配置/状态 | 读取地址 40001-40100 |
| 04 | Read Input Registers | 输入寄存器 | 只读 | 读取测量值 | 读取地址 30001-30100 |
写入功能码:
| 功能码 | 名称 | 写入数据类型 | 读写能力 | 用途 | 示例 |
|---|---|---|---|---|---|
| 05 | Write Single Coil | 单个线圈 | 写入 | 控制单个开关 | 写入地址 00001 = ON/OFF |
| 06 | Write Single Register | 单个寄存器 | 写入 | 设置单个参数 | 写入地址 40001 = 1234 |
| 15 | Write Multiple Coils | 多个线圈 | 写入 | 控制多个开关 | 写入地址 00001-00008 |
| 16 | Write Multiple Registers | 多个寄存器 | 写入 | 设置多个参数 | 写入地址 40001-40005 |
功能码实际应用示例:
功能码 03 (FC03) - 读保持寄存器:
客户端请求:读取地址 40001-40005 (5个寄存器)
服务端响应:返回 [100, 200, 300, 400, 500] (5个16位值)
用途:读取设备的温度、压力、流量等参数
功能码 06 (FC06) - 写单个寄存器:
客户端请求:写入地址 40001 = 1234
服务端响应:确认写入成功
用途:设置设备的目标温度、报警阈值等
功能码 16 (FC16) - 写多个寄存器:
客户端请求:写入地址 40001-40003 = [100, 200, 300]
服务端响应:确认批量写入成功
用途:批量设置设备参数
4. 在你项目中的体现
服务端 ModbusTcpViewModel.cs:
public ObservableCollection<RegisterData> HoldingRegisters { get; } = new(); // 40001-4xxxx
public ObservableCollection<RegisterData> InputRegisters { get; } = new(); // 30001-3xxxx
public ObservableCollection<CoilData> Coils { get; } = new(); // 00001-0xxxx
public ObservableCollection<CoilData> DiscreteInputs { get; } = new(); // 10001-1xxxx
客户端 ModbusTcpClientViewModel.cs:
public ObservableCollection<string> FunctionCodes { get; } = new()
{
"读线圈 (FC01)", // 读取 00001-0xxxx
"读离散输入 (FC02)", // 读取 10001-1xxxx
"读保持寄存器 (FC03)", // 读取 40001-4xxxx
"读输入寄存器 (FC04)", // 读取 30001-3xxxx
"写单个线圈 (FC05)", // 写入 00001-0xxxx
"写单个寄存器 (FC06)", // 写入 40001-4xxxx
"写多个线圈 (FC15)", // 写入 00001-0xxxx
"写多个寄存器 (FC16)" // 写入 40001-4xxxx
};
5. 实际应用场景
工业自动化系统:
PLC (D1000-D1999) → Modbus (41000-41999) → 你的模拟器
温度传感器 → 保持寄存器 40100 (读取功能码 04)
控制阀门 → 线圈 00001 (写入功能码 05)
报警状态 → 离散输入 10001 (读取功能码 02)
总结:
- D1000 = PLC 编程地址,对应 Modbus 保持寄存器 41000
- 功能码 = 定义了读写操作的类型和方式
- 数据类型 = 定义了存储的数据性质和访问权限
- 地址范围 = 定义了不同类型数据的编号空间

浙公网安备 33010602011771号