EtherCAT 周期速度 × 故障率 × CPU 占用 调研

调研日期 2026-09-08 · 本机 I210 + 1 个 GD32E508 从站 · 两轮扫描:带 CAN / 拔掉全部 CAN · 数据 lab/ecat_rate_sweep_*.csv · 生成器 scripts/build_ecat_report_html.py
0.5ms实测可用上限(2kHz,带 CAN 工况)
≈9.0ppCAN 每拍恒定负担(3 档配对,饱和档除外)
4000 帧/s电机 STATUS 实测刷新(1/0.5ms)
≈8.2kHz纯 ECAT 实测硬上限(设 10/12.5/16kHz 实测均不涨)

结论

一、曲线

① 循环率:设定 vs 实测(主站侧)
2005001,0002,0005,00010,00020,0002005001,0002,0005,00010,00020,00097.2%98.0%51.2%82.3%65.9%理想 1:1(设定率)实测循环率 · 带 CAN实测循环率 · 无 CAN标注为达成率%(<99.5% 才标)。无 CAN 设定 >8kHz 后实测全顶在 ≈8.2kHz —— 硬上限设定循环率 (Hz,对数)实测循环率 (Hz,对数)
② 从站每拍负担:带 CAN vs 无 CAN
025.050.075.01002005001,0002,0005,00010,000100%Δ9.3ppΔ9.1ppΔ8.7pp带 CAN(电机在报 STATUS/CONFIG)拔掉全部 CAN 设备纵轴是固件 load_perm(只计 ISR+非延迟段,排除 SSC 轮询)—— 不是整机 CPU 占用率无 CAN 补测:0.25/0.125ms 满速;设定再快实测全顶在 ≈8.2kHz。≥4kHz 的负载读数全是饱和值,不能定位拐点带 CAN 的 0.25/0.125ms 两点同理停在 ~99.x% —— 饱和读数不等于"已测到上限"实测循环率 (Hz,对数)从站 load_perm (%)
③ CAN 流量分层:STATUS 刷新与 CONFIG 事件流
10.020.050.01002005001,0002,0005,00010,00020,0002005001,0002,0005,00010,000带 CAN 轮:STATUS 全流量塌陷CAN 总接收 rx_count ≡ STATUS 刷新 gseq(实测同为 ~4000/s)CONFIG 事件流独立实测仅约 92 帧/s(去重后),不随周期放大>2kHz 处 STATUS 与 CONFIG 一同塌到 ~150/s实测循环率 (Hz,对数)帧/s(对数)
④ 主站错拍率
0.100.200.5012510.020.050.01002005001,0002,0005,00010,00020,0005001,0002,0005,00010,000带 CAN无 CAN▽ = skip ≤0.05 次/s(真 0 档,不在对数刻度上)skip=错过的网格拍。0.0625ms 设定档 15720 次/s:实测率被钉在 8.2kHz,错拍数随设定率线性涨实测循环率 (Hz,对数)主站错拍 skip_total (次/s,对数)

名词解释(表里这几个计数器到底是什么)

二、数据全表

带 CAN(主结论轮)

周期实测Hz达成率从站loadCAN接收/sskip/swkc在线
4ms24999.7%20.2%3,9870.023/3未记录*
2ms49999.7%28.3%3,9900.083/3未记录*
1ms99899.8%44.5%3,9921.103/3未记录*
0.5ms1,999100.0%76.7%3,99511.863/3未记录*
0.25ms3,98999.7%99.7%15998.613/3未记录*
0.125ms7,78097.2%99.3%1905,106.623/3未记录*

拔掉全部 CAN 设备(补测轮)

周期实测Hz达成率从站loadCAN接收/sskip/swkc在线
2ms49999.7%19.0%00.083/30.00
1ms99899.8%35.4%00.583/30.00
0.5ms2,000100.0%68.0%017.083/30.00
0.25ms3,98899.7%99.4%039.723/30.00
0.125ms7,83998.0%98.8%04,672.073/30.00
0.0625ms8,19651.2%99.0%015,720.463/30.00
0.1ms8,23282.3%98.9%010,039.193/30.00
0.08ms8,23865.9%98.9%012,282.873/30.00

* 「在线」列是扫描脚本后来才加的(motors_online/online_frac),带 CAN 那轮跑在加列之前,逐档数据没采 —— 不是全部掉线。该轮电机在线另有 8s/档定点实测(「电机数据刷新率」表)佐证。

电机数据刷新率(带 CAN 轮,8s/档定点实测)

周期刷新率 帧/s判定
1ms4,000.2正常
0.5ms4,000.2正常
0.25ms87.9塌陷
0.125ms147.5塌陷

这是唯一直接回答"用户还能不能用"的指标 —— λ 与 drop 都是中间量。塌陷两档当场确认 online=True,故为真失效而非掉线。

三、机理与上限推算

上限已实测:≈8.2kHz,墙是单拍 ≈121µs 的硬耗时

证据链:无 CAN 设定 0.25 → 0.0625ms 五档,实测循环率在 ≤0.125ms (8kHz)前跟随设定,再快就被钉死在 8196–8238Hz;与此同时主站单拍耗时 cyc p50 在所有档位(含 2ms 慢档)恒为 117–126µs,1/121µs ≈ 8.2kHz,与顶墙实测严丝合缝。即:每拍有一段不可压缩的「发送→从站处理→回读+主站处理」往返时间,周期设定小于它时就堵在这里。

排除项:不是主机 CPU 不够 —— 顶墙档主机 CPU 只有 ~85%(自旋等待占比变小);不是从站拒答 —— wkc 全程 3/3。load_perm 在 ≥4kHz 全饱和 99.x%,既定位不了拐点也喂不准模型,早先「两项模型 load=F/T+R → 2.7/3.5kHz」的外推已被满速补测证伪,仅留档。

未闭合的一处:121µs 里主站协议栈与从站 ESC/固件各占多少,本轮数据分不开 —— 需给固件 fillRxWindow 加直接计时(固件改动,需批准)或抓总线帧时序才能归因。

四、判据口径与踩过的坑

仪表陷阱(每条都实际踩过)

五、可信度边界

这份数据不能证明什么

六、下一步

按优先级

本报告由 scripts/build_ecat_report_html.py 从 lab/*.csv 与 lab/ecat_calib.json 现场渲染,图中每个数值均从原始数据计算,未手抄。native 实时:op=1 loop=1 wkc=3 period=1.0ms。Markdown 版(含同源结论):ECAT_RATE_TRADEOFF.md。