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

125 lines
5.0 KiB
Markdown
Raw Permalink 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 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.rs``twin_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/aOut1``ARRAY[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=True`、`aIn1` 非零字节数 ≈ 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 | 初版方案 |