Files
cnc_wams/web-rtcp-5axis-sim-plan/working_run/03-run-step1-preconditions-complete-next-steps.md

8.1 KiB
Raw Blame History

03 RUN 第一步完成记录与下一步建议

生成时间2026-06-22

1. 本轮完成范围

本轮只完成 02-run-preconditions-test-and-implementation-steps.md 中的第一步和第二步:

Step 1: 增加 validateRunPreconditions(state)
Step 2: RUN action 先调用前置检查

本轮没有实现连续 feedback pump。也没有把 RUN 宣称为完整实时运行模型。

2. 已完成改动

2.1 RUN 前置条件 gate

新增源码:

app/src/state/store.js
export function validateRunPreconditions(...)

校验内容:

1. profile 必须是 xyzac-trt 或 xyzbc-trt。
2. LinuxCNC INI 必须已加载并 validation.ready=true。
3. profile.iniPath 必须与已加载 INI path 一致。
4. profile TRAJ coordinates 必须与 INI coordinates 一致。
5. profile.kinematicsModuleId 必须与 INI [KINS] 推导结果一致。
6. LinuxCNC kinematics runtime 必须 loaded。
7. kinematics runtime moduleId 必须匹配当前 profile。
8. RTCP frame 必须来自 source-derived-kinematics-wasm。
9. machine files 必须 staged。
10. 必须已选择 LinuxCNC source-directory G-code。
11. task/HAL runtime 必须 ready。
12. requireTaskHalSession=true 时taskHalSession.programPath 必须匹配当前 selected G-code。

关键结果:

当 taskHalRuntime 已加载时RUN 不再直接发送 EMC_TASK_PLAN_RUN。
RUN 会先校验 INI/profile/kinematics/machine-file/task-HAL 上下文。
前置条件不满足时,只给 operatorMessage不进入 fixture playback。

2.2 RUN 使用真实 machine-file session

新增内部流程:

runValidatedTaskHalProgramRun()

执行顺序:

1. validateRunPreconditions(..., requireTaskHalSession=false)
2. 如 taskHalSession 缺失或 programPath 不匹配initializeTaskHalSession({ openProgram: true })
3. validateRunPreconditions(..., requireTaskHalSession=true)
4. 发送:
   EMC_TASK_SET_STATE ON
   EMC_TASK_SET_MODE AUTO
   EMC_TASK_PLAN_RUN line = activeLine - programStartLine
5. runTaskHalCommandSequence(..., allowFixtureSession=false)

这一步解决的是“RUN 之前先确定明确 INI、机床类型和五轴运动学算法”不是连续执行问题。

2.3 新增测试

新增:

tests/node/verify_run_preconditions.mjs

覆盖:

1. xyzac-trt.ini 解析:
   MACHINE=sim-xyzac-trt-kins (switchkins)
   COORDINATES=XYZAC
   KINEMATICS=xyzac-trt-kins
   kinematicsModuleId=xyzac-trt

2. xyzbc-trt.ini 解析:
   MACHINE=sim-xyzbc-trt-kins (switchkins)
   COORDINATES=XYZBC
   KINEMATICS=xyzbc-trt-kins
   kinematicsModuleId=xyzbc-trt

3. applyIniConfigToProfile() 后 profile 与 INI 保持一致。
4. createLinuxCncKinematicsRuntime() 可按 moduleId 加载对应 WASM。
5. stageProfileMachineFiles() 和 buildTaskHalSessionFromMachineFiles() 能形成同一 machine-file 上下文。
6. validateRunPreconditions() 能阻断未加载 INI 的初始状态。
7. validateRunPreconditions() 能在 INI/kinematics/staged G-code ready 时通过非 task-HAL session 预检。
8. task/HAL runtime 缺失时返回明确阻断消息。

app/package.jsonsmoke:node 已加入:

node ../tests/node/verify_run_preconditions.mjs

2.4 调整 task/HAL smoke

更新:

tests/node/verify_linuxcnc_task_hal_runtime.mjs

调整点:

1. 不再用内联 fixture G-code 直接测试真实 RUN。
2. 加载 xyzac-trt INI。
3. 加载 xyzac-trt kinematics runtime。
4. stage machine files。
5. LOAD_LINUXCNC_GCODE_SOURCE 选择:
   configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc
6. 等待 taskHalSession.programPath 指向该 G-code。
7. 再执行 POWER/HOME/AUTO/RUN。

这样 task/HAL RUN smoke 与新的 RUN 前置条件一致。

