诊断中心总览
概述
DarraRT 诊断中心面向软 PLC + 机器人控制器全栈的故障定位与健康监控。不同于普通应用程序, DarraRT 运行在用户态 + 内核态双层架构之上, 涉及硬件时钟、NDIS 网卡、EtherCAT 帧、PLC 扫描周期、 机器人插补周期等多个强实时环节。任何一个层级的异常都会传导到上层 HMI 或生产节拍。
诊断中心的目标: 让工程师在 5 分钟内完成分诊, 30 分钟内定位根因, 2 小时内恢复产线。
PLC 产品不提供断点 / 单步执行调试能力。PLC 程序一旦装载即按扫描周期连续运行。异常处理遵循: 停 PLC → Q 区清零 → 日志记录 → 报警输出 的整体停机路径。调试依赖在线监视 / 强制赋值 / 交叉引用 / 趋势曲线 / 日志 / 报警等非侵入手段。
适用场景
| 场景 | 典型表现 | 首选入口 |
|---|---|---|
| 产线无法启动 | IDE 连接失败 / Service 无响应 | 日志分析 |
| 产线周期抖动 | 扫描周期偶发超时 / 机器人顿挫 | 实时抖动分析 |
| 从站掉线 | WKC 异常 / DC 同步丢失 | 网络诊断 |
| 驱动加载失败 | \\.\DarraRT_Eth 无法打开 | 驱动诊断 |
| CPU / 内存异常 | Service 占用飙升 / 泄漏 | 系统健康监控 |
| 时序错位 | 日志时间不对齐 / 事件顺序异常 | 跟踪分析 |
诊断金字塔
DarraRT 的故障排查遵循自下而上的五层金字塔: 下层异常会伪装成上层症状, 因此定位必须逐层排除。
┌──────────────────┐
5 │ 应用层诊断 │ PLC 变量 / HMI 画面 / 报警记录
└──────────────────┘
┌──────────────────┐
4 │ 运行时诊断 │ Service / IDE / Panel / SDK
└──────────────────┘
┌──────────────────┐
3 │ 内核态诊断 │ 三驱动 + GlobalIO Section + TSC
└──────────────────┘
┌──────────────────┐
2 │ 驱动层诊断 │ NDIS / WDF / 核心隔离 / 中断亲和
└──────────────────┘
┌──────────────────┐
1 │ 硬件层诊断 │ CPU / 内存 / 网卡 / 电源 / 温度
└──────────────────┘
每往上推一层, 都应先确认下层无异常, 否则修上层只是治标不治本。
层级对应工具
| 层级 | 关键工具 | 日志/指标 |
|---|---|---|
| 1 硬件 | BIOS / IPMI / HWiNFO / 风扇 SMART | 温度 / 电压 / ECC 计数 |
| 2 驱动 | sc query / DbgView.exe / devmgmt.msc | SCM 状态 / DbgPrint |
| 3 内核 | DbgView.exe / WinDbg / TSC 校准日志 | Section 映射 / IRQL |
| 4 运行时 | logs/ide_*.log / logs/service_*.log | .NET 异常栈 |
| 5 应用 | IDE 在线监视 / 报警列表 / 趋势曲线 | PLC I/O 值 / 事件 |
诊断工具矩阵
不同问题需要不同工具。表格按现象反查工具, 直接可用。
| 现象 | 首选工具 | 备用工具 | 日志路径 |
|---|---|---|---|
| IDE 启动崩溃 | VS 输出 / ide_*.log | Event Viewer | %AppData%/DarraPLC/logs/ |
| Service 启动失败 | service_*.log | sc query DarraRT.Service | <Service.exe>/logs/ |
| 驱动加载失败 | DbgView.exe | !devnode (WinDbg) | 内核 DbgPrint |
| EtherCAT WKC 错误 | debug_info.txt | Wireshark (ECAT 过滤) | Darra_EtherCAT_Master/ |
| 周期抖动 > 20μs | TSC 抖动直方图 | Windows Performance Analyzer | logs/jitter_*.csv |
| SMI 抖动 | DarraRT.sys SMI 计数 | Intel PT | DbgView |
| 网卡丢包 | netstat -e / Wireshark | Npcap 计数器 | NDIS 驱动统计 |
| 内存泄漏 | Process Explorer | dotnet-dump | Service 任务管理器 |
| 死锁 | ProcDump -ma | dotnet-trace | 崩溃转储 |
| 文件占用 | Handle.exe | Process Explorer | — |
| DockPanel 异常 | ide_*.log | _last_layout.xml | %AppData%/DarraPLC/ |
快速分诊流程图
收到异常告警后的前 5 分钟必须走一遍以下决策树:
[告警] → 能打开 IDE 吗?
├─ 否 → 看 %AppData%/DarraPLC/logs/ide_*.log
│ ├─ 崩溃在构造函数 → 检查 DevExpress License / 字体 (MiSans)
│ ├─ 崩溃在 Load → 检查 _last_layout.xml 版本
│ └─ 无日志 → Event Viewer → .NET Runtime 错误
│
└─ 是 → Service 状态正常吗? (IDE 标题栏)
├─ 否 → 看 logs/service_*.log → 常见: 端口占用 / 证书过期
│
└─ 是 → EtherCAT 总线状态?
├─ Init/PreOP → 看 debug_info.txt → 检查 ENI 配置 / 从站身份
├─ SafeOP → DC 同步异常 → 走 network-diagnostics
└─ OP → 跳到应用层: PLC 在线监视 / 变量值异常
关键原则: 不要跳层。如果看到 PLC 变量异常, 先确认 OP 状态稳定 ≥ 60 秒, 再查 PLC 逻辑。
三驱动架构下的诊断入口
DarraRT 诊断的特殊之处在于需要同时观察三个内核驱动的状态。
| 驱动 | 设备路径 | 关注指标 | 对应文档 |
|---|---|---|---|
| DarraRT.sys | \\.\DarraRT | 核心隔离数量 / TSC 校准偏差 / SMI 次数 | 实时抖动 |
| DarraRT_Eth.sys | \\.\DarraRT_Eth | NDIS 绑定 / PDO 帧率 / WKC | 网络诊断 |
| DarraRT_PLC.sys | \\.\DarraRT_PLC | VM 扫描周期 / IOMerge 计数 | 驱动诊断 |
三驱动通过 GlobalIO Section 零拷贝共享状态。任何一个驱动未正常映射 Section, 都会导致 IOMerge / CyclicUpdate 输出全零。这是初学者最常踩的坑 — 不要只看 Service 日志, 务必用 DbgView 观察 Section 映射日志。
日志等级与读取顺序
所有 DarraRT 日志统一使用 LogManager.Get("模块名"), 等级从低到高:
Trace < Debug < Info < Warn < Error < Fatal
异常分析推荐读取顺序:
- 先看最后 30 秒
Fatal→ 崩溃根因 - 再看最后 5 分钟
Error→ 异常扩散路径 - 最后看最后 1 分钟
Warn→ 预警信号 - 若根因不明, 再打开
Debug级重新复现
禁止: 直接从头到尾翻日志。2GB 日志人工读不完, 必须按时间窗 + 级别过滤。
异常模式速查表
| 现象 | 根因 | 定位方法 | 解决 |
|---|---|---|---|
| IDE 启动闪退 | DevExpress 许可证 / 字体 | VS 输出窗口异常类型 | 安装 MiSans + 刷新 License |
| "Collection was modified" | foreach 遍历时修改集合 | 堆栈 → MoveNext | 用 .ToArray() 快照 |
| "DockTo ... not supported" | DevExpress API 过时 | 异常堆栈第一行 | 换 DockController.Dock 新 API |
| MSB3027 无法复制 | Service 进程锁定 | Handle.exe <dll> | pre-build taskkill /IM |
\\.\DarraRT 打开失败 | 驱动未加载 | sc query DarraRT | sc start DarraRT |
| PDO 全零 | GlobalIO Section 未映射 | DbgView 搜 MapViewOfSection | 重启三驱动按顺序 |
| 周期偶发 100μs 峰值 | SMI 中断 | DarraRT.sys SMI 计数递增 | BIOS 关闭 USB Legacy / C-State |
| WKC 计数卡在 N-1 | 末站身份校验失败 | debug_info.txt 搜 SII | 重烧从站 EEPROM |
高级技巧
- 多驱动事件时间线对齐: 用 TSC (Time Stamp Counter) 替代
DateTime.Now, 三驱动同基准, 跨层因果关系清晰。参考 跟踪分析。 - 离线复盘: IDE 支持将一段生产周期的 PLC 变量 + 报警 + 日志打包为
.darradump, 离线加载回放, 不影响现场产线。 - 一键健康报告: IDE 菜单
诊断 → 导出健康报告会自动汇集 6 类日志 + 驱动状态 + 硬件温度, 生成 PDF, 适合远程支持场景。
相关文档
- 系统健康监控 — 硬件与系统指标基线
- 日志分析 — 四类日志的定位与检索
- 跟踪分析 — 扫描周期 / 运动轨迹回放
- 网络诊断 — EtherCAT / TCP / Modbus 问题
- 实时抖动分析 — 内核隔离与抖动优化
- 驱动诊断 — 三驱动层面的根因定位
- PLC 在线监视
- 冗余配置
