# 2026-07-06 AXIS 主控制按钮完全对标复核 ## 用户提问 项目 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 要完全对标 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc/AXIS主控制按钮功能先决条件与状态影响详解.md`。 ## 对标范围 按文档逐项复核: - 急停与解除急停:`estop_clicked()`,`STATE_ESTOP` / `STATE_ESTOP_RESET`。 - 上电/下电:`onoff_clicked()`,仅 `STATE_ESTOP_RESET` 分支上电,其余状态发送 `STATE_OFF`。 - Home All:`home_all_joints()` / `c.home(-1)`。 - Run:`task_run()` / `AUTO_RUN`,要求上电、已回零、程序打开。 - Pause:`task_pause()` / `AUTO_PAUSE`,要求 AUTO 且解释器 READING/WAITING。 - Resume:`task_resume()` / `AUTO_RESUME`,要求 paused 且 AUTO/MDI。 - Pause/Resume 工具栏合并按钮:`task_pauseresume()`,要求 AUTO/MDI,paused 时恢复,非 idle 时暂停。 - Step:`task_step()` / `AUTO_STEP`,支持自动空闲初次单步,也支持 reading/waiting/paused 队列单步推进。 ## 本轮发现和修正 ### P-016-001 电源按钮 ESTOP/OFF 语义偏差 问题: Web 原 `TOGGLE_POWER` 在 `STATE_ESTOP` 下会被策略阻止并提示先 reset;在非 on 状态下容易按“切换”理解直接进入 on。LinuxCNC AXIS 的 `onoff_clicked()` 并不是“任意非 on 上电”,而是: ```python if s.task_state == linuxcnc.STATE_ESTOP_RESET: c.state(linuxcnc.STATE_ON) else: c.state(linuxcnc.STATE_OFF) ``` 修正: - `app/src/state/linuxcnc-task-policy.js` - `TOGGLE_POWER` 不再在 `STATE_ESTOP` 下阻止,允许按钮动作进入 OFF 分支。 - `app/src/state/store.js` - `TOGGLE_POWER` 改为 `taskState === "estop-reset"` 时上电,否则下电到 `taskState="off"`。 - 下电时关闭 power、motion、RTCP、冷却、主轴速度,并清除 `allHomed`,对标 `emcJointUnhome(-2)` 的 volatile home 清除效果。 - task/HAL 命令改为上电发送 `EMC_TASK_SET_STATE ON`,否则发送 `EMC_TASK_SET_STATE OFF`。 ### P-016-002 自动化验证补齐 - `tests/node/verify_xyzbc_trt_web_app.mjs` - 新增 ESTOP 下点击 Power 进入 OFF 的断言。 - 新增 OFF 下继续点击 Power 仍保持 OFF,不能绕过 reset 直接上电的断言。 - 新增下电清除 `allHomed` 的断言。 - 将主按钮链路测试和后续 MDI/JOG/override 测试拆分为独立 store,避免异步运行状态污染。 - `tests/browser/xyzbc_trt_browser_smoke.html` - 新增真实 DOM 按钮路径:ESTOP 后点 Power 进入 OFF;OFF 下点 Power 仍保持 OFF;再 ESTOP/RESET 后才能上电。 ## 验证结果 ```text npm --prefix app run smoke:node xyzbc_trt_web_app_smoke=ok npm --prefix app run build gmoccapy_static_build=ok npm --prefix app run smoke:browser xyzbc_trt_browser_smoke=ok npm --prefix app run evidence:web web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json web status=ready-for-wasm-runtime blockers=[] npm --prefix app run evidence:compare compare_xyzbc_trt_status=pass checkCount=60 passCount=60 failCount=0 blockers=[] ``` ## 结论 本轮按参考文档完成主控制按钮全量复核,并修正电源按钮与 AXIS `onoff_clicked()` 不一致的问题。当前 ESTOP、RESET、POWER、HOME、RUN、PAUSE、RESUME、PAUSE_RESUME、STEP 均有源码门禁和自动化验证覆盖,Web/native evidence compare 为 60/60 pass。