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

133 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# EL6695 端到端 500µs 延迟优化 — 计划文档
> **版本**: 1.0
> **日期**: 2026-07-27
> **状态**: 待执行
> **前置文档**: `8b-bridge-design.md`、`8b-verification-methodology.md`、`8b-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 是固件特性(写路径必慢),则单向 J1900TwinCAT 方向延迟受此下限约束,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_test`、`ecat_el6695_mem_reflect_lrw`、`ecat_el6695_mem_reflect_dc`;
- TwinCAT 侧 DC 配置参考: `C:\Users\tonycao\work\free\TwinCATProject1_DC_Reference`
## 7. 修订历史
| 日期 | 内容 |
|---|---|
| 2026-07-27 | 初版计划 |