通讯问题
EtherCAT 从站无法上线怎么办?
排查步骤
-
检查物理连接
- 确认网线插好,Link 灯亮起
- 使用交叉线或直连线 (大多数设备支持 Auto-MDI/MDIX)
- 检查网线质量 (推荐 CAT5e 或 CAT6)
-
检查网卡驱动
- 推荐使用 Intel I210/I211/I350 网卡
- 确认 Runtime 已启动,实时模式需要已安装实时内核包
- 在设备管理器中确认网卡工作正常
-
检查从站地址
- EtherCAT 从站不需要 IP 地址,通过拓扑自动编址
- 确认从站硬件地址拨码正确 (如有)
-
检查 ESI 文件
- 导入正确版本的 ESI XML 文件
- ESI 文件版本需与从站固件匹配
在调试控制台中执行 ecat scan 可列出当前发现的所有从站。如果列表为空,说明物理层通讯异常。
EtherCAT WKC 不匹配报警是什么意思?
WKC (Working Counter) 是 EtherCAT 帧通过每个从站时的计数器。WKC 不匹配表示帧未被所有期望的从站处理。
| 原因 | 解决方案 |
|---|---|
| 从站离线 | 检查网线连接和从站电源 |
| 从站未进入 OP | 检查从站状态机,确认配置正确 |
| 网线松动 | 重新插拔或更换网线 |
| EMI 干扰 | 使用屏蔽网线,远离变频器 |
| 帧超时 | 增加超时时间或降低周期频率 |
WKC 期望值 = 已配置从站数 × 3 (每个从站: 读+写+读写各1)
WKC 实际值 < 期望值 → 有从站未正常响应
Modbus 通讯超时怎么处理?
常见原因
- IP 地址/端口错误 — 确认目标设备 IP 和 Modbus TCP 端口 (默认 502)
- 防火墙阻止 — 确认 Windows 防火墙允许 TCP 502 端口
- 串口参数不匹配 (RTU) — 检查波特率、数据位、停止位、校验位
- 寄存器地址错误 — Modbus 地址从 0 开始还是从 1 开始,不同厂商有差异
超时设置
(* Modbus TCP 配置 *)
ModbusConfig.IP := '192.168.1.10';
ModbusConfig.Port := 502;
ModbusConfig.Timeout := T#3s; (* 超时时间 *)
ModbusConfig.RetryCount := 3; (* 重试次数 *)
ModbusConfig.RetryDelay := T#500ms; (* 重试间隔 *)
Darra PLC 的通讯适配器内置自动重连机制。连接断开后以指数退避策略 (1s → 2s → 4s → ... 最大 30s) 自动重连,无需手动干预。
OPC UA 连接报证书错误怎么办?
证书信任配置
OPC UA 使用 X.509 证书进行安全通讯。首次连接时需要互相信任证书:
-
服务器端 (Darra PLC)
- 在「OPC-UA 配置」对话框中选择安全策略
- 支持
None(无安全) 和Basic256Sha256(加密签名) - 首次连接的客户端证书会出现在「待信任」列表中,手动确认信任
-
客户端端 (MES/SCADA)
- 导入 Darra PLC 的服务器证书
- 将其添加到客户端的可信证书列表
快速测试
开发阶段可使用无安全策略:
端点: opc.tcp://localhost:4840
安全策略: None
认证模式: Anonymous
生产环境必须启用安全策略 (Basic256Sha256) 和用户认证,避免未授权访问控制系统。
TCP SDK 连接不上 Runtime 怎么办?
检查项
- Runtime 是否运行 — 确认 Darra PLC Runtime 进程正在运行
- 端口是否正确 — 默认端口 9527,确认未被其他程序占用
- 防火墙 — 确认允许 TCP 9527 入站连接
- IP 地址 — 本机连接用
127.0.0.1,远程连接用实际 IP
连接测试
通过 HTTP API 测试连接:
curl -k https://127.0.0.1:18443/api/status
返回 JSON 状态信息即表示连接成功。
MQTT 消息发不出去?
排查步骤
- Broker 地址 — 确认 MQTT Broker 地址和端口正确 (默认 1883,TLS 默认 8883)
- 认证信息 — 确认用户名和密码正确
- Topic 权限 — 确认账号有目标 Topic 的发布权限
- QoS 设置 — QoS 1 需要 Broker 确认,网络不稳定时延迟较大
- 消息大小 — 部分 Broker 限制单条消息大小 (如 AWS IoT 限 128KB)
配置示例
MqttConfig.BrokerAddress := '192.168.1.200';
MqttConfig.BrokerPort := 1883;
MqttConfig.ClientId := 'DarraPLC_01';
MqttConfig.Username := 'plc';
MqttConfig.Password := '****';
MqttConfig.QoS := 1; (* QoS 0=最多一次, 1=至少一次 *)
MqttConfig.KeepAlive := 60; (* 心跳间隔 秒 *)
多个协议同时使用会相互影响吗?
不同协议运行在独立的线程/OB 中,互不阻塞:
| 协议 | 执行位置 | 影响 |
|---|---|---|
| EtherCAT | 实时内核(独占核心) | 不影响其他协议 |
| Modbus/TCP | 异步 OB (用户态线程) | 超时不阻塞主循环 |
| OPC UA | 独立服务线程 | 不影响 PLC 扫描 |
| MQTT | 独立客户端线程 | 不影响 PLC 扫描 |
| HTTP API | 独立 HTTP 服务线程 | 不影响 PLC 扫描 |
只有 EtherCAT 运行在独占核心上,具有硬实时保障。其他协议运行在普通线程上,通讯延迟受操作系统调度影响,不适合实时控制场景。
运维层常见通讯问题
EtherCAT 从站掉线后如何恢复
掉线可能是短暂 (电缆抖动, 电源毛刺) 或长久 (硬件故障)。DarraRT 按不同恢复策略处理:
| 掉线时长 | 恢复策略 | 配置项 |
|---|---|---|
<1 总线周期 | 自愈, 无感知 | 自动 |
| 1-100 ms | 热重连 (状态机 OP 保持) | ecat.hotReconnect = true |
| 0.1-10 s | 冷重连 (从 INIT 重新进入 OP) | ecat.coldReconnectTimeout = 10s |
>10s | 主站重新扫描拓扑 | 手工触发 ecat rescan |
恢复期间的输出处理:
(* 掉线期间输出冻结, 不做危险动作 *)
IF NOT SYS.Ecat.Slave[5].Online THEN
Motor_Speed := 0.0; (* 安全值 *)
Alarm_SlaveLost := TRUE;
ELSE
Motor_Speed := SetpointSpeed;
END_IF;
关键命令:
ecat status ← 查看每个从站当前状态
ecat rescan ← 重新扫描拓扑 (会短暂停止总线)
ecat reset <addr> ← 对单个从站发 Reset 命令
ecat coe read <addr> <index>:<subindex> ← 读 CoE 对象字典
Modbus TCP 连接断开自动重连参数
ModbusTcp.Config(
AutoReconnect := TRUE,
InitialDelayMs := 1000, (* 首次重试延迟 *)
MaxDelayMs := 30000, (* 最大退避延迟 *)
BackoffFactor := 2.0, (* 指数退避 1s→2s→4s→...→30s *)
KeepAliveSec := 30, (* TCP KeepAlive 心跳秒数 *)
ConnectTimeoutMs := 3000 (* 首次建连超时 *)
);
排查重连失败原因:
| 现象 | 原因 |
|---|---|
| 重试日志持续但不成功 | 防火墙间歇丢包, 检查路由 |
| 第一次成功后就断, 反复如此 | 对端会话超时设置过短 |
| 网线插回才恢复 | 交换机端口 STP 重计算 (30s), 改用快速生成树 |
| 同 PLC 多个 Modbus Client 全掉线 | 本地 TCP 连接数上限, 见下 |
Windows 默认 MaxUserPort 16384, 对端打开很多连接时可能耗尽, 修改:
netsh int ipv4 set dynamicport tcp start=10000 num=50000
OPC UA 证书不信任怎么办
生产环境启用 Basic256Sha256 后, 客户端第一次连接会收到"证书不信任"错误。处理步骤:
服务器端 (DarraRT)
%AppData%\DarraPLC\pki\
├── own\ ← 服务器自己的证书 + 私钥
├── trusted\ ← 信任的客户端证书
├── rejected\ ← 被拒绝的客户端证书
└── issuers\ ← CA 根证书
首次连接失败后, 到 rejected\certs\ 找到客户端证书 .der 文件, 手工移到 trusted\certs\, 重启 OPC UA 服务即信任。
客户端端
将 %AppData%\DarraPLC\pki\own\certs\ServerCert.der 拷贝到客户端工具 (UaExpert / KEPServer) 的信任目录。
IDE → OPC UA 诊断面板 显示"最近拒绝的客户端"列表, 一键"信任", 避免手工拷文件。
MQTT 遗嘱消息 LWT 怎么用
Last Will and Testament (LWT) 是客户端掉线时由 Broker 代发的消息, 用于通知其他订阅者"我死了"。
MqttConfig.LWT.Topic := 'darra/line1/plc/status';
MqttConfig.LWT.Message := '{"online":false,"ts":0}';
MqttConfig.LWT.QoS := 1;
MqttConfig.LWT.Retain := TRUE; (* 保留消息, 新订阅者上线立即收到 *)
(* 正常运行时定期发送 online=true 消息 *)
MqttClient.Publish('darra/line1/plc/status',
'{"online":true,"ts":NOW}',
qos := 1, retain := TRUE);
Broker 在检测到连接断开时 (KeepAlive 超时或 TCP RST), 自动代发 LWT 消息。订阅方收到后更新 UI 状态灯。
通讯重试策略 (指数退避)
DarraRT 内置通讯适配器统一采用指数退避 + 随机抖动:
t(n) = min(InitialDelay * Factor^n + Jitter, MaxDelay)
| 参数 | 默认 | 说明 |
|---|---|---|
| InitialDelay | 1 s | 首次失败后等待时间 |
| Factor | 2.0 | 每次翻倍 |
| MaxDelay | 30 s | 延迟上限 |
| Jitter | ±10% | 随机扰动, 避免多客户端同步风暴 |
自定义策略:
ModbusTcp.SetRetryPolicy(
Strategy := RETRY_EXPONENTIAL, (* LINEAR / EXPONENTIAL / FIXED *)
InitialDelayMs := 500,
MaxDelayMs := 10000,
Factor := 1.5,
MaxAttempts := 0 (* 0 = 无限重试 *)
);
跨网段通讯 (NAT / 网关穿透)
现场 PLC 在 192.168.10.x 内网, 服务器在 10.0.0.x, 两者通过路由器互连:
| 场景 | 方案 |
|---|---|
| PLC 主动连云端 MQTT | 出站连接一般路由器放行, 无需特殊配置 |
| 云端主动访问 PLC OPC UA | 路由器做端口映射 (4840 → 内网 PLC) |
| 多 PLC 同时暴露 OPC UA | 每台 PLC 用不同外网端口 (4840, 4841, 4842...) |
| 纯工厂内网, 无公网需求 | 用三层交换机做静态路由 |
NAT 穿透 (不推荐生产):
- STUN: 适合纯 UDP 协议 (如 KCP, 有点用)
- TURN: 需中继服务器, 延迟高
- DarraRT 优先选固定公网 IP + VPN 的传统方案
工业以太网 vs 办公以太网区别
| 维度 | 工业以太网 | 办公以太网 |
|---|---|---|
| 温度范围 | -40°C 至 70°C | 0-40°C |
| 振动 | IEC 60068-2-6 | 无要求 |
| 供电 | 24VDC 冗余 | 220VAC 单路 |
| 端口数 | 5-8 足够 | 24-48 |
| VLAN/QoS | 必须支持 | 可选 |
| 生成树 | 快速 RSTP/MRP | STP (30s 收敛慢) |
| EMI 抗扰 | 屏蔽端口 (FTP/STP) | 普通 (UTP) |
| 网线等级 | CAT5e SF/FTP 双屏蔽 | CAT5e UTP |
EtherCAT 总线必须用工业级网线和接插件, 办公 CAT5e UTP 在变频器旁抗扰能力不足, 容易出现 WKC 偶发报警。
冗余链路断线检测
参见 冗余功能。
通讯诊断清单
出现通讯问题时按顺序检查:
| # | 项 | 工具 |
|---|---|---|
| 1 | 物理层 (网线、Link 灯) | 目视 + 网线测试仪 |
| 2 | IP 可达 | ping |
| 3 | 端口开放 | Test-NetConnection -Port 502 |
| 4 | 协议层 (抓包) | Wireshark |
| 5 | 应用层 (Modbus Poll / UaExpert) | 第三方调试工具 |
| 6 | 日志层 | Service 日志 + 对端日志 |