diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..6ce9f8e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,49 @@ +# 更新日志 (CHANGELOG) + +按日期倒序记录面向使用者的变更;实现细节见 README 对应章节与提交说明。 + +## 2026-09-05 + +### 新增:app 窗口租约 —— 关掉 app 必停从站 + +- 每个 app 页面与本地页面服务器保持一条 WebSocket(`js/common/app-lease.js` → + `GET /ws/app-lease`);**最后一条**租约断开(所有 app 窗口关闭)后,服务端 + 等 3s 宽限自动调后端 `/api/op/stop`:停 PDO 循环、从站退回 INIT。 + 覆盖两种 native `--parent-pid` 看门狗够不着的离开方式:浏览器模式关窗后 + 服务还活着、窗口模式复用现成 ecat_native 实例。 +- 断开感知靠 TCP FIN / Close 帧回显而非心跳计时器,后台标签页定时器节流 + 不会误停;3s 宽限吸收 F5 刷新的断连→重连;外壳内切标签不停(外壳自己 + 持有租约);只停"本服务经代理确认跑过"的循环,ecat 控制台(:8090) + 手工起的循环不受影响;服务进程退出路径(`/api/shutdown`、Ctrl+C)同步补停。 +- 接入点:`tabs.html`(外壳)与 `pages/motor.html`(单独打开电机页)。 +- 新增自测:`python scripts/test_app_lease.py`(服务端逻辑,裸 TCP 全路径) + + `node scripts/test_app_lease_e2e.mjs`(真 Edge headless + 假后端 8091, + 不碰真总线)。 +- 代价说明:每次重开 app 都要重走 PREOP→SAFEOP→OP,有概率撞 SSC 邮箱楔死 + ——这是"关闭必须停"这个要求本身的代价。设计细节见 README"关掉 app 必停 + 从站"一节。 + +### 新增:首页运行指标卡显示 GD32 CPU 负载率 + +- 新指标 `GD32 负载`(`#mGd32Load`):DCU_APP 固件 ≥ 1.5.61 把"中断 + + 非延迟处理段"占用率写进 EtherCAT 输入 PDO 段 5(1s 滚动窗口,0.1% + 分辨率),前端经 `/ecat/api/app/load` 轮询显示(`js/ota/ecat_load.js`)。 +- 与 `/system/status` 轮询完全独立:ESP32 离线互不影响;失败静默退避 + (1s→5s→30s),不触发页面服务器的自动拉起刷屏;≥85% 琥珀色提示。 +- 无效语义(显示 `--`):ECAT 总线未打开 / 循环未跑 / 固件 < 1.5.61 / + 负载值超 3s 未滚动(PDO 循环已停)。 + +### 变更:PDO 周期缓存一次性迁移,恢复默认改为"跟随后端" + +- 存量 localStorage `dcu_ecat_period_ms=4`(Python 时代默认,检查脚本 + 收尾也会写入)会在下次启动时自动清除一次(迁移标记 + `dcu_ecat_period_mig`),避免把 native 已调小的总线默认周期压回 4ms; + 迁移后用户显式设 4 会被原样保留。 +- `setPdoPeriod` 的"恢复默认"从 `setPdoPeriod(4)` 改为删除该键、跟随后端 + 默认(固件修好前别低于 1ms)。 + +### 修复:电机传输测试对齐生产代码的 `pcore_mask` + +- 自旋节拍钉核显示此前已由"钉 E 核"改为"钉 P 核"并改用快照字段 + `pcore_mask`,`scripts/test_motor_transport.mjs` 仍是旧字段与旧措辞, + 本次对齐(含跨 32 位掩码、不连续核号区间等用例)。