PLC 诊断
DarraRT PLC 提供一页式诊断仪表板, 集中展示运行时的健康状态: 任务扫描 / 内存使用 / 堆栈深度 / IO 映像表 / 通讯质量 / 驱动状态 / 持久化校验。不需要打开多个窗口, 一眼看完 PLC 整体状态。

仪表板概览
Ribbon → 诊断 → PLC 健康仪表板, 布局如下:
┌─ PLC 健康 ─────────────────────────────────────────────────┐
│ │
│ [任务扫描] [内存使用] [通讯质量] [驱动状态] │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ OB1 7ms │ │ M: 15% │ │ 正常 │ │ 运行中 │ │
│ │ OB30 0.9│ │ RET: 3% │ │ WKC=24 │ │ ISO=OK │ │
│ │ OB35 85μ│ │ PER: 1% │ │ Jitter 1│ │ SMI=OK │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ [IO 映像表] [堆栈深度] [持久化校验] [系统信息] │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ I: 420B │ │ 65% │ │ CRC=OK │ │ 温度 52 │ │
│ │ Q: 320B │ │ 最大 8层│ │ 电池 OK │ │ 电压 24 │ │
│ │ D: 32KB │ │ 0 溢出 │ │ 上次成功│ │ 风扇 OK │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ [趋势: CPU 与内存 (最近 1 小时)] │
│ 100% ┤ │
│ 80% ┤ ╱‾‾‾╲ │
│ 60% ┤╱ ‾─╲ │
│ 40% ┤ ‾‾‾‾‾─── CPU │
│ 20% ┤━━━━━━━━━━━━━━━━━━── MEM │
│ └────────────────────────────────────────── │
└────────────────────────────────────────────────────────────┘