3. 已运行验证

通过:

node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build

输出:

run_preconditions_ini_profile_smoke=ok
run_preconditions_kinematics_smoke=ok
run_preconditions_machine_file_smoke=ok

linuxcnc_task_hal_runtime_smoke=ok
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok

gmoccapy_static_build=ok

部分通过后失败:

npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node

该命令已通过本轮新增和相关测试:

linuxcnc_kinematics_runtime_smoke=ok
linuxcnc_interpreter_runtime_smoke=ok
linuxcnc_ini_runtime_smoke=ok
run_preconditions_ini_profile_smoke=ok
run_preconditions_kinematics_smoke=ok
run_preconditions_machine_file_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok

随后在既有 native audit 停止:

wasm-port/tests/native/verify_task_hal_phase0.sh failed with status 1

直接运行该脚本确认失败点是:

wasm-port/tools/verify_task_hal_source_manifest.sh

日志:

task_hal_source_manifest_ready=0
task_hal_reference_source_ready=0
task_hal_missing_reference_source_count=20

说明:该失败来自外部 reference source ../linuxcnc 缺失 task/HAL manifest 需要的 20 个文件,不是本轮 RUN 前置条件改动造成。

4. 当前 RUN 状态

现在 RUN 的第一道边界已经收紧:

没有明确 INI -> 不 RUN
profile/INI 坐标不一致 -> 不 RUN
kinematics module 不一致 -> 不 RUN
kinematics frame 未 ready -> 不 RUN
machine files 未 staged -> 不 RUN
没有 LinuxCNC source G-code -> 不 RUN
task/HAL runtime 未 ready -> 不 RUN
taskHalSession.programPath 不匹配当前 G-code -> 不 RUN

但当前 RUN 仍然是:

发送 task command
-> runCycles({ taskCycles: 5 })
-> readStatus() 一次
-> TASK_HAL_STATUS_APPLIED 一次

所以 01-run-gcode-execution-principle-and-test.md 中指出的连续 feedback 问题仍未解决。

5. 下一步工作建议

下一步应实现 02 文件中的 Step 3 和 Step 4

Step 3: 拆分 task command 与执行 pump
Step 4: 增加 RUN pump 状态

建议最小实现范围:

1. 在 store state 增加 taskHalRunPump:
   active
   sequence
   profileId
   iniPath
   kinematicsModuleId
   tickCount
   lastStatusAt
   lastError

2. 增加 programRuntimeFeedbackHistory最多保留 100 条。

3. RUN 发送 EMC_TASK_PLAN_RUN 后,不只 runCycles 5 次。
   改为启动 pump:
   runCycles({ taskCycles: batchSize })
   readStatus()
   dispatch TASK_HAL_STATUS_APPLIED
   append feedback history
   根据 interpState / task.nextProgramLine / openedLineCount / paused / aborted 停止。

4. STOP/ABORT 必须停止 pump。

5. PAUSE 停止或降频 pump并保留 paused status。

6. RESUME 重新启动 pump。

7. STEP 在 task/HAL runtime loaded 时不走 fixture sample playback
   而是推进一个明确 task cycle batch 并 readStatus 一次。

下一步测试建议:

1. 新增 tests/node/verify_run_feedback_pump.mjs。
2. 使用 xyzac_switchkins_test_1.ngc。
3. RUN 后采集至少 8 个 feedback tick。
4. 断言 taskCycle 或 servoCycle 单调递增。
5. 断言 activeLine 不停留在 RUN 后第一帧。
6. 断言每个 tick 的 sourceMode 都是 linuxcnc-task-motion-hal-wasm。
7. 断言 programRuntimeFeedbackHistory 至少包含 3 条。
8. 断言 STOP 后 pump.active=false。

浏览器测试建议:

扩展 qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
新增 07-run-preconditions-and-feedback case。
采集 RUN 后 0.2s / 0.5s / 1.0s / 2.0s 的 state。
断言 activeLine、DRO、runtime feedback、canvas RTCP 状态来自同一 feedback snapshot。

6. 重要边界

下一步实现 pump 时仍需保持:

不引入 JS G-code parser。
不在 UI 里自增 activeLine。
不在 UI 里自造 axisPose。
不把 canonical timing estimate 当作真实 task/HAL runtime。
不把 fixture playback 标记为 fullLinuxCncProgramExecutionReady。

RUN 的真实推进必须来自:

taskHalRuntime.runCycles()
taskHalRuntime.readStatus()
TASK_HAL_STATUS_APPLIED