跳到主要内容

跟踪分析

概述

日志记录"发生了什么", 跟踪分析回答"事件如何在时间轴上演化"。DarraRT 的跟踪系统 以硬件时间戳 TSC (Time Stamp Counter) 为统一基准, 将 PLC 扫描周期、运动插补、 EtherCAT PDO、IO 刷新、应用事件等高频事件串成同一条时间线, 支持毫秒甚至百纳秒级回放。

本文档介绍四类跟踪手段:

  1. PLC 扫描周期跟踪 — 每个周期的执行时间直方图
  2. 运动轨迹回放 — 机器人 TCP 在三维空间的离线回放
  3. 事件时间线 — 跨层因果关系可视化
  4. 跨驱动对齐 — Global/Eth/PLC 三驱动事件在同一坐标系

适用场景

  • 扫描周期偶发超时 (如 1ms 周期出现 2ms 毛刺)
  • 机器人运动曲线不平滑 / 轨迹偏离
  • PLC 与 EtherCAT 事件因果倒置
  • 产线节拍分析与优化

前置条件与工具

工具用途
IDE → 诊断 → 跟踪视图DarraRT 自带
TSC CALibrationDarraRT.sys 开机校准
Windows Performance Recorder (WPR)内核态高频采样
Windows Performance Analyzer (WPA)离线分析 .etl
Chrome TracingJSON 时间线可视化

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)\\.\DarraRTIOCTL_DARRT_TRACE_READ用户态工具轮询
DarraRT_Eth.sysSection 环形缓冲GlobalIO 读
DarraRT_PLC.sysSection 环形缓冲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, 工具自动按起点-终点对齐, 生成 "批次间差异矩阵", 用于定位某次故障的特殊动作。

相关文档

事件时间线示例