跳到主要内容

诊断中心总览

概述

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.mscSCM 状态 / DbgPrint
3 内核DbgView.exe / WinDbg / TSC 校准日志Section 映射 / IRQL
4 运行时logs/ide_*.log / logs/service_*.log.NET 异常栈
5 应用IDE 在线监视 / 报警列表 / 趋势曲线PLC I/O 值 / 事件

诊断工具矩阵

不同问题需要不同工具。表格按现象反查工具, 直接可用。

现象首选工具备用工具日志路径
IDE 启动崩溃VS 输出 / ide_*.logEvent Viewer%AppData%/DarraPLC/logs/
Service 启动失败service_*.logsc query DarraRT.Service<Service.exe>/logs/
驱动加载失败DbgView.exe!devnode (WinDbg)内核 DbgPrint
EtherCAT WKC 错误debug_info.txtWireshark (ECAT 过滤)Darra_EtherCAT_Master/
周期抖动 > 20μsTSC 抖动直方图Windows Performance Analyzerlogs/jitter_*.csv
SMI 抖动DarraRT.sys SMI 计数Intel PTDbgView
网卡丢包netstat -e / WiresharkNpcap 计数器NDIS 驱动统计
内存泄漏Process Explorerdotnet-dumpService 任务管理器
死锁ProcDump -madotnet-trace崩溃转储
文件占用Handle.exeProcess 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_EthNDIS 绑定 / PDO 帧率 / WKC网络诊断
DarraRT_PLC.sys\\.\DarraRT_PLCVM 扫描周期 / IOMerge 计数驱动诊断

三驱动通过 GlobalIO Section 零拷贝共享状态。任何一个驱动未正常映射 Section, 都会导致 IOMerge / CyclicUpdate 输出全零。这是初学者最常踩的坑 — 不要只看 Service 日志, 务必用 DbgView 观察 Section 映射日志

日志等级与读取顺序

所有 DarraRT 日志统一使用 LogManager.Get("模块名"), 等级从低到高:

Trace < Debug < Info < Warn < Error < Fatal

异常分析推荐读取顺序:

  1. 先看最后 30 秒 Fatal → 崩溃根因
  2. 再看最后 5 分钟 Error → 异常扩散路径
  3. 最后看最后 1 分钟 Warn → 预警信号
  4. 若根因不明, 再打开 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 DarraRTsc start DarraRT
PDO 全零GlobalIO Section 未映射DbgView 搜 MapViewOfSection重启三驱动按顺序
周期偶发 100μs 峰值SMI 中断DarraRT.sys SMI 计数递增BIOS 关闭 USB Legacy / C-State
WKC 计数卡在 N-1末站身份校验失败debug_info.txtSII重烧从站 EEPROM

高级技巧

  • 多驱动事件时间线对齐: 用 TSC (Time Stamp Counter) 替代 DateTime.Now, 三驱动同基准, 跨层因果关系清晰。参考 跟踪分析
  • 离线复盘: IDE 支持将一段生产周期的 PLC 变量 + 报警 + 日志打包为 .darradump, 离线加载回放, 不影响现场产线。
  • 一键健康报告: IDE 菜单 诊断 → 导出健康报告 会自动汇集 6 类日志 + 驱动状态 + 硬件温度, 生成 PDF, 适合远程支持场景。

相关文档

诊断金字塔示意