# 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. 工时估计 约 2–3 小时(含一次失败重试余量):tsproj 手术 30min、PLC 30min、J1900 blob 泛化+构建 40min、联调验证 40min。 ## 8. 修订历史 | 日期 | 内容 | |---|---| | 2026-07-27 | 初版方案 |