Modbus IO
Darra PLC 支持 Modbus RTU (串口) 和 Modbus TCP (以太网) 两种通讯方式,用于连接远程 IO 模块、变频器、温控器等设备。
协议支持
| 协议 | 物理层 | 典型速率 | 最大距离 |
|---|---|---|---|
| Modbus RTU | RS-485 | 9600~115200 bps | 1200m |
| Modbus TCP | 以太网 | 10/100 Mbps | 无限制 |
Modbus 数据模型
| 寄存器类型 | 功能码 | 地址范围 | 数据类型 | PLC 映射 |
|---|---|---|---|---|
| Coils (线圈) | 01/05/15 | 0x0000~0xFFFF | BOOL | %QX |
| Discrete Inputs (离散输入) | 02 | 0x0000~0xFFFF | BOOL | %IX |
| Holding Registers (保持寄存器) | 03/06/16 | 0x0000~0xFFFF | UINT16 | %MW / %QW |
| Input Registers (输入寄存器) | 04 | 0x0000~0xFFFF | UINT16 | %IW |
配置 Modbus RTU
var modbus = new ModbusRtuAdapter();
modbus.Configure(new ModbusRtuConfig {
PortName = "COM3",
BaudRate = 19200,
DataBits = 8,
Parity = Parity.Even,
StopBits = StopBits.One,
SlaveId = 1
});
配置 Modbus TCP
var modbus = new ModbusDriver();
modbus.Configure(new ModbusTcpConfig {
Host = "192.168.1.100",
Port = 502,
SlaveId = 1,
Timeout = 1000 // ms
});
轮询配置
Modbus 采用主从轮询模式,通过轮询表定义读写周期:
| 参数 | 说明 | 默认值 |
|---|---|---|
| 轮询间隔 | 两次读取之间的最小间隔 | 100ms |
| 超时时间 | 单次请求的最大等待时间 | 1000ms |
| 重试次数 | 超时后重试次数 | 3 |
| 批量读取 | 单次最大寄存器数 | 125 |
// 添加轮询项
modbus.AddPollItem(new PollItem {
FunctionCode = 0x03, // 读保持寄存器
StartAddress = 0,
Quantity = 10,
PollInterval = 100, // 100ms 轮询
PLCStartAddress = "%IW0" // 映射到 PLC 地址
});
通讯延迟
Modbus 为非实时协议。RTU 模式下单次请求往返约 5-50ms,TCP 模式约 1-10ms。不适合需要 < 1ms 响应的场景,此类需求应使用 EtherCAT。
地址映射示例
| Modbus 寄存器 | PLC 地址 | 说明 |
|---|---|---|
| Coil 0~7 | %QX10.0~10.7 | 远程 8 路 DO |
| DI 0~7 | %IX10.0~10.7 | 远程 8 路 DI |
| HR 40001~40004 | %IW200~206 | 4 路模拟量 |
| HR 40010 | %QW100 | 变频器频率设定 |
异常处理
Modbus 通讯异常通过自动重连机制处理:
掉线保护
当 Modbus 从站失联时,对应的 PLC 输入地址保持最后有效值,同时 IOManager 设置通讯故障标志。PLC 程序可检查此标志执行安全处理逻辑。
典型 IO 模块
| 厂商 / 型号 | 路数 | 连接方式 | 应用 |
|---|---|---|---|
| 台达 DVP-SV2 | 16DI + 16DO | RTU | 中小机械 |
| 汇川 CTB05 | 8DI + 8DO | RTU | 变频配套 |
| 研华 ADAM-6050 | 12DI + 6DO | TCP | 实验室 / 测试台 |
| 威豪 IO-2000 | 32AI + 8AO | TCP | 温度监测 |
| Wago 750 系列 | 可扩展 | RTU + TCP | 模块化 IO |
| Phoenix Inline | 可扩展 | RTU + TCP | 工业分布式 |
| 华工控 M340 | 16AI | RTU | 过程控制 |
适用 Modbus IO 模块的选型关键:
- 有无足够的模拟/数字点数
- 支持 RTU 还是 TCP (现场走线决定)
- 供电方式 (24V DC 是否够用)
- 环境等级 (IP54 / IP65 / 防爆)
配置步骤 (IDE)
- 项目树 → IO 设备 → 右键 → 添加 → Modbus TCP (或 RTU)
- 填连接参数 (IP/端口, 或 COM/波特率)
- 添加从站 ID (1~247)
- 选择设备模板 (从内置库或导入 XML 模板)
- 自动生成 PDO 映射:
- DI 模块: 线圈/离散输入 →
%IX地址 - DO 模块: 线圈 →
%QX地址 - AI 模块: 输入寄存器 →
%IW地址, 自动填 scale - AO 模块: 保持寄存器 →
%QW地址
- DI 模块: 线圈/离散输入 →
- 测试: 右键从站 → 测试连接 → 查看响应时间和错误率
设备模板
IDE 内置常见 IO 模块模板, 包含:
- 寄存器地址定义 (DI/DO/AI/AO 的起始和长度)
- 功能码 (读 vs 读写)
- 默认 scale 和单位
- 设备状态 / 故障寄存器
导入方式:
- 内置库: 选厂商和型号
- 在线下载: 从 Darra 云库搜最新模板
- XML 导入: 厂商提供的 Modbus 描述
轮询频率建议
Modbus IO 的刷新速度主要取决于:
| 场景 | RTU | TCP |
|---|---|---|
| 8 路 DI | 10~50 ms | 5~20 ms |
| 16 路 DI | 15~60 ms | 10~30 ms |
| 16 点 AI | 50~100 ms | 20~50 ms |
| 多从站 (5 台) RTU | 总周期 = 单从站周期 × 5 | TCP 可并发 |
高频场景应考虑 EtherCAT 替代。
AI 模块配置
常见 AI 模块的量程和对应:
| 输入类型 | 原始值范围 | 工程量 | scale |
|---|---|---|---|
| 0~10 V | 0 | 0~10 V | 10/32767 |
| 4~20 mA | 6553~32767 | 4~20 mA | (20-4)/(32767-6553) |
| Pt100 | 按厂商查表 | -200~600 °C | 非线性, 需查表 |
| 热电偶 K | 按厂商查表 | -200~1370 °C | 非线性 |
对非线性传感器, 用 IDE 的线性化工具做分段插值:
0°C = 0
100°C = 3894
200°C = 7857
300°C = 11849
...
高速计数 / 编码器
少数 Modbus IO 模块支持高速计数:
- 一个 DI 作为脉冲输入
- 一个 DI 作为方向
- 32 位计数器映射到两个寄存器
不推荐高速应用 (> 10 kHz) 使用 Modbus, 优选 EtherCAT 或专用计数模块。
混合 IO 拓扑
实际产线常见拓扑:
┌─ EtherCAT 主干 (1ms 高速)
│ ├─ 伺服驱动器 × 6
│ └─ 快速 IO (EL1008, EL2008)
│
└─ Modbus TCP 支线 (100ms 慢速)
├─ 温度采集 (8 路 Pt100)
├─ 变频器 × 3
└─ HMI 显示屏
按实时性拆分: 必须实时的走 EtherCAT, 允许慢的走 Modbus, 降低成本。
故障场景
| 故障 | 表现 | 处理 |
|---|---|---|
| 单个从站断电 | 该从站超时, 其他正常 | 通讯故障标志, 程序降级 |
| RS-485 总线短路 | 所有从站失联 | 隔离故障段 |
| TCP 网关故障 | 该网关后所有从站失联 | 路由切换 / 备用网关 |
| 从站固件异常 | 返回异常码 | 重试 / 复位 |
| IP 地址冲突 | 间歇性丢包 | 检查 ARP 表 |
排错
| 症状 | 处理 |
|---|---|
| 连接成功但读数不变 | 寄存器地址错 / 功能码错 |
| 读数乘以 100 倍或除以 100 | 缩放系数错, 对照模块手册 |
| 浮点数读出是乱值 | 字节序错, 试 ABCD/CDAB/BADC/DCBA |
| 模拟输出设不上 | 该寄存器对该从站是只读 (功能码 03 vs 04) |
| TCP 连接随后掉线 | 从站的 TCP keepalive 太短, 调大 |