xyzbc-trt Web 数控仿真系统
设计任务书和技术方案

完全对标 LinuxCNC xyzbc-trt 五轴 table rotary/tilting 仿真配置

原型系统/home/mes123456/cnc_wams/linuxcnc
启动命令/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment linuxcnc /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
目标产物浏览器端 Web 数控仿真界面、五轴机床模型、switchkins 逻辑、路径预览与执行对比 JSON
文档位置/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc
编制日期2026-07-02

1. 项目目标

本项目建设一个 Web 数控仿真系统,功能和行为完全对标 LinuxCNC 真实运行配置 xyzbc-trt.ini。Web 系统不是展示页,而是首屏即进入数控仿真工作台,提供程序加载、预览、DRO、MDI、PyVCP 等价控件、五轴机床运动显示、switchkins 模式切换、刀具路径采样、执行过程记录和误差对比。

对标基线以已编译成功并能运行的 /home/mes123456/cnc_wams/linuxcnc 为准,历史旧 LinuxCNC 目录不再作为本方案的运行基线。

核心验收原则:同一份配置、同一份 G-code、同一运动学模式、同一采样周期、同一 JSON 字段,分别采集 LinuxCNC 真实系统和 Web 仿真系统的预览路径与执行路径,逐点比对位置、姿态、运动学模式和 HAL 状态。

2. 原型系统运行证据

2.1 当前启动命令

/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment linuxcnc \
  /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini

2.2 当前关键进程

进程对标含义
scripts/linuxcnc xyzbc-trt.iniLinuxCNC 主启动入口,Web 端需实现等价启动会话和配置装载流程。
linuxcncsvrNML/状态服务,Web 端需提供统一运行状态中心。
rtapi_app load tpmod运动规划模块,Web 端需实现轨迹规划与采样接口。
milltask任务解释和程序执行,Web 端需实现程序状态机、运行、暂停、复位、MDI。
haluiHAL UI 指令通道,Web 端需复刻 PyVCP 按钮到 MDI 命令的连接。
hal_manualtoolchange手动换刀流程,Web 端需提供换刀提示和工具状态。
xyzbc-trt-guiVismach 五轴机床模型,Web 端需使用 Three.js 对标机床结构和运动。
axis -ini xyzbc-trt.iniAXIS 主界面,Web 端需对标界面信息架构和操作入口。

2.3 当前界面截图

xyzbc-trt AXIS window
图 1:通过真实 LinuxCNC 会话抓取的 AXIS 主界面,包含预览、DRO、PyVCP SWITCHKINS 面板、程序区和状态栏。
xyzbc-trt desktop screenshot
图 2:桌面级运行截图,用于保留真实执行环境和窗口布局证据。

2.4 HAL 状态基线

HAL 项当前值或连接Web 对标要求
motion.switchkins-type0,由 :kinstype-select 驱动实现 0:IDENTITY1:XYZBC2:USERK 三态切换。
kinstype.is-0/1/2TRUE/FALSE/FALSE驱动 Web PyVCP multilabel 的当前模式显示。
joint.0..4.pos-fbX/Y/Z/B/C 五轴反馈均为 0映射到 Web DRO、机床模型关节和路径采样。
motion.tooloffset.z连接 :tool-offset影响 TCP 刀尖位置和机床模型刀具长度。
xyzbc-trt-kins.x-offset-20Web 运动学参数必须使用同值。
xyzbc-trt-kins.z-offset-15Web 运动学参数必须使用同值。
xyzbc-trt-kins.conventional-directionsFALSEWeb 端旋转方向和矩阵约定必须一致。

3. 完全对标范围

