ethercat-linux/docs/500us-latency-plan.md
Tony Cao 3a26aea082 2kHz spin-lock mode: RTT halved to 2ms, per-byte XOR proof at 500us cycle
- ticker: --spin mode polls FPRD until payload changes (phase-locks
  processing to TwinCAT frame arrival instead of free-running ticker),
  timeout at 1.5 periods keeps loop alive on master stop
- verified: 238k cycles, 0 errors, exec=245us (FPWR-bound),
  TwinCAT PLC task confirmed at 2000.8 Hz (all three tasks 0.5ms;
  base tick was already 50us - no base-time change needed)
- docs: 500us latency plan; scripts: task-rate ADS probe, 2kHz deploy,
  UI automation experiments (pywinauto) for task cycle inspection
2026-07-28 00:11:34 +08:00

6.2 KiB
Raw Blame History

EL6695 端到端 500µs 延迟优化 — 计划文档

版本: 1.0 日期: 2026-07-27 状态: 待执行 前置文档: 8b-bridge-design.md8b-verification-methodology.md8b-test-report.md


1. 目标

目标 定义 优先级
G1(主目标) 单向端到端延迟 ≤ 500µs(TwinCAT 写出 → J1900 可读,或 J1900 写出 → TwinCAT 可读) 必须
G2(Stretch) 往返延迟(aOut1 变化 → aIn1 可见对应回传)≤ 500µs 力争

验收方式与 8B 验证体系一致:逐字节图案 + 历史环匹配测延迟(nMatchLag 换算为 µs)+ J1900 周期统计 + 连续 10 分钟零错误。


2. 现状基线(实测)

当前两侧均为 1kHz 自由运行(未同步),RTT 恒为 4 个 PLC 周期(≈4ms),单向 ≈2ms。

构成 实测值 性质 可压缩性
TwinCAT 任务量化(PLC 写 → 帧发出) ≤1000µs 调度 提频 / DC 锁相
EtherCAT 帧传输(9 端子, 8B) ~15µs 硬件 不可压缩(下限)
EL6695 桥内部转发 微秒级(推定) 固件 待实测确认
J1900 采样量化(自由 ticker) ≤1000µs 调度 提频 / DC 锁相
J1900 处理(exec) 313µs 均值 / 359µs 峰值 软件+事务 优化写路径
├ FPRD(读 SM) 71µs 均值 / 84µs p99
└ FPWR(写 SM) 242µs 均值 / 246µs p99 主要瓶颈
返回路径量化 ≤1000µs 调度 提频 / DC 锁相

关键结论: 4ms 中约 3ms 是两侧 1kHz 自由运行的相位量化,~0.3ms 是 J1900 写事务,硬件传输仅 ~15µs 级。延迟优化的本质是消除量化 + 压缩 J1900 写耗时


3. 阶段计划

阶段 0:精确测量现状分解(0.5 天)

# 任务 方法 产出
0.1 测量桥纯转发延迟 J1900 侧环回测试(ecat_el6695_loopback_test 已有)或对同一字节做"写后立即读"测 DPRAM 镜像时间 桥转发延迟(预期 <50µs)
0.2 定位 FPWR 242µs 根因 对比 FPRD/FPWR 在不同 payload(8B/64B/1KB)下的耗时;检查 ethercrab PDU 等待逻辑;逻辑分析仪或帧时间戳 结论:固件写处理慢 vs 软件等待方式
0.3 J1900 高频空跑 ticker 以 2kHz/4kHz/10kHz 空跑(不读写),测周期抖动与 CPU 占用 J1900 可达到的稳定频率上限

决策点 D0: 若 FPWR 是固件特性(写路径必慢),则单向 J1900→TwinCAT 方向延迟受此下限约束,G1 双向需重新评估;若可用 LRW 合并读写(exec → ~100µs),进入阶段 1。

阶段 1:J1900 写路径优化(1 天)

# 任务 预期收益
1.1 试验 LRW(单帧逻辑读写)替代 FPRD+FPWR,利用已有 ecat_el6695_mem_reflect_lrw 程序验证 exec 313µs → ~150µs
1.2 若 LRW 不可用:FPWR 异步化(发出不等响应,下周期校验 WKC) exec → ~120µs
1.3 RT 调优复核:核隔离、IRQ 亲和、禁用 eth1 节能 抖动 7µs → <5µs

