- 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
5.0 KiB
5.0 KiB
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 验证
- J1900 日志:SM2/SM3 len=800、OP、stale=0%、mism=0;
- TwinCAT ADS:
bSync=True、aIn1非零字节数 ≈ 784(图案区)、RTT 稳定; - 逐字节证据:抽 [16..799] 中多个偏移核对
(seq+i) mod 256; - 连续 10 分钟:nMismatch 零增长、tx/rx 零错误;
- 频率:保持 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 | 初版方案 |