Files
DCU_DesktopController/docs/review/DCU_DesktopController_专家评审_2026-10-19.html
T

41 lines
92 KiB
HTML
Raw Normal View History

2026-10-20 21:27:39 +08:00
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>DCU_DesktopController 专家评审 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>DCU_DesktopController 专家评审</h1><div class="meta">评审日期 2026-10-19(成稿 2026-10-20)· 仓库 cbb/DCU_DesktopController · 分支 main · 基线 commit <code>eac3717</code>(feat: 添加局域网设备发现功能和链路胶囊优化)· 评审方式:多专家组并行通读 + 抽样复核行号</div><div class="kpis" style="margin-top:16px"><div class="kpi"><span class="sev s0">致命</span><b>8</b></div><div class="kpi"><span class="sev s1">严重</span><b>27</b></div><div class="kpi"><span class="sev s2">一般</span><b>33</b></div><div class="kpi"><span class="sev s3">建议</span><b>7</b></div><div class="kpi">问题总数<b>75</b></div><div class="kpi">综合评分<b>5.4 / 10</b></div></div><h2>1. 项目概述与架构</h2><div class="card"><p>本仓库是 DCU(GD32E508 主控 + LAN9252 EtherCAT 从站 + ESP32-C3 通信中继)的 <b>上位机调试控制台</b>:HTML/CSS/JS(ES module)纯前端 + 本地 Python 页面服务与桌面窗口外壳(pywebview/WebView2)。仓库内<b>不含固件</b>;业务 API 由 ESP32 固件 80 端口跨域提供,EtherCAT 主站 <code>ecat_native.exe</code> 位于外部 <code>tools/ecat</code>,由本仓 Python 代码拉起/代理。代码约 1.9 MB、184 个文件。</p><pre class="arch">┌──────────────────── 桌面窗口 esp32_app.vbs (pywebview, GUI 进程) ────────────────────┐
│ tabs.html 标签外壳 · DeviceLink Owner(BroadcastChannel) · app-lease WebSocket │
│ ├─ pages/index.html OTA:ESP32 WiFi OTA / GD32 中继 / BLE OTA / EtherCAT 直灌 │
│ ├─ pages/can.html CAN:DBC 解析、信号编码、批量发送 (+ can_monitor 内嵌) │
│ ├─ pages/motor.html 电机:CAN FD 指令、周期发送、命令序列、示波器 (WiFi | ECAT) │
│ └─ lab/*.html SPI/ECAT 测速、LAN9252 电源管理、PDO 布局 │
│ js_api 桥: ecat_api / ecat_send_raw ──(ESF1 TCP 快发)──┐ │
└──────────────────────────────────────────────────────────┼───────────────────────────┘
HTTP 127.0.0.1:2625 (esp32_server.py 子进程) │
├─ 静态文件 + _reload 注入 ▼
├─ /ecat/api/* 反向代理 ──► ecat_client.py ──► ecat_native.exe (8090+, Npcap/I210)
│ ecat_proc.py (拉起/互斥/RealTime/强杀) │ EtherCAT
├─ /api/lan/probe ─► lan_probe.py (局域网发现) ▼
└─ WS 租约:全部窗口关闭 → op/stop GD32 + LAN9252 从站 ──CAN FD──► 电机
浏览器 ──HTTP(跨域)──► ESP32:80 (/system/status, /can/*, /ota/*) ──SPI──► GD32
浏览器 ──Web Bluetooth GATT──► ESP32 (BLE OTA)</pre><table><tr><th>模块</th><th>主要文件</th><th>职责</th><th>评分</th></tr><tr><td>主机服务/安全</td><td>esp32_server.py, ecat_client.py, ecat_proc.py, lan_probe.py, *.vbs/bat</td><td>本地静态服务、ECAT 代理、桌面桥、native 进程治理、局域网发现</td><td>6/10</td></tr><tr><td>电机控制/故障保护</td><td>js/motor/*, js/common/ecat-bus.js, device-link.js, app-lease.js, desktop-bridge.js, pages/motor.html</td><td>双链路电机指令、周期发送、序列、示波器、总线所有权</td><td>4.5/10</td></tr><tr><td>OTA/刷写</td><td>js/app.js, js/ota/*, js/ble/*, js/ble_ota.js, pages/index.html</td><td>ESP32/GD32 多通道刷写会话与进度</td><td>5/10</td></tr><tr><td>CAN/公共层</td><td>js/can.js, js/can/*, js/can_monitor.js, js/common/*</td><td>DBC 解析编码、发送、监控;连接、轮询、日志</td><td>6/10</td></tr><tr><td>仓库卫生/文档</td><td>README.md, docs/, .gitignore, .qoder/, .zcode/, scripts/</td><td>文档、报告、测试脚本与版本控制卫生</td><td>5.5/10</td></tr></table></div><h2>2. 评审范围与方法</h2><div class="card"><ul><li><b>范围</b>:基线 <code>eac3717</code> 下全部源码与配置——Python 服务 4 个、JS 模块 50+、页面 5 个、lab 页 3 个、CSS 6 个、scripts/ 测试与探针 31 个,以及 docs/ 下全部既有报告和规格、.zcode 计划。<code>.qoder/repowiki</code> 为工具生成物,仅做卫生评估。</li><li><b>专家组</b>:① 主机服务与安全;② 实时控制与故障保护(电机);③ OTA/Bootloader 刷写可靠性;④ 前端架构、CAN 协议与仓库卫生;⑤ 既有评审/报告核对。各组独立通读负责模块后汇总,主审对致命/严重条目逐条按行号复核。</li><li><b>严重度定义</b>:<span class="sev s0">致命</span> 可能导致电机误动作、设备损坏/变砖或安全事故;<span class="sev s1">严重</span> 功能性缺陷或明显安全漏洞;<span class="sev s2">一般</span> 健壮性/可维护性;<span class="sev s3">建议</span> 改进项。</li><li><b>局限</b>:静态审阅,未上真机运行;固件(ESP32_COMM、GD32 APP/BOOT)与 <code>tools/ecat/ecat_native.c</code> 不在本仓,相关结论标注为“无法在本仓库核实”。行号以基线 commit 为准。</li><li><b>测试有效性</b>:<code>scripts/</code> 中 .mjs 与多数 .py 以 <code>process.exit</code>/<code>sys.exit</code> 返回码判定,<code>test_app_lease.py</code>、<code>test_esf_pack.py</code> 有较多断言;<code>probe_*.py</code> 为采样器无断言(合理)。覆盖集中在传输契约、刷新速率、租约与快发打包,<b>不覆盖停机路径、序列竞态、指令数值边界、链路丢失判定、HEX 解析</b>(见 M-19)。</li></ul></div><h2>3. 问题清单</h2><h3>3.1 总览</h3><table><tr><th>编号</th><th>严重度</th><th>模块</th><th>标题</th><th>位置</th></tr><tr><td><a href="#M-1">M-1</a></td><td><span class="sev s0">致命</span></td><td>电机控制/故障保护</td><td>无急停/全部失能,停止类操作均不下发失能帧</td><td><code>js/motor/main.js:809-811, 2391, 2403, 2494; js/motor/seq.js:449; js/motor/main.js:1103, 11…</code></td></tr><tr><td><a href="#M-2">M-2</a></td><td><span class="sev s0">致命</span></td><td>电机控制/故障保护</td><td>CMD 数值无范围校验,整数编码会回绕</td><td><code>js/motor/main.js:744-756; pages/motor.html:141-149; js/motor/main.js:2462-2470</code></td></tr><tr><td><a href="#M-3">M-3</a></td><td><span class="sev s0">致命</span></td><td>电机控制/故障保护</td><td>真实链路丢失永远判不出离线</td><td><code>js/motor/main.js:969-987, 1175</code></td></tr><tr><td><a href="#M-4">M-4</a></td><td><span class="sev s0">致命</span></td><td>电机控制/故障保护</td><td>序列停止后立即重启会出现两个并发执行循环</td><td><code>js/motor/seq.js:431-447, 449-455, 461-504</code></td></tr><tr><td><a href="#O-1">