24 KiB
xyzac-trt.ini 控制面板、数据流、控制约束与 Web/WASM 设计基础
更新时间:2026-08-25
本文专门分析:
linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
目标不是复刻一个静态 AXIS 外观,而是为 Web/WASM 控制台建立可验证的功能、数据、控制和权限模型。所有“按钮是否可点”的结论都必须来自 LinuxCNC authoritative task/motion/HAL 状态;React/浏览器只能投影状态并发出带 gate 的命令。
相关运行入口和基础说明:
run-5axis-rtcp.sh5axis-rtcp-shortcut.mdgmoccapy-control-panel-data-control-flow.md5axis-rtcp-running.png
1. 案例边界
1.1 入口配置
xyzac-trt.ini 的关键配置如下:
| INI 段 | 字段 | 功能 |
|---|---|---|
[EMC] |
MACHINE = sim-xyzac-trt-kins (switchkins) |
案例名称和 switchkins 语义 |
[DISPLAY] |
DISPLAY = axis |
主控制面板是 AXIS/Tk,不是 GMOCCAPY |
[DISPLAY] |
OPEN_FILE = ./demos/xyzac_switchkins.ngc |
启动后预置的 G-code 文件 |
[DISPLAY] |
PYVCP = ./xyzac-trt.xml |
右侧 SWITCHKINS/vismach-clear 面板 |
[DISPLAY] |
JOG_AXES = XYZC |
手动点动显示 X/Y/Z/C;A 仍属于五轴运动学 |
[DISPLAY] |
PROGRAM_PREFIX = ../../nc_files |
默认程序搜索目录 |
[DISPLAY] |
POSITION_OFFSET = RELATIVE |
DRO 默认显示相对坐标 |
[DISPLAY] |
POSITION_FEEDBACK = ACTUAL |
DRO 使用 actual position |
[RS274NGC] |
SUBROUTINE_PATH = ./remap_subs |
M428/M429/M430 和 helix 子程序路径 |
[RS274NGC] |
HAL_PIN_VARS = 1 |
允许 remap 访问 HAL pin |
[RS274NGC] |
REMAP = M428/M429/M430 |
kinematics 状态切换入口 |
[RS274NGC] |
PARAMETER_FILE = xyzac.var |
RS274 参数持久化 |
[KINS] |
KINEMATICS = xyzac-trt-kins sparm=identityfirst |
5 关节 XYZAC,0=identity,1=TRT,2=userk |
[KINS] |
JOINTS = 5 |
X/Y/Z/A/C 五个 joint |
[HAL] |
HALFILE = LIB:basic_sim.tcl |
生成仿真 motion/HAL/模拟设备 |
[HAL] |
POSTGUI_HALFILE = switchkins_postgui.hal |
GUI 创建后连接 PyVCP 控件 |
[HAL] |
motion.analog-out-03 => motion.switchkins-type |
remap 写入 switchkins 的控制通道 |
[HAL] |
loadusr -W xyzac-trt-gui |
独立 Vismach 五轴模型进程 |
[TRAJ] |
COORDINATES = XYZAC |
解释器和轨迹规划的笛卡尔坐标集合 |
[EMCIO] |
TOOL_TABLE = xyzac-trt.tbl |
工具长度/直径等数据 |
1.2 三个界面实体
AXIS 主窗口
├── Tk 菜单、工具栏、Manual Control、MDI、Preview、DRO、G-code view
├── PyVCP xyzac-trt.xml(右侧 SWITCHKINS 面板)
└── AXIS 内部 Python/Tk command + linuxcnc.stat 状态轮询
xyzac-trt-gui 进程
└── Python vismach 模型,仅消费 HAL joint feedback/tool-offset/offset
LinuxCNC runtime
├── linuxcncsvr / NML
├── milltask / RS274NGC interpreter
├── motmod / TP / switchkins / xyzac-trt-kins
└── HAL / simulated home / spindle / tool-change / PyVCP pins
AXIS 是控制和状态投影者,PyVCP 是 HAL 控件,Vismach 是可视化消费者;三者都不是独立的运动 authority。
2. 启动与初始化数据流
run-5axis-rtcp.sh
│
▼
/usr/bin/linuxcnc -r xyzac-trt.ini
│
├── 读取 [DISPLAY]/[TASK]/[HAL]/[KINS]/[TRAJ]
├── 启动 linuxcncsvr
├── 启动 milltask
├── 运行 basic_sim.tcl 生成 HAL
├── loadusr xyzac-trt-gui
├── 执行 switchkins_postgui.hal
└── 启动 /usr/bin/axis -ini xyzac-trt.ini
│
├── open_file_guts(OPEN_FILE)
├── 创建 Tk/AXIS widgets
├── 读取 linuxcnc.stat
└── 周期刷新 DRO/preview/gates
2.1 AXIS 初始化的责任
主要来源:
linuxcnc/src/emc/usr_intf/axis/scripts/axis.py
核心职责:
- 解析 INI 和显示选项。
- 初始化
linuxcnc.command()、linuxcnc.stat()和 HAL component。 - 根据
COORDINATES=XYZAC建立 axis/joint 映射。 - 读取
OPEN_FILE,通过open_file_guts()和c.program_open()载入程序。 - 读取 G-code,运行 canon/preview 生成程序轨迹。
- 周期
s.poll(),将 position、joint position、homed、limit、tool、G/M code、task/interpreter state 投影到 Tk 变量。 - 根据
running()、manual_ok()、all_homed()和 task/motion 状态决定按钮是否响应。
2.2 Vismach 初始化的责任
linuxcnc/src/hal/user_comps/vismach/xyzac-trt-gui.py 创建 HAL component:
xyzac-trt-gui.table-x HAL_FLOAT IN
xyzac-trt-gui.saddle-y HAL_FLOAT IN
xyzac-trt-gui.spindle-z HAL_FLOAT IN
xyzac-trt-gui.tilt-a HAL_FLOAT IN
xyzac-trt-gui.rotate-c HAL_FLOAT IN
xyzac-trt-gui.y-offset HAL_FLOAT IN
xyzac-trt-gui.z-offset HAL_FLOAT IN
xyzac-trt-gui.tool-offset HAL_FLOAT IN
模型通过 HalTranslate/HalRotate 将这些输入转换为 OpenGL 模型姿态。它不发 program_run、jog、home 或 kinematics 命令。
3. AXIS 主控制面板功能
3.1 顶部菜单和工具栏
AXIS/Tk 主面板通常提供:
| 类别 | 典型动作 | LinuxCNC command/效果 |
|---|---|---|
| 文件 | Open | program_open(path),更新 loaded file 和 preview |
| AUTO 按钮组 | hbtb_auto / btn_load |
AXIS 的 Open/Load 文件入口;只在程序未运行时打开文件选择器 |
| 文件 | Reload | 重新读取当前文件;运行中拒绝 |
| 文件 | Recent files | 偏好文件保存最近路径,最多 10 项 |
| 文件 | Edit | 调用 EDITOR/外部编辑器;不改变 runtime authority |
| 程序 | Run | c.mode(MODE_AUTO) + c.auto(AUTO_RUN, start_line) |
| 程序 | Step | c.auto(AUTO_STEP) |
| 程序 | Pause | c.auto(AUTO_PAUSE) |
| 程序 | Resume | c.auto(AUTO_RESUME) |
| 程序 | Stop | c.abort(),同时设置 GUI abort 状态 |
| 程序 | Run from line | 设置 first line 后再 AUTO_RUN,风险高于普通 Run |
| 机床 | Power | c.state(STATE_ON/OFF) |
| 机床 | E-stop | c.state(STATE_ESTOP/STATE_ESTOP_RESET) 或硬件链路 |
| 机床 | Home/Unhome | c.home(joint) / c.unhome(joint) |
| 机床 | Spindle | c.spindle(...) 或 MDI/halui |
| 机床 | Feed/rapid/spindle override | c.feedrate()/c.maxvel() 或相应 HAL/command |
| 辅助 | HAL show/tooleditor | 外部工具或 tool data action |
| 视图 | Perspective/X/Y/Z/clear plot | 只改变 view/preview,不改变运动状态 |
菜单图标不是 authority。每个动作必须以 command result 和下一次 status snapshot 确认。
3.2 Manual Control
Manual 页包含:
- X/Y/Z/A/C 轴选择;
JOG_AXES=XYZC会影响默认可点动轴列表。 - Continuous/incremental jog 选择。
- jog speed、angular jog speed。
- Home All、单轴 Home、Unhome。
- Touch Off、Tool Touch Off。
- feed/rapid/spindle override。
- spindle start/stop/reverse。
AXIS 的 manual_ok() 条件:
task_state == STATE_ON
并且当前没有 AUTO/MDI 正在运行
并且 interp_state == INTERP_IDLE
或当前为 MDI 且 queued_mdi_commands < max_queued_mdi_commands
jog_on() 还要满足当前 tab 是 manual、轴/joint 映射有效、没有 active limit 阻止动作。Web/WASM 应把这些结果作为 gate reason 返回,不仅仅把 HTML button 设为 disabled。
3.3 MDI
MDI 入口通过 ensure_mdi():
- 检查
manual_ok()。 - 关闭 teleop 或切换到合适 motion mode。
c.mode(MODE_MDI)。- 用户输入字符串后调用
c.mdi(command)。 - interpreter 执行后由
stat.interp_state、queued_mdi_commands、位置和错误通道反馈。
MDI 不是任意字符串的本地脚本执行器。Web/WASM 必须保留 G-code parser、能力边界、长度限制、错误码和 operation id。
3.4 Preview/DRO/G-code view
AXIS 周期更新同时刷新:
stat.actual_position/joint_actual_position→ DRO。stat.g5x_offset/g92_offset/rotation_xy/tool_offset→ 坐标投影。stat.gcodes/stat.mcodes/settings→ G-code 信息。- canon/preview → 静态程序路径。
motion_line/running_line→ 当前行高亮。joint.pos-fb→ Vismach 模型。
静态 preview 和 realtime/live plot 必须分开建模;Web 端不能用 JS 重新解析一份程序来代替 WASM canonical motion。
4. xyzac-trt.xml SWITCHKINS 面板
4.1 控件定义
PyVCP XML 定义:
| 控件文本 | HAL pin | 目标 |
|---|---|---|
IDENTITY |
pyvcp.type0-button |
触发 halui.mdi-command-00 → M429 |
TCP:XYZAC |
pyvcp.type1-button |
触发 halui.mdi-command-01 → M428 |
userk |
pyvcp.type2-button |
触发 halui.mdi-command-02 → M430 |
| 多标签 | kinstype.is-0/1/2 |
显示当前 switchkins type |
vismach-clear |
pyvcp.vismach-clear |
连接 vismach.plotclear |
switchkins_postgui.hal 将按钮连接到 HALUI MDI command:
pyvcp.type0-button → halui.mdi-command-00
pyvcp.type1-button → halui.mdi-command-01
pyvcp.type2-button → halui.mdi-command-02
这意味着浏览器端的“TCP:XYZAC”按钮不能直接写 motion.switchkins-type,应走同等的受控 command/remap 路径,并等待确认状态。
4.2 switchkins 状态模型
type 0 / M429 → identity
type 1 / M428 → xyzac TRT TCP/RTCP
type 2 / M430 → userk
xyzac-trt-kins.c 在 sparm=identityfirst 下将 type 0 绑定 identity,type 1 绑定 trtKinematicsSetup + xyzacKinematicsForward/Inverse,type 2 绑定 userk。配置注释和实现必须同时读取,不能只依据面板标签。
5. 五轴 RTCP 控制流
5.1 M428/M429 remap
428remap.ngc 的关键操作:
验证 motion.switchkins-type HAL pin 存在
M68 E3 Q1 写 motion.analog-out-03 = 1
M66 E0 L0 同步等待
读取 motion.switchkins-type,必须等于 1
429remap.ngc 相同,但写入 Q0。失败时输出 debug STOP 并结束子程序;Web/WASM 需要把这些失败变成稳定的错误码,而不是只显示“按钮没有反应”。
5.2 典型 helix 数据流
helix_ac.ngc 的典型顺序:
M429 identity
G0 / G10 L20 机床坐标定位和设置工作偏置
M428 XYZAC TRT / TCP
G0 A... C... 改变刀轴姿态
G2 ... 在 RTCP 运动学下插补
M429 切回 identity
G0 ... 安全返回
M428 如后续仍需 TCP
这里的关键不是“同时有 A/C 数字”,而是同一轨迹块由 XYZAC inverse kinematics 将 TCP pose 转换为五个 joint 命令。姿态变化可能导致 X/Y/Z 补偿变化;因此前端必须同时展示笛卡尔 pose、joint positions、active kinematics mode 和 tool offset。
5.3 Vismach 数据流
joint.0.pos-fb → table-x → HalTranslate
joint.1.pos-fb → saddle-y → HalTranslate
joint.2.pos-fb → spindle-z → HalTranslate
joint.3.pos-fb → tilt-a → HalRotate(A)
joint.4.pos-fb → rotate-c → HalRotate(C)
motion.tooloffset.z → tool-offset → HalTranslate(tool)
y/z-offset → rotary geometry placement
Vismach 只读 HAL input。Web/WASM 的 Three.js adapter 应消费 authoritative visual.pose/joints/toolpath,而不是在 React 中根据 A/C 自行推算补偿。
6. 按钮互相制约条件
下表是 AXIS/LinuxCNC 语义的最小可执行门控。running 表示 AUTO 或 MDI 且 interp_state != INTERP_IDLE。
| 按钮/动作 | 必须满足 | 典型阻塞原因 |
|---|---|---|
| E-stop | 始终可用 | transport/session 不可用 |
| Power ON/OFF | 非 ESTOP;不在禁止转换状态 | ESTOP_ACTIVE |
| Reset | machine ON、非 running、无 active limit | LIMIT_ACTIVE / INTERP_RUNNING |
| Manual jog | STATE_ON、MANUAL、非 running、未 fault |
MACHINE_OFF / MODE_REQUIRED |
| Home all | manual_ok();必要时确认重复 homing |
NOT_ON / RUNNING |
| 单轴 Home | manual_ok();非 identity 时通常必须 joint mode;重复坐标字母禁用单轴 home |
JOINT_MODE_REQUIRED |
| MDI | machine ON;队列未满;idle 或当前 MDI | MDI_QUEUE_FULL / INTERP_RUNNING |
| Open file | 解释器 idle;AXIS open_file_guts 临时切 MANUAL 后恢复原 mode |
INTERP_RUNNING |
| Load program | machine ON、idle | MACHINE_OFF |
| Reload | idle 且已有 loaded file | TASKFILE_MISSING |
| Run | machine ON、idle、已有程序 | TASKFILE_MISSING / INTERP_RUNNING |
| Run from line | Run 条件 + 有明确 highlight line | HIGHLIGHT_MISSING |
| Step | machine ON 且有程序;进入 AUTO | TASKFILE_MISSING |
| Pause | machine ON 且 interpreter READING/WAITING | PAUSE_STATE_GATE |
| Resume | machine ON 且 interpreter PAUSED | RESUME_STATE_GATE |
| Stop/Abort | machine ON 且 running;abort 可以强制恢复状态 | STOP_STATE_GATE |
| Touch Off | manual_ok、MANUAL、允许的 motion mode | JOINT_MODE_REQUIRED |
| Tool Touch Off | Touch Off 条件 + 有当前工具 | TOOL_MISSING |
| TCP:XYZAC/M428 | remap HAL pin 存在、HAL net 正确、当前程序允许切换 | MISSING_HAL_PIN / WRONG_SWITCHKINS_TYPE |
| Identity/M429 | 同上,切换后必须确认 type=0 | WRONG_SWITCHKINS_TYPE |
| Vismach clear | 只清显示 plot,不改变 task/motion | 不应改变机床状态 |
6.1 重要状态互斥
ESTOP → 禁止所有运动、模式、MDI、RTCP 切换
OFF → 可以复位/上电,禁止 Run/Jog/Home/MDI
ON + 未 homed → 允许 Manual/Home,禁止 AUTO/MDI(除非配置 NO_FORCE_HOMING)
RUNNING → 禁止 Open/Reload/Edit/MDI/Jog/Home;允许 Pause/Stop/状态观察
PAUSED → 允许 Resume/Stop;禁止 MDI/Jog/重新加载
RTCP type switch → 应在 interpreter idle、安全位置、无活动轨迹时执行
7. 当前 Web/WASM 的对应实现
7.1 已存在的通用契约
当前 Web 代码已经提供可复用基础:
| 文件 | 作用 |
|---|---|
web/app/axis-contract.mjs |
AXIS_COMMANDS、状态归一化、纯 gate 函数 |
web/app/axis-operation-controller.mjs |
operation id、gate 检查、command trace、错误保留 |
web/react/src/protocol.ts |
MessageEnvelope、SimSnapshotV1、PanelSnapshotV1、AxisStateView |
web/react/src/store.ts |
Worker message → authoritative snapshot/projected UI state |
web/react/src/worker-client.ts |
Dedicated Worker transport、seq、session/context、错误处理 |
web/react/src/visual-workflow.ts |
AXIS/GMOCCAPY/Vismach 的 visual source 分类 |
现有 AXIS_COMMANDS 已覆盖 PROGRAM_LOAD/RUN/STEP/PAUSE/RESUME/ABORT/RESTART、MDI_EXECUTE、JOG_START/STOP、HOME、ESTOP、RESET、override、spindle、coolant、tool 和 probe。
7.2 xyzac-trt 需要的新增协议字段
建议在现有 PanelSnapshotV1 上 additive 扩展,不破坏 sim_task.v1:
{
"configuration": {
"case_path": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"coordinates": ["X", "Y", "Z", "A", "C"],
"kinematics": "xyzac-trt-kins",
"topology": "table-tilting-A/table-rotary-C",
"joint_count": 5,
"program_prefix": "../../nc_files"
},
"kinematics": {
"family": "switchkins",
"active_type": 1,
"active_name": "xyzac-trt",
"available": [
{"type": 0, "name": "identity", "command": "M429"},
{"type": 1, "name": "xyzac-trt", "command": "M428"},
{"type": 2, "name": "userk", "command": "M430"}
],
"transition": "idle_only"
},
"motion": {
"axes": {"x": 0, "y": 0, "z": 10, "a": 0, "c": 0},
"joints": [0, 0, 10, 0, 0],
"tool_offset": {"z": 0},
"rotation_center": {"x": 0, "y": 0, "z": 0},
"axis_offsets": {"y": 20, "z": 10}
}
}
字段的 authoritative 来源必须来自 WASM kinematics/motion snapshot 或受控 native oracle;不能由 A/C slider 在浏览器中自行补偿。
7.3 命令映射建议
| Web action | protocol command | xyzac 行为 |
|---|---|---|
PROGRAM_LOAD |
PROGRAM_LOAD |
载入程序、canonical preview、重置 active segment |
PROGRAM_RUN |
PROGRAM_RUN |
进入 AUTO,固定 tick 推进 interpreter/TP |
PROGRAM_PAUSE |
PROGRAM_PAUSE |
保留当前 segment/kinematics type |
PROGRAM_RESUME |
PROGRAM_RESUME |
继续同一 program state |
PROGRAM_ABORT |
PROGRAM_ABORT |
停止并返回稳定 STOPPED/IDLE |
MDI_EXECUTE |
MDI_EXECUTE |
用于 M428/M429/M430,必须有 idle gate |
KINEMATICS_SELECT |
建议新增 | payload {type:0|1|2},内部走 remap/受控 HAL,不直接写 pin |
JOG_START |
JOG_START |
仅允许合法 axis/joint;XYZAC 的 A/C 速度单位独立校验 |
HOME |
HOME |
返回每个 joint homed 状态和错误 |
VISMACH_CLEAR |
VISUAL_CLEAR |
只清可视化轨迹,不清 task/motion/program |
7.3.1 当前 Web 实现的五轴缺口
现有通用 AXIS contract 已有大量三轴/通用动作,但对本案例仍有明确缺口,不能把“按钮存在”当成已实现:
| 缺口 | 当前状态 | 五轴实现要求 |
|---|---|---|
KINEMATICS_SELECT |
AXIS_COMMANDS 尚未定义 |
新增受 gate 的 type 0/1/2 命令,禁止前端直接写 HAL |
POWER |
axisGate() 有 power 分支,但 AXIS_COMMANDS 没有对应 action |
补齐 command map 和 Worker handler,保持 OFF/ESTOP 语义 |
VISUAL_CLEAR |
原生 PyVCP 有 vismach-clear,通用 Web command 尚未固定 |
作为 visual-only command,不能改 program/motion hash |
| A/C jog | 当前 React 示例轴选择主要是 X/Y/Z | 增加 A/C angular units、limits、jog speed 和 joint/teleop gate |
| XYZAC pose | PanelSnapshotV1.visual.pose 目前是通用 Record |
增加明确 a/c、joint vector、kinematics type 和 tool-offset 字段 |
| rotation centers | 当前通用 snapshot 没有 TRT rotation-point 完整字段 | 将 x/y/z rotation point、y/z offset 纳入 configuration/authoritative |
| switchkins recovery | 通用 recovery 有 task/program,但没有 active kinematics mode | checkpoint 必须保存 type、remap transition、source line、joint/pose hash |
7.4 Worker snapshot 到 React
WASM/native runtime
└── task + interpreter + motion + joints + kinematics + HAL + devices
│
▼
protocol.v1 STATE_SNAPSHOT / COMMAND_RESULT
│
▼
store.ts projection()
├── axis_state
├── gates
├── task/program
├── motion.axes / motion.joints
├── authoritative.planner / authoritative.kinematics
└── visual.pose / visual.toolpath
│
▼
React DRO / controls / Three.js Vismach
React 控件的 disabled 只是 projection;真正 gate 必须在 Worker/runtime 再检查一次。AxisOperationController 已提供 operation id、拒绝原因和 trace 结构,五轴切换应复用此机制。
8. Web/WASM 不应直接照搬的部分
| 原生机制 | Web/WASM 处理 |
|---|---|
| Tk widget/菜单 | React button/menu/keyboard command,但保留 source control id 和 tooltip 语义 |
| LinuxCNC NML | Dedicated Worker protocol envelope + session/seq/operation_id |
HAL pin motion.switchkins-type |
Worker-owned runtime capability;浏览器不能任意写 HAL pin |
loadusr -W xyzac-trt-gui |
Worker/Three.js Vismach adapter;visual-only,不是 authority |
OPEN_FILE |
Worker workspace resolver + exact path/resource closure |
G-code preview |
WASM canonical interpreter/TP segments;不能用 JS preview 冒充 |
linuxcnc.stat() polling |
fixed-tick STATE_SNAPSHOT/EVENT,带 state_hash |
| M428/M429 remap | WASM remap/interpreter capability,记录切换、错误和首个 divergent tick |
| POSIX realtime/HAL hardware | SIM-DEVICE 或 REAL-EXCLUDED,不能静默当成 Web 等价 |
9. 推荐的 Web 端组件拆分
XyzacTrtCaseResolver
├── exact ini/hal/remap/resource resolver
└── startup diagnostics
XyzacTrtControlStore
├── axis_state / task / interp / homed / limits
├── kinematics.active_type
├── gates and gate reasons
└── command trace
XyzacTrtOperationController
├── PROGRAM_LOAD/RUN/PAUSE/RESUME/ABORT
├── MDI M428/M429/M430
├── JOG/HOME/override
└── transition checks: idle, no fault, valid capability
XyzacTrtPanel
├── mode/task controls
├── XYZAC DRO and joint view
├── TCP/identity/userk segmented control
├── gate-aware MDI/run/jog/home buttons
└── alarms and diagnostics
XyzacTrtVismach
├── pose/joints/toolpath from authoritative snapshot
├── A/C table rotation
├── tool-offset rendering
└── canvas/WebGL pixel/interaction checks
10. 验收和测试矩阵
正常流程
- 加载
xyzac_switchkins.ngc。 - 验证
XYZAC五个轴和五个 joints 出现在 snapshot。 - 验证 preview segment/source line/hash。
M429→ active type 0。M428→ active type 1,等待确认后再允许 TCP 轨迹。- 运行包含 A/C 变化的 helix;比较 Cartesian pose、joint positions、tool offset。
M429安全返回;验证 no duplicate segment/no stale active segment。
边界和拒绝
| 测试 | 期望 |
|---|---|
| ESTOP 时 M428 | blocked,不改变 kinematics type |
| interpreter running 时 M428 | blocked 或排队策略明确,不能隐式切换 |
缺 HAL_PIN_VARS=1 |
remap 错误码 M428:Missing...,保留证据 |
缺 motion.switchkins-type net |
WRONG_SWITCHKINS_TYPE/source diagnostic |
| A/C 超限 | limit/fault snapshot,禁止继续运动 |
| tool offset 非有限值 | fail closed,不能送入 kinematics |
| pause 后 resume | segment、kinematics type、state hash 连续 |
| abort 后 reload | program/task/preview 清理顺序确定 |
| Worker restart | checkpoint 恢复 kinematics type、program line、joint/pose hash |
| Vismach clear | 只清 visual layer,task/program/state_hash 不变 |
必须保存的证据
- context id、case path、INI/HAL/remap source hash。
- command envelope、operation id、gate result、command result。
- 每个固定 tick 的 task/interp/motion/kinematics state hash。
- Cartesian pose、XYZAC joint vector、tool offset、active segment/source line。
- 首个 divergent tick、错误码、资源缺失分类。
- native/WASM/Worker 对照结果;不以单一截图替代。
11. 已知限制
- 当前
xyzac-trt.ini是 AXIS + PyVCP + 独立 Vismach 的 LinuxCNC 原生案例;Web/WASM 尚未声明其完整五轴 RTCP parity 已完成。 - 当前环境使用 POSIX non-realtime;不提供实时硬件周期、延迟和驱动证明。
xyzac-trt-gui只可视化 joint feedback/tool offset;它不是 canonical motion authority。- 官方 kinematics oracle 缺失时,native/WASM 结果只能作为实现证据,不能伪称官方 golden。
xyzac-trt配置中的x-rot-point/y-rot-point/z-rot-point在示例中固定为 0,且注释说明当前 Vismach GUI 不支持通过 GUI 调整;Web 端必须把它作为配置/能力字段,而不是随意暴露可写 slider。
12. 后续实现顺序
- 建立 exact-path
xyzac-trt.iniresolver 和 resource graph。 - 在 Worker/WASM 建立 additive
kinematicssnapshot 与KINEMATICS_SELECTcommand。 - 将 M428/M429/M430 的 remap 行为接入固定 tick interpreter,先做拒绝和错误边界。
- 将 XYZAC Cartesian/joint/tool-offset canonical snapshot 接到 Three.js Vismach adapter。
- 实现 gate matrix:ESTOP/OFF/ON/HOME/IDLE/RUNNING/PAUSED/limit/fault。
- 完成 program load/run/pause/resume/abort/restart + RTCP switch recovery 测试。
- 运行 native/Worker/browser 三方对照,并记录首个差异 tick。
- 只有 source/resource/oracle/recovery/浏览器边界均有证据后,才可提升为 selected-case verified;不能从一个 AXIS 截图直接宣称全 LinuxCNC 五轴 parity。