ethercat-linux/docs/8b-test-report.md
Tony Cao 309aaba342 EL6695 8-byte bidirectional exchange with per-byte verification
- 8B PDO config: ULINT-sized payload, no 0x1A01 diag PDO on SM3
  (device rejected SM3=8 with diag assigned: 'size not allowed, min/max 0xa')
- twin_layout_blob_sized(): single 64-bit mapping entry for 8B payloads
- Ticker: per-byte XOR 0x5A transform in 8B mode so TwinCAT can verify
  every byte individually (1KB path unchanged, const-guarded)
- TwinCAT automation scripts: deploy with RPC retry, LinkVariables-based
  whole-array relink (element links only carry 1 byte), ADS watch, diag
- Docs: 8B design, verification methodology, test report
2026-07-27 19:01:05 +08:00

7.2 KiB

EL6695 8B 双向通讯 — 测试文档

版本: 1.0 日期: 2026-07-27 结论: 全部通过 配套文档: 8b-bridge-design.md8b-verification-methodology.md


1. 测试环境

1.1 硬件

TwinCAT PC Windows,TwinCAT 3.1.4026.24,网卡 "以太网 2" (TwinCAT-Intel PCI, MAC 00-15-17-8A-B3-DA)
目标 AmsNetId 169.254.176.217.1.1
E-bus EK1100 → EL2202 → EL1252 → EL2262 → EL2008 → EL6851-0010 → EL6022 → EL6695 → EL9011
J1900 Linux 6.6.135-rt74 (PREEMPT_RT), IP 192.168.68.100, eth1 直连 EL6695 X1
跳板机 tonycao@192.168.58.8(SSH 免密)

1.2 软件

位置
TwinCAT 工程 C:\Users\tonycao\work\twincat3-auto-cli\TwinCAT_EL6695_Primary\TwinCATProject1.sln
J1900 程序源码 C:\Users\tonycao\work\ethercat-linux(Rust, ethercrab 0.7 本地 patch)
J1900 程序(8B XOR 版) /root/gateway/el6695_rt_8b_xor
1KB 版备份 /root/gateway/el6695_rt_1k.bak;tsproj 备份 TwinCATProject1.tsproj.bak-1k

1.3 工具脚本(ethercat-linux/scripts/)

脚本 用途
tc-deploy-retry.ps1 打开工程 → 构建 → 激活 → 重启运行时(全 COM 调用带 RPC 重试)
tc-relink.ps1 LinkVariables API 重建整数组链接并激活
tc-ads-watch.ps1 ADS 循环采样 aOut1/aIn1/bSync/nMatchLag 并做 XOR 还原展示
tc-diag-online.ps1 导出 EtherCAT 主站在线 XML + PLC 变量
tc-errors.ps1 读取 TwinCAT 错误消息与 VS 错误列表
tc-open-project.ps1 在可见 XAE 中打开工程并连接目标(供人工查看 Online 页)

2. 测试步骤(复现流程)

2.1 部署 TwinCAT 配置

# 关闭残留 XAE,然后构建+激活+重启
Get-Process TcXaeShell -ErrorAction SilentlyContinue | Stop-Process -Force
powershell -NoProfile -ExecutionPolicy Bypass `
  -File C:\Users\tonycao\work\ethercat-linux\scripts\tc-deploy-retry.ps1
# 期望: build done (LastBuildInfo=0) / activated / restart issued

激活后校验 _Boot 中 EL6695 的实际配置(应见 SM2 len=8、SM3 len=8,且事件日志无 size not allowed):

python C:\Users\tonycao\work\ethercat-linux\tmp_check_boot.py
Get-WinEvent -LogName Application -MaxEvents 1000 |
  Where-Object { $_.TimeCreated -gt (Get-Date).AddMinutes(-5) -and $_.Message -match 'EL6695' }

2.2 启动 J1900 数据环

ssh -J tonycao@192.168.58.8 root@192.168.68.100 \
  "nohup /root/gateway/el6695_rt_8b_xor eth1 --mode ticker --duration 600 > /tmp/ticker_xor.log 2>&1 &"
# 期望日志: SM2/SM3 len=8 → SAFEOP achieved → OP achieved → running: ticker loop

注意顺序:必须先激活 TwinCAT,再启动 ticker(EL6695 固件在主站切换时擦除用户 OD,配置与数据循环须同一会话)。

2.3 采样验证

powershell -NoProfile -ExecutionPolicy Bypass `
  -File C:\Users\tonycao\work\ethercat-linux\scripts\tc-ads-watch.ps1

3. 测试结果

3.1 设备配置确认(激活后 _Boot tszip)

SM2: 001c08006400010003000000000000000000001c64010000   (start=0x1C00 len=8  ✓)
SM3: 008e08002000010004000000000000000200008e20010000   (start=0x8E00 len=8  ✓)
PDO 0x1608/0x1A08 条目: ARRAY [0..7] OF BYTE (GUID {FE565D85-927B-2D08-1043-124F5F921E35}) ✓
Windows 事件日志: 无 EL6695 错误 ✓

3.2 J1900 侧运行日志

