feat: sync latest run execution updates

This commit is contained in:
2026-06-22 21:47:16 -04:00
parent 0b1aad39e1
commit 8d3177cb73
92 changed files with 22837 additions and 246 deletions

View File

@@ -93,7 +93,385 @@ M430 -> switchkins type 2 -> userk
HAL link: motion.analog-out-03 => motion.switchkins-type
```
## 3. RUN 前置状态检查
## 3. INI definition contract
`RUN` 只能基于一个完整、可验证的 LinuxCNC INI 上下文启动。INI 不是展示信息,而是机床契约来源。`parseLinuxCncIni()``applyIniConfigToProfile()` 必须把下面字段转成结构化状态RUN gate 只读取结构化状态,不在 RUN action 中重新猜测字符串。
### 3.1 必须存在的 INI sections
当前五轴 `xyzac-trt` / `xyzbc-trt` profile 至少要求这些 section
| section | 是否必填 | RUN gate 用途 |
| --- | --- | --- |
| `[EMC]` | 必填 | 识别 machine name确认是 switchkins 五轴 profile |
| `[DISPLAY]` | 必填 | 提供默认打开程序、程序目录、UI 坐标提示;不能作为运动学真值 |
| `[RS274NGC]` | 必填 | 提供 remap、subroutine path、HAL pin vars、parameter file |
| `[KINS]` | 必填 | 提供 kinematics module 和 joint 数,是 kinematics/runtime 匹配依据 |
| `[HAL]` | 必填 | 提供 HAL 文件、HALUI、POSTGUI_HALFILE、switchkins HALCMD |
| `[HALUI]` | 必填 | 提供 M428/M429/M430 operator command 顺序和语义提示 |
| `[TRAJ]` | 必填 | 提供 COORDINATES、单位、速度/加速度上限 |
| `[EMCMOT]` | 必填 | 提供 motmod、SERVO_PERIOD、COMM_TIMEOUT |
| `[TASK]` | 必填 | 提供 task module 和 CYCLE_TIME |
| `[EMCIO]` | 必填 | 提供 tool table |
| `[AXIS_*]` | 必填 | 提供各坐标轴 limit/velocity/acceleration |
| `[JOINT_*]` | 必填 | 提供 joint 类型、home、limit、home sequence |
不满足这些 section 时INI readiness 必须是 not readyRUN 必须阻断。
### 3.2 必填字段与 gate 用途
`[EMC]`
```text
VERSION
MACHINE
```
要求:
```text
xyzac-trt: MACHINE = sim-xyzac-trt-kins (switchkins)
xyzbc-trt: MACHINE = sim-xyzbc-trt-kins (switchkins)
```
用途:
```text
1. 推导 profileId。
2. 确认当前 profile 是 switchkins 五轴仿真机床。
3. 作为 task/HAL session metadata写入 feedback 证据。
```
`[DISPLAY]`
```text
GEOMETRY
OPEN_FILE
JOG_AXES
DISPLAY
PROGRAM_PREFIX
POSITION_OFFSET
POSITION_FEEDBACK
MAX_LINEAR_VELOCITY
MAX_ANGULAR_VELOCITY
```
用途:
```text
1. OPEN_FILE 只能作为默认程序候选RUN 实际程序必须来自 staged selected G-code。
2. PROGRAM_PREFIX 用于解析 machine-file staging 的相对路径。
3. GEOMETRY/JOG_AXES 用于 UI 呈现,不得覆盖 [TRAJ] COORDINATES。
```
`[RS274NGC]`
```text
SUBROUTINE_PATH
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
PARAMETER_FILE
```
用途:
```text
1. HAL_PIN_VARS=1 是 remap 子程序读取 motion.switchkins-type 的前提。
2. M428/M429/M430 remap 文件必须被 stage 到同一 machine context。
3. PARAMETER_FILE 必须随 profile 区分,不能 xyzac/xyzbc 混用。
```
`[KINS]`
```text
KINEMATICS
JOINTS
```
要求:
```text
xyzac-trt: KINEMATICS = xyzac-trt-kins sparm=identityfirst
xyzbc-trt: KINEMATICS = xyzbc-trt-kins sparm=identityfirst
JOINTS = 5
```
用途:
```text
1. 从 KINEMATICS 推导 kinematicsModuleId。
2. 校验 kinematics WASM moduleId。
3. 校验 joint count 与 [JOINT_0]...[JOINT_4] 完整性。
4. sparm=identityfirst 决定 switchkins type 0 是 identity不能按默认 kins 猜测。
```
`[HAL]`
```text
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = switchkins_postgui.hal
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
```
用途:
```text
1. HALUI 存在时UI command 与 LinuxCNC halui 行为对齐。
2. HALFILE/POSTGUI_HALFILE 必须 stagetask/HAL runtime 才能构造同一机床上下文。
3. switchkins HALCMD 是 M428/M429/M430 影响 motion.switchkins-type 的证据。
```
`[HALUI]`
```text
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
```
用途:
```text
1. 记录 operator 命令入口。
2. 与 [RS274NGC] REMAP 和 [HAL] switchkins HALCMD 交叉校验。
3. 不直接作为 RUN 自动插入命令RUN 程序内的 M428/M429/M430 由 interpreter/remap 处理。
```
`[TRAJ]`
```text
COORDINATES
LINEAR_UNITS
ANGULAR_UNITS
DEFAULT_LINEAR_VELOCITY
MAX_LINEAR_VELOCITY
MAX_LINEAR_ACCELERATION
DEFAULT_LINEAR_ACCELERATION
```
要求:
```text
xyzac-trt: COORDINATES = XYZAC
xyzbc-trt: COORDINATES = XYZBC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
```
用途:
```text
1. COORDINATES 是 UI 轴、G-code 轴、runtime axisPose 的主契约。
2. 单位决定 DRO 和 velocity 显示,不能由前端默认值覆盖。
3. velocity/acceleration 是 planner/runtime limit 的来源。
```
`[EMCMOT]``[TASK]`
```text
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
```
用途:
```text
1. SERVO_PERIOD 用于 taskHalStatusLoop 的 servo tick 语义。
2. CYCLE_TIME 用于 task cycle 语义和测试断言。
3. runtime readiness 必须能报告 task/motion/HAL 三者已按这些参数初始化。
```
`[EMCIO]`
```text
TOOL_TABLE
```
用途:
```text
1. tool table 必须 stage 到 machine files。
2. G43/tool offset 相关状态不能用空表静默替代。
```
`[AXIS_*]`
```text
MIN_LIMIT
MAX_LIMIT
MAX_VELOCITY
MAX_ACCELERATION
```
要求:
```text
xyzac-trt: [AXIS_X] [AXIS_Y] [AXIS_Z] [AXIS_A] [AXIS_C]
xyzbc-trt: [AXIS_X] [AXIS_Y] [AXIS_Z] [AXIS_B] [AXIS_C]
```
用途:
```text
1. 校验 profile coordinates 对应的 axis section 完整。
2. 约束 UI limit、DRO 范围、preview bounds。
3. 防止 xyzac/xyzbc 轴表混用。
```
`[JOINT_*]`
```text
TYPE
HOME
MIN_LIMIT
MAX_LIMIT
MAX_VELOCITY
MAX_ACCELERATION
HOME_SEARCH_VEL
HOME_SEQUENCE
```
要求:
```text
JOINT_0..JOINT_4 必须完整。
JOINT_0..JOINT_2 TYPE = LINEAR。
xyzac-trt: JOINT_3/JOINT_4 分别对应 A/C rotary。
xyzbc-trt: JOINT_3/JOINT_4 分别对应 B/C rotary。
```
用途:
```text
1. 校验 [KINS] JOINTS=5 与 joint section 数量一致。
2. home/allHomed gate 的配置来源。
3. task/HAL runtime 初始化 joint status 的来源。
```
### 3.3 INI readiness 输出
`parseLinuxCncIni()` 应输出或间接形成这些结构化字段:
```js
{
profileId: "xyzac-trt",
iniPath: "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
machineName: "sim-xyzac-trt-kins (switchkins)",
traj: {
coordinates: "XYZAC",
linearUnits: "mm",
angularUnits: "deg"
},
kinematics: {
name: "xyzac-trt-kins",
moduleId: "xyzac-trt",
switchkins: true,
identityFirst: true,
joints: 5
},
rs274ngc: {
halPinVars: true,
remaps: ["M428", "M429", "M430"],
subroutinePath: "./remap_subs",
parameterFile: "xyzac.var"
},
hal: {
halui: "halui",
halFiles: ["LIB:basic_sim.tcl"],
postguiHalFiles: ["switchkins_postgui.hal"],
switchkinsSignal: "motion.analog-out-03 => motion.switchkins-type"
},
emcmot: {
module: "motmod",
servoPeriodNs: 1000000
},
task: {
module: "milltask",
cycleTimeSeconds: 0.010
},
emcio: {
toolTable: "xyzac-trt.tbl"
},
axes: {
X: { minLimit: -200, maxLimit: 200 },
Y: { minLimit: -100, maxLimit: 100 },
Z: { minLimit: -120, maxLimit: 120 },
A: { minLimit: -100, maxLimit: 50 },
C: { minLimit: -36000, maxLimit: 36000 }
},
joints: [
{ index: 0, type: "LINEAR", axis: "X" },
{ index: 1, type: "LINEAR", axis: "Y" },
{ index: 2, type: "LINEAR", axis: "Z" },
{ index: 3, type: "ANGULAR", axis: "A" },
{ index: 4, type: "ANGULAR", axis: "C" }
],
validation: {
ready: true,
errors: []
}
}
```
`xyzbc-trt` 的输出必须只在 profileId、machineName、coordinates、kinematics module、parameter/tool table、rotary axis B/C 等字段上变化,不能沿用 xyzac 的 A/C axis contract。
### 3.4 INI contract 失败时的阻断
这些情况必须让 `state.iniConfigReadiness.ready=false`,并阻断 RUN
```text
缺少 [EMC] MACHINE。
缺少 [TRAJ] COORDINATES。
COORDINATES 不是 XYZAC 或 XYZBC。
[KINS] KINEMATICS 不是 xyzac-trt-kins 或 xyzbc-trt-kins。
[KINS] JOINTS 不是 5。
缺少 M428/M429/M430 remap。
HAL_PIN_VARS 不是 1。
缺少 motion.analog-out-03 => motion.switchkins-type HALCMD。
缺少 [EMCMOT] SERVO_PERIOD。
缺少 [TASK] CYCLE_TIME。
缺少 TOOL_TABLE。
axis section 与 COORDINATES 不一致。
joint section 数量与 [KINS] JOINTS 不一致。
xyzac INI 指向 xyzbc tool table/parameter file或反向混用。
```
阻断消息建议:
```text
run blocked: LinuxCNC INI contract invalid
run blocked: INI missing required section [KINS]
run blocked: INI coordinates do not match selected profile
run blocked: INI switchkins remap incomplete
run blocked: INI HAL switchkins signal missing
run blocked: INI joint/axis contract mismatch
```
### 3.5 与 RUN gate 的关系
INI contract 通过只是 RUN 的第一层 gate。RUN 仍必须继续检查:
```text
1. kinematics WASM 已按 INI [KINS] moduleId 加载。
2. machine files 已按同一个 INI stage。
3. task/HAL runtime 已按同一个 INI/session 初始化。
4. selected G-code 已通过 task plan open 打开。
5. task status 的 opened file 与 selected staged G-code 一致。
6. machine ON、AUTO、homed/no_force_homing 满足。
```
所以不能把 `parseLinuxCncIni().validation.ready=true` 等同于 `RUN` ready。
## 4. RUN 前置状态检查
`RUN` action 进入真正执行前,应要求这些状态全部明确:
@@ -112,6 +490,11 @@ state.taskHalRuntimeReadiness.taskRuntimeReady === true
state.taskHalRuntimeReadiness.motionRuntimeReady === true
state.taskHalRuntimeReadiness.halRuntimeReady === true
state.taskHalSession.programPath 指向当前选中的 G-code
state.taskHalSession.openProgram === true
state.taskHalStatus.task.file 或 openedProgram.path 指向同一个 staged G-code
state.taskHalStatus.task.state 是 ON
state.taskHalStatus.task.mode 是 AUTO或 RUN 前可切换到 AUTO
state.taskHalStatus.motion.allHomed === true或当前仿真 profile 明确 no_force_homing
```
如果任一项不满足,`RUN` 应返回明确 operatorMessage不应进入 fixture line playback 后伪装成真实运行。
@@ -124,11 +507,98 @@ run blocked: machine profile and INI coordinates mismatch
run blocked: LinuxCNC kinematics runtime not ready
run blocked: task/HAL runtime not ready
run blocked: no machine-file G-code opened for task/HAL session
run blocked: machine is not on
run blocked: machine is not homed
run blocked: task mode is not AUTO
```
## 4. 详细测试计划
## 5. LinuxCNC 源码对照结论
### 4.1 INI/profile 解析测试
`RUN` 命令修改方向总体合适,但必须严格贴近 LinuxCNC 的 task 语义:
```text
RUN 不是前端 sample playback。
RUN 不是直接解析 G-code 后自增 activeLine。
RUN 是在已打开程序、机床可运行、AUTO 模式下发送 EMC_TASK_PLAN_RUN
随后由 task 主循环持续 read/execute interpreter并从 motion/HAL 状态读取反馈。
```
源码证据:
```text
/home/meswork/cnc_wams/linuxcnc/src/emc/usr_intf/halui.cc:1096
sendProgramRun(int line)
- updateStatus()
- 如果 emcStatus->task.file 为空,直接返回 -1
- 保存 programStartLine
- 设置 EMC_TASK_PLAN_RUN.line
- sendAuto()
- emcCommandSend(EMC_TASK_PLAN_RUN)
/home/meswork/cnc_wams/linuxcnc/src/emc/usr_intf/shcom.cc:750
sendProgramOpen(program)
- 发送 EMC_TASK_PLAN_OPEN
- 本地进程发送文件名
- remote process 通过 remote_buffer 分块发送文件内容
/home/meswork/cnc_wams/linuxcnc/src/emc/usr_intf/shcom.cc:814
sendProgramRun(int line)
- status 为 AUTO update 时先 updateStatus()
- task.file 为空时尝试重新打开 lastProgramFile
- 再发送 EMC_TASK_PLAN_RUN
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc:2164
EMC_TASK_PLAN_OPEN
- 接收 remote 文件或打开本地文件
- 调用 emcTaskPlanOpen(open_msg->file)
- 成功后写入 emcStatus->task.file
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc:2318
EMC_TASK_PLAN_RUN
- 未 homed 且 no_force_homing=false 时拒绝运行
- 清 single stepping
- 必要时重新 emcTaskPlanOpen(emcStatus->task.file)
- 保存 programStartLine
- 设置 interpState=READING
- 清 task_paused
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc:2337
EMC_TASK_PLAN_PAUSE
- emcTrajPause()
- interpState=PAUSED
- task_paused=1
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc:2369
EMC_TASK_PLAN_RESUME
- emcTrajResume()
- 恢复 interpState
- 清 task_paused
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctask.cc:543
emcTaskPlanOpen(file)
- 清 motionLine/currentLine/readLine
- interp.open(file)
- taskplanopen=1
/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctask.cc:566
emcTaskPlanRead()
- interp.read()
- 文件未打开时用 emcStatus->task.file 重新 open/read
```
对当前 web runtime 的约束:
```text
1. initializeTaskHalSession({ openProgram: true }) 必须等价于先完成 EMC_TASK_PLAN_OPEN。
2. RUN gate 必须确认 opened program 与当前 selected G-code 是同一个 staged machine-file。
3. RUN 发送 EMC_TASK_PLAN_RUN 后UI 不能用 canonical timing 或 fixture sample 冒充 task 反馈。
4. 连续反馈必须来自 taskHalRuntime.runCycles/readStatus且 status 的 task/motion/HAL 字段必须同源。
5. PAUSE/RESUME/ABORT 要按 LinuxCNC task command 修改状态循环,而不是只改前端 runState。
```
## 6. 详细测试计划
### 6.1 INI/profile 解析测试
目标:证明 `RUN` 使用的不是手写机床参数,而是明确 LinuxCNC INI。
@@ -175,7 +645,7 @@ node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
run_preconditions_ini_profile_smoke=ok
```
### 4.2 运动学模块确认测试
### 6.2 运动学模块确认测试
目标:证明当前机床的五轴运动学算法已经按 INI/profile 加载。
@@ -199,7 +669,7 @@ node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_kinematics_runtime.mjs
新增 RUN 前置测试应把这个结果纳入 `RUN` gate而不是只作为独立 smoke。
### 4.3 machine-file staging 测试
### 6.3 machine-file staging 测试
目标:证明 `RUN` 打开的程序、INI、remap、tool table 是同一个 LinuxCNC 机床目录上下文。
@@ -226,7 +696,7 @@ node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_kinematics_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_machine_file_staging.mjs
```
### 4.4 RUN 连续 feedback 测试
### 6.4 RUN 连续 feedback 测试
目标:证明点击 `RUN` 后,不是只推进一次 `taskCycles=5`,而是持续从 task/HAL/motion 获取反馈。
@@ -282,7 +752,7 @@ programRuntimeFeedback.sourceMode 不是 linuxcnc-task-motion-hal-wasm。
RTCP 状态与当前 G-code 的 M428/M429 不一致。
```
### 4.5 浏览器端测试
### 6.5 浏览器端测试
建议扩展:
@@ -318,7 +788,7 @@ qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json
qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/*.png
```
## 5. 编写 RUN 程序的实现步骤
## 7. 编写 RUN 程序的实现步骤
### Step 1: 增加 `validateRunPreconditions(state)`
@@ -338,6 +808,8 @@ app/src/state/store.js
5. 检查 task/HAL runtime ready。
6. 检查 machine file staging ready。
7. 检查 taskHalSession.programPath 指向当前 G-code。
8. 检查 task status 的 opened file 与当前 staged G-code 一致。
9. 检查 machine ON、AUTO mode、homed/no_force_homing。
```
返回结构:
@@ -376,21 +848,32 @@ runTaskHalCommandSequence([...], { taskCycles: 5 })
2. validateRunPreconditions(state)
3. initializeTaskHalSession({ openProgram: true }) 如需要
4. 确认 readStatus() 的 openProgram/programPath 与 state.activeProgram 对齐
5. 如果 task mode 不是 AUTO先发送 EMC_TASK_SET_MODE AUTO 并等待 status 确认
6. 如果 task state 不是 ON先发送 EMC_TASK_SET_STATE ON 并等待 status 确认
```
未满足前置条件时,只设置 `operatorMessage`,不推进任何 line/sample。
### Step 3: 拆分 task command 与执行 pump
### Step 3: 拆分 task command 与 taskHalStatusLoop
`RUN` 应只发送 LinuxCNC task 命令:
```text
EMC_TASK_SET_STATE ON
EMC_TASK_SET_MODE AUTO
EMC_TASK_PLAN_RUN line = activeLine - programStartLine
EMC_TASK_PLAN_RUN line = linuxcncStartLine
```
然后启动 feedback pump
说明
```text
linuxcncStartLine 应按 LinuxCNC 的 program run line 语义保存。
普通从头运行传 0。
run-from-line 才传明确 line并需要单独处理 start line、previous modal state 和安全性。
不要用 UI activeLine 自行推导 programStartLine。
```
然后启动 `taskHalStatusLoop`
```text
while running:
@@ -399,22 +882,22 @@ while running:
dispatch TASK_HAL_STATUS_APPLIED(status)
append feedback history
if complete/paused/aborted/stopped:
stop pump
stop taskHalStatusLoop
```
说明:
```text
这里的 pump 可以在 store 主线程调度,也可以放到 worker 内部 postMessage 推送。
这里的 taskHalStatusLoop 可以在 store 主线程调度,也可以放到 worker 内部 postMessage 推送。
关键不是 timer 本身,而是每个 tick 都必须由 task/HAL/motion runtime 的 runCycles/readStatus 产生反馈。
```
### Step 4: 增加 RUN pump 状态
### Step 4: 增加 RUN status loop 状态
建议 state 增加:
```js
taskHalRunPump: {
taskHalStatusLoop: {
active: false,
sequence: 0,
profileId: null,
@@ -457,24 +940,24 @@ programRuntimeFeedback
4. 运行态 axisPose、velocity、DTG、activeLine 必须来自同一个 status snapshot。
```
### Step 6: STOP/ABORT/PAUSE/RESUME 控制 pump
### Step 6: STOP/ABORT/PAUSE/RESUME 控制 taskHalStatusLoop
行为要求:
```text
STOP/ABORT:
send EMC_TASK_ABORT
stop pump
stop taskHalStatusLoop
read final status
PAUSE:
send EMC_TASK_PLAN_PAUSE
pump 可停止或降频读取 paused status
taskHalStatusLoop 可停止或降频读取 paused status
runState=paused
RESUME:
send EMC_TASK_PLAN_RESUME
restart pump
restart taskHalStatusLoop
STEP:
不走 fixture sample playback
@@ -509,7 +992,7 @@ fullLinuxCncProgramExecutionReady=false
在真实 `taskHalRuntime.loaded === true` 且前置条件失败时,不应退回 fixture playback。
## 6. 开发验收命令
## 8. 开发验收命令
基础检查:
@@ -518,6 +1001,7 @@ node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_kinematics_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_machine_file_staging.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_feedback_loop.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build
```
@@ -540,7 +1024,7 @@ QA 证据采集:
node qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
```
## 7. 完成标准
## 9. 完成标准
`RUN` 可以判定为完善,必须同时满足:
@@ -553,6 +1037,7 @@ node qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
6. RUN 后 taskCycle/servoCycle 随时间持续推进,直到 paused/stopped/complete。
7. UI 高亮行和执行历史能复现逐行执行过程。
8. fallback playback 不能冒充 LinuxCNC task/HAL runtime。
9. RUN 失败时能明确区分 INI/profile、open program、machine ON、AUTO、homed、runtime readiness 哪一项未满足。
```
未满足以上条件时,状态应继续标记为:

View File

@@ -0,0 +1,210 @@
# 04 RUN status loop 完成记录与下一步建议
生成时间2026-06-22
## 1. 本轮完成范围
本轮完成 `03-run-step1-preconditions-complete-next-steps.md` 建议中的连续 feedback 工作,但命名从 `pump` 调整为更明确的:
```text
taskHalStatusLoop
```
这里的 loop 不生成 CNC 状态,不解析 G-code也不自增行号。它只负责在 `RUN` 之后持续调度:
```text
taskHalRuntime.runCycles(...)
taskHalRuntime.readStatus()
dispatch TASK_HAL_STATUS_APPLIED
```
`activeLine``axisPose``currentVelocity``switchkinsType`、DRO 和 runtime feedback 仍来自同一个 task/HAL/motion status snapshot。
## 2. 已完成改动
### 2.1 store 增加 taskHalStatusLoop
更新:
```text
app/src/state/store.js
```
新增状态:
```text
taskHalStatusLoop:
active
sequence
profileId
iniPath
kinematicsModuleId
tickCount
batchSize
intervalMs
taskPeriodNs
servoPeriodNs
lastStatusAt
lastError
stopReason
```
并新增:
```text
programRuntimeFeedbackHistory
```
最多保留 100 条 task/HAL/motion runtime feedback。
### 2.2 RUN 改为连续读取 task/HAL status
`RUN` 当前流程:
```text
1. validateRunPreconditions(..., requireTaskHalSession=false)
2. 初始化或复用当前 machine-file task/HAL session
3. validateRunPreconditions(..., requireTaskHalSession=true)
4. 发送:
EMC_TASK_SET_STATE ON
EMC_TASK_SET_MODE AUTO
EMC_TASK_PLAN_RUN
5. runCycles/readStatus 一次,应用首帧 status
6. 如果 status 仍处于 READING则启动 taskHalStatusLoop
7. loop 持续 runCycles/readStatus并通过 TASK_HAL_STATUS_APPLIED 更新 UI 状态
```
停止条件:
```text
interpState=IDLE 且 nextProgramLine >= openedLineCount -> complete
interpState=PAUSED 或 motion.paused=true -> paused
motion.aborted=true -> stopped
```
### 2.3 STOP / ABORT / PAUSE / RESUME / STEP
更新行为:
```text
STOP/ABORT:
先停止 taskHalStatusLoop再发送 EMC_TASK_ABORT并读取一次 status。
PAUSE:
先停止 taskHalStatusLoop再发送 EMC_TASK_PLAN_PAUSE并读取一次 paused status。
RESUME:
发送 EMC_TASK_PLAN_RESUME若 status 回到 READING则重新启动 taskHalStatusLoop。
STEP:
task/HAL runtime loaded 时不走 fixture playback。
改为明确 runCycles({ taskCycles: 1 }) 后 readStatus 一次。
```
### 2.4 新增验证
新增:
```text
tests/node/verify_run_feedback_loop.mjs
```
覆盖:
```text
1. 加载 xyzac-trt INI。
2. 加载 xyzac-trt kinematics WASM。
3. 加载 task/HAL runtime。
4. stage machine files。
5. 打开 xyzac_switchkins_test_1.ngc。
6. POWER/HOME/AUTO/RUN。
7. 等待 programRuntimeFeedbackHistory 至少 3 条。
8. 断言每条 feedback sourceMode 都是 linuxcnc-task-motion-hal-wasm。
9. 断言 semanticBoundary 是 linuxcnc_task_motion_hal_wasm_simulation_runtime。
10. 断言 taskCycle 和 servoCycle 单调递增。
11. 断言 STOP 后 taskHalStatusLoop.active=false。
```
`app/package.json``smoke:node` 已加入:
```text
node ../tests/node/verify_run_feedback_loop.mjs
```
## 3. 已运行验证
通过:
```bash
node tests/node/verify_run_feedback_loop.mjs
node tests/node/verify_linuxcnc_task_hal_runtime.mjs
node tests/node/verify_run_preconditions.mjs
node tests/node/verify_rtcp_store.mjs
npm --prefix app run build
npm --prefix app run smoke:node
```
关键输出:
```text
run_feedback_status_loop_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
run_preconditions_ini_profile_smoke=ok
rtcp_store_smoke=ok
gmoccapy_static_build=ok
```
本轮 `npm --prefix app run smoke:node` 已完整通过,包括 native task/HAL audit。
## 4. 当前 RUN 状态
当前 `RUN` 已经从:
```text
发送 task command -> runCycles({ taskCycles: 5 }) -> readStatus() 一次
```
推进为:
```text
发送 task command
-> runCycles/readStatus 首帧
-> taskHalStatusLoop 持续 runCycles/readStatus
-> TASK_HAL_STATUS_APPLIED 持续消费同一 task/HAL/motion status 链
```
重要边界仍保持:
```text
不引入 JS G-code parser。
不在 UI 自增 activeLine。
不在 UI 自造 axisPose。
不把 canonical timing estimate 当作真实 task/HAL runtime。
status 内容必须来自 task/HAL/motion runtime。
```
## 5. 下一步工作建议
下一步建议做浏览器端证据采集:
```text
1. 扩展 qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs。
2. 新增 07-run-preconditions-and-feedback case。
3. 浏览器中执行 POWER/HOME/AUTO/RUN。
4. 采集 t=0.2s / 0.5s / 1.0s / 2.0s state。
5. 断言:
- taskHalStatusLoop.tickCount 增长
- programRuntimeFeedbackHistory 增长
- activeLine 等于 UI 高亮行
- DRO 读取 state.programRuntimeFeedback.axisPose
- RTCP canvas 状态与 state.rtcpState 一致
6. 输出 JSON 和截图证据。
```
随后再考虑:
```text
1. 把 M428/M429 switchkins 状态变化纳入 RUN loop 浏览器断言。
2. 增加 xyzbc-trt 的 RUN status loop 对称测试。
3. 如果需要更接近真实 UI 实时性,再评估是否把 loop 下沉到 worker push status而不是 store setTimeout polling。
```

View File

@@ -0,0 +1,149 @@
# 06 RUN 实施完成情况矩阵与接续工作
生成时间2026-06-22
## 1. 本轮执行范围
`05-run-program-implementation-detailed-steps.md` 核对并补强当前实现,本轮完成:
```text
1. 建立 05 阶段完成情况矩阵。
2. 补强 INI definition contract validation。
3. 修正普通 RUN 的 EMC_TASK_PLAN_RUN 起始行为 line=0。
4. 补充 INI runtime 测试断言。
5. 执行 node smoke 验证。
6. 记录剩余接续工作。
```
## 2. 本轮代码改动
### 2.1 INI contract validation 补强
更新:
```text
app/src/runtime/linuxcnc-ini-runtime.js
tests/node/verify_linuxcnc_ini_runtime.mjs
```
补强内容:
```text
1. parseLinuxCncIni() 现在保留 sourceText。
2. 解析并输出 emcmot.module / emcmot.servoPeriodNs。
3. 解析并输出 task.module / task.cycleTimeSeconds。
4. emcio.toolTable 保持结构化输出。
5. applyIniConfigToProfile() 将 emcmot/task/emcio 写入 profile。
6. validateIniConfig() 增加 05 要求的关键 gate
- required sections: [EMC], [DISPLAY], [RS274NGC], [KINS], [HAL], [HALUI], [TRAJ], [EMCMOT], [TASK], [EMCIO]
- COORDINATES 必须是 XYZAC 或 XYZBC
- JOINTS 必须是 5
- JOINT_0..JOINT_4 必须存在
- KINEMATICS 必须包含 sparm=identityfirst
- M428/M429/M430 remap 必须完整
- HAL_PIN_VARS=1 必须存在
- HALCMD 必须连接 motion.analog-out-03 与 motion.switchkins-type
- SERVO_PERIOD / CYCLE_TIME / TOOL_TABLE 必须存在
```
### 2.2 RUN 起始行修正
更新:
```text
app/src/state/store.js
```
修正:
```text
普通 RUN 发送 EMC_TASK_PLAN_RUN line=0。
不再用 activeLine - programStartLine 推导普通 RUN 起始行。
run-from-line 后续应作为独立功能处理。
```
## 3. 完成情况矩阵
| 05 阶段 | 状态 | 证据 | 备注 |
| --- | --- | --- | --- |
| 阶段 0建立当前状态基线 | 完成 | `smoke:node` 完整通过 | 当前基线可复现 |
| 阶段 1INI definition contract | 完成 | `verify_linuxcnc_ini_runtime.mjs` | 本轮补强 section/字段 validation |
| 阶段 2绑定 kinematics runtime | 完成 | `verify_linuxcnc_kinematics_runtime.mjs`, `verify_run_preconditions.mjs` | RUN gate 检查 module/frame source |
| 阶段 3machine-file staging | 完成 | `verify_machine_file_staging.mjs` | selected G-code 与 wasmProgramPath 同步 |
| 阶段 4初始化 task/HAL session | 完成 | `verify_linuxcnc_task_hal_runtime.mjs` | openProgram/session/status 链路通过 |
| 阶段 5RUN preconditions gate | 完成 | `verify_run_preconditions.mjs` | 仍可继续扩展更细 ON/AUTO/homed 阻断文案 |
| 阶段 6RUN command sequence | 完成 | `verify_run_feedback_loop.mjs` | 本轮修正普通 RUN line=0 |
| 阶段 7taskHalStatusLoop | 完成 | `verify_run_feedback_loop.mjs` | tick/history/STOP 断言通过 |
| 阶段 8统一 TASK_HAL_STATUS_APPLIED | 完成 | `verify_run_feedback_loop.mjs`, `verify_rtcp_store.mjs` | feedback history 保留 task/HAL/motion source |
| 阶段 9STOP/ABORT/PAUSE/RESUME/STEP | 部分完成 | `verify_linuxcnc_task_hal_runtime.mjs` | PAUSE/RESUME 有测试STOP 有 feedback-loop 测试STEP/ABORT 仍需专门断言 |
| 阶段 10UI 显示与交互 | 部分完成 | 现有 browser smoke 未在本轮执行 | 仍需 07 浏览器证据 case |
| 阶段 11full execution boundary | 完成 | `verify_full_execution_boundary.mjs`, native audit | web simulation boundary 通过 |
| 阶段 12Node smoke 集成 | 完成 | `npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node` | 完整通过 |
| 阶段 13浏览器证据采集 | 未完成 | 无新 JSON/截图 | 下一步工作 |
## 4. 本轮验证结果
通过:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_ini_runtime.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
```
关键输出:
```text
linuxcnc_ini_runtime_smoke=ok
gmoccapy_static_build=ok
run_feedback_status_loop_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
full_execution_boundary_smoke=ok
machine_file_staging_smoke=ok
rtcp_store_smoke=ok
profile_boundary_smoke=ok
```
`smoke:node` 已完整通过。
## 5. 剩余接续工作
下一步建议优先做浏览器证据采集:
```text
1. 扩展 qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs。
2. 新增 07-run-preconditions-and-feedback case。
3. 浏览器执行 POWER/HOME/AUTO/RUN。
4. 采集 t=0.2s / 0.5s / 1.0s / 2.0s / 5.0s state。
5. 断言 taskHalStatusLoop.tickCount 和 programRuntimeFeedbackHistory 增长。
6. 断言 feedback sourceMode 不含 fixture-line-playback。
7. 输出 JSON 与截图:
qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json
qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/*.png
```
随后补强控制类测试:
```text
1. ABORT 后 loop active=falserunState/stopped status 正确。
2. STEP 在 task/HAL loaded 时 sourceMode 仍是 linuxcnc-task-motion-hal-wasm。
3. RUN gate 对 machine ON / AUTO / homed / opened-file 增加更细粒度失败断言。
4. taskHalStatusLoop 的 taskPeriodNs/servoPeriodNs 从 INI CYCLE_TIME/SERVO_PERIOD 派生,而不是只使用默认值。
5. xyzbc-trt 增加对称 RUN status loop 测试。
```
## 6. 当前结论
当前 RUN 主链路已经满足 05 的 node 侧核心完成标准:
```text
INI contract ready
-> profile/INI/kinematics 一致
-> machine files staged
-> selected G-code opened by task/HAL session
-> RUN sends LinuxCNC task commands
-> taskHalStatusLoop continuously runCycles/readStatus
-> UI/store consumes TASK_HAL_STATUS_APPLIED snapshots
```
尚未完成的是浏览器端 JSON/截图证据,以及 ABORT/STEP/xyzbc 对称测试的补强。

View File

@@ -0,0 +1,135 @@
# 07 浏览器 RUN feedback 证据完成记录与下一步
生成时间2026-06-22
## 1. 本轮执行范围
`06-run-implementation-traceability-matrix-and-next-steps.md` 的优先级,完成浏览器端 `07-run-preconditions-and-feedback` 证据采集。
本轮没有继续扩展 ABORT/STEP/xyzbc 对称测试。
## 2. 已完成改动
更新:
```text
qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
```
新增:
```text
07-run-preconditions-and-feedback
```
浏览器流程:
```text
1. 等待 app、INI、kinematics runtime、machine files ready。
2. 选择 LinuxCNC vendored G-code:
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc
3. 确认 taskHalSession.programPath 已 open 同一个 G-code。
4. POWER -> MANUAL -> HOME -> AUTO。
5. RUN。
6. 采集 baseline 和 0.2s / 0.5s / 1.0s / 2.0s / 5.0s state。
7. 截图并输出 JSON 证据。
```
输出:
```text
qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json
qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/
```
## 3. 断言结果
`run-preconditions-feedback.json` 当前状态:
```text
status=PASS
```
通过的关键断言:
```text
1. INI ready。
2. selected G-code 是 xyzac_switchkins_test_1.ngc。
3. task/HAL session opened selected G-code。
4. RUN 后 taskHalStatusLoop sequence 从 1 变为 2。
5. 本次 RUN tickCount=4。
6. 本次 RUN programRuntimeFeedbackHistory=5。
7. feedback sourceMode 全部是 linuxcnc-task-motion-hal-wasm。
8. 不含 fixture-line-playback feedback。
9. semanticBoundary 全部是 linuxcnc_task_motion_hal_wasm_simulation_runtime。
10. activeLine 等于 UI 高亮行。
11. DRO 等于 runtime feedback axisPose。
12. RTCP canvas 状态与 state.rtcpState 一致。
13. taskCycle/servoCycle 可见。
14. canvas 执行轨迹可见。
```
样本摘要:
```text
t=0.2s / 0.5s / 1.0s / 2.0s / 5.0s
runState=complete
taskHalStatusLoop.sequence=2
taskHalStatusLoop.tickCount=4
programRuntimeFeedbackHistory.length=5
activeLine=29
sourceMode=linuxcnc-task-motion-hal-wasm
```
说明:
```text
xyzac_switchkins_test_1.ngc 很短,浏览器首个 0.2s 样本时程序已 complete。
因此证据不要求 5 秒内持续 active=true而是验证本次 RUN 的新 loop sequence、tick/history、task/HAL feedback 和 UI snapshot 一致性。
```
## 4. 已运行验证
执行:
```bash
node qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
```
结果:
```text
01-home-toolpath: PASS
02-operator-demo-toolpath: PASS
03-arc-demo-toolpath: PASS
04-clear-preview-reference: PASS
05-vendored-impeller-toolpath: PASS
06-running-rtcp-toolpath: PASS
07-run-preconditions-and-feedback: PASS
```
## 5. 接续工作
下一步建议补控制类 node 测试:
```text
1. ABORT 后 taskHalStatusLoop.active=falserunState/stopped status 正确。
2. STEP 在 task/HAL loaded 时 sourceMode 仍是 linuxcnc-task-motion-hal-wasm。
3. RUN gate 对 machine ON / AUTO / homed / opened-file 增加更细粒度失败断言。
4. taskHalStatusLoop 的 taskPeriodNs/servoPeriodNs 从 INI CYCLE_TIME/SERVO_PERIOD 派生。
5. xyzbc-trt 增加 RUN status loop 对称测试。
```
## 6. 当前完成矩阵变化
`06` 中的阶段 13 状态从:
```text
未完成:无新 JSON/截图
```
更新为:
```text
完成run-preconditions-feedback.json + run-preconditions-feedback/*.png07 case PASS
```

View File

@@ -0,0 +1,131 @@
# 08 LinuxCNC 源程序测试资产
生成时间2026-06-22
## 1. 选择结果
本轮按用户要求,从 `/home/meswork/cnc_wams/linuxcnc` LinuxCNC 源程序中选定一组更适合项目测试的真实 RTCP/五轴资产:
```text
INI:
/home/meswork/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
G-code:
/home/meswork/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc
```
已复制到 `working_run`
```text
web-rtcp-5axis-sim-plan/working_run/test_linuxcnc_source/xyzac-trt.ini
web-rtcp-5axis-sim-plan/working_run/test_linuxcnc_source/impeller-7bl-xyzac.ngc
```
已移除不合适的短程序副本:
```text
web-rtcp-5axis-sim-plan/working_run/test_linuxcnc_source/xyzac_switchkins_test_1.ngc
```
## 2. 选择原因
选择 `xyzac-trt.ini` + `impeller-7bl-xyzac.ngc`,原因:
```text
1. INI 是 LinuxCNC 官方 5axis table-rotary-tilting 仿真配置。
2. 坐标为 XYZAC与当前项目默认 profile `xyzac-trt` 一致。
3. KINEMATICS = xyzac-trt-kins sparm=identityfirst。
4. 包含完整 M428/M429/M430 remap contract。
5. 包含 HAL_PIN_VARS=1。
6. 包含 motion.analog-out-03 => motion.switchkins-type HALCMD。
7. G-code 以 M428 ;TCP:xyzac 进入 TCP/RTCP kinematics。
8. G-code 使用 G93 inverse-time feed。
9. G-code 包含大量 XYZAC 五轴联动段。
10. G-code 共 4510 行,比短 switchkins test 程序更适合测试项目功能完整性。
11. G-code 来自 /home/meswork/cnc_wams/linuxcnc 源程序,不是项目手写 fixture。
```
## 3. 源文件哈希
当前副本与 `/home/meswork/cnc_wams/linuxcnc` 源文件逐字节一致:
```text
xyzac-trt.ini
sha256=4b7fa6cb8d3e7031e769b3e0c779b586b67cfd45d715985f40d4ec23c662dc97
impeller-7bl-xyzac.ngc
sha256=e90f0b4b6c43809da94a8170ee1029b5afc3e1bbe9bf2ae66298a8baefad013c
```
验证结果:
```text
ini_cmp=0
ngc_cmp=0
```
## 4. 测试覆盖点
这组资产覆盖:
```text
1. LinuxCNC INI definition contract。
2. profile/INI 坐标一致性XYZAC。
3. kinematics module 一致性xyzac-trt。
4. RTCP/TCP kinematics
M428 -> xyzac TCP
5. inverse-time feed
G93
6. 长路径五轴联动:
XYZAC motion lines with A/C rotary axes
7. machine-file staging。
8. taskHalRuntime.openProgram(programPath)。
9. RUN command sequence。
10. taskHalStatusLoop feedback。
11. UI activeLine/DRO/RTCP/runtime feedback same-snapshot 证据。
12. 长路径 preview、执行轨迹、rapid/feed 与五轴姿态变化。
```
## 5. 已运行验证
执行:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_real_linuxcnc_5axis_program_cases.mjs
```
结果:
```text
linuxcnc_source_program_case_count=8
all_cases_program_preview_points=ok
all_cases_executed_path_points=ok_after_run_or_step
all_cases_toolpath_preview_source=linuxcnc_interpreter_canonical_motion
all_cases_tool_execution_trace_source=linuxcnc_tp_samples_or_task_motion_hal_feedback
all_switchkins_cases_rtcp_state_changes_verified=1
all_cases_source_guard=linuxcnc_vendored_5axis_gcode_source_file
fixture_toolpath_fallback_not_promoted=1
real_linuxcnc_5axis_program_cases_smoke=ok
```
## 6. 后续使用方式
后续新增测试时优先引用这组资产:
```text
working_run/test_linuxcnc_source/xyzac-trt.ini
working_run/test_linuxcnc_source/impeller-7bl-xyzac.ngc
```
如果要测试短 switchkins identity/TCP 循环,再补充:
```text
/home/meswork/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc
```
如果要测试 xyzbc 对称链路,再补充:
```text
/home/meswork/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
/home/meswork/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc
```

View File

@@ -0,0 +1,58 @@
# 09 单位换算与 Three.js 米单位场景完成记录
生成时间2026-06-22
## 本轮目标
解决英寸、毫米、米之间的单位换算问题,重点覆盖:
- 实时轴值显示;
- 刀具路径预览;
- 刀具执行轨迹;
- Three.js 绘图坐标统一使用米。
## 完成情况矩阵
| 项目 | 完成状态 | 代码落点 | 验证 |
| --- | --- | --- | --- |
| 公共线性单位换算 | 已完成 | `app/src/runtime/linear-units.js` | `verify_linear_unit_conversion.mjs` |
| mm/inch/m 到米转换 | 已完成 | `linearValueToMeters()``axesToSceneMeters()` | `25.4mm == 1inch == 0.0254m` |
| 执行计时距离归一到毫米 | 已完成 | `app/src/runtime/execution-timing.js` | inch 段长 `1 inch -> 25.4 mm` |
| 执行计时进给归一到 mm/min | 已完成 | `app/src/runtime/execution-timing.js` | inch feed `1 inch/min -> 25.4 mm/min` |
| G20/G21 程序单位解析 | 已完成 | `app/src/runtime/linuxcnc-interpreter-runtime.js` | G20 motion 标记 `inch`G21 motion 标记 `mm` |
| 刀具路径预览使用米 | 已完成 | `app/src/visualization/five-axis-scene.js` | motion axes 经 `axesToSceneMeters()` |
| 刀具执行轨迹使用米 | 已完成 | `app/src/visualization/five-axis-scene.js` | timing samples 携带/继承 motion 单位 |
| 当前刀位 marker 使用米 | 已完成 | `app/src/visualization/five-axis-scene.js` | runtime feedback linearUnits 参与转换 |
| Three.js 机床参考模型使用米尺度 | 已完成 | `app/src/visualization/five-axis-scene.js` | 参考模型尺寸从任意倍率改为米尺度 |
| 2D fallback 使用米尺度 | 已完成 | `app/src/visualization/five-axis-scene.js` | fallback scale 改为米坐标范围 |
| 轴值实时显示 | 已确认边界 | `store.axisPose` / DRO | 保留机床/程序单位,不改成米 |
## 关键设计结论
实时轴值显示不应强制转换为米。DRO/axisPose 表示当前机床或程序坐标单位,应保留 LinuxCNC/INI/G-code 的语义Three.js 预览层才统一转换为米。
Three.js 场景现在通过 dataset 暴露:
```text
data-three-scene-units="m"
data-three-linear-units="<mm|inch|m>"
data-three-linear-unit-scale-to-meters="<factor>"
```
## 已执行验证
```text
node web-rtcp-5axis-sim-plan/tests/node/verify_linear_unit_conversion.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_real_linuxcnc_5axis_program_cases.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_ini_runtime.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build
```
结果均通过。
## 后续工作
1. 增加浏览器截图证据,确认米尺度 Three.js 画面在 desktop/mobile 下不空白、不偏移。
2. 如果后续接入真实 task/motion HAL feedback需要确认 feedback 坐标是否已经按 INI 单位输出,并继续填充 `programRuntimeFeedback.linearUnits`
3. 可继续补 G-code 中途 G20/G21 切换的多段浏览器端预览用例。

View File

@@ -0,0 +1,210 @@
# 10 RUN 控制类测试与 INI 周期派生详细步骤
生成时间2026-06-22
## 1. 本轮目标
`05``09` 已完成 RUN 主链路、浏览器 RUN 证据和米单位场景的基础上,继续补齐 `07``09` 中列出的剩余可自动验证项。
本轮执行范围:
```text
1. ABORT 后 taskHalStatusLoop.active=falserunState/status 正确。
2. STEP 在 task/HAL runtime loaded 时仍消费 linuxcnc-task-motion-hal-wasm feedback。
3. RUN gate 对 machine ON / AUTO / homed / opened-file 保持细粒度失败断言。
4. taskHalStatusLoop 的 taskPeriodNs/servoPeriodNs 从 INI TASK.CYCLE_TIME / EMCMOT.SERVO_PERIOD 派生。
5. xyzbc-trt 增加 RUN status loop 对称 node 测试。
```
不在本轮执行:
```text
1. 新增浏览器 desktop/mobile 米尺度截图证据。
2. G20/G21 中途切换浏览器端预览用例。
3. 新增真实 LinuxCNC native 对照资产。
```
## 2. 执行顺序
### 步骤 1建立当前基线
运行:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_feedback_loop.mjs
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
```
通过标准:
```text
现有 xyzac RUN feedback loop、RUN preconditions、task/HAL runtime smoke 均可复现。
```
### 步骤 2实现 INI 周期派生
代码落点:
```text
app/src/state/store.js
```
实现要求:
```text
1. 从 state.linuxCncIniConfig.task.cycleTimeSeconds 派生 taskPeriodNs。
2. 从 state.linuxCncIniConfig.emcmot.servoPeriodNs 派生 servoPeriodNs。
3. runTaskHalCommandSequence 默认使用派生周期。
4. startTaskHalStatusLoop 默认使用派生周期。
5. 如果 INI 字段缺失,才回退到原默认值 task=10000000ns / servo=1000000ns。
```
验收断言:
```text
xyzac-trt.ini: TASK.CYCLE_TIME=0.010 -> taskPeriodNs=10000000。
xyzac-trt.ini: EMCMOT.SERVO_PERIOD=1000000 -> servoPeriodNs=1000000。
```
### 步骤 3补 ABORT/STEP node 测试
测试落点:
```text
tests/node/verify_run_feedback_loop.mjs
```
新增断言:
```text
1. RUN 后 loop sequence/tick/history 由 task/HAL feedback 产生。
2. ABORT 后 taskHalStatusLoop.active=false。
3. ABORT 后 stopReason 为 aborted 或 runState 被 task/HAL status 收敛到 stopped/complete。
4. STEP 后 programRuntimeFeedback.sourceMode 是 linuxcnc-task-motion-hal-wasm。
5. STEP 后不出现 fixture-line-playback。
```
### 步骤 4补 RUN gate 细粒度断言
测试落点:
```text
tests/node/verify_run_preconditions.mjs
```
新增断言:
```text
1. INI/profile/kinematics/machine-file ready 但 machine off 时RUN gate 返回 machine must be on。
2. machine on 但未 home 时RUN gate 返回 home machine first。
3. homed 但 manual mode 时RUN gate 返回 switch to auto mode first。
4. selected G-code/session 缺失时validateRunPreconditions 返回 no machine-file G-code opened。
```
### 步骤 5补 xyzbc RUN status loop 对称测试
测试落点:
```text
tests/node/verify_run_feedback_loop.mjs
```
流程:
```text
1. 加载 profile=xyzbc-trt。
2. 解析 xyzbc-trt.ini。
3. attach xyzbc-trt kinematics runtime。
4. stage machine files。
5. 选择 xyzbc_switchkins.ngc 或 boat-xyzbc.ngc。
6. POWER -> HOME -> AUTO -> RUN。
7. 断言 taskHalStatusLoop/profile/kinematics/sourceMode/history 与 xyzbc 一致。
```
### 步骤 6验证
运行:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_feedback_loop.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
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
```
通过标准:
```text
所有命令返回 0。
新增断言覆盖 ABORT、STEP、RUN gate、INI cycle period、xyzbc RUN symmetry。
```
## 3. 完成记录模板
执行完成后,追加记录:
```text
1. 修改文件。
2. 新增断言。
3. 验证命令与结果。
4. 未完成项和下一步。
```
## 4. 本轮完成记录
完成时间2026-06-22 17:45 EDT
修改文件:
```text
app/src/state/store.js
tests/node/verify_run_feedback_loop.mjs
tests/node/verify_run_preconditions.mjs
working_run/README.md
working_run/10-run-control-tests-and-ini-cycle-steps.md
```
完成内容:
```text
1. runTaskHalCommandSequence 默认周期改为从 INI 派生:
TASK.CYCLE_TIME -> taskPeriodNs。
EMCMOT.SERVO_PERIOD -> servoPeriodNs。
2. startTaskHalStatusLoop 默认周期改为从同一个 INI 派生。
3. verify_run_feedback_loop.mjs 增加 STOP、ABORT、STEP、xyzbc-trt 对称 RUN 覆盖。
4. verify_run_feedback_loop.mjs 断言 taskHalStatusLoop.taskPeriodNs=10000000、
servoPeriodNs=1000000且 feedback sourceMode 不回退 fixture-line-playback。
5. verify_run_preconditions.mjs 增加 RUN gate 细粒度断言:
machine off、not homed、manual mode、未打开 selected G-code。
6. working_run/README.md 增加 10 文档索引,并把下一步改为米尺度浏览器截图证据。
```
验证结果:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_feedback_loop.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
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
```
结果:
```text
全部通过。
run_preconditions_ini_profile_smoke=ok
run_feedback_status_loop_smoke=ok
linuxcnc_task_hal_runtime_smoke=ok
gmoccapy_static_build=ok
smoke:node 全部通过。
```
剩余项:
```text
1. 增加浏览器 desktop/mobile 米尺度截图证据。
2. 后续可补 G20/G21 中途切换浏览器端预览用例。
```

View File

@@ -0,0 +1,105 @@
# 11 浏览器米尺度场景与 G20/G21 混合单位证据完成记录
生成时间2026-06-22 17:55 EDT
## 1. 本轮目标
`09-linear-units-meter-scene-complete-next-steps.md` 的剩余项继续执行,补齐:
```text
1. 浏览器 desktop/mobile 米尺度 Three.js 截图证据。
2. G20/G21 混合单位浏览器端预览用例。
3. 对应 JSON 证据和截图归档。
```
## 2. 修改文件
```text
app/src/visualization/five-axis-scene.js
qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
working_run/README.md
working_run/11-browser-meter-scene-and-mixed-units-complete.md
gptlog-process/gpdlog.md
```
## 3. 完成内容
```text
1. Three.js canvas dataset 新增 threePathBoundsMeters。
2. browser 证据脚本新增 08-meter-scene-desktop-mobile。
3. desktop/mobile 分别采集 canvas screenshot、pixelStats、dataset。
4. 断言 sceneUnits=m、linearUnitScaleToMeters 有效、pathFitBounds=ok、bounds maxSpan 为米尺度且 canvas 非空。
5. browser 证据脚本新增 09-g20-g21-mixed-units-preview。
6. 加载本地 G-code
G90 G20
G1 X1.0 Y0 Z0 F10
G21
G1 X25.4 Y25.4 Z0 F254
M2
7. 断言 canonical motion 同时保留 inch/mm并且 1 inch 与 25.4 mm 都映射到 0.0254m 场景坐标。
8. RUN case 前恢复 vendored impeller 程序,避免本地混合单位程序污染 RUN 证据上下文。
```
## 4. 新增输出
```text
qa/web-rtcp-5axis-site-test/output/meter-scene-evidence.json
qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence/08-meter-scene-desktop.png
qa/web-rtcp-5axis-site-test/screenshots/meter-scene-evidence/08-meter-scene-mobile.png
qa/web-rtcp-5axis-site-test/screenshots/toolpath-preview-cases/09-g20-g21-mixed-units-preview.png
```
`toolpath-preview-cases.json` 当前新增 case
```text
08-meter-scene-desktop-mobile: PASS
09-g20-g21-mixed-units-preview: PASS
```
## 5. 验证结果
执行:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_linear_unit_conversion.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build
node qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
```
结果:
```text
linear_unit_conversion_smoke=ok
gmoccapy_static_build=ok
browser evidence: all recorded cases PASS
smoke:node: all checks PASS
```
浏览器 JSON 摘要:
```text
meter-scene-evidence.json status=PASS
run-preconditions-feedback.json status=PASS
toolpath-preview-cases:
01-home-toolpath PASS
02-operator-demo-toolpath PASS
03-arc-demo-toolpath PASS
04-clear-preview-reference PASS
05-vendored-impeller-toolpath PASS
08-meter-scene-desktop-mobile PASS
09-g20-g21-mixed-units-preview PASS
06-running-rtcp-toolpath PASS
07-run-preconditions-and-feedback PASS
```
## 6. 当前结论
`working_run` 中列出的 RUN 主链路、控制类测试、INI 周期派生、xyzbc 对称测试、浏览器 RUN feedback 证据、Three.js 米尺度场景证据、G20/G21 混合单位预览证据均已完成并可复现。
后续可选增强:
```text
1. 将浏览器证据脚本拆分为独立小脚本,降低单次运行时间。
2. 补更多真实 LinuxCNC native 对照资产。
```

View File

@@ -0,0 +1,111 @@
# 12 working_run 剩余工作最终完成记录
生成时间2026-06-22
## 1. 执行范围
`working_run` 当前执行情况复核 `01``11` 的接续项,并完成最终收尾确认。
本轮重点核对:
```text
1. RUN 主链路是否仍可复现。
2. RUN preconditions、status loop、ABORT/STEP、xyzbc 对称测试是否通过。
3. INI CYCLE_TIME / SERVO_PERIOD 派生周期是否仍通过测试。
4. Three.js 米单位场景、G20/G21 混合单位浏览器证据是否仍通过。
5. browser evidence JSON 是否全部 PASS。
```
## 2. 当前结论
`working_run` 中早期文档保留的“下一步/未完成”项已经由后续文档覆盖:
```text
06 中的浏览器 RUN feedback 证据 -> 07 已完成。
07 中的 ABORT/STEP/RUN gate/xyzbc 对称测试 -> 10 已完成。
09/10 中的 desktop/mobile 米尺度截图与 G20/G21 混合单位浏览器用例 -> 11 已完成。
```
因此,按 `working_run` 已列出的必做项,当前剩余工作已全部完成并复核通过。
只保留可选增强:
```text
1. 将浏览器证据脚本拆成多个独立小脚本,降低单次运行时间。
2. 后续补更多真实 LinuxCNC native 对照资产。
3. 如果接入真实 task/motion HAL feedback再重新确认 feedback 坐标单位语义。
```
## 3. 本轮复核命令
已执行:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_feedback_loop.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linear_unit_conversion.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run build
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
node qa/web-rtcp-5axis-site-test/capture-toolpath-preview-cases.mjs
```
结果:
```text
run_preconditions_ini_profile_smoke=ok
run_preconditions_kinematics_smoke=ok
run_preconditions_machine_file_smoke=ok
run_feedback_status_loop_smoke=ok
linear_unit_conversion_smoke=ok
gmoccapy_static_build=ok
smoke:node 全部通过
browser evidence 脚本返回 0
```
## 4. 浏览器证据状态
`qa/web-rtcp-5axis-site-test/output/toolpath-preview-cases.json`
```text
01-home-toolpath: PASS
02-operator-demo-toolpath: PASS
03-arc-demo-toolpath: PASS
04-clear-preview-reference: PASS
05-vendored-impeller-toolpath: PASS
08-meter-scene-desktop-mobile: PASS
09-g20-g21-mixed-units-preview: PASS
06-running-rtcp-toolpath: PASS
07-run-preconditions-and-feedback: PASS
```
其他证据:
```text
qa/web-rtcp-5axis-site-test/output/run-preconditions-feedback.json: PASS
qa/web-rtcp-5axis-site-test/output/meter-scene-evidence.json: PASS
```
## 5. 最终状态
当前已完成:
```text
INI definition contract validation
profile/INI/kinematics 一致性验证
machine-file staging
task/HAL session openProgram
RUN gate
RUN command sequence
连续 taskHalStatusLoop
TASK_HAL_STATUS_APPLIED runtime feedback 消费
STOP/ABORT/STEP 控制类测试
INI 周期派生
xyzac/xyzbc RUN status loop 对称覆盖
LinuxCNC 源程序真实五轴资产覆盖
mm/inch/m 到 Three.js 米单位场景转换
desktop/mobile 米尺度浏览器截图证据
G20/G21 混合单位浏览器预览证据
完整 node smoke
浏览器 evidence JSON/截图
```

View File

@@ -9,8 +9,17 @@
| 文件 | 用途 |
| --- | --- |
| `01-run-gcode-execution-principle-and-test.md` | G-code 具体执行过程、`RUN` 执行原理、源码证据、测试观察和问题结论 |
| `02-run-preconditions-test-and-implementation-steps.md` | `RUN` 前置条件、INI/机床/五轴运动学确认流程、详细测试用例和编写 `RUN` 程序步骤 |
| `02-run-preconditions-test-and-implementation-steps.md` | `RUN` 前置条件、INI definition contract、LinuxCNC 源码对照、INI/机床/五轴运动学确认流程、详细测试用例和编写 `RUN` 程序步骤 |
| `03-run-step1-preconditions-complete-next-steps.md` | 本轮已完成的 `RUN` 前置条件 gate、验证结果和下一步接续建议 |
| `04-run-status-loop-complete-next-steps.md` | 本轮已完成的 `RUN` 连续 task/HAL status loop、验证结果和下一步接续建议 |
| `05-run-program-implementation-detailed-steps.md` | 根据 01-04 文档整理的程序实现详细实施步骤、代码落点、测试与验收顺序 |
| `06-run-implementation-traceability-matrix-and-next-steps.md` | 按 05 核对后的完成情况矩阵、本轮补强项、验证结果和后续接续工作 |
| `07-browser-run-feedback-evidence-complete-next-steps.md` | 浏览器端 RUN feedback JSON/截图证据完成记录和后续控制类测试建议 |
| `08-linuxcnc-source-test-assets.md` | 从 LinuxCNC 源程序选定并复制到 working_run 的真实 INI/G-code 测试资产说明 |
| `09-linear-units-meter-scene-complete-next-steps.md` | 英寸/毫米/米单位换算、Three.js 米单位场景、执行轨迹单位语义完成记录和后续建议 |
| `10-run-control-tests-and-ini-cycle-steps.md` | RUN 控制类测试、INI 周期派生、ABORT/STEP/RUN gate/xyzbc 对称测试实施步骤与完成记录 |
| `11-browser-meter-scene-and-mixed-units-complete.md` | 浏览器 desktop/mobile 米尺度截图证据、G20/G21 混合单位预览用例与完成记录 |
| `12-working-run-final-completion-record.md` | 按 `working_run` 接续项最终复核后的剩余工作完成记录 |
## 结论摘要
@@ -18,10 +27,13 @@
```text
1. 先确定明确的 LinuxCNC INI 文件。
2. INI/profile 确定机床类型、坐标轴、joint 配置、HAL/remap/tool-table 资产
3. 由 INI 的 [KINS] KINEMATICS 确定五轴运动学算法和 switchkins 映射
4. 验证对应 LinuxCNC kinematics WASM 已加载,并能产生 source-derived frame
5. 之后才进入 RUN打开同一 INI 上下文下的 G-code发送 task command持续消费 task/HAL/motion feedback
2. 验证 INI definition contract[EMC]、[DISPLAY]、[RS274NGC]、[KINS]、[HAL]、[TRAJ]、[EMCMOT]、[TASK]、[EMCIO]、[AXIS_*]、[JOINT_*] 必须完整且互相一致
3. 由 INI/profile 确定机床类型、坐标轴、joint 配置、HAL/remap/tool-table 资产
4. 由 INI 的 [KINS] KINEMATICS 确定五轴运动学算法和 switchkins 映射
5. 验证对应 LinuxCNC kinematics WASM 已加载,并能产生 source-derived frame
6. 验证同一 INI 上下文下的 G-code 已通过 task plan open 打开。
7. 确认 machine ON、AUTO mode、homed/no_force_homing 等 LinuxCNC task gate。
8. 之后才进入 RUN发送 task command持续消费 task/HAL/motion feedback。
```
当前项目明确支持的五轴机床上下文是:
@@ -33,22 +45,28 @@
当前实现已经能显示 G-code 程序文本、当前行、高亮行、DRO、runtime feedback 和 task/HAL 状态。
但按 `textbak` 接续文件的边界要求,当前 `RUN` 还不是连续的 task/HAL feedback 推送执行模型
`04` 完成后,当前 `RUN` 已从单次 task/HAL status 读取推进为连续 status loop
```text
RUN 点击后:
1. UI 发送 EMC_TASK_SET_STATE / EMC_TASK_SET_MODE / EMC_TASK_PLAN_RUN
2. store 调用 taskHalRuntime.runCycles({ taskCycles: 5 })
3. 随后 readStatus() 一次
4. TASK_HAL_STATUS_APPLIED 将这一次 status 映射到 activeLine / axisPose / velocity / feedback
5. 没有看到 worker 主动持续 postMessage 推送 status
6. 如果没有再次调用 runCycles/readStatus状态不会继续随真实时间推进
1. UI 确认 opened program、machine ON、AUTO、homed 后发送 EMC_TASK_SET_STATE / EMC_TASK_SET_MODE / EMC_TASK_PLAN_RUN
2. store 调用 taskHalRuntime.runCycles(...)
3. store 调用 taskHalRuntime.readStatus()
4. TASK_HAL_STATUS_APPLIED 将 task/HAL/motion status 映射到 activeLine / axisPose / velocity / feedback
5. taskHalStatusLoop 持续重复 runCycles/readStatus
6. programRuntimeFeedbackHistory 保留最近 100 条 task/HAL/motion feedback
```
因此,当前问题重点不是前端是否需要定时器”,而是:
该顺序与 LinuxCNC 源码中的 `halui.cc::sendProgramRun()``shcom.cc::sendProgramOpen/sendProgramRun()``emctaskmain.cc::EMC_TASK_PLAN_OPEN/RUN/PAUSE/RESUME` 对齐RUN 不是前端播放,而是在已打开程序和可运行 task 状态下发送 `EMC_TASK_PLAN_RUN`,后续状态来自 task/motion/HAL feedback。
当前仍需保持的边界是:
```text
task/HAL runtime 是否能在 G-code 执行期间持续产出状态
UI/store 是否持续消费这些 LinuxCNC-owned 状态
轴值、当前行、速度、DTG、程序时间是否都来自同一条 task/HAL/motion feedback 链。
taskHalStatusLoop 只负责调度 runCycles/readStatus
status 内容必须来自 task/HAL/motion runtime
UI/store 不自增 activeLine
UI/store 不自造 axisPose
浏览器端米尺度 desktop/mobile 截图证据已补齐;
G20/G21 混合单位浏览器预览证据已补齐。
working_run 已列出的必做接续项已全部复核通过,仅保留可选增强。
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,182 @@
[APPLICATIONS]
# uncomment to enable:
#APP = halshow --fformat %.5f switchkins.halshow
[EMC]
VERSION = 1.1
MACHINE = sim-xyzac-trt-kins (switchkins)
[DISPLAY]
GEOMETRY = XYZ-A
OPEN_FILE = ./demos/xyzac_switchkins.ngc
PYVCP = ./xyzac-trt.xml
JOG_AXES = XYZC
DISPLAY = axis
MAX_ANGULAR_VELOCITY = 360
MAX_LINEAR_VELOCITY = 1000
POSITION_OFFSET = RELATIVE
POSITION_FEEDBACK = ACTUAL
MAX_FEED_OVERRIDE = 2
PROGRAM_PREFIX = ../../nc_files
INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 1
#EDITOR = geany
TOOL_EDITOR = tooledit z diam
TKPKG = Ngcgui 1.0
NGCGUI_FONT = Helvetica -12 normal
NGCGUI_SUBFILE = xyzac_switchkins_sub.ngc
NGCGUI_SUBFILE = centering.ngc
[RS274NGC]
SUBROUTINE_PATH = ./remap_subs
HAL_PIN_VARS = 1
REMAP = M428 modalgroup=10 ngc=428remap
REMAP = M429 modalgroup=10 ngc=429remap
REMAP = M430 modalgroup=10 ngc=430remap
PARAMETER_FILE = xyzac.var
[KINS]
#NOTE: for backwrds compatibility !!!!!!!!!!!!!!!!!!!
# default switchkins-type == 0 is xyzac-trt-kins
# here switchkins-type == 0 is identity kins
KINEMATICS = xyzac-trt-kins sparm=identityfirst
JOINTS = 5
[HAL]
HALUI = halui
HALFILE = LIB:basic_sim.tcl
POSTGUI_HALFILE = switchkins_postgui.hal
# net for control of motion.switchkins-type
HALCMD = net :kinstype-select <= motion.analog-out-03 => motion.switchkins-type
# vismach xyzac-trt-gui items
HALCMD = loadusr -W xyzac-trt-gui
HALCMD = net :table-x joint.0.pos-fb xyzac-trt-gui.table-x
HALCMD = net :saddle-y joint.1.pos-fb xyzac-trt-gui.saddle-y
HALCMD = net :spindle-z joint.2.pos-fb xyzac-trt-gui.spindle-z
HALCMD = net :tilt-a joint.3.pos-fb xyzac-trt-gui.tilt-a
HALCMD = net :rotate-c joint.4.pos-fb xyzac-trt-gui.rotate-c
HALCMD = net :tool-offset motion.tooloffset.z
HALCMD = net :tool-offset xyzac-trt-kins.tool-offset xyzac-trt-gui.tool-offset
HALCMD = net :y-offset xyzac-trt-kins.y-offset xyzac-trt-gui.y-offset
HALCMD = net :z-offset xyzac-trt-kins.z-offset xyzac-trt-gui.z-offset
HALCMD = sets :y-offset 20
HALCMD = sets :z-offset 10
# not currently supported by xyzac-trt-gui:
HALCMD = setp xyzac-trt-kins.x-rot-point 0
HALCMD = setp xyzac-trt-kins.y-rot-point 0
HALCMD = setp xyzac-trt-kins.z-rot-point 0
HALCMD = setp xyzac-trt-kins.conventional-directions 0
[HALUI]
# NOTE: kinstype==0 is identity kins because sparm=identityfirst
# M429:identity kins (motion.switchkins-type==0 startupDEFAULT)
# M428:xyzac kins (motion.switchkins-type==1)
# M430:userk kins (motion.switchkins-type==2)
MDI_COMMAND = M429
MDI_COMMAND = M428
MDI_COMMAND = M430
[TRAJ]
COORDINATES = XYZAC
LINEAR_UNITS = mm
ANGULAR_UNITS = deg
DEFAULT_LINEAR_VELOCITY = 20
MAX_LINEAR_VELOCITY = 35
MAX_LINEAR_ACCELERATION = 400
DEFAULT_LINEAR_ACCELERATION = 300
[EMCMOT]
EMCMOT = motmod
SERVO_PERIOD = 1000000
COMM_TIMEOUT = 1
[TASK]
TASK = milltask
CYCLE_TIME = 0.010
[EMCIO]
TOOL_TABLE = xyzac-trt.tbl
[AXIS_X]
MIN_LIMIT = -200
MAX_LIMIT = 200
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Y]
MIN_LIMIT = -100
MAX_LIMIT = 100
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_Z]
MIN_LIMIT = -120
MAX_LIMIT = 120
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
[AXIS_A]
MIN_LIMIT = -100
MAX_LIMIT = 50
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[AXIS_C]
MIN_LIMIT = -36000
MAX_LIMIT = 36000
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
[JOINT_0]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -200
MAX_LIMIT = 200
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_1]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 100
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_2]
TYPE = LINEAR
HOME = 0
MAX_VELOCITY = 20
MAX_ACCELERATION = 300
MIN_LIMIT = -120
MAX_LIMIT = 120
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_3]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -100
MAX_LIMIT = 50
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0
[JOINT_4]
TYPE = ANGULAR
HOME = 0
MAX_VELOCITY = 30
MAX_ACCELERATION = 300
MIN_LIMIT = -36000
MAX_LIMIT = 36000
HOME_SEARCH_VEL = 0
HOME_SEQUENCE = 0