飞腾 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.5–1 天,方法全部现成)
| # |
任务 |
复用资产 |
| 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.5–1 天)
| # |
措施 |
场景 |
| 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 通,环境档案完成(Q1–Q4 全部答案) |
⬜ 待硬件接入 |
| M2 |
aarch64 二进制构建成功 |
✅ 2026-08-06(见下) |
| M3 |
链路 OP,8B bSync=True |
⬜ |
| M4 |
10 分钟零错误 + 抖动基线报告 |
⬜ |
| M5 |
文档归档 + git 提交 |
⬜ |
M2 完成记录(2026-08-06)
rustup target add aarch64-unknown-linux-musl 曾因清华镜像缺该日期组件 404 且 RUSTUP_DIST_SERVER 环境变量被缓存清单吞掉;根因:~/.rustup/toolchains/<tc>/lib/rustlib/multirust-channel-manifest.toml 缓存清单内含 tuna 绝对 URL,替换为 https://static.rust-lang.org/dist/ 后安装成功。
cargo build --release --target aarch64-unknown-linux-musl 零代码改动通过(el6695-rt + xfc_probe),产物 ELF e_machine=0xB7 (AArch64),musl 静态,约 1MB。
- 构建配置固化:
.cargo/config.toml 已为两个 musl target 指定 rust-lld,不再需要 RUSTFLAGS 环境变量。
- 部署脚本:
scripts/d2000-deploy.ps1(构建→架构校验→scp→chmod),JumpHost/TargetHost 待 D2000 接入后填实际值。
6. 修订历史