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
File diff suppressed because one or more lines are too long
@@ -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-rx-stuck.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>《ecat-rx-stuck.md》修订附录 2026-10-19</h1><div class="meta"><a href="../ecat-rx-stuck.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 从机帧接收异常(输入全 0 / 发帧后才流动)<br><b>时间线:</b>status: in-progress,2026-09-16(e91d53e)<br><b>原结论概要:</b>根因在从站 SSC SM-Synchron 下应用未被唤醒;主站进 OP 后用 dlc=0 + seq 沿踢帧并放宽活性判据,从站救援路径先 Process 再 InputMapping(1.6.42)。T1~T3 均已勾选。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>RX-1</td><td>主站 OP 后 seq 沿踢帧 + 活性判据加宽</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>ecat_native.c 不在本仓</td></tr><tr><td>RX-2</td><td>从站新鲜度救援先 Process 再 InputMapping</td><td class="st st-na">无法在本仓库核实</td><td><code>—</code></td><td>固件仓</td></tr><tr><td>RX-3</td><td>规格状态仍为 in-progress,但 T1~T3 已勾选</td><td class="st st-open">仍存在</td><td><code>docs/compose/spec/ecat-rx-stuck.md:3</code></td><td>建议改为 delivered 或注明剩余事项</td></tr></table><h2>结论</h2><div class="card">共 3 条:已修复 0、部分修复 0、仍存在/存疑 1、已过时 0、无法在本仓库核实 2。</div></div></body></html>
File diff suppressed because one or more lines are too long
@@ -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>pdo-fast-send.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>《pdo-fast-send.md》修订附录 2026-10-19</h1><div class="meta"><a href="../pdo-fast-send.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>PDO 快发(网页按钮 → 原生入队二进制直通)<br><b>时间线:</b>status: delivered,2026-09-23(2c6235d)<br><b>原结论概要:</b>桌面 APP 下 ECAT 电机发送强制走 ESF1 TCP 快发,堵死 HTTP/JSON 慢发回落;失败可重探端口后再试 TCP 一次。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>FS-1</td><td>Python 桥 ESF1 仅走 TCP,无 HTTP 回落</td><td class="st st-ok">已修复(已交付)</td><td><code>ecat_client.py:231-287</code></td><td></td></tr><tr><td>FS-2</td><td>前端 sendViaFastOrJson 有桥时只调快发</td><td class="st st-ok">已修复(已交付)</td><td><code>js/motor/transport-ecat.js:282-300</code></td><td></td></tr><tr><td>FS-3</td><td>失败重探端口后再试 TCP 一次</td><td class="st st-open">仍存在风险</td><td><code>ecat_client.py:247-279</code></td><td>sendall 成功后 recv 失败也会重发,同一帧可能入队两次(P-2,致命)</td></tr><tr><td>FS-4</td><td>堵死慢发原则</td><td class="st st-part">部分修复</td><td><code>js/motor/transport-ecat.js:259-271</code></td><td>低频路径(motor/send、motor/start)桥失败仍回落 HTTP(M-8)</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s0b" id="P-2"><h4><span class="sev s0">致命</span> [P-2] ESF1 快发在 sendall 成功后出错仍整包重发</h4><dl><dt>模块</dt><dd>主机服务/安全</dd><dt>位置</dt><dd><code>ecat_client.py:247-279</code></dd><dt>现象</dt><dd>_tcp_once 持锁 sendall(body) 后读 8 字节 FSOK;recv 超时/断连抛异常时 attempt 0 会 continue,attempt 1 再发同一 body。与同文件非幂等不重发原则(_ECAT_IDEMPOTENT_TAILS)矛盾。</dd><dt>风险</dt><dd>同一帧运动指令被 native 入队两次,电机执行两次增量/相对命令。</dd><dt>修改建议</dt><dd>仅当 connect 阶段失败时重试;sendall 之后的任何异常直接返回 ok:false(可附 maybe_sent 标记)。</dd></dl></div><div class="issue s1b" id="M-8"><h4><span class="sev s1">严重</span> [M-8] ECAT 桥失败回落 HTTP,非幂等命令可能执行两次</h4><dl><dt>模块</dt><dd>电机控制/故障保护</dd><dt>位置</dt><dd><code>js/motor/transport-ecat.js:259-271; js/common/desktop-bridge.js:59-74</code></dd><dt>现象</dt><dd>低频路径(motor/send、motor/start 等)在桌面桥失败或超时后无条件回落 HTTP 再发一次;desktopEcatPost/desktopEcatSendRaw 在 JS 侧无超时。</dd><dt>风险</dt><dd>桥已把命令送达 native 但响应超时时,HTTP 再送一次,造成重复运动指令/重复 start;与 pdo-fast-send『堵死慢发』原则冲突。</dd><dt>修改建议</dt><dd>按 ecat_client.py 的幂等白名单处理:非幂等尾部仅在确认未送达(连接失败)时回落;JS 桥调用加 Promise.race 超时。</dd></dl></div><h2>结论</h2><div class="card">共 4 条:已修复 2、部分修复 1、仍存在/存疑 1、已过时 0、无法在本仓库核实 0。</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>tab-keepalive.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>《tab-keepalive.md》修订附录 2026-10-19</h1><div class="meta"><a href="../tab-keepalive.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>Tab Keep-Alive(多 iframe 常驻)<br><b>时间线:</b>status: delivered,2026-09-16(eaafee1 / be26f4d)<br><b>原结论概要:</b>tabs.html 一标签一懒创建 iframe,visibility 切换不销毁文档;注入的 F5/⟳ 只刷新激活帧;明确不做后台降频。<p class="note">原文件保持不变;本附录逐条记录其结论在当前代码中的状态。</p></div><h2>逐条结论跟踪</h2><table><tr><th>编号</th><th>原结论 / 建议</th><th>当前状态</th><th>证据(文件:行号)</th><th>备注</th></tr><tr><td>TK-1</td><td>多 iframe 宿主 + visibility 切换</td><td class="st st-ok">已修复(已交付)</td><td><code>tabs.html:70-81, 100, 113</code></td><td></td></tr><tr><td>TK-2</td><td>F5/⟳ 只 reload .page-frame.active</td><td class="st st-ok">已修复(已交付)</td><td><code>esp32_server.py:126, 150, 166</code></td><td></td></tr><tr><td>TK-3</td><td>不做后台页降频(Out of Scope)</td><td class="st st-open">仍存在风险</td><td><code>tabs.html:76-81; js/common/polling.js:350-352</code></td><td>隐藏帧持续轮询挤占设备 6 个 socket(C-13);电机页发送节拍在后台被节流(M-10)——建议重新评估此决策</td></tr></table><h2>相关新问题(详见总评审)</h2><div class="issue s1b" id="M-10"><h4><span class="sev s1">严重</span> [M-10] 周期发送与序列计时在后台标签被节流,且无可见性处理</h4><dl><dt>模块</dt><dd>电机控制/故障保护</dd><dt>位置</dt><dd><code>js/motor/main.js:2488; js/motor/seq.js:503</code></dd><dt>现象</dt><dd>周期发送用主线程 setInterval,序列保持用 setTimeout;隐藏 iframe/最小化后被浏览器降到 ≥1 s 乃至分钟级。只有状态轮询走 Worker。无 visibilitychange 停止/告警;WiFi 链路关窗时无停机。</dd><dt>风险</dt><dd>后台时控制节拍严重失真,序列时间轴不可预测。</dd><dt>修改建议</dt><dd>发送节拍迁入 tick.worker.js;visibilitychange 时提示或按策略安全停机;pagehide 时对 WiFi 也发停机(sendBeacon)。</dd></dl></div><div class="issue s2b" id="C-13"><h4><span class="sev s2">一般</span> [C-13] 对设备的并发轮询过多</h4><dl><dt>模块</dt><dd>CAN/公共层</dd><dt>位置</dt><dd><code>js/common/device-link.js:30; js/can.js:131, 424; js/can_monitor.js:487, 490; tabs.html:76-81; js/common/polling.js:350-352</code></dd><dt>现象</dt><dd>/system/status 被 Owner(1 Hz)、OTA 页(1 Hz)、can.js(5 s)、can_monitor(5 s) 同时轮询;/can/feedback 被抽屉与独立监控页各 1 Hz;隐藏 iframe 继续轮询,无可见性暂停与离线退避。README 称设备 httpd 仅 6 个 socket 且 lru_purge。</dd><dt>风险</dt><dd>连接被挤占驱逐,业务请求失败。</dd><dt>修改建议</dt><dd>状态统一由 Owner 广播;隐藏页暂停;离线指数退避。</dd></dl></div><h2>结论</h2><div class="card">共 3 条:已修复 2、部分修复 0、仍存在/存疑 1、已过时 0、无法在本仓库核实 0。</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_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>
File diff suppressed because one or more lines are too long