验收: 1kHz 下 exec p99 < 200µs,10 分钟零错误。

阶段 2:双侧提频(0.5 天)

# 任务 备注
2.1 TwinCAT PlcTask 周期 1000µs → 500µs(2kHz) XAE 直接改;确认 TcRTime 在该硬件支持 500µs 基频
2.2 J1900 ticker --cycle 250(4kHz) 需阶段 1 完成(exec < 250µs)
2.3 PLC 历史环匹配窗口适配新周期(16 槽仍覆盖 4ms) 仅改注释/常量

预期延迟: RTT 4 阶段 × 250µs = 1ms;单向 ≈ 500µs(G1 达标,余量小)。 风险: 自由运行相位最差时单向可能到 750µs → 需要阶段 3。

阶段 3:DC 分布式时钟同步(12 天)

# 任务 备注
3.1 TwinCAT 侧启用 EL6695 DC(SYNC0),设为参考时钟或跟随现有 DC 主 参考工程 TwinCATProject1_DC_Reference 已有 DC 配置可借用
3.2 J1900 读取 EL6695 DC 系统时间,ticker 锁相 SYNC0(ethercrab 支持 DC 读;或轮询 0x0910 寄存器对齐) 消除 J1900 采样量化
3.3 相位标定:调整 J1900 唤醒相位,使"帧到达 → 立即处理 → 帧返回前写回"在单周期内完成 目标:单向 = 帧传输 + 桥转发 + exec ≈ 200300µs

预期延迟(2kHz + DC):

  • 单向: ~200350µs G1 有余量
  • 往返: ~500700µs,G2 边缘

阶段 4:G2 冲刺(可选,视阶段 3 结果)

仅当 G2 明确需要时:两侧 4kHz(250µs 周期)+ DC + exec < 150µs。往返 = 帧 + 桥 + exec + 帧 ≈ 400500µs。余量极小,需 EL6695 固件最小周期(待阶段 0 实测)允许 250µs。

阶段 5:验证与文档(0.5 天)

  • 8b-verification-methodology.md 体系做 10 分钟连续验证(逐字节图案 + lag 测量);
  • 更新设计/验证/测试三份文档,新增延迟分解表;
  • git 提交。

4. 里程碑与决策点

里程碑 判据 决策
D0(阶段 0 末) FPWR 根因明确 固件瓶颈→重谈目标;软件可优化→继续
M1(阶段 1 末) exec p99 < 200µs 不达标→LRW/异步化二选一深挖
M2(阶段 2 末) 2kHz 稳定,单向 ≈500µs G1 名义达标
M3(阶段 3 末) DC 锁相,单向 <350µs G1 稳妥达标;评估是否冲 G2
M4(阶段 5 末) 10 分钟零错误 + 文档提交 收尾

5. 风险登记

# 风险 概率 影响 缓解
R1 EL6695 固件最小周期 > 250µs,无法 4kHz G2 不可达 阶段 0 实测;G1 不受影响
R2 FPWR 慢是固件特性 J1900→TwinCAT 方向下限 ~250µs LRW 合并;或接受单向非对称
R3 TcRTime 在 500µs 基频下抖动大 量化消除不彻底 实测 TwinCAT 任务抖动;必要时 1kHz+DC
R4 ethercrab 不支持 DC 时间读取/锁相 阶段 3 受阻 轮询 DC 寄存器 0x0910 软件锁相
R5 提频后 E-bus 上其他端子(EL6851/EL6022 串口模块)不支持 2kHz 激活失败 串口模块 PDO 移出高速任务或降低其更新率

6. 资源与依赖

  • 硬件现状即可,无需新增;
  • 依赖阶段 0 的三个测量结论再细化后续工时;
  • J1900 已有实验程序可复用:ecat_el6695_loopback_testecat_el6695_mem_reflect_lrwecat_el6695_mem_reflect_dc;
  • TwinCAT 侧 DC 配置参考: C:\Users\tonycao\work\free\TwinCATProject1_DC_Reference

7. 修订历史

日期 内容
2026-07-27 初版计划