docs(review): 专家评审 2026-10-19

This commit is contained in:
cbb
2026-10-20 21:27:39 +08:00
parent eac3717f9a
commit 297c020a20
11 changed files with 290 additions and 0 deletions
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ECAT_BEAT_TAIL_REPORT.html 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《ECAT_BEAT_TAIL_REPORT.html》修订附录 2026-10-19</h1><div class="meta"><a href="../ECAT_BEAT_TAIL_REPORT.html">原报告</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>EtherCAT 单拍耗时 345µs→124µs:改动原理与验证<br><b>时间线:</b>调查 2026-09-11,修订 2026-09-12;入库 209a869(09-12)→ 9bb804e(09-13)→ 归档 beeae8a(09-21)<br><b>原结论概要:</b>单拍从 345µs 降到 124µs 的事实成立,但『win 布局固有成本/密排省 220µs』的归因在 09-12 被自我更正(09-08 存量扫描 win 布局同为 124.6µs);并提出刷写≠生效、前端槽位常量与跳拍卡读数等配套改动。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>BT-1</td><td>前端每 PDO 电机槽数与扫描拍数按 dense 布局改(MOT_SLOTS_PER_PDO=9、MOTOR_SCAN_CYCLES=1)</td><td class="st st-ok">已修复</td><td><code>js/motor/transport-ecat.js:57, 88</code></td><td></td></tr><tr><td>BT-2</td><td>测速页跳拍卡改读 cyc_us.late/lost</td><td class="st st-ok">已修复</td><td><code>lab/spi_test.html:506, 1522-1534, 2154-2167</code></td><td></td></tr><tr><td>BT-3</td><td>刷写≠生效:flash_gd32.py 增加生效守卫</td><td class="st st-old">已过时</td><td><code>—(beeae8a 随 scripts 收敛删除)</code></td><td>网页 WiFi 中继路径无替代版本比对,见新问题 H-6;ECAT 直灌有 0x100A 比对(boot_ecat.js:629-632, 792-794)</td></tr><tr><td>BT-4</td><td>345µs 归因:win 布局固有成本 vs 主站 97fab23 回归,需一次刷板钉死实验</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>涉及固件布局与 ecat_native.c,不在本仓</td></tr><tr><td>BT-5</td><td>0.25ms 档实测列为待办</td><td class="st st-open">仍存在</td><td><code>js/common/ecat-bus.js:28</code></td><td>默认已是 0.25ms 却无复测记录,见 H-5</td></tr><tr><td>BT-6</td><td>报告引用 lab/ecat_rate_sweep.csv 等证据数据</td><td class="st st-old">已过时</td><td><code>—</code></td><td>数据随归档删除,报告不可复现,见 H-7</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s2b" id="H-6"><h4><span class="sev s2">一般</span> [H-6] GD32 WiFi 中继刷写缺『刷写≠生效』版本比对,守卫脚本已删除</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>js/ota/upload-gd32.js; js/ota/stages.js:497-499</code></dd><dt>现象</dt><dd>ECAT 直灌有 0x100A 刷前后比对,WiFi 中继路径没有;原 flash_gd32.py 生效守卫随 beeae8a 删除。</dd><dt>风险</dt><dd>刷写成功但未生效不被发现。</dd><dt>修改建议</dt><dd>中继完成后读取 APP 版本比对。</dd></dl></div><div class="issue s3b" id="H-7"><h4><span class="sev s3">建议</span> [H-7] 报告中的资源与脚本链接随归档失效</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>docs/reports/ECAT_RATE_TRADEOFF.md; docs/reports/ecat_integral_report.html; docs/reports/REPORT_ecat_skip_opt_20260917.md</code></dd><dt>现象</dt><dd>lab/*.png、lab/*.csv、ecat_calib.json、sweep/plot/build 脚本与 scripts/skip_*.py 在 beeae8a 删除,报告不可复现。</dd><dt>风险</dt><dd>无法复核结论。</dd><dt>修改建议</dt><dd>把关键数据与脚本归档到 docs/reports/assets/ 或标注出处 commit。</dd></dl></div><h2>结论</h2><div class="card">共 6 条:已修复 2、部分修复 0、仍存在/存疑 1、已过时 2、无法在本仓库核实 1。</div></div></body></html>
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ECAT_RATE_TRADEOFF.html 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《ECAT_RATE_TRADEOFF(.html + .md)》修订附录 2026-10-19</h1><div class="meta"><a href="../ECAT_RATE_TRADEOFF.html">原报告</a> · <a href="../ECAT_RATE_TRADEOFF.md">原报告 .md</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>EtherCAT 周期档位取舍<br><b>时间线:</b>入库 81096d0(09-10)→ 209a869(09-12)→ 归档 beeae8a(09-21)<br><b>原结论概要:</b>扫描 0.125~4ms 各档周期的达成率与跳拍,建议生产停在 0.5ms,称 0.25ms 在带 CAN 工况下功能损坏;指出周期可被 localStorage 覆盖。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>RT-1</td><td>建议周期停在 0.5ms,0.25ms 为功能损坏</td><td class="st st-open">仍存在</td><td><code>js/common/ecat-bus.js:28; js/motor/transport-ecat.js:428-431</code></td><td>代码默认 0.25ms,建议未采纳且无复测依据(H-5)</td></tr><tr><td>RT-2</td><td>周期可被 localStorage 覆盖(原 :227-228)</td><td class="st st-open">仍存在</td><td><code>js/motor/transport-ecat.js:167, 428-430</code></td><td>设计如此,但应在 UI 明示并限定合法档位</td></tr><tr><td>RT-3</td><td>drop 口径、fillRxWindow 计时待办</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>属固件/native 侧</td></tr><tr><td>RT-4</td><td>sweep_ecat_rate.py / calibrate_ecat_metrics.py / plot_* / build_ecat_report_html.py 与图表数据</td><td class="st st-old">已过时</td><td><code>—</code></td><td>beeae8a 删除,.md 中图片链接失效(H-7)</td></tr><tr><td>RT-5</td><td>注释/README 称默认 4ms 由后端决定</td><td class="st st-open">仍存在</td><td><code>js/motor/transport-ecat.js:166, 416-417; README.md:190</code></td><td>文档与代码不符(H-4)</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s1b" id="H-5"><h4><span class="sev s1">严重</span> [H-5] 默认 ECAT 周期 0.25 ms 与既有报告建议冲突且缺复测依据</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>js/common/ecat-bus.js:28; js/motor/transport-ecat.js:428-431</code></dd><dt>现象</dt><dd>ECAT_RATE_TRADEOFF 建议 0.5 ms(称 0.25 ms 为功能损坏),REPORT_ecat_skip_opt 建议生产 2 ms;代码默认 0.25 ms,仓库无带 CAN 工况的 0.25 ms 复测证据(BEAT_TAIL 自列为待办)。</dd><dt>风险</dt><dd>高负载下丢拍/跳拍、控制抖动。</dd><dt>修改建议</dt><dd>补带 CAN 工况复测并在报告中记录;若无证据,默认回到 0.5 ms。</dd></dl></div><div class="issue s2b" id="H-4"><h4><span class="sev s2">一般</span> [H-4] 注释/文档与代码不符(默认周期等)</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>js/motor/transport-ecat.js:37, 166, 416-417, 607; README.md:190</code></dd><dt>现象</dt><dd>注释写 supportsOta=false,实际 :607 为 true;注释与 README 写『默认 4 ms 由后端决定/删键跟随后端』,实际回落 0.25 ms。</dd><dt>风险</dt><dd>误导调参与维护。</dd><dt>修改建议</dt><dd>统一以 ecat-bus.js 常量为准并修正文档。</dd></dl></div><div class="issue s3b" id="H-7"><h4><span class="sev s3">建议</span> [H-7] 报告中的资源与脚本链接随归档失效</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>docs/reports/ECAT_RATE_TRADEOFF.md; docs/reports/ecat_integral_report.html; docs/reports/REPORT_ecat_skip_opt_20260917.md</code></dd><dt>现象</dt><dd>lab/*.png、lab/*.csv、ecat_calib.json、sweep/plot/build 脚本与 scripts/skip_*.py 在 beeae8a 删除,报告不可复现。</dd><dt>风险</dt><dd>无法复核结论。</dd><dt>修改建议</dt><dd>把关键数据与脚本归档到 docs/reports/assets/ 或标注出处 commit。</dd></dl></div><h2>结论</h2><div class="card">共 5 条:已修复 0、部分修复 0、仍存在/存疑 3、已过时 1、无法在本仓库核实 1。</div></div></body></html>
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>GD32_OTA_FLOW_COMPARE.html 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《GD32_OTA_FLOW_COMPARE.html》修订附录 2026-10-19</h1><div class="meta"><a href="../GD32_OTA_FLOW_COMPARE.html">原报告</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>GD32 刷写流程对比:ESP32 中继(老)× EtherCAT 直灌(新)<br><b>时间线:</b>报告日期 2026-09-13;入库 383535b(09-20)→ 归档 beeae8a<br><b>原结论概要:</b>对比老流程(WiFi→ESP32 中继→SPI,2604 次往返)与新流程(EtherCAT CoE SDO,527 帧),结论为新流程是『少一层先决条件』的刷法,当时 0 次上板实测,且刷运行中 APP 的机器尚不支持。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>OF-1</td><td>新流程 0 次上板实测</td><td class="st st-old">已过时</td><td><code>js/ota/boot_ecat.js:55-58, 307-322</code></td><td>EtherCAT 直灌已移植入本仓(d73e2fb 起),注释含 2026-10-12/13 实测记录</td></tr><tr><td>OF-2</td><td>正在跑 APP 的机器还不能直接刷</td><td class="st st-part">部分修复</td><td><code>js/ota/boot_ecat.js:663-676</code></td><td>主机侧已写 CoE 0x2502:00=1 交接;固件侧无法核实</td></tr><tr><td>OF-3</td><td>刷前刷后 0x100A 版本比对</td><td class="st st-ok">已修复</td><td><code>js/ota/boot_ecat.js:629-632, 792-794</code></td><td></td></tr><tr><td>OF-4</td><td>4 字节对齐补 0xFF</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>发生在 native 侧</td></tr><tr><td>OF-5</td><td>固件 OTA.cpp 尾巴丢弃缺陷</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>固件仓</td></tr><tr><td>OF-6</td><td>老流程无断点续传,每次从偏移 0 重写</td><td class="st st-open">仍存在</td><td><code>js/ota/upload-esp32.js:213-247</code></td><td>整文件 POST 且内存双份(O-15)</td></tr><tr><td>OF-7</td><td>报告引用行号 upload-gd32.js:58,194</td><td class="st st-old">已过时(行号漂移)</td><td><code>js/ota/upload-gd32.js:67-68; js/ota/file-handle.js:458, 563</code></td><td>file-handle 引用仍有效</td></tr><tr><td>OF-8</td><td>两条路互为备份、复用同一 flash 写入者</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>前端侧两条路缺统一互斥,见新问题 O-1(致命)</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s0b" id="O-1"><h4><span class="sev s0">致命</span> [O-1] 同一块 GD32 可被两条通道同时刷写</h4><dl><dt>模块</dt><dd>OTA/刷写</dd><dt>位置</dt><dd><code>js/ota/session.js:128; js/ota/boot_ecat.js:176-189, 576-577; js/ota/console-mode.js:67, 120; js/ota/ecat_load.js:114-117; js/ota/upload-esp32.js:62-91; js/ble/transfer.js:457-472</code></dd><dt>现象</dt><dd>WiFi 上传进入 VERIFYING/RELAYING 后 window.isUploading 置 false;依赖它的所有忙判(ECAT 按钮、模式切换、ECAT 负载轮询)都放行。bootEcatFlash 只查 bootEcatBusy;startUpload 与 BLE autoFlash 从不查 bootEcatBusy。</dd><dt>风险</dt><dd>ESP32 正经 SPI 中继写 GD32 时,ECAT 或 BLE 又开始刷同一芯片,Flash 内容交错,设备变砖。</dd><dt>修改建议</dt><dd>建立唯一的 flashBusy 互斥(跨帧共享,含 WiFi/中继/BLE/ECAT 全阶段),所有入口统一检查;isUploading 仅作 UI 用途。</dd></dl></div><div class="issue s3b" id="O-15"><h4><span class="sev s3">建议</span> [O-15] 大量 window.* 全局、猴补 showOpenFilePicker、内存复制</h4><dl><dt>模块</dt><dd>OTA/刷写</dd><dt>位置</dt><dd><code>js/ota/console-mode.js:170-199; js/ota/upload-esp32.js:213-247; js/ota/progress.js:177; js/ota/upload-gd32.js:85-104</code></dd><dt>现象</dt><dd>上传体为完整文件再复制一份;失败清理写死按钮文案;存在 FAILED→DONE 转移路径。</dd><dt>风险</dt><dd>可维护性差,状态机可出现非法转移。</dd><dt>修改建议</dt><dd>收敛状态机转移表;模块化状态;流式上传。</dd></dl></div><h2>结论</h2><div class="card">共 8 条:已修复 1、部分修复 1、仍存在/存疑 1、已过时 2、无法在本仓库核实 3。</div></div></body></html>
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>REPORT_ecat_skip_opt_20260917.md 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《REPORT_ecat_skip_opt_20260917.md》修订附录 2026-10-19</h1><div class="meta"><a href="../REPORT_ecat_skip_opt_20260917.md">原报告</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>EtherCAT 跳拍优化实验报告<br><b>时间线:</b>2026-09-17;入库 e91d53e → 归档 beeae8a<br><b>原结论概要:</b>按性价比列出跳拍优化:网卡协议绑定/高级属性、ecat_native 进程提到 RealTime、主站二进制替换;给出回滚命令与标定脚本,建议生产用 2ms。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>SK-1</td><td>ecat_native 提权为 RealTime</td><td class="st st-part">部分修复</td><td><code>ecat_proc.py:97-120, 273-276</code></td><td>仅新拉起进程提权;复用实例分支 :212-215 不提权;且 REALTIME 有饿死系统线程风险(P-7)</td></tr><tr><td>SK-2</td><td>生产建议 2ms</td><td class="st st-open">仍存在</td><td><code>js/common/ecat-bus.js:28</code></td><td>默认 0.25ms,与建议冲突(H-5)</td></tr><tr><td>SK-3</td><td>第四节回滚命令依赖 scripts/skip_*.py</td><td class="st st-old">已过时</td><td><code>—</code></td><td>脚本已删除,回滚步骤不可直接执行</td></tr><tr><td>SK-4</td><td>I210 协议绑定/高级属性调整</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>属主机网卡配置</td></tr><tr><td>SK-5</td><td>标定/实验脚本(第五节)</td><td class="st st-old">已过时</td><td><code>—</code></td><td>已出库(H-7)</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s1b" id="H-5"><h4><span class="sev s1">严重</span> [H-5] 默认 ECAT 周期 0.25 ms 与既有报告建议冲突且缺复测依据</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>js/common/ecat-bus.js:28; js/motor/transport-ecat.js:428-431</code></dd><dt>现象</dt><dd>ECAT_RATE_TRADEOFF 建议 0.5 ms(称 0.25 ms 为功能损坏),REPORT_ecat_skip_opt 建议生产 2 ms;代码默认 0.25 ms,仓库无带 CAN 工况的 0.25 ms 复测证据(BEAT_TAIL 自列为待办)。</dd><dt>风险</dt><dd>高负载下丢拍/跳拍、控制抖动。</dd><dt>修改建议</dt><dd>补带 CAN 工况复测并在报告中记录;若无证据,默认回到 0.5 ms。</dd></dl></div><div class="issue s1b" id="P-7"><h4><span class="sev s1">严重</span> [P-7] ecat_native 提到 REALTIME 优先级,配合自旋线程可能拖死系统;复用实例不提权</h4><dl><dt>模块</dt><dd>主机服务/安全</dd><dt>位置</dt><dd><code>ecat_proc.py:96-121, 212-215, 273-276</code></dd><dt>现象</dt><dd>新拉起进程设 REALTIME_PRIORITY_CLASS;README 称循环为自旋+TIME_CRITICAL。复用已有实例分支不设置(行为不一致)。</dd><dt>风险</dt><dd>饿死同核系统线程,UI 冻结后无法下达停机;不同启动路径实时性不一致。</dd><dt>修改建议</dt><dd>改用 HIGH_PRIORITY_CLASS + 线程亲和性绑核;如需 REALTIME,确保至少留一核并在复用路径一致处理。</dd></dl></div><div class="issue s3b" id="H-7"><h4><span class="sev s3">建议</span> [H-7] 报告中的资源与脚本链接随归档失效</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>docs/reports/ECAT_RATE_TRADEOFF.md; docs/reports/ecat_integral_report.html; docs/reports/REPORT_ecat_skip_opt_20260917.md</code></dd><dt>现象</dt><dd>lab/*.png、lab/*.csv、ecat_calib.json、sweep/plot/build 脚本与 scripts/skip_*.py 在 beeae8a 删除,报告不可复现。</dd><dt>风险</dt><dd>无法复核结论。</dd><dt>修改建议</dt><dd>把关键数据与脚本归档到 docs/reports/assets/ 或标注出处 commit。</dd></dl></div><h2>结论</h2><div class="card">共 5 条:已修复 0、部分修复 1、仍存在/存疑 1、已过时 2、无法在本仓库核实 1。</div></div></body></html>
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ecat_integral_report.html 修订附录 2026-10-19</title><style>
body{font-family:-apple-system,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;margin:0;background:#f5f6f8;color:#1d2330;line-height:1.6}
.wrap{max-width:1180px;margin:0 auto;padding:28px 24px 60px}
h1{font-size:26px;margin:0 0 6px}h2{font-size:20px;margin:36px 0 12px;padding-bottom:6px;border-bottom:2px solid #d9dee8}
h3{font-size:16px;margin:22px 0 8px}
.meta{color:#5b6476;font-size:13px}
.card{background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:16px 18px;margin:12px 0}
table{border-collapse:collapse;width:100%;background:#fff;font-size:13px;margin:8px 0}
th,td{border:1px solid #e1e5ec;padding:6px 8px;vertical-align:top;text-align:left}
th{background:#eef1f6;font-weight:600}
code{font-family:Consolas,Menlo,monospace;font-size:12px;background:#f0f2f6;padding:1px 4px;border-radius:3px;word-break:break-all}
.sev{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff;white-space:nowrap}
.s0{background:#b3261e}.s1{background:#e8710a}.s2{background:#3367d6}.s3{background:#5f6b7a}
.kpis{display:flex;gap:12px;flex-wrap:wrap}.kpi{flex:1;min-width:130px;background:#fff;border:1px solid #e1e5ec;border-radius:10px;padding:12px 14px}
.kpi b{display:block;font-size:26px}
.issue{background:#fff;border:1px solid #e1e5ec;border-left:5px solid #ccc;border-radius:8px;padding:12px 16px;margin:10px 0}
.issue.s0b{border-left-color:#b3261e}.issue.s1b{border-left-color:#e8710a}.issue.s2b{border-left-color:#3367d6}.issue.s3b{border-left-color:#5f6b7a}
.issue h4{margin:0 0 6px;font-size:15px}.issue dl{margin:0;display:grid;grid-template-columns:72px 1fr;gap:3px 10px;font-size:13px}
.issue dt{color:#5b6476}.issue dd{margin:0}
.st{white-space:nowrap;font-weight:600}.st-ok{color:#1e7e34}.st-part{color:#b26a00}.st-open{color:#b3261e}.st-na{color:#5f6b7a}.st-old{color:#6b4fbb}
pre.arch{background:#1f2430;color:#e6e9ef;padding:14px;border-radius:8px;overflow:auto;font-size:12.5px;line-height:1.45}
a{color:#2457c5}
.note{font-size:12.5px;color:#5b6476}
</style></head><body><div class="wrap"><h1>《ecat_integral_report.html》修订附录 2026-10-19</h1><div class="meta"><a href="../ecat_integral_report.html">原报告</a> · 核对基线 commit <code>eac3717</code> · 总评审:<a href="../../review/DCU_DesktopController_专家评审_2026-10-19.html">DCU_DesktopController_专家评审_2026-10-19.html</a></div><div class="card"><b>原报告:</b>对接电机 2/3:积分差是谁造成的?<br><b>时间线:</b>入库 27a8fc1(09-21)→ 归档 beeae8a<br><b>原结论概要:</b>基于 lab/ecat_passive_latest.csv(0.25ms 周期)的离线分析:两台电机巡航速度一致,积分差主要出现在停车/换向沿;给出统一减速段、负载对称、v2+v3 纠偏、序列 hold 足够长等标定建议。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>IN-1</td><td>数据源 lab/ecat_passive_latest.csv</td><td class="st st-old">已过时</td><td><code>—</code></td><td>CSV 不在仓库,报告不可复现(H-7)</td></tr><tr><td>IN-2</td><td>结论:积分差大头在停车段</td><td class="st st-open">存疑</td><td><code>docs/reports/ecat_integral_report.html(附带脚本输出)</code></td><td>附带 JSON 的 main_source_of_integral_error=起动段、who_lags_at_stop=N2,与正文『N3 停车更拖』相矛盾(H-8)</td></tr><tr><td>IN-3</td><td>建议④ 序列 hold 不短于两台都停稳时间</td><td class="st st-open">仍存在</td><td><code>js/motor/seq.js:95</code></td><td>holdMs 范围 0~600000,无『停稳确认』机制;且序列重启存在并发循环(M-4)</td></tr><tr><td>IN-4</td><td>建议①~③ 统一减速段、对称负载、v2+v3 纠偏</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>属固件控制器</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s0b" id="M-4"><h4><span class="sev s0">致命</span> [M-4] 序列停止后立即重启会出现两个并发执行循环</h4><dl><dt>模块</dt><dd>电机控制/故障保护</dd><dt>位置</dt><dd><code>js/motor/seq.js:431-447, 449-455, 461-504</code></dd><dt>现象</dt><dd>stopSeq 只置 running=false、stopRequested=true,不等待旧循环退出,也无代次令牌;startSeq 又把 running=true、stopRequested=false。旧循环若正处于 await sleep(holdMs)(最长 600 s)醒来后看到 running 仍为 true 便继续执行。</dd><dt>风险</dt><dd>两个循环交错下发不同步骤,电机运动序列错乱。</dd><dt>修改建议</dt><dd>引入 runId/generation:startSeq 自增,循环每个 await 后校验 myId===seq.runId;或 stopSeq 返回 Promise,待旧循环退出后才允许重启;sleep 改为可中断(AbortSignal)。</dd></dl></div><div class="issue s2b" id="H-8"><h4><span class="sev s2">一般</span> [H-8] ecat_integral_report 结论与其附带脚本输出自相矛盾</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>docs/reports/ecat_integral_report.html</code></dd><dt>现象</dt><dd>正文称积分差大头在『停车段』、N3 停车更拖;附带脚本 JSON 却为 main_source_of_integral_error=起动段(phase on 3.54 &gt; stop 1.09),who_lags_at_stop=N2,plain 中又写『N3 停车更拖』。</dd><dt>风险</dt><dd>依据该报告调参可能方向错误。</dd><dt>修改建议</dt><dd>重跑脚本核对口径(均值 vs 绝对值均值)并修正结论。</dd></dl></div><div class="issue s3b" id="H-7"><h4><span class="sev s3">建议</span> [H-7] 报告中的资源与脚本链接随归档失效</h4><dl><dt>模块</dt><dd>仓库卫生/文档</dd><dt>位置</dt><dd><code>docs/reports/ECAT_RATE_TRADEOFF.md; docs/reports/ecat_integral_report.html; docs/reports/REPORT_ecat_skip_opt_20260917.md</code></dd><dt>现象</dt><dd>lab/*.png、lab/*.csv、ecat_calib.json、sweep/plot/build 脚本与 scripts/skip_*.py 在 beeae8a 删除,报告不可复现。</dd><dt>风险</dt><dd>无法复核结论。</dd><dt>修改建议</dt><dd>把关键数据与脚本归档到 docs/reports/assets/ 或标注出处 commit。</dd></dl></div><h2>结论</h2><div class="card">共 4 条:已修复 0、部分修复 0、仍存在/存疑 2、已过时 1、无法在本仓库核实 1。</div></div></body></html>