ethercat-linux/docs/800b-pdo-plan.md
Tony Cao f0163d8d70 800B PDO variant + long-term stability evidence + analysis docs
- twin_layout_blob_sized generalized: multi-entry TwinCAT line format
  (1 real @240bit + N continuation + remainder entry); 1024B path kept
  byte-identical; 800B = 27 entries verified on hardware
- 800B constants (PAYLOAD/SM 800), deployed as el6695_rt_800b
- 10-min + 5h stability runs: 18M cycles, zero errors, zero mismatches,
  PLC nMismatch frozen over the whole run (monitor_5h.csv evidence)
- docs: 800B plan/design/verification/test-report chapters,
  jitter analysis (NFS rootfs stall primary cause), D2000 dev plan
- scripts: 800B deploy/relink/verify, mismatch-delta, 5h monitor
2026-08-06 01:10:50 +08:00

5.0 KiB
Raw Permalink Blame History

EL6695 PDO 扩展至 800 字节 — 方案文档

版本: 1.0 日期: 2026-07-27 状态: 待评审 前置文档: 8b-bridge-design.md(8B 实现)、500us-latency-plan.md(延迟优化)


1. 目标

在现有 8B 工程基础上,新建 800 字节 PDO 变体工程 TwinCAT_EL6695_Primary_800B,实现 TwinCAT ↔ J1900 双向 800B/周期数据交换,并保持逐字节可验证性。

选型说明:800B 介于 8B(验证通路)与 1024B(ESI 默认上限)之间,可作为实际应用的带宽档位;同时验证任意尺寸的映射 blob 生成规则。


2. 关键技术点(复用既有经验)

# 经验 应用到 800B
1 链接必须整数组(LinkVariables) 同 8B,PLC 数组与 PDO 条目同类型同尺寸
2 类型 GUID 必须复用 PLC 构建生成的随机 GUID 先建 PLC ARRAY[0..799],构建取 GUID 填 PDO 条目
3 SM3 不挂 0x1A01 诊断 PDO,否则设备报 size not allowed SM3 纯 800B,不含诊断(若含诊断则需 802B)
4 EL6695 固件按 PDO 赋值总和校验 SM 长度 SM2=SM3=800(0x0320),两侧一致
5 映射 blob 须为 TwinCAT 行格式(240bit 条目 + 余量) 见 §3 数学
6 先激活 TwinCAT,再启动 J1900 ticker(同一会话) 部署顺序不变

3. PDO 映射 blob 数学(800B)

EL6695 固件要求映射为 TwinCAT 行格式:真实对象条目 @240bit + 若干 0x0000:00 延续条目,总位数 = payload 位数。

800 B = 6400 bit = 26 × 240 bit + 160 bit
blob = [条目数=27 (u16 LE)]
     + [240, 1, obj_lo, obj_hi]   (真实对象 0x6000/0x7000 子索引1)
     + 25 × [240, 0, 0, 0]        (延续)
     + 1 × [160, 0, 0, 0]         (余量延续)

bridge.rstwin_layout_blob_sized 需泛化:payload_bytes ≤ 30 走单条目;否则按 ceil 生成多条目(1 真实 + (n-2) 延续 + 1 余量延续),1024B 时退化为现有 35 条目格式(字节级兼容已验证)。


4. 工程结构

twincat3-auto-cli/
├─ TwinCAT_EL6695_Primary\        (8B, 不动)
├─ TwinCAT_EL6695_Primary_2kHz\   (2kHz, 不动)
├─ TwinCAT_EL6695_Primary_4kHz\   (4kHz, 不动)
└─ TwinCAT_EL6695_Primary_800B\   (新建, 本方案)

J1900 二进制: /root/gateway/el6695_rt_800b(新构建,旧的全部保留)。


5. 实施步骤

5.1 TwinCAT 侧(副本工程)

步骤 内容
1 robocopy 复制 TwinCAT_EL6695_Primary_800B;修 sln 为相对路径(防绝对路径 bug)
2 PLC: GVL_Sync.aIn1/aOut1ARRAY[0..799] OF BYTE;MAIN 协议改 800B 布局(§6)
3 构建 PLC → 从 tsproj 取 ARRAY [0..799] 的随机 GUID
4 tsproj PDO 条目(0x1608/0x1A08)类型替换为该 GUID 的 ARRAY [0..799] OF BYTE
5 SM2 记录: 001c200364...(len=0x0320=800);SM3 记录: 008e200320...(len=800),0x1A01 仍不挂 SM3
6 tc-relink.ps1 整数组重建链接;部署激活;验证 _Boot tszip 中 SM2/SM3=800

5.2 J1900 侧

步骤 内容
1 twin_layout_blob_sized 泛化为多条目(§3)
2 常量: PAYLOAD_LEN=SM_TX_LEN=SM_RX_LEN=SM_RX_PLD_LEN=800
3 SM 长度写 800;FMMU len 写 800
4 ticker 走 1KB 式协议路径(f(x)=x·7+3 + 图案回显 + 时间戳字段),现有编译期守卫 PAYLOAD_LEN>=256/280 自动生效
5 交叉编译(rust-lld)→ scp 为 el6695_rt_800b

5.3 数据协议(800B 布局)

偏移 内容 方向
[0..7] TwinCAT nCycles(ULINT) → J1900 回 nCycles*7+3 双向
[8..15] J1900 本地周期号 J→T
[16..799] 逐字节图案 (nCycles + i) mod 256,J1900 原样回显 双向
[264..267] J1900 周期抖动 ns J→T
[268..271] J1900 图案失配计数 J→T
[272..279] J1900 回存的原始 tc_seq J→T

TwinCAT 校验(复用 1KB 逻辑):从 nProcessedSeq 反推原始 seq → 按 seq 重建预期图案逐字节比对 [16..799] → bSync;RTT = nCycles nReturnedSeq。

5.4 验证

  1. J1900 日志:SM2/SM3 len=800、OP、stale=0%、mism=0;
  2. TwinCAT ADS: bSync=TrueaIn1 非零字节数 ≈ 784(图案区)、RTT 稳定;
  3. 逐字节证据:抽 [16..799] 中多个偏移核对 (seq+i) mod 256;
  4. 连续 10 分钟:nMismatch 零增长、tx/rx 零错误;
  5. 频率:保持 1kHz(带宽目标,不引入 2k/4k 变量)。

6. 风险与注意点

# 风险 缓解
R1 多条目 blob 被固件拒绝(余量条目不认) 先用 verify 模式观察 AL 状态码;备选:全部按 240bit 进位到 27×240(6480bit,多 80bit 填 0)
R2 800B 时 SM 长度设备校验失败 事件日志看 min/max size;按报告值对齐
R3 PLC 构建后 tsproj 类型 GUID 抓取失败 构建后 rg 校验 GUID 存在再替换
R4 1kHz 下 800B 帧对 E-bus 其他端子无影响 既有端子已在 1kHz 验证过,800B 增量小

7. 工时估计

约 23 小时(含一次失败重试余量):tsproj 手术 30min、PLC 30min、J1900 blob 泛化+构建 40min、联调验证 40min。

8. 修订历史

日期 内容
2026-07-27 初版方案