ethercat-linux/docs/800b-pdo-plan.md

125 lines
5.0 KiB
Markdown
Raw Permalink Normal View 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.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 | 初版方案 |