5.6 KiB
5.6 KiB
01-项目功能内容
项目目标
完善 /home/mes123456/cnc_wams/wasm-port 中 LinuxCNC WASM task/motion 执行链,使 /home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan 的 AXIS 风格“执行 Run”按钮按 LinuxCNC 语义工作。
最终用户可见目标:
- 未解除急停、未上电、未 Home 或未打开程序时,Run 按钮不能绕过 LinuxCNC 门禁。
- 满足条件后点击 Run,系统切到
MODE_AUTO,发送EMC_TASK_PLAN_RUN,task 进入INTERP_READING或INTERP_WAITING。 - 执行中当前行、队列深度、motion id、DRO、TCP、RTCP 位置由 task/motion status 驱动。
- 执行中 Pause、Resume、Step 继续走 task/motion 命令链,不直接操作前端播放状态。
- 执行完成、错误、急停、下电、abort 后,UI 与 task/motion status 一致,不能残留“前端 running”假状态。
LinuxCNC 对标依据
来源文档:
/home/mes123456/cnc_wams/项目分析/AXIS主控制按钮调用链与WASM完善指南.md
核心调用链:
AXIS task_run()
-> ensure_mode(MODE_AUTO)
-> linuxcnc.command().auto(AUTO_RUN, line)
-> EMC_TASK_PLAN_RUN
-> emcTaskPlan()
-> emcTaskIssueCommand()
-> interpreter readahead
-> canonical motion commands
-> taskintf.cc
-> EMCMOT_SET_LINE / EMCMOT_SET_CIRCLE / ...
-> motion command/control cycle
-> emcStatus
-> linuxcnc.stat().poll()
Run 不是前端播放按钮。LinuxCNC 中 Run 的真实结果是 task 解释器状态、motion 队列、status echo 和 GUI 可见状态共同变化。
功能范围
必须覆盖
- 急停与解除急停:
STATE_ESTOP与STATE_ESTOP_RESET的切换。- ESTOP 分支 abort、motion disable、IO estop on、volatile home 清理。
- 上电与下电:
- 只有
STATE_ESTOP_RESET才能进入STATE_ON。 STATE_ON由 motion enabled 状态推导,不由前端直接写死。
- 只有
- Home:
- Run 前必须满足 all homed 或
no_force_homing。 - Home 应有
homing -> homed过程态。
- Run 前必须满足 all homed 或
- Run:
MODE_AUTO。EMC_TASK_PLAN_RUN。interpState=READING、taskPaused=false、singleStepping=false。- 程序文件已 open,或 task 能按
emcStatus->task.file打开。
- Pause/Resume/Step:
- 作为 Run 后执行过程控制,不作为独立前端播放逻辑。
- Pause 后
taskPaused=true且motion.paused=true。 - Step 只推进一个 motion id 或一个可观测执行边界,并回到 paused。
- Status 投影:
- Web store 中
taskState/mode/interpState/runState/currentLine/motionPaused/singleStepping来自 task/HAL status。
- Web store 中
暂不覆盖
- 完整 LinuxCNC NML 网络传输。WASM 可用内存队列替代 NML transport,但命令类型和状态语义必须保留。
- 完整实时 HAL。当前阶段只要求 task/motion/Home/Run/Pause/Step 相关 HAL pin 可观测。
- 所有 G-code 语义。G-code 到 canonical motion 应优先来自 LinuxCNC interpreter,不在 Web 层扩写解释器。
当前代码基线
wasm-port 已有基础
关键文件:
wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cppwasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.cwasm-port/runtime/sdk/src/linuxcnc-task-hal.jswasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
已具备的基础:
- task/HAL WASM 入口已经存在。
- Pause/Resume/Step 已有 working8 基础验证。
- status JSON 已能输出部分 task/motion 字段。
- Web 项目已经能加载 task-hal WASM 并把部分 status 映射到 store。
主要差距
- task/HAL runtime 仍有
phase4_minimal过渡实现痕迹,部分命令解析和 G-code motion 派生仍是手写逻辑。 - Run 的门禁需要完全对齐
emcTaskPlan():不能只看 Web 自定义runState。 - 程序 open、canonical motion plan、motion queue、current line 的来源需要收敛到 LinuxCNC interpreter/task/motion 状态。
- Home 状态常见简化是立即
allHomed=true,缺少homing/homeState过程态。 - Web store 仍可能存在点击 Run 后直接写
running的分支,需要改为等待 WASM status 确认。 - 验收不能只看按钮 active,需要读取 task/HAL status、trace、截图和 Node/browser 断言。
完成定义
本项目完成必须同时满足:
- Run 前置门禁:
- ESTOP 下 Run 被拒绝。
- ESTOP_RESET 未上电时 Run 被拒绝。
- ON 但未 Home 且
no_force_homing=false时 Run 被拒绝。 - 未 open 程序或没有 canonical plan 时 Run 被拒绝并给出明确错误。
- Run 命令链:
- UI 点击 Run 后发送
MODE_AUTO和EMC_TASK_PLAN_RUN。 - WASM status 显示
task.mode=AUTO。 - WASM status 显示
task.interpState=READING/WAITING。 task.taskPaused=false、motion.traj.singleStepping=false。
- UI 点击 Run 后发送
- 执行状态:
- motion queue 或 canonical execution id 可观测。
- 当前行、motion id、DRO/TCP 随 status 推进。
- 执行完成后进入
INTERP_IDLE与DONE或等价完成状态。
- 执行中控制:
- Pause 后 task 和 motion 双层 paused。
- Resume 后恢复暂停前状态。
- Step 后只推进一个边界并回到 paused。
- Web 集成:
- Web
runState是 task/HAL status 投影。 - UI 按钮 enable/active 状态与 LinuxCNC 门禁一致。
- 浏览器 trace 能证明 Run 后位置推进、Pause 后冻结、Resume 后继续。
- Web
非目标与风险提醒
- 不把 Web frame 播放器当作 CNC task。
- 不在 JS 中新增 G-code 正则解释器作为长期方案。
- 不因为 UI 看起来 running 就关闭任务,必须有 WASM status 证据。
- 不把单步实现为数组下标加一,Step 必须进入 task/motion 单步状态机。