- 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
133 lines
6.2 KiB
Markdown
133 lines
6.2 KiB
Markdown
# 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 是固件特性(写路径必慢),则单向 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 分布式时钟同步(1–2 天)
|
||
|
||
| # | 任务 | 备注 |
|
||
|---|---|---|
|
||
| 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 ≈ 200–300µs |
|
||
|
||
**预期延迟(2kHz + DC)**:
|
||
- 单向: ~200–350µs ✅ G1 有余量
|
||
- 往返: ~500–700µs,G2 边缘
|
||
|
||
### 阶段 4:G2 冲刺(可选,视阶段 3 结果)
|
||
|
||
仅当 G2 明确需要时:两侧 4kHz(250µs 周期)+ DC + exec < 150µs。往返 = 帧 + 桥 + exec + 帧 ≈ 400–500µ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 | 初版计划 |
|