跟踪分析
概述
日志记录"发生了什么", 跟踪分析回答"事件如何在时间轴上演化"。DarraRT 的跟踪系统 以硬件时间戳 TSC (Time Stamp Counter) 为统一基准, 将 PLC 扫描周期、运动插补、 EtherCAT PDO、IO 刷新、应用事件等高频事件串成同一条时间线, 支持毫秒甚至百纳秒级回放。
本文档介绍四类跟踪手段:
- PLC 扫描周期跟踪 — 每个周期的执行时间直方图
- 运动轨迹回放 — 机器人 TCP 在三维空间的离线回放
- 事件时间线 — 跨层因果关系可视化
- 跨驱动对齐 — Global/Eth/PLC 三驱动事件在同一坐标系
适用场景
- 扫描周期偶发超时 (如 1ms 周期出现 2ms 毛刺)
- 机器人运动曲线不平滑 / 轨迹偏离
- PLC 与 EtherCAT 事件因果倒置
- 产线节拍分析与优化
前置条件与工具
| 工具 | 用途 |
|---|---|
| IDE → 诊断 → 跟踪视图 | DarraRT 自带 |
TSC CALibration | DarraRT.sys 开机校准 |
| Windows Performance Recorder (WPR) | 内核态高频采样 |
| Windows Performance Analyzer (WPA) | 离线分析 .etl |
| Chrome Tracing | JSON 时间线可视化 |
TSC 时间基准
为什么不用 DateTime
DateTime.Now 精度 ~16ms, 跨进程跳跃; Environment.TickCount 精度 ~1ms, 32 位溢出;
Stopwatch 精度 100ns 但不同线程可能不同步。只有 TSC 能做到 100ns 精度 + 单机全局一致。
TSC 校准
DarraRT.sys 在驱动加载时执行 TSC 校准:
[DarraRT] TSC CAL begin
[DarraRT] TSC CAL core0 freq=3600000000 Hz
[DarraRT] TSC CAL core1 freq=3600000000 Hz
...
[DarraRT] TSC CAL done, skew(max) = 12 cycles (3.3 ns)
判定规则:
skew < 100 cycles(~30ns) → TSC 可作全局时间基准skew > 1000 cycles→ CPU 不支持 Invariant TSC, 需更换 CPU 或关闭部分核心
用户态读 TSC
// Darra.Core.dll 暴露的封装
long tsc = Darra.Core.Timing.ReadTsc();
double ns = Darra.Core.Timing.TscToNanoseconds(tsc);
DateTime t = Darra.Core.Timing.TscToLocalTime(tsc);
诊断步骤 (一): PLC 扫描周期跟踪
步骤 1: 打开周期跟踪
IDE → 诊断 → 扫描周期跟踪 → 启用
· 采样深度: 10 000 个周期 (1ms 周期 = 10 秒数据)
· 记录内容: 任务名 / 开始 TSC / 结束 TSC / IO 耗时 / 用户逻辑耗时
预期输出: 实时显示一个直方图:
耗时(μs) 数量 百分比 |
< 500 9 823 98.2% |█████████████████████████████████████
500-600 150 1.5% |█
600-700 20 0.2% |
700-800 5 0.05% |
> 1000 2 0.02% | <-- 超时点
步骤 2: 定位超时周期
点击直方图中 > 1000μs 的柱子, 下方会列出该桶中所有超时周期:
周期 # 耗时(μs) 时间戳 任务
-----------------------------------------------------------------
47 823 1247 2026-04-18 09:15:22.481 Task_10ms
83 451 1098 2026-04-18 09:23:04.127 Task_10ms
步骤 3: 查看详细分解
双击任一条目, 进入周期详情:
周期 #47823, 总耗时 1247μs
├─ IO 刷新入: 180μs (正常)
├─ 全局变量同步: 45μs (正常)
├─ Task_10ms:
│ ├─ FB_Motor.Exec: 892μs <-- 异常! 平均 120μs
│ └─ FB_Valve.Exec: 85μs
├─ IO 刷新出: 120μs (正常)
└─ 周期余量: -567μs (超时)
判定规则: 异常 FB 耗时 > 平均 3 倍 → 用在线监视 查该 FB 输入变量, 找触发条件 (通常是某输入翻转后进入了异常分支)。
诊断步骤 (二): 运动轨迹回放
步骤 1: 启用轨迹记录
IDE → 机器人 → 轨迹记录 → 启用
· 采样频率: 插补周期 (通常 1ms)
· 记录字段: TCP[X Y Z A B C] / 关节角 [J1~J6] / 速度 / 加速度 / 模式
步骤 2: 执行一次典型运动
让机器人执行一个代表性生产节拍 (如取件 → 装配 → 放件)。结束后:
IDE → 机器人 → 轨迹记录 → 停止 → 保存为 .darratrace
步骤 3: 回放 + 可视化
IDE → 机器人 → 轨迹回放 → 打开 .darratrace
三视图同步显示:
- 3D 空间视图 (OpenTK 渲染 TCP 路径)
- 关节角曲线 (6 条 J1~J6 随时间变化)
- 速度/加速度曲线 (检查加速度是否超过电机额定)
关键检查项:
| 指标 | 期望 | 异常表现 |
|---|---|---|
| TCP 连续性 | 路径平滑无突变 | 锯齿 = 插补不足 |
| 速度曲线 | 梯形/S曲线 | 抖动 = 伺服增益失调 |
| 加速度 | 不超电机额定 | 饱和 = 规划超限 |
| 关节角 | 单调变化 | 反复穿越 = 奇异点 |
步骤 4: 差分对比
点击 加载参考轨迹 按钮, 与首次调试时的黄金轨迹逐点差分:
路径偏差 (mm)
时间(s) X偏差 Y偏差 Z偏差
0.000 0.001 0.000 0.002
0.100 0.003 0.001 0.002
1.500 0.851 0.432 0.098 <-- 异常
判定规则: 任一轴偏差 > 0.1mm → 检查该时刻对应的关节角是否超过软限位或进入奇异区。
诊断步骤 (三): 事件时间线
步骤 1: 启用事件订阅
IDE → 诊断 → 事件时间线 → 配置
☑ PLC 任务切换
☑ EtherCAT PDO 帧收发
☑ IO 刷新
☑ 机器人插补
☑ 报警触发
☑ 用户 UI 事件
步骤 2: 导出 Chrome Tracing 格式
诊断 → 事件时间线 → 导出 → chrome_trace.json
步骤 3: 用 Chrome 打开
浏览器地址栏输入:
chrome://tracing
拖入 chrome_trace.json, 键盘 W/A/S/D 缩放 (超级实用):
W放大时间轴S缩小A/D左右移动
判定规则: 任何两条事件若出现因果倒置 (B 依赖 A, 但 B 先发生) → 说明跨层时钟不同步, 回到 TSC 校准步骤排查。
诊断步骤 (四): 跨驱动事件对齐
三驱动事件通道
| 驱动 | 通道 | 导出方式 |
|---|---|---|
| DarraRT.sys (Global) | \\.\DarraRT → IOCTL_DARRT_TRACE_READ | 用户态工具轮询 |
| DarraRT_Eth.sys | Section 环形缓冲 | GlobalIO 读 |
| DarraRT_PLC.sys | Section 环形缓冲 | GlobalIO 读 |
步骤 1: Service 作为汇聚端
Service 启动时会自动连接三驱动, 消费事件并统一打 TSC 时间戳, 写入环形缓冲 (trace.bin)。
诊断 → 跟踪 → 汇聚状态: 在线
· Global: 已连接 (IOCTL 延迟 3μs)
· Eth: 已映射 Section (读指针 0x7F...)
· PLC: 已映射 Section (读指针 0x7F...)
判定规则:
- 三驱动全部"已连接/已映射" → 可用
- 任一"未连接" → 走驱动诊断
步骤 2: 导出 .etl 供 WPA 分析
# 以管理员启动
wpr -start C:\Program Files\DarraRT\trace_profile.wprp -filemode
# ... 复现故障 ...
wpr -stop trace.etl
步骤 3: WPA 打开
Windows Performance Analyzer → File → Open → trace.etl
View: CPU Usage (Precise) / GPU Utilization / System Activity / Custom: Darra Events
在 Darra Events 行:
DarraRT ├──── 核心隔离中断 IPI
DarraRT_Eth │ ├─ 帧收
DarraRT_Eth │ │ ├─ 帧发
DarraRT_PLC │ │ ├─ 扫描开始
DarraRT_PLC │ │ ├─ 扫描结束
事件间隔一目了然 — 从硬件中断到 PLC 完成扫描的端到端延迟就是这一条横线长度。
异常模式速查表
| 现象 | 根因 | 定位方法 | 解决 |
|---|---|---|---|
| 扫描周期直方图长尾 | SMI 中断或后台进程 | WPA 看隔离核 | 关 C-State / 隔离核 |
| 轨迹抖动 (锯齿) | 插补频率不足 | 轨迹回放 ds/dt | 降速度 or 提插补率 |
| 关节反复穿越零 | 奇异点规划 | 关节角曲线 | 改用关节空间轨迹 |
| Chrome Tracing 时钟倒置 | TSC 未校准 | DbgView TSC CAL 日志 | 重装 Global 驱动 |
| 事件在 WPA 有间隙 | Section 未映射 | Service 汇聚状态 | 重启 PLC 驱动 |
| 速度曲线毛刺 | 伺服环增益过高 | 对比速度期望 vs 实际 | 伺服整定 |
| TCP 路径偏差突增 | 坐标系原点漂移 | 差分回放 | 重新 TCP 标定 |
高级技巧
- .darratrace 版本管理: 把每次调试成功的轨迹存入
traces/目录下的 Git 子模块, 变成黄金标准样本, 日后变更对比。 - 实时 p99 推送: Service 支持把每秒的扫描周期 p50/p95/p99 推到 InfluxDB, Grafana 看板可以看到长期趋势。
- 回放速度: 轨迹回放支持 0.1x~10x 变速, 查细节用 0.1x, 看整体用 10x。
- 批量对比: 一次加载 N 个
.darratrace, 工具自动按起点-终点对齐, 生成 "批次间差异矩阵", 用于定位某次故障的特殊动作。
相关文档
