docs: add axis run process working set

This commit is contained in:
wangdequan
2026-07-07 16:46:39 -04:00
parent 8b6be369ff
commit 39b495cf16
672 changed files with 280923 additions and 59 deletions

View File

@@ -0,0 +1,113 @@
# 01-项目功能内容
## 项目目标
完善 `/home/mes123456/cnc_wams/wasm-port` 中 LinuxCNC WASM task/motion 暂停能力,使 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan` 的 AXIS 风格暂停按钮具备真实 LinuxCNC 语义。
最终用户可见目标:
1. 运行中点击工具栏暂停按钮,程序进入暂停。
2. 暂停时 G-code 解释器不继续读行,运动采样不继续推进。
3. 暂停时 DRO、刀具位置、TCP、canvas toolhead、当前行和速度保持稳定。
4. 暂停中再次点击同一按钮,按 AXIS `task_pauseresume` 语义恢复。
5. 菜单 Pause 与 Resume 保持分离语义,不能被工具栏 toggle 逻辑污染。
## LinuxCNC 对标依据
来源文档:
`/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc/AXIS暂停按钮LinuxCNC调用链分析.md`
核心调用链:
```text
AXIS toolbar task_pauseresume
-> linuxcnc.command().auto(AUTO_PAUSE/AUTO_RESUME)
-> EMC_TASK_PLAN_PAUSE / EMC_TASK_PLAN_RESUME
-> emcTrajPause() / emcTrajResume()
-> EMCMOT_PAUSE / EMCMOT_RESUME
-> tpPause() / tpResume()
```
核心语义:
1. `EMC_TASK_PLAN_PAUSE`
- 调用 `emcTrajPause()`
- 如果当前解释器不是 `PAUSED`,保存 `interpResumeState`
- 设置 `interpState = PAUSED`
- 设置 `task_paused = 1`
2. `EMC_TASK_PLAN_RESUME`
- 调用 `emcTrajResume()`
- 恢复 `interpState = interpResumeState`
- 设置 `task_paused = 0`
- 清理 single stepping 状态。
3. `EMCMOT_PAUSE`
- 调用 `tpPause()`
- 设置 motion paused 状态。
4. `EMCMOT_RESUME`
- 调用 `tpResume()`
- 清除 motion paused 状态。
5. 暂停后 `emcTaskExecute()` 不继续从 interpreter list 取新命令。
## 当前代码基线
### wasm-port 已有基础
已存在文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_wasm.c`
- `wasm-port/runtime/sdk/src/linuxcnc-task-hal.js`
- `wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `wasm-port/tests/wasm/node/verify_tp_wasm.mjs`
当前已有能力:
- `EMC_TASK_PLAN_PAUSE` 会设置 `interpState=PAUSED``taskPaused=true`,并转发 `EMC_TRAJ_PAUSE`
- `EMC_TASK_PLAN_RESUME` 会转发 `EMC_TRAJ_RESUME`
- motion runtime 状态 JSON 已有 `motion.paused` 字段。
- Node WASM smoke 已覆盖 pause/resume 的最低限度状态变化。
### 当前主要差距
1. `linuxcnc_task_hal_wasm.cpp` 没有显式保存 LinuxCNC 风格的 `interpResumeState` 字段resume 目前近似恢复为 `READING`
2. `linuxcnc_motion_runtime.c` 的 pause 命令在队列中处理,用户即时暂停时可能被前序 move 阻塞,和 AXIS GUI immediate pause 语义不完全一致。
3. `STEP` 当前近似为 resume 一次,缺少 LinuxCNC `idForStep` 或 motion id 改变后自动重新 pause 的语义。
4. `linuxcnc_tp_wasm.c` 已链接 vendored TP但 task-hal motion runtime 还没有直接使用 TP 的 `tpPause()/tpResume()` 做运动减速与队列保持。
5. 前端 task policy 的 resume gate 仍以 `interpState === paused` 为主,需要纳入 motion/traj paused 字段,贴近 AXIS `s.paused`
6. 现有前端测试证明 UI 冻结可用,但还不能证明底层 WASM 完整对标 LinuxCNC task/motion/TP 暂停链。
## 完成定义
本项目完成必须同时满足:
1. WASM task 状态输出包含并正确维护:
- `task.interpState`
- `task.interpResumeState`
- `task.taskPaused`
- `task.singleStepping`
2. WASM motion 状态输出包含并正确维护:
- `motion.paused`
- `motion.stepping`
- `motion.programLine`
- `commandQueueDepth`
3. 暂停后执行若干 `lctask_run_cycles()`
- `interpState` 保持 `PAUSED`
- `taskPaused=true`
- `motion.paused=true`
- `programLine`、axis pose、HAL `motion.program-line` 不继续推进。
4. 恢复后:
- `interpState` 恢复到暂停前状态;
- `taskPaused=false`
- `motion.paused=false`
- 程序从暂停位置继续推进。
5. 单步后:
- 只推进一个 motion id 或一个可观测程序行;
- 自动回到 paused 状态。
6. 前端暂停按钮继续通过:
- Node store 测试;
- WASM Node 测试;
- 浏览器 trace 暂停位置冻结测试;
- 50ms 长流程暂停/恢复截图验证。