SM2: start=0x1C00 len=8 ctrl=0x64 enable=0x00
SM3: start=0x8E00 len=8 ctrl=0x20 enable=0x00
>>> OP achieved! <<<
S tms=1000 cyc=1000 raw=62198 proc=435389 txe=0 rxe=0 stale=0% mono=0 cerr=0 mism=0
...
(120s 运行全程 stale=0%, txe=0, rxe=0)

3.3 TwinCAT 侧连续采样(24 秒,8 次)

# nCycles bSync lag aOut1 (发送, 8B) aIn1 (接收, 8B) aIn1^5A
1 343616 True 4 58-78-98-B8-D8-F8-18-38 02-22-C2-E2-82-A2-42-62 58-78-98-B8-D8-F8-18-38 ✓8/8
2 346668 True 4 38-58-78-98-B8-D8-F8-18 6D-0D-2D-CD-ED-8D-AD-4D byte0 时差 ±1
3 349688 True 4 04-24-44-64-84-A4-C4-E4 59-79-19-39-D9-F9-99-B9 byte0 时差 ±1
4 352710 True 4 DC-FC-1C-3C-5C-7C-9C-BC 84-A4-44-64-04-24-C4-E4 byte0 时差 ±2
5 355745 True 4 AD-CD-ED-0D-2D-4D-6D-8D F6-96-B6-56-76-16-36-D6 AC-CC-EC-0C-2C-4C-6C-8C ✓8/8
6 358768 True 4 7D-9D-BD-DD-FD-1D-3D-5D 27-C7-E7-87-A7-47-67-07 7D-9D-BD-DD-FD-1D-3D-5D ✓8/8
7 361792 True 4 58-78-98-B8-D8-F8-18-38 00-20-C0-E0-80-A0-40-60 byte0 时差 ±2
8 364829 True 4 2A-4A-6A-8A-AA-CA-EA-0A 73-13-33-D3-F3-93-B3-53 byte0 时差 ±1
  • nMismatch 在 24s 观测窗口内恒定不变(零新增失配;窗口前的累计值来自 ticker 未启动期间);
  • lag=4 全程稳定;
  • byte0 的 ±1/±2 差异为 ADS 分次读快照时差,见验证说明文档 §4.1。

3.4 XAE 在线人工核对

tc-open-project.ps1 打开工程后: I/O → 设备 1 (EtherCAT) → 模块 3 (EK1100) → 模块 10 (EL6695) → IO Inputs / IO Outputs → Online 页, 可见 8 个字节全部持续变化。


4. 测试项与结论

# 测试项 方法 结果
T1 TwinCAT 配置激活 tc-deploy-retry + tszip 解析 SM2/SM3=8B 保留,无事件错误
T2 J1900 侧到达 OP ticker 日志 SAFEOP/OP achieved
T3 TwinCAT→J1900 数据流 J1900 rx_buf 非零 + stale=0%
T4 J1900→TwinCAT 数据流 aIn1 整组历史环匹配
T5 8 字节逐一有效 逐字节图案 + XOR 还原比对 8/8
T6 软件处理证明 XOR 0x5A 变换
T7 桥接延迟测量 nMatchLag 4 周期恒定
T8 持续稳定性 24s bSync 全真 + nMismatch 零增长 + 120s J1900 零错误

5. 故障排查速查(本次实测遇到)

现象 检查点 命令/位置
aIn1 全 0 J1900 ticker 是否在跑(必须先激活 TwinCAT 再启动) `ssh -J ... "ps aux
SM3 被清零 / size not allowed 0x1A01 诊断 PDO 是否仍挂在 SM3 tsproj Index="#x1a01" 行不应有 SyncMan="3"
PDO 条目名被改回 [0..1023] 是否手写了 18071995-... 命名空间 GUID 改用 PLC 生成的随机 GUID 类型
只有 1 字节过 bridge 链接是否指向 [0] 元素 运行 tc-relink.ps1 重建链接
RPC_E_CALL_REJECTED VS 忙/模态 等 30s 重试;tc-list-vs-windows.ps1 查对话框
J1900 侧 layout_ok=false 预期内(8B 单条目映射与 1KB 校验规则不同),不影响数据 忽略

6. 回退到 1KB 配置

# 1. 恢复 tsproj
Copy-Item "C:\Users\tonycao\work\twincat3-auto-cli\TwinCAT_EL6695_Primary\TwinCATProject1.tsproj.bak-1k" `
          "C:\Users\tonycao\work\twincat3-auto-cli\TwinCAT_EL6695_Primary\TwinCATProject1.tsproj" -Force
# 2. 恢复 PLC 代码(GVL/MAIN 的 1024 数组与 1KB 校验逻辑)——从 git 历史或备份还原
# 3. 重新部署 + 重建链接
# 4. J1900 使用 1KB 二进制: /root/gateway/el6695_rt_1k.bak
# 5. J1900 源码恢复: git checkout src/main.rs src/bridge.rs 后改回 PAYLOAD_LEN=1024 相关常量重新编译

7. 修订历史

日期 内容
2026-07-27 初版:8B 双向交换全部测试通过