面板 1: 任务扫描健康
显示每个 OB 的实时统计:
| 列 | 说明 |
|---|---|
| OB | 组织块编号 (OB1, OB30, OB35 ...) |
| Name | 绑定的 POU 名 |
| Period | 配置周期 |
| Curr | 最近一次执行耗时 |
| Min | 历史最短 |
| Avg | 滑动平均 (1000 周期) |
| Max | 历史最长 |
| Jitter | 抖动 (Max - Min) |
| WD % | 看门狗使用率 (Curr / MaxCycleTime) |
| Overrun | 累计超时次数 |
| Priority | 优先级 |
| State | 运行 / 暂停 / 错误 |
颜色编码:
| 值域 | 颜色 |
|---|---|
| WD% < 30% | 绿 (健康) |
| WD% 30% ~ 70% | 黄 (注意) |
| WD% 70% ~ 100% | 橙 (警告) |
| WD% ≥ 100% | 红 (超时已触发 OB80) |
任务抖动分析
双击任意 OB → 弹出抖动直方图:
μs
40┤ ▁
30┤ ▂▄
20┤ ▁▆█▆▂
10┤ ▂▃█████▇▃▁
0┤ ▁▂▄▆▇████████████▇▆▄▂▁
└──────────────────────
-20 -10 0 +10 +20
偏离平均 (μs)
正态分布 = 健康, 长尾 / 双峰 = 存在干扰源 (如 SMI / DPC)。
面板 2: 内存使用
所有内存区占用:
| 区 | 已用 | 总量 | 占比 | 峰值 |
|---|---|---|---|---|
| I 区 | 420 B | 8 KB | 5.1% | 420 B |
| Q 区 | 320 B | 8 KB | 3.9% | 320 B |
| M 区 | 9.8 KB | 64 KB | 15.3% | 12.4 KB |
| D 区 | 32 KB | 1 MB | 3.2% | 45 KB |
| V 区 (自动) | 128 KB | — | — | 156 KB |
| RETAIN | 128 B | 16 KB | 0.8% | 128 B |
| PERSISTENT | 32 B | 4 KB | 0.8% | 32 B |
| 堆栈 | 6.5 KB | 64 KB | 10.1% | 8.2 KB |
| 代码段 | 512 KB | 4 MB | 12.5% | — |
趋势子图显示过去 1 小时的内存变化, 发现内存泄漏 (持续增长)。
面板 3: 通讯质量
每个通讯接口的指标:
EtherCAT
| 指标 | 值 | 健康 |
|---|---|---|
| 主站状态 | OP | 绿 |
| 从站数量 | 24 (24 OP) | 绿 |
| WKC 期望 | 48 | — |
| WKC 实际 | 48 | 绿 |
| 周期丢帧 | 0 / 10000 | 绿 |
| 周期抖动 | ±1μs | 绿 |
| 冗余链路 | 主 OK, 备 OK | 绿 |
| 最后错误 | (无) | — |
Modbus TCP
| 从站 IP | 状态 | 响应时间 | 成功率 |
|---|---|---|---|
| 192.168.1.10 | 在线 | 2.5ms | 100.0% |
| 192.168.1.11 | 在线 | 3.1ms | 99.8% |
| 192.168.1.12 | 离线 | — | — |
OPC UA
| 会话 | 客户端 | 订阅数 | 数据率 |
|---|---|---|---|
| 1 | HMI_SCADA | 152 | 1.2 KB/s |
| 2 | MES_Client | 48 | 0.3 KB/s |
面板 4: 驱动状态
DarraRT.sys / DarraRT_Eth.sys / DarraRT_PLC.sys 三个内核驱动:
| 驱动 | 状态 | 版本 | 核心隔离 | SMI 干扰 |
|---|---|---|---|---|
| DarraRT.sys | 运行 | 1.2.3 | 核 4,5 已隔离 | 0 次 |
| DarraRT_Eth.sys | 运行 | 1.2.3 | — | — |
| DarraRT_PLC.sys | 运行 | 1.2.3 | — | — |
故障诊断:
- 核心隔离失效: 隔离的核被 Windows 占用 → BIOS 设置有问题
- SMI 干扰 > 0: BIOS 产生了 System Management Interrupt → 禁用 BIOS 电源管理
- 驱动版本不一致: 三个驱动版本号必须完全一致
面板 5: IO 映像表状态
实时显示 IO 映像表的完整性和时效性:
| 指标 | 值 |
|---|---|
| I 区最后刷新 | 0.123 ms 前 |
| Q 区最后下发 | 0.087 ms 前 |
| I 区 CRC | 0x8F3A (每周期变化) |
| Q 区 CRC | 0x2B6E |
| 未映射字节 | 0 (所有配置的 IO 都有数据) |
| 强制数量 | 3 |
未映射字节 > 0 = 配置了 IO 模块但物理上未连接 → IO 组态错误。
面板 6: 堆栈深度
监控每个任务的调用堆栈深度, 防止栈溢出:
| OB | 当前深度 | 最大深度 | 上限 | 使用率 |
|---|---|---|---|---|
| OB1 | 3 | 8 | 32 | 25% |
| OB30 | 2 | 5 | 32 | 15.6% |
| OB35 | 1 | 2 | 32 | 6.3% |
栈溢出 = OB121 触发, 日志记录触发 POU。建议保持使用率 < 50%。
面板 7: 持久化校验
RETAIN / PERSISTENT 区的完整性:
| 指标 | 值 |
|---|---|
| RETAIN CRC | 正确 |
| RETAIN 上次写入 | 2026-04-18 14:32:05 |
| PERSISTENT CRC | 正确 |
| PERSISTENT 上次写入 | 2026-04-17 09:15:42 |
| NVRAM 电池 | 3.02V (标准 3.0V, 健康) |
| NVRAM 写入次数 | 15234 / 100000 (寿命 85%) |
CRC 不匹配 → 非正常断电导致数据损坏 → 自动触发冷启动 OB100, 部分变量丢失。
面板 8: 系统信息
PLC 硬件状态:
| 项 | 值 |
|---|---|
| 主板温度 | 52 °C |
| CPU 温度 | 58 °C |
| 供电电压 | 24.12 V |
| 风扇 1 转速 | 3600 rpm |
| 风扇 2 转速 | 3550 rpm |
| 运行时间 | 162 天 14 小时 |
| 重启次数 | 3 (本月) |
| 最近重启原因 | 计划维护 |
历史趋势
仪表板底部是 1 小时滚动趋势:
- CPU 占用率
- 内存占用率
- 任务平均扫描时间
- 通讯丢帧率
- 主板温度
点击图例可切换显示/隐藏曲线, 光标显示具体时刻值。
告警集成
诊断面板的指标自动转化为报警:
| 指标 | 阈值 | 等级 |
|---|---|---|
| CPU 占用 > 85% 持续 1 分钟 | Warn | A900 |
| 扫描超时 OB80 触发 | Error | A901 |
| 内存占用 > 90% | Error | A902 |
| 通讯丢帧率 > 1% | Warn | A903 |
| 主板温度 > 75°C | Error | A904 |
| NVRAM 电池 < 2.5V | Warn | A905 |
| 驱动核心隔离失效 | Fatal | A910 |
导出诊断报告
点击 诊断 → 导出报告, 一键打包:
- 当前所有面板截图
- 最近 24 小时的完整历史
- 系统日志
- 编译信息 + 固件版本
- 配置文件
生成 DarraPLC_Diagnostic_YYYYMMDD_HHMMSS.zip, 用于:
- 报请厂家支持
- 长期问题归档
- 跨团队协作
排错表
| 指标异常 | 可能原因 | 解决 |
|---|---|---|
| CPU 占用高 | OB1 负载重 / 有死循环 | Performance 分析找热点 |
| 内存持续增长 | 泄漏 (字符串累积等) | 审查代码 FOR 循环中的字符串操作 |
| 抖动大 | 核心未隔离 / SMI 干扰 | 检查 BIOS 与核心隔离 |
| WKC 异常 | EtherCAT 从站掉线 | 看 EtherCAT 诊断 |
| NVRAM CRC 错 | 非正常断电 | 加 UPS / 电容保持 |
| 堆栈溢出 | 递归或深度调用 | 重构代码减少嵌套 |
最佳实践
- 上线前走一遍仪表板: 所有指标绿色, 才允许投产
- 关键指标上 HMI: 运行期间操作员实时看到 PLC 健康
- 每日导出报告: 归档 30 天, 用于回溯
- 设置告警阈值保守: 早报警早处理, 别等 Fatal
- 定期巡检: 每班次看仪表板 1 分钟, 积累经验
- 对比基线: 新项目上线时保存一份"健康基线", 日后对比