LinuxCNC 文件或模块真实功能Web 对标实现
xyzbc-trt.ini定义 AXIS、PyVCP、KINS、HAL、TRAJ、TASK、EMCIO、轴和关节参数。实现 INI 解析器,生成 Web 会话配置、轴参数、速度限制、文件引用和 UI 初始状态。
xyzbc-trt.xml定义 SWITCHKINS multilabel、IDENTITY、TCP:XYZBC、userk、vismach-clear 按钮。实现 PyVCP 等价面板,按钮通过 Web HAL 总线触发 MDI 命令或清除轨迹。
switchkins_postgui.hal把 PyVCP 控件接到 halui.mdi-command-00/01/02vismach.plotclear实现 postgui HAL 装配层,保证 UI 控件不直接改状态,而是经 HAL 语义连接。
LIB:basic_sim.tcl生成仿真 HAL 基础链路。在 Web 中建立基础 HAL 信号、仿真 joint、motion、halui、pyvcp、vismach 命名空间。
xyzbc-trt-kins.soXYZBC table rotary/tilting 运动学和 switchkins。实现或移植为 WASM/TypeScript 运动学模块,支持 identity、XYZBC TCP、userk。
xyzbc-trt-guiVismach 三维机床模型,随 HAL 引脚运动。使用 Three.js 建立桌台、转台、倾斜轴、主轴、刀具、工件和路径轨迹。
xyzbc_switchkins.ngc默认打开的演示程序,调用 xyzbc_switchkins_subWeb 端默认加载同一程序,预览曲线和执行曲线可导出 JSON。
remap_subs/*.ngcM428/M429/M430 以及演示子程序。支持 remap 调用或预编译宏展开,保证模式切换轨迹一致。
xyzbc-trt.tbl刀具表。Web 端提供刀具表加载、显示、选择、tooloffset 影响。
xyzbc.varRS274 参数文件。Web 端持久化参数,支持会话恢复和对标导出。

4. Web 界面设计任务书

4.1 首屏布局

Web 应用启动后直接进入数控仿真界面,不设置营销式首页。首屏按 AXIS 的工作流组织:

4.2 视觉和交互要求

界面区域对标要求验收证据
AXIS 工具栏保留关键数控操作入口,按钮使用明确图标和 tooltip。截图比对,操作事件 JSON。
DRO显示 X/Y/Z/B/C、joint 或 world 坐标、实际/命令位置。uiState.dro 与 LinuxCNC status 对比。
PyVCP按钮和 multilabel 文案、状态、HAL 连线语义一致。halPins.kinstypeuiState.pyvcp
Preview显示默认程序的圆形/螺旋路径、刀尖、刀轴、XYZBC 坐标。previewPath.samples 和截图。
Vismach 等价模型五轴结构、B/C 旋转、X/Y/Z 平移、tooloffset、x/z offset 生效。模型姿态 JSON 和截图。
web architecture
图 3:LinuxCNC 原型系统与 Web 仿真系统的模块级对标关系。

5. 技术方案

5.1 总体架构

层级模块职责
文件层OPFS/IndexedDB 工作区保存 ini/xml/hal/ngc/tbl/var/json,支持导入 LinuxCNC 原始目录。
解析层INI/XML/HAL/NGC/TBL/VAR parser结构化解析配置、控件、信号、程序和参数,禁止手工硬编码配置结果。
运行层Task/Interp/Motion/HAL runtime复刻 LinuxCNC 任务状态机、G-code 解释、运动规划、HAL pin/net。
运动学层xyzbc-trt-kins实现 identity、XYZBC TCP、userk,输出关节、世界坐标、刀尖和刀轴。
界面层React/Vue/Svelte 或原生组件对标 AXIS、PyVCP、DRO、MDI、程序窗口、状态栏。
三维层Three.js五轴机床、工件、刀具、路径、坐标系、清轨迹和相机视图。
证据层Evidence JSON + Compare report采集真实系统和 Web 系统,按同周期逐点比对。

5.2 switchkins 逻辑

Web 端必须复刻原型中的 switchkins 控制链路:PyVCP 按钮触发 halui.mdi-command-00/01/02,MDI 执行 M429/M428/M430,remap 子程序改变 motion.analog-out-03,再驱动 motion.switchkins-type。UI 当前模式由 kinstype.is-0/1/2 反向驱动,而不是由按钮直接写 UI 标签。

按钮HAL 目标MDI 命令目标模式
IDENTITYhalui.mdi-command-00M4290:IDENTITY
TCP:XYZBChalui.mdi-command-01M4281:XYZBC
userkhalui.mdi-command-02M4302:USERK
vismach-clearvismach.plotclear清除三维路径显示。

5.3 五轴运动学和模型

Web 端机床模型采用 XYZBC table rotary/tilting 结构。X 对应 table-x,Y 对应 saddle-y,Z 对应 spindle-z,B 对应 tilt-b,C 对应 rotate-c。运动学参数使用原型系统当前 HAL 值:x-offset=-20z-offset=-15、旋转点均为 0conventional-directions=false。刀具长度来自 motion.tooloffset.z

三维模型不只显示程序预览曲线,还必须在执行时按采样点刷新桌台、转台、主轴和刀具姿态。执行暂停、复位、清轨迹、模式切换后,模型状态和 JSON 状态必须同步。

5.4 路径采样和 JSON 比对

曲线采样周期固定为 samplePeriodMs = 20,即 50 Hz。LinuxCNC 真实系统和 Web 仿真系统必须使用相同采样周期、相同 sampleIndex、相同时间基准和相同坐标字段,禁止一端 10 ms、另一端 20 ms 或使用不同插补点。

json compare flow
图 4:刀具预览路径和执行路径 JSON 的同周期采样与逐点比对流程。

5.5 Evidence JSON 字段规范

{
  "schema": "xyzbc-trt-evidence/v1",
  "source": "linuxcnc-native | web-sim",
  "samplePeriodMs": 20,
  "linuxcncRoot": "/home/mes123456/cnc_wams/linuxcnc",
  "ini": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
  "program": "./demos/xyzbc_switchkins.ngc",
  "runtime": {
    "taskState": 1,
    "interpState": 1,
    "axisMask": 55,
    "kinstype": 0
  },
  "halPins": {
    "motion.switchkins-type": 0,
    "xyzbc-trt-kins.x-offset": -20,
    "xyzbc-trt-kins.z-offset": -15,
    "xyzbc-trt-kins.conventional-directions": false
  },
  "previewPath": {
    "coordinateSystem": "XYZBC",
    "samples": [
      {
        "sampleIndex": 0,
        "timeMs": 0,
        "line": 1,
        "joint": {"x": 0, "y": 0, "z": 0, "b": 0, "c": 0},
        "world": {"x": 0, "y": 0, "z": 0, "b": 0, "c": 0},
        "toolTip": {"x": 0, "y": 0, "z": 0},
        "toolAxis": {"i": 0, "j": 0, "k": 1},
        "kinstype": 0
      }
    ]
  },
  "executionPath": {
    "samples": []
  },
  "screenshots": []
}

5.6 对比报告字段

字段说明
sampleCount.native/web真实系统和 Web 系统采样点数量。
maxPositionErrorX/Y/Z/B/C 最大逐点误差。
rmsPositionError路径整体均方根误差。
maxToolTipErrorTCP 刀尖位置最大误差。
maxToolAxisErrorDeg刀轴方向最大角度误差。
firstMismatch首个超差点的 sampleIndex、line、timeMs、native/web 值。
uiEquivalenceAXIS/PyVCP/DRO/状态栏截图和 DOM 状态对比。
pass是否通过设定阈值。

6. 开发任务分解

阶段任务交付物验收方式
阶段 1导入并解析 xyzbc-trt.ini、XML、HAL、TBL、VAR、NGC 文件。结构化配置 JSON、文件依赖图。xyzbc-trt-runtime-files.md 逐项核对。
阶段 2搭建 AXIS 等价 Web UI 和 PyVCP 面板。首屏数控工作台。与真实 AXIS 截图逐区比对。
阶段 3实现 HAL 总线、halui、switchkins 状态机和 remap 命令链路。HAL 状态面板、MDI 命令记录。按钮触发 M429/M428/M430 后状态一致。
阶段 4实现 XYZBC 运动学和 Three.js Vismach 等价模型。五轴机床模型、刀具和工件。X/Y/Z/B/C 点动与 HAL pin 一致。
阶段 5实现 G-code 预览路径、执行路径、暂停/复位/单步。预览轨迹、执行轨迹、状态机。默认程序 xyzbc_switchkins.ngc 可回放。
阶段 6实现 native 和 web evidence JSON,固定 20 ms 采样周期。native-evidence.jsonweb-evidence.json字段、单位、sampleIndex 对齐。
阶段 7实现 compare-report 自动生成。compare-report.json、HTML 报告。误差统计和首个差异点可追溯。

7. 验收标准

类别必须通过的标准
路径标准所有文档、配置和运行基线均指向 /home/mes123456/cnc_wams/linuxcnc
界面标准Web 首屏包含 AXIS 主要工作区、PyVCP SWITCHKINS 面板、预览区、DRO、程序区和状态栏。
功能标准默认加载 xyzbc_switchkins.ngc,支持 MDI、模式切换、清轨迹、点动、倍率、刀具和参数。
运动学标准identity、XYZBC TCP、userk 模式状态和轨迹计算与真实系统一致。
JSON 标准预览路径和执行路径同时导出,采样周期统一为 20 ms,字段一致。
比对标准能输出最大误差、RMS 误差、首个差异点、截图和通过/失败结论。
证据标准每次验收保存 LinuxCNC 原始截图、Web 截图、native JSON、web JSON、compare report。

8. 风险和控制措施

风险影响控制措施
LinuxCNC 内部解释器和 Web 解释器细节不一致路径点或模式切换时序不同。优先移植或复用 LinuxCNC 解析/运动学逻辑,保留 native evidence 作为回归基准。
采样周期不一致曲线无法逐点比较。强制配置 samplePeriodMs=20,JSON schema 校验不允许缺省。
Three.js 模型和 Vismach 结构偏差视觉对标通过但运动不一致。每个关节都绑定 HAL pin,模型矩阵由运动学输出驱动。
UI 直接改状态绕过 HAL无法对标真实控制链路。PyVCP 控件只发 HAL/MDI 事件,状态由 HAL pin 回读。
路径或旧目录混入证据不可复现。文档和脚本统一扫描旧路径,禁止使用历史旧 LinuxCNC 目录。

9. 附录:对标文件清单

文件用途
/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-runtime-files.md当前运行配置文件说明和路径基线。
/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini主 INI 配置。
xyzbc-trt.xmlPyVCP SWITCHKINS 面板。
switchkins_postgui.halPyVCP 与 HALUI、Vismach 清轨迹连接。
demos/xyzbc_switchkins.ngc默认加载的演示程序。
remap_subs/428remap.ngc429remap.ngc430remap.ngcswitchkins 模式切换 remap。
xyzbc-trt.tbl刀具表。
xyzbc.var参数文件。
bin/xyzbc-trt-guiVismach 原型模型入口。
rtlib/xyzbc-trt-kins.so真实五轴运动学模块。

10. xyzbc-trt 程序逻辑全量分析

下面按“文件装载 - 运动学 - HAL - 界面 - 执行 - 证据”的顺序,把 xyzbc-trt 的实际逻辑拆开说明。这里不是抽象架构,而是与当前源码、HAL pin 和界面行为一一对应的执行逻辑。

10.1 启动入口逻辑

步骤逻辑结果
1rip-environment 先建立 run-in-place 环境,确保本地 bin/lib/rtlib/bin/python 可被当前会话找到。执行路径完全指向 /home/mes123456/cnc_wams/linuxcnc
2linuxcnc xyzbc-trt.ini 读取主 INI,按段装载 DISPLAY、RS274NGC、KINS、HAL、TRAJ、TASK、EMCIO。界面、运动学和程序执行进入同一会话。
3AXIS、PyVCP、Vismach、halui、milltask、linuxcncsvr、rtapi_app 同时被拉起。形成“界面 + 任务 + 运动 + 证据”闭环。

这个启动链路的关键点是:界面不是单独运行的,而是被 INI 文件和 HAL 图驱动。Web 端要完全对标,就不能把预览、模式切换、DRO、刀具、执行按钮做成彼此割裂的前端组件,而要让它们共享同一个运行态和信号总线。

10.2 配置装载逻辑

文件逻辑作用Web 对标要点
xyzbc-trt.ini定义机器类型、显示方式、五轴坐标、最大速度、轴/关节限制、默认程序、运动学模块和 HAL 连线。必须解析成结构化会话配置,不能只读出少量文本字段。
xyzbc-trt.xml定义 SWITCHKINS 面板和按钮文案。按钮状态要由 HAL 输出决定,multilabel 要能随 kinstype 更新。
switchkins_postgui.hal把按钮接到 MDI 命令,把清轨迹接到 vismach.plotclearWeb 端的按钮必须走同样的“事件 - HAL - MDI - 状态”链路。
xyzbc_switchkins.ngc默认加载的程序是演示切换程序,既包含路径,也包含模式切换场景。Web 必须默认回放同一程序并记录同一套证据字段。

10.3 switchkins 运动学逻辑

xyzbc-trt-kins 通过 switchkinsSetup() 绑定三个运动学分支:

源码里明确设置了 kinsname = "xyzbc-trt-kins"halprefix = "xyzbc-trt-kins"required_coordinates = "xyzbc"allow_duplicates = 1,这意味着它既是一个五轴模块,也是一个允许坐标字母重复映射的 switchkins 模块。identityfirst 参数把启动默认值切换成 identity,而不是让机床类型本体成为 type0,这正是 sim 配置的关键差异。

xyzbc-trt logic map
图 5:`xyzbc-trt` 程序逻辑总图,展示从文件装载到证据采样的完整执行链。

switchkins 内部的逻辑顺序很重要:先由 rtapi_app_main() 创建 HAL 组件和输出 pin,再调用 kinematicsSwitch(0) 设定初始模式,然后把三个 setup 函数分别执行一遍,最后 hal_ready()。这意味着 Web 端在启动时也必须先完成状态总线和模式初始化,再挂载界面和三维模型,不能反过来。

10.4 正逆运动学逻辑

函数逻辑对标意义
xyzbcKinematicsForward()根据 X/Y/Z/B/C 和 offset、tooloffset、旋转点、方向约定计算 TCP 世界坐标与姿态。Web 端预览路径和三维模型必须采用同一套正解公式。
xyzbcKinematicsInverse()根据目标 TCP 位姿反推关节角和关节位移,再写回 mapped joints。MDI、点动、程序执行时的运动控制必须能从目标位姿反推关节。
conventional-directions默认关闭时,旋转轴方向与 conventional 约定相反。Web 模型如果方向画反,视觉上会“像”,但运动学会错,必须严格对齐。

在当前配置里,B/C 轴是主运动学轴,A/U/V/W 只是可选字母。前向解使用主关节 JX/JY/JZ/JB/JC 计算 TCP 位姿;逆解再根据目标位姿回算这些主关节。这个路径对 Web 端非常关键,因为预览路径不能只画“刀尖折线”,还要把每个采样点对应的关节姿态也算出来,否则无法和真实系统逐点比对。

10.5 HAL 和状态逻辑

HAL 语义逻辑Web 对标实现
motion.switchkins-type当前运动学类型输入,浮点值被截断为整数 0/1/2。前端 switchkins 状态必须是整数型并保持和任务状态一致。
kinstype.is-0/1/2当前模式输出,供 GUI、指示灯、程序逻辑读取。Web 端要提供同样的可读状态给 PyVCP 等价面板和检测逻辑。
motion.analog-out-03通过 M68/MDI 等方式写入,间接控制 kinstype。Web 端模式切换必须保留“间接驱动”语义,不可直接写最终状态。
halui.mdi-command-00/01/02PyVCP 按钮发出的 MDI 入口。按钮点击后必须先变成命令,再进入状态机。

switchkins.c 的实现说明了一个很重要的行为:模式切换后先清除 use_lastpose,再根据当前模式把对应的 kinstype.is.N 置位。也就是说,Web 仿真不能把“当前模式”当作普通表单状态,它必须是一次完整状态机切换,切换后还要在 UI 上立即反映。

10.6 UI 与三维模型逻辑

axis.py 的行为说明 AXIS 窗口里存在“轴模式”和“关节模式”的切换;当配置处于非 trivkins 或特殊 kinstype 时,按钮和焦点会根据当前运动模式自动切换到关节/轴对应控件。Web 端要对标的不只是布局,还有这个控件激活规则。

xyzbc-trt-gui.py 则把 Vismach 模型拆成可响应的 HAL 变换链:tool-offset 作用于刀具,spindle-z 作用于主轴头,tilt-b 作用于倾斜轴,rotate-c 作用于回转台,table-xsaddle-y 则驱动横向与纵向运动。这个顺序决定了几何层级关系,所以 Web 端模型必须按同样层级搭建,而不是把每个零件独立摆放。

10.7 程序执行与同步逻辑

阶段逻辑结果
预览读取 xyzbc_switchkins.ngc,在预览区生成 G-code 轨迹和位置采样。得到 previewPath JSON。
切换通过 M428/M429/M430 或等价按钮改变 switchkins 模式,并执行同步命令。运动学和解释器状态对齐。
执行根据当前模式执行程序,同时刷新关节反馈和 TCP 位姿。得到 executionPath JSON。
比对用固定 20 ms 采样周期对比预览和执行曲线。输出 compare-report.json。

同步逻辑是这个程序最容易被误解的地方:切换模式不是单独改一个 pin 就结束了,必须让解释器和 motion 同步,否则 G-code 看到的坐标语义和 motion 看到的坐标语义会不同。这个要求在文档中已经被固化为“预览路径和执行路径统一采样周期,并在切换时强制同步”。

10.8 异常和约束逻辑

总的来说,xyzbc-trt 的逻辑不是“一个五轴模型 + 一个预览窗口”,而是“配置驱动的状态机 + 可切换运动学 + HAL 事件 + 三维可视化 + 路径证据”的组合。Web 端要做到完全对标,必须把这五件事统一成一条链。