Loading

介绍 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
  • 功能码 = 定义了读写操作的类型和方式
  • 数据类型 = 定义了存储的数据性质和访问权限
  • 地址范围 = 定义了不同类型数据的编号空间
posted @ 2026-02-04 11:29  老卫同学  阅读(82)  评论(0)    收藏  举报