ethercat-linux/docs/d2000-dev-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.6 KiB
Raw Blame History

飞腾 D2000 ↔ EL6695 ↔ TwinCAT 通讯链路 — 开发计划

版本: 1.0 日期: 2026-07-28 状态: 待启动 前置成果: J1900 链路全部方法论(8B/800B 设计、验证体系、脚本集、Rust 代码库)


1. 目标与拓扑

在现有 J1900 链路之外,新增一条并列通讯链路:飞腾 D2000(ARM64)经 EL6695#2 与 TwinCAT PC 实时数据交换,复用已验证的配置方法与验证体系。

TwinCAT PC (169.254.176.217)
  │
  ├─ [现有链路] EK1100 → ... → EL6695#1 → J1900 (x86_64, Debian13+RT)   ✅ 已验收
  │
  └─ [新增链路] E-bus 扩展或独立网口 → EL6695#2 → 飞腾 D2000 (aarch64)   🆕
                                                    ▲
                                              跳板机#2 网口 (SSH 管理通道)

待确认事项(启动前)

# 问题 影响
Q1 EL6695#2 挂在哪里?(现有 E-bus 末端 EL9011 前扩展,还是 TwinCAT 第二网口独立段?) TwinCAT 工程拓扑/网卡规划
Q2 D2000 的 OS 与内核(麒麟 V10? UOS? Ubuntu? 内核版本? 是否有 PREEMPT_RT?) RT 性能预期、移植工作量
Q3 D2000 管理通道:跳板机#2 的地址、SSH 凭据、能否免密 自动化部署方式
Q4 D2000 接 EL6695 的网口(板载 GbE? 独立网卡? 驱动?) ethercrab 裸 socket 可用性

2. 阶段计划

阶段 1:环境与可达性(0.5 天)

# 任务 产出
1.1 经跳板机#2 SSH 到 D2000,采集:uname -a/etc/os-release/proc/version、CPU/核数、网口列表(ip link)、中断分布(/proc/interrupts) 环境档案
1.2 确认 PREEMPT_RT(uname -v 含 rt?)、chrt/mlockall 可用性 RT 基线判定
1.3 网络打通:D2000 → EL6695#2 网线;D2000 → 跳板机 管理网 拓扑照片/记录
1.4 空口探测:tcpdump/裸 socket 读 ethX,确认能收发二层帧 网卡可用性

阶段 2:Rust 交叉编译 aarch64(0.5 天)

# 任务 备注
2.1 rustup target add aarch64-unknown-linux-musl;cargo build --target aarch64-unknown-linux-musl --release ethercrab 为纯 Rust,理论上零改动;libc 裸 socket(AF_PACKET)在 aarch64 内核同样支持
2.2 链接器:沿用 RUSTFLAGS="-C linker=rust-lld"(musl 静态,免去 D2000 上 glibc 版本问题) musl 静态二进制通吃 Kylin/UOS/Debian
2.3 部署 scp → D2000,跑 --mode probe(只读扫描) 首次上机验证
2.4 若 AF_PACKET 在目标内核异常,备选 aarch64-unknown-linux-gnu + 检查目标 glibc 风险预案

阶段 3:EL6695 链路开通(0.51 天,方法全部现成)

# 任务 复用资产
3.1 TwinCAT 侧:复制 8B 工程为 TwinCAT_EL6695_Primary_D2000(或在 EL6695#2 所在段新建拓扑),激活确认 SM2/SM3 tc-deploy-retry.ps1 模式
3.2 D2000 侧:el6695_rt ethX --mode verify CoE 审计 → ConfigOwner 到 OP 与 J1900 完全相同的流程
3.3 严格遵守顺序:TwinCAT 激活时 D2000 侧空闲;先激活,后启 ticker(800B 踩坑 F1) 教训文档化
3.4 ticker 8B XOR 模式联通,PLC bSync=True GVL_Sync 验证体系

阶段 4:数据验证与实时性测量(0.5 天)

# 任务 判据
4.1 8B 逐字节验证(图案+XOR+历史环) bSync=True,lag 稳定
4.2 10 分钟稳定性 60 万周期零错误,nMismatch 零增长
4.3 D2000 实时性基线:周期抖动/exec/FPRD/FPWR 统计 与 J1900 对照(7µs 抖动基准)
4.4 如需 800B:换 el6695_rt_800b 对应构建(同源码,常量切换) 800B 工程现成

阶段 5:D2000 RT 调优(按需,0.51 天)

# 措施 场景
5.1 IRQ 亲和:管理网口 IRQ 钉到非 RT 核 必做
5.2 核隔离 isolcpus + ticker 绑核(程序已支持 --core) 推荐
5.3 若无 RT 补丁且抖动不可接受:评估编译 aarch64 PREEMPT_RT 内核(源码 kernel.org + rt patch,交叉编译) 兜底
5.4 抖动向因分析:hwlatdetect/cyclictest 对照 诊断工具

阶段 6:文档与归档(0.5 天)

  • 新增 docs/d2000-bringup.md(环境档案、移植记录、与 J1900 的性能对照)
  • 更新三份主文档的适用范围章节;git 提交

3. 复用率评估

资产 复用程度
el6695_rt 源码(main.rs/bridge.rs) ~100%(唯一改动:默认网口名/可能的字节序检查——ARM 与 x86 同小端,无影响)
TwinCAT 工程与 PLC 验证程序 100%(复制副本改拓扑)
部署/诊断/监视脚本(20+ 个) ~90%(J1900 地址替换为 D2000 地址)
配置方法论(SM/PDO/blob/链接/激活顺序) 100%

4. 风险登记

# 风险 概率 缓解
R1 D2000 OS 无 PREEMPT_RT,抖动大(几十~几百 µs) 阶段 5.3 自编译 RT 内核;或先测后判,1kHz 场景通常可接受
R2 麒麟/UOS 老内核(4.19)与 ethercrab 兼容性 musl 静态;AF_PACKET 自 2.2 内核即有
R3 D2000 网口驱动不支持混杂/裸包或性能差 阶段 1.4 提前探测;备 USB 网卡
R4 跳板机#2 到 D2000 的 SSH 不稳定 串口兜底;长会话用 nohup+日志(既有模式)
R5 双链路并存时 TwinCAT 两张网卡/两段总线资源冲突 Q1 拓扑确认后评审

5. 里程碑

里程碑 判据
M1 D2000 SSH 通,环境档案完成(Q1Q4 全部答案)
M2 aarch64 二进制在 D2000 上 --mode probe 发现 EL6695
M3 链路 OP,8B bSync=True
M4 10 分钟零错误 + 抖动基线报告
M5 文档归档 + git 提交

6. 修订历史

日期 内容
2026-07-28 初版计划