提交当前项目改动

This commit is contained in:
mes123456
2026-07-02 08:01:34 -04:00
parent 83075c4b96
commit c4a721f6cf
274 changed files with 157294 additions and 1394 deletions

View File

@@ -0,0 +1,189 @@
# 01-项目功能内容
## 目标
对标 LinuxCNC `xyzbc-trt` 当前运行配置,在 Web 中实现 XYZBC table rotary/tilting 五轴数控系统仿真界面。界面基于 HTML/JavaScript文件和会话持久化基于 OPFSCNC 核心能力通过 `wasm-port` 的 LinuxCNC-derived WASM/SDK 边界提供。
Native 对标基线:
- 后续以 `/home/mes123456/cnc_wams/linuxcnc` 作为 LinuxCNC `xyzbc-trt` 源码与真实执行基线。
- Web 数控仿真界面和逻辑必须根据该路径编译后执行 `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini` 的真实运行结果设计。
- native evidence 采集脚本应通过 `/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment` 启动/连接 LinuxCNC而不是继续依赖 `/home/mes123456/linuxcnc-master`
- `/home/mes123456/cnc_wams/linuxcnc` 已完成 run-in-place 编译,并已验证 `scripts/rip-environment``scripts/linuxcnc``bin/axis``bin/xyzbc-trt-gui``bin/milltask``bin/linuxcncsvr``bin/halui``rtlib/xyzbc-trt-kins.so``rtlib/tpmod.so``lib/python/linuxcnc.so` 存在可用。后续可以基于该路径重新生成真实 native JSON。
完全对标要求:
- `working` 下的设计、任务和验收必须逐项覆盖 `doc/xyzbc-trt-runtime-files.md` 中记录的运行进程、启动顺序、INI 配置、AXIS 界面行为、PyVCP、POSTGUI HAL、basic_sim、Vismach、switchkins/remap、G-code 子程序、tool table、parameter file、kinematics HAL pins、轴/关节限制和 JSON 执行证据。
- Web 不只展示五轴场景,还必须具备与 LinuxCNC 配置等价的运行状态、按钮行为、文件 staging、HAL/task 反馈、刀具预览路径、刀具执行路径和 native/Web JSON 对比闭环。
- 无法在浏览器中一比一复用的 LinuxCNC 桌面组件,例如 AXIS/Tk/PyVCP/Vismach 窗口,必须在 Web 中提供同语义等效实现,并在 evidence JSON 中说明替代边界。
## 对标文件
主对标文档:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-runtime-files.md
```
LinuxCNC 目标配置:
```text
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var
lib/hallib/basic_sim.tcl
src/hal/user_comps/vismach/xyzbc-trt-gui.py
src/emc/usr_intf/axis/scripts/axis.py
src/emc/kinematics/xyzbc-trt-kins.c
```
## 功能清单
| 功能 | Web 实现方式 | 当前状态 |
| --- | --- | --- |
| XYZBC 机型默认进入 | `app/src/state/store.js` 默认 profile 为 `xyzbc-trt` | 已落地 |
| INI 配置解析 | `linuxcnc-ini-runtime.js` 解析 vendored `xyzbc-trt.ini` | 已落地 |
| PyVCP switchkins 面板 | `xyzbc-trt` profile 复用并改写 PyVCP schema`IDENTITY``TCP:XYZBC``userk``vismach-clear` | 已落地 |
| M428/M429/M430 remap | profile 映射 remap 文件和 switchkins typeWASM interp/remap 由 `wasm-port` 支撑 | Web staging 已完成;真实 WASM 执行需 artifact |
| `motion.switchkins-type` | profile 描述 `motion.analog-out-03 => motion.switchkins-type` | 已落地 |
| XYZBC kinematics | `wasm-port/runtime/sdk/src/linuxcnc-kinematics.js` 支持 `xyzbc-trt``linuxcnc_xyzbc_trt_kinematics.wasm` | SDK 已支持,当前缺 build artifact |
| Vismach 等效三维仿真 | Web canvas/Three 风格五轴场景替代 Python Vismach GUI显示机床参考、刀路、TCP、刀轴 | 参考 app 已移植 |
| OPFS 机器文件 staging | `web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/...` | 已落地 |
| Tool table | `xyzbc-trt.tbl` staged 并进入 Web tool DB 仿真 | 已落地 |
| Parameter file | INI 指向 `xyzbc.var`;已从真实运行树导入 `wasm-port/vendor` 并加入 manifest | 已落地 |
| 默认程序 | `xyzbc_switchkins.ngc` 作为 `xyzbc-trt` 默认程序 | 已落地 |
| task/HAL runtime | `linuxcnc-task-hal-runtime.js` 连接 `wasm-port` task/HAL SDK | 代码已接入,需 artifact 验收 |
| 刀具预览路径 JSON | native 与 Web 在预览阶段输出统一结构的 `previewPath` 曲线采样 | 待补充采集脚本 |
| 刀具执行路径 JSON | native 与 Web 在真实执行阶段输出统一结构的 `executionPath` 曲线采样 | 待补充采集脚本 |
| 预览/执行路径对比 | `compare-xyzbc-trt-evidence.json``previewPath``executionPath` 逐点/误差统计比对 | 待补充 compare 规则 |
| AXIS 主界面等效 | Web 首屏必须是可操作 CNC 仿真界面包含程序、坐标、状态、override、工具、MDI/switchkins 控制 | 待全量验收 |
| POSTGUI HAL 等效 | Web 需复现 `pyvcp.* -> halui.mdi-command-* -> M428/M429/M430` 连接关系 | 待补充 JSON 检查 |
| basic_sim 等效 | Web task/HAL runtime 需提供模拟回零、manual toolchange、spindle、joint feedback 基础仿真语义 | 待 WASM/task-HAL 验收 |
| Vismach 模型等效 | Web 3D 模型需按 `table-x/saddle-y/spindle-z/tilt-b/rotate-c/tool-offset/x-offset/z-offset` 驱动 | 待补充模型 pin 验收 |
| Ngcgui 子程序 | Web 需 stage 并可运行 `xyzbc_switchkins_sub.ngc``centering.ngc``helix_bc.ngc` | 待补充子程序验收 |
| 演示程序全集 | Web 需 stage `xyzbc_switchkins.ngc``boat-xyzbc.ngc`,默认打开前者 | 待补充 boat 验收 |
| 速度/限制/坐标显示 | Web 需对标 `GEOMETRY/JOG_AXES/POSITION_FEEDBACK/MAX_*`、TRAJ 和 AXIS/JOINT 限制 | 待补充 UI/JSON 检查 |
| Kinematics HAL pins | Web 需 expose/record `x-offset/z-offset/tool-offset/rot-point/conventional-directions` | 待补充 HAL pin 检查 |
## 刀具预览与执行路径 JSON 要求
目标:把 LinuxCNC 真实系统和 Web 仿真系统中的刀具预览路径、刀具执行路径都写入 evidence JSON并在 compare JSON 中做同周期曲线比对。
统一采样规则:
- 对比采样周期固定为 `samplePeriodMs = 20`,即 50 Hz。
- native 和 Web 可以保留各自原始采样,但写入 `previewPath.samples``executionPath.samples` 前必须重采样到同一个周期。
- 两侧样本必须使用相同的 `sampleIndex``timeMs` 序列,方便逐点比较。
- 曲线开始点以程序开始执行或预览路径第一段有效运动为 `timeMs = 0`
- 对于 `G0/G1/G2/G3` 等不同插补段JSON 中必须记录 `motionType`,用于区分快移、直线、圆弧和 remap/switchkins 前后的路径段。
native/Web evidence JSON 中都应增加:
```json
{
"pathSampling": {
"samplePeriodMs": 20,
"timeBase": "program-relative-ms",
"resampling": "linear-position-slerp-or-axis-linear",
"coordinateSystem": "machine-xyzbc-and-tcp"
},
"previewPath": {
"source": "linuxcnc-preview-or-web-preview",
"sampleCount": 0,
"samples": []
},
"executionPath": {
"source": "linuxcnc-stat-or-web-task-hal",
"sampleCount": 0,
"samples": []
}
}
```
每个 sample 至少包含:
```json
{
"sampleIndex": 0,
"timeMs": 0,
"line": 0,
"motionType": "G0|G1|G2|G3|remap|unknown",
"activeKinematics": "identity|xyzbc-tcp|userk|unknown",
"tool": {
"id": 0,
"length": 0,
"diameter": 0
},
"joint": {
"x": 0,
"y": 0,
"z": 0,
"b": 0,
"c": 0
},
"tcp": {
"x": 0,
"y": 0,
"z": 0
},
"toolAxis": {
"i": 0,
"j": 0,
"k": 1
},
"feed": 0,
"spindle": 0
}
```
compare JSON 应增加 `pathComparison`
- `previewVsPreview`native 预览路径与 Web 预览路径对比。
- `executionVsExecution`native 执行路径与 Web 执行路径对比。
- `previewVsExecutionNative`LinuxCNC 预览与真实执行之间的偏差。
- `previewVsExecutionWeb`Web 预览与 Web 执行之间的偏差。
- 误差统计至少包含 `maxTcpErrorMm``rmsTcpErrorMm``maxJointError``rmsJointError``maxToolAxisAngleDeg``sampleCountDelta``missingSamples`
## WASM 是否满足
结论:`wasm-port` 已经具备满足 `xyzbc-trt` Web 仿真的主要语义边界,但当前工作区没有 `wasm-port/build/wasm` 构建产物,导致完整浏览器运行需要先执行 WASM 构建。
已具备的证据:
- `wasm-port/runtime/sdk/src/linuxcnc-kinematics.js` 注册 `xyzbc-trt`,目标文件为 `linuxcnc_xyzbc_trt_kinematics.wasm`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_xyzbc_trt_kinematics_probe.cpp` 覆盖 `xyzbc-trt-kins` forward/inverse/switchkins。
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_5axis_remap_execute_harness.cpp` 包含 `xyzbc-trt.ini``xyzbc_switchkins.ngc``boat-xyzbc.ngc` 执行路径。
- `wasm-port/docs/compatibility-validation.md` 记录 `xyzbc-trt` kinematics、remap、browser interp 覆盖。
- 当前环境已经安装并可调用 `emcc 6.0.2`,后续缺口从“安装 Emscripten”转为“执行 WASM 构建并复跑证据”。
当前缺口:
- `wasm-port/build/wasm/kinematics``core``tp``task-hal` 目录当前不存在。
- 因此本轮已完成 native 真实执行、Web OPFS/staging/readiness、JSON 对比验证;完整 browser worker WASM 执行需先构建 artifact。
## Native/Web JSON 对比结论
证据文件:
```text
working/evidence/native-xyzbc-trt-evidence.json
working/evidence/web-xyzbc-trt-evidence.json
working/evidence/compare-xyzbc-trt-evidence.json
```
当前结果:
- native `xyzbc-trt` 通过 LinuxCNC Python API 真实执行 `xyzbc_switchkins.ngc`,采集到 1462 个执行事件。
- Web 侧已完成 profile、INI、OPFS staging、PyVCP XML、remap、tool table、parameter file、默认程序覆盖。
- 对比 12 项检查中 11 项通过。
- 唯一失败项:`required WASM artifacts available`,缺少 `wasm-port/build/wasm/...` 的 kinematics/core/tp/task-hal `.js/.wasm` 文件。

View File

@@ -0,0 +1,215 @@
# 02-项目程序开发详细步骤
## 步骤
1. 读取 `doc/xyzbc-trt-runtime-files.md`,确认 LinuxCNC 进程、INI、PyVCP、POSTGUI HAL、Vismach、remap、tool table、parameter file 的运行关系。
2. 读取 `wasm-port/AGENTS.md``wasm-port/SKILL.md`,确认必须复用 LinuxCNC 源码语义Web 只做 UI/OPFS/运行边界适配。
3. 检查 `wasm-port` 是否包含 `xyzbc-trt`:确认 SDK、probe、vendored configs、remap harness 已覆盖。
4. 复制参考 Web app 到目标目录:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/app
web-rtcp-5axis-xyzbc-trt-sim-plan/tests
```
5. 将目标 app 默认机型改为 `xyzbc-trt`
```text
app/src/state/store.js
app/src/profiles/index.js
app/src/runtime/linuxcnc-kinematics-runtime.js
app/src/runtime/linuxcnc-kinematics-worker-client.js
app/src/main.js
```
6. 将 OPFS/session/tool-db 根路径改为目标项目命名空间:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/machines
web-rtcp-5axis-xyzbc-trt-sim-plan/sessions
web-rtcp-5axis-xyzbc-trt-sim-plan/tool-db
```
7.`xyzbc-trt` profile 增加默认机器文件 staging
```js
machineFileStaging: {
defaultProgramFilename: "xyzbc_switchkins.ngc",
wasmDir: "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt",
}
```
8. 新增目标项目 Node smoke
```text
tests/node/verify_xyzbc_trt_web_app.mjs
```
9. 创建工作文档:
```text
working/01-项目功能内容.md
working/02-项目程序开发详细步骤.md
working/03-推进台账.md
working/04-任务矩阵.md
working/05-验收证据.md
working/06-决策记录.md
working/07-全量对标追踪矩阵.md
working/README.md
```
10.`07-全量对标追踪矩阵.md` 继续补齐 Web 对标功能:
```text
AXIS 等效界面
PyVCP/POSTGUI HAL 等效连接
basic_sim task/HAL 等效运行
Vismach xyzbc-trt-gui.py 等效 3D 模型
Ngcgui/remap 子程序全集 staging 和执行
TRAJ/AXIS/JOINT 限制、速度、单位和 override
tool table/tool offset 对 kinematics 和模型的双向影响
native/Web JSON 全字段对比
```
11. 切换 native 真实执行基线到 `/home/mes123456/cnc_wams/linuxcnc`
```bash
test -x /home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment
test -x /home/mes123456/cnc_wams/linuxcnc/bin/axis
test -x /home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui
test -f /home/mes123456/cnc_wams/linuxcnc/rtlib/xyzbc-trt-kins.so
test -f /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
```
验收要求:
- 上述文件存在后native 采集脚本统一使用 `/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment`
- 真实执行命令的 INI 必须是 `/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini`
- Web 界面布局、状态流、switchkins 逻辑、Vismach 等效模型、刀具路径和 JSON 字段都以该路径实际执行结果为准。
- `/home/mes123456/linuxcnc-master` 只能作为历史运行参考,不再作为新的 native evidence 基线。
## 后续完整验收步骤
1. 生成 WASM artifact
```bash
source /home/mes123456/emsdk/emsdk_env.sh
wasm-port/tools/build_kinematics_wasm.sh
wasm-port/tools/build_wasm_core.sh
wasm-port/tools/build_tp_wasm.sh
wasm-port/tools/build_task_hal_wasm.sh
```
2. 运行 wasm-port 对应验证:
```bash
wasm-port/tests/wasm/node/verify_kinematics_wasm.sh
wasm-port/tests/wasm/node/verify_interp_wasm.sh
wasm-port/tests/wasm/node/verify_task_hal_wasm.sh
wasm-port/tests/browser/verify_interp_browser.sh
```
3. 运行目标 app 验证:
```bash
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run smoke:node
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build
```
4. 生成 native/Web 对比证据:
```bash
/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment \
python3 web-rtcp-5axis-xyzbc-trt-sim-plan/tools/collect-native-xyzbc-trt-evidence.py --run --timeout 90
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
```
输出:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/compare-xyzbc-trt-evidence.json
```
5. 补充刀具预览路径和刀具执行路径采集:
```text
tools/collect-native-xyzbc-trt-evidence.py
tools/collect-web-xyzbc-trt-evidence.mjs
tools/compare-xyzbc-trt-evidence.mjs
```
实现要求:
- 在 native evidence 中增加 `pathSampling``previewPath``executionPath`
- 在 Web evidence 中增加同名字段,字段结构必须与 native 完全一致。
- 统一对比采样周期为 `samplePeriodMs = 20`
- 采集脚本可保留原始高频/低频轨迹,但写入对比 JSON 的曲线必须重采样到 20ms。
- 预览路径从 LinuxCNC preview/canon 或 Web preview planner 采集;执行路径从 LinuxCNC `stat()`/HAL 反馈或 Web task/HAL runtime 采集。
- 每个样本必须包含 `sampleIndex``timeMs``line``motionType``activeKinematics``tool``joint``tcp``toolAxis``feed``spindle`
- 对 B/C 旋转轴和 TCP/toolAxis 的计算必须以 `xyzbc-trt` kinematics/WASM 结果为准,不能用 UI 插值伪造。
6. 补充刀路 compare 规则:
```json
{
"pathComparison": {
"samplePeriodMs": 20,
"previewVsPreview": {},
"executionVsExecution": {},
"previewVsExecutionNative": {},
"previewVsExecutionWeb": {}
}
}
```
验收要求:
- `compare-xyzbc-trt-evidence.json` 中新增 `pathComparison`
- `checks` 中新增 `path-preview``path-execution``path-preview-execution-consistency` 类别。
- 每类检查至少输出 `maxTcpErrorMm``rmsTcpErrorMm``maxJointError``rmsJointError``maxToolAxisAngleDeg``sampleCountDelta``missingSamples`
- 若 native/Web 两侧采样周期不一致compare 必须直接 fail并输出实际周期。
- 若 WASM artifact 缺失导致 Web 执行路径无法采集compare 必须保持 fail/blocker不能用预览路径替代执行路径。
7. 补充全量对标 JSON 字段:
```json
{
"startupSequence": [],
"iniDisplay": {},
"halNets": [],
"kinematicsPins": {},
"axisJointLimits": {},
"switchkinsTransitions": [],
"uiEquivalence": {},
"vismachEquivalent": {},
"ngcguiSubroutines": [],
"demoPrograms": []
}
```
验收要求:
- `startupSequence` 对标 `.desktop -> rip-environment -> linuxcncsvr/rtapi_app/milltask/halui -> basic_sim -> kinematics -> Vismach -> AXIS -> PyVCP -> POSTGUI HAL -> OPEN_FILE`
- `halNets` 覆盖 `motion.switchkins-type``halui.mdi-command-*``pyvcp.*``joint.N.pos-fb``motion.tooloffset.z``xyzbc-trt-kins.*`
- `kinematicsPins` 覆盖 `x-offset=-20``z-offset=-15``x/y/z-rot-point=0``conventional-directions=0``tool-offset`
- `axisJointLimits` 覆盖 `XYZBC` 单位、关节数、B/C 角轴限制、TRAJ 速度/加速度。
- `uiEquivalence` 覆盖 AXIS 主界面的程序区、坐标区、MDI/switchkins、override、工具、状态、预览/执行路径。
- `vismachEquivalent` 覆盖 `xyzbc-trt-gui.py` 的模型 pin 和清除轨迹行为。
- `ngcguiSubroutines` 覆盖 `xyzbc_switchkins_sub.ngc``centering.ngc``helix_bc.ngc`
- `demoPrograms` 覆盖 `xyzbc_switchkins.ngc``boat-xyzbc.ngc`
8. 启动目标 Web
```bash
cd web-rtcp-5axis-xyzbc-trt-sim-plan/app
npm run dev
```
默认 URL
```text
http://127.0.0.1:4174/
```

View File

@@ -0,0 +1,280 @@
# 03-推进台账
## 2026-07-02 07:31 EDT - DOCX 设计任务书整合到 working
### 本轮目标
`doc/xyzbc-trt-web-cnc-simulation-design-task-and-technical-plan.docx` 的内容整合到 `working` 目录下,方便后续直接用 Markdown 工作文档继续开发和验收。
### 已做事项
- 读取 DOCX 包结构,确认正文包含 507 段文本,图片包含 `xyzbc-trt-axis-window.png``xyzbc-trt-desktop.png``xyzbc-trt-web-architecture.png``xyzbc-trt-json-compare-flow.png``xyzbc-trt-logic-map.png`
- 从 DOCX 的 `word/document.xml` 提取段落和表格,转换为 `working/09-设计任务书与技术方案整合.md`
- 在整合稿中保留 1-11 章项目目标、原型运行证据、完全对标范围、Web 界面设计任务书、技术方案、开发任务分解、验收标准、风险控制、对标文件清单、程序逻辑全量分析、开机/急停/回零/执行状态联锁。
- 将 DOCX 图片引用改为 `../doc/assets/...`,使 working 文档可直接查看原有图像证据。
- 更新 `working/README.md`,把 09 文档加入索引。
- 更新 `04-任务矩阵.md`,新增 `T-040 DOCX 任务书整合到 working`
### 修改文件
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/README.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/03-推进台账.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/04-任务矩阵.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/05-验收证据.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/06-决策记录.md
```
### 验证情况
- `working/09-设计任务书与技术方案整合.md` 已生成,共 364 行。
- `rg` 检查到核心章节:`项目目标``原型系统运行证据``完全对标范围``Web 界面设计任务书``技术方案``开发任务分解``验收标准``风险和控制措施``程序逻辑全量分析``开机、急停、回零与执行状态的联锁逻辑`
- `rg` 检查到 5 张图片引用,均指向 `../doc/assets/`
### 下一步
1. 后续开发需求优先引用 `working/09-设计任务书与技术方案整合.md`,不再需要反复打开 DOCX 才能检索任务书内容。
2. 若 DOCX 后续继续更新,需要同步重新生成或手工补充 09 文档,并在本台账记录差异。
## 2026-07-02 03:10 EDT
### 本轮目标
对标 `xyzbc-trt-runtime-files.md`,确认 `wasm-port` 是否满足,并创建 Web 方式的 `xyzbc-trt` 数控系统仿真界面与工作文档。
### 已做事项
- 读取 `web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-runtime-files.md`
- 读取 `wasm-port/AGENTS.md``wasm-port/SKILL.md``wasm-port/README.md`
- 检查参考 app`web-rtcp-5axis-sim-plan/app`
- 检查 `wasm-port``xyzbc-trt` 的覆盖SDK、vendored config、kinematics probe、remap execute harness、文档覆盖。
- 复制参考 app 和 tests 到目标目录。
- 修改目标 app 默认 profile 为 `xyzbc-trt`
- 修改 OPFS/session/tool-db 命名空间为 `web-rtcp-5axis-xyzbc-trt-sim-plan`
-`xyzbc-trt` profile 增加 `machineFileStaging.defaultProgramFilename = xyzbc_switchkins.ngc`
- 新增 `tests/node/verify_xyzbc_trt_web_app.mjs`
- 创建 `README.md``working/` 六类工作文档。
- 发现 `xyzbc.var` 未进入 `wasm-port/vendor`/manifest本轮记录为参数文件基线导入缺口。
### 修改文件
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/README.md
web-rtcp-5axis-xyzbc-trt-sim-plan/app/index.html
web-rtcp-5axis-xyzbc-trt-sim-plan/app/package.json
web-rtcp-5axis-xyzbc-trt-sim-plan/app/package-lock.json
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/main.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/state/store.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/profiles/index.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/profiles/xyzbc-trt.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/five-axis-session.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/linuxcnc-machine-file-staging.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/linuxcnc-kinematics-runtime.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/linuxcnc-kinematics-worker-client.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/runtime/tool-db-simulation.js
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/ui/gmoccapy-shell.js
web-rtcp-5axis-xyzbc-trt-sim-plan/tests/node/verify_xyzbc_trt_web_app.mjs
web-rtcp-5axis-xyzbc-trt-sim-plan/working/README.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/01-项目功能内容.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/02-项目程序开发详细步骤.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/03-推进台账.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/04-任务矩阵.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/05-验收证据.md
web-rtcp-5axis-xyzbc-trt-sim-plan/working/06-决策记录.md
```
### 验证情况
- 已通过:`npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run smoke:node`,输出 `xyzbc_trt_web_app_smoke=ok`
- 已通过:`git diff --check -- web-rtcp-5axis-xyzbc-trt-sim-plan`
- 已发现:当前工作区缺少 `wasm-port/build/wasm`,完整 WASM/browser 验收需要先构建 artifact。
### 下一步
1. 运行目标 Node smoke。
2. 如需完整 Web 执行,先构建 `wasm-port/build/wasm`
3. 根据 browser smoke 结果补齐目标项目专用浏览器断言。
## 2026-07-02 native/Web 对比验证轮次
### 本轮目标
执行真实 `xyzbc-trt` 和 Web 仿真采集,分别写入 JSON并通过比较 JSON 找出需要完善的差异。
### 已做事项
- 确认 native `xyzbc-trt` 进程正在运行:`linuxcncsvr``milltask``halui``xyzbc-trt-gui``axis`
- 历史轮次曾使用 `/home/mes123456/linuxcnc-master/scripts/rip-environment python3` 成功导入 LinuxCNC Python API 并读取 `stat()`;当前 native 新基线已切换到 `/home/mes123456/cnc_wams/linuxcnc`
- 新增 native 采集脚本:`tools/collect-native-xyzbc-trt-evidence.py`
- 新增 Web 采集脚本:`tools/collect-web-xyzbc-trt-evidence.mjs`
- 新增 JSON 对比脚本:`tools/compare-xyzbc-trt-evidence.mjs`
-`xyzbc.var` 从真实运行树导入 `wasm-port/vendor/linuxcnc/.../xyzbc.var`,并加入 `wasm-port/tools/source-manifest.txt`
- 更新目标 smoke使参数文件 staging 成为必须通过项。
-`package.json` 增加 `evidence:web``evidence:compare`
### 验证情况
- 已通过 native 真实执行采集:`native-xyzbc-trt-evidence.json``commandResult.status=completed`,事件数 `1462`
- 已通过 Web 采集:`web-xyzbc-trt-evidence.json`profile/INI/OPFS/PyVCP/remap/tool/parameter/default program 均覆盖。
- 已生成比较报告:`compare-xyzbc-trt-evidence.json`12 项检查中 11 项通过。
- 当前唯一失败项:缺少 `wasm-port/build/wasm` 下的 kinematics/core/tp/task-hal `.js/.wasm` artifact。
- 当前环境此前缺少 `emcc`;后续已安装 `emcc 6.0.2`,下一步应直接构建 WASM artifact。
### 下一步
1. 运行 `source /home/mes123456/emsdk/emsdk_env.sh`
2. 运行 `wasm-port/tools/build_kinematics_wasm.sh``build_wasm_core.sh``build_tp_wasm.sh``build_task_hal_wasm.sh`
3. 重跑 `npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web``evidence:compare`,目标是比较报告 artifact 项通过。
4. 再补目标浏览器 smoke确认 worker runtime 和 canvas 非空。
## 2026-07-02 刀具预览/执行路径 JSON 对比需求补充
### 本轮目标
把“刀具预览路径”和“刀具执行路径”的采集过程纳入 native/Web evidence JSON并要求 compare JSON 使用一致曲线采样周期进行比对。
### 已做事项
-`01-项目功能内容.md` 增加 `pathSampling``previewPath``executionPath``pathComparison` 的 JSON 字段要求。
- 明确 native 和 Web 对比采样周期统一为 `samplePeriodMs = 20`
- 明确每个路径样本必须包含程序行号、运动类型、switchkins/kinematics 状态、刀具信息、XYZBC joint、TCP、toolAxis、feed、spindle。
-`02-项目程序开发详细步骤.md` 增加 native/Web 采集脚本和 compare 脚本的后续实现步骤。
- 在任务矩阵中增加预览路径采集、执行路径采集、统一采样周期、路径误差统计等任务。
### 当前状态
- 本轮只补充工作文档和验收要求。
- 现有 `working/evidence/*.json` 仍是上一轮真实采集结果,尚未伪造或手工改写。
- 后续需要修改采集脚本,让真实 native/Web 运行重新生成包含刀具路径的 JSON。
### 下一步
1.`collect-native-xyzbc-trt-evidence.py` 中增加 LinuxCNC 预览路径与执行反馈路径采集。
2.`collect-web-xyzbc-trt-evidence.mjs` 中增加 Web 预览 planner 与 WASM task/HAL 执行路径采集。
3.`compare-xyzbc-trt-evidence.mjs` 中增加 20ms 重采样和路径误差统计。
4. 重新生成 native/Web/compare 三份 JSON确认 `pathComparison.samplePeriodMs = 20` 且两侧样本可逐点对齐。
## 2026-07-02 全量对标 working 文档完善
### 本轮目标
根据 `doc/xyzbc-trt-runtime-files.md`,让 `working` 文档明确要求 Web 数控系统仿真界面完全对标 LinuxCNC `xyzbc-trt` 真实运行配置。
### 已做事项
- 重新读取 `doc/xyzbc-trt-runtime-files.md`,确认文档共 702 行覆盖进程、启动入口、INI、AXIS、PyVCP、POSTGUI HAL、basic_sim、Vismach、switchkins、G-code、tool table、kinematics、加载顺序和重要文件清单。
- 新增 `working/07-全量对标追踪矩阵.md`,把每个 LinuxCNC 功能点映射到 Web 对标目标、evidence 字段和当前缺口。
- 更新 `01-项目功能内容.md`,明确完全对标范围,并补充 AXIS 等效、POSTGUI HAL 等效、basic_sim、Vismach pin、Ngcgui、演示程序全集、速度/限制、kinematics HAL pins 等功能项。
- 更新 `02-项目程序开发详细步骤.md`,增加全量对标 JSON 字段和后续实现步骤。
- 更新 `04-任务矩阵.md`,新增 T-025 到 T-035。
- 更新 `05-验收证据.md`,新增全量对标 JSON 验收要求。
- 同步 `emcc` 状态:当前已安装 `emcc 6.0.2`,剩余前置是构建 WASM artifact。
### 当前状态
- 文档层面已把 `xyzbc-trt-runtime-files.md` 的完整运行语义转成 Web 对标清单。
- 代码层面仍需继续补齐全量 evidence JSON、UI 等效行为、Vismach pin 验收和 WASM artifact 验收。
### 下一步
1. 构建 `wasm-port/build/wasm` artifact。
2. 修改 native/Web evidence 采集脚本,补齐 `startupSequence``halNets``kinematicsPins``axisJointLimits``uiEquivalence``vismachEquivalent` 等字段。
3. 修改 compare 脚本,把 `07-全量对标追踪矩阵.md` 中的检查项转为自动化 check。
4. 根据新增任务矩阵补齐 Web UI 和 3D 模型行为。
## 2026-07-02 切换 native 对标基线到 `/home/mes123456/cnc_wams/linuxcnc`
### 本轮目标
根据用户要求,以编译成功并能够执行 `xyzbc-trt``/home/mes123456/cnc_wams/linuxcnc` 为真实 LinuxCNC 对标基线,设计 Web 数控仿真界面和逻辑。
### 已做事项
- 检查 `/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini`,确认配置文件存在。
- 检查 `/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment``bin/axis``bin/xyzbc-trt-gui``rtlib/xyzbc-trt-kins.so`,当前自动检查未发现这些 RIP/构建产物。
- 更新 `01-项目功能内容.md`,声明后续 native evidence 采集和 Web 对标基线统一使用 `/home/mes123456/cnc_wams/linuxcnc`
- 更新 `02-项目程序开发详细步骤.md`,将 native 采集命令切换为 `/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment`
- 更新 `04-任务矩阵.md`,新增 T-036 到 T-038覆盖 native 基线切换、新基线 JSON 重采集、Web 界面按新 native 运行结果复核。
- 更新 `05-验收证据.md`,新增 native 基线切换验收,记录当前文件检查结果。
- 更新 `07-全量对标追踪矩阵.md``06-决策记录.md`,明确 `/home/mes123456/linuxcnc-master` 只作为历史运行参考。
### 当前状态
- 文档层面已切换对标基线。
- 代码和 evidence 层面还未重新采集;现有 `working/evidence/*.json` 仍来自历史 `/home/mes123456/linuxcnc-master` 运行树。
### 下一步
1. 确认 `/home/mes123456/cnc_wams/linuxcnc` 的 RIP 构建产物实际输出位置。
2. 用该路径执行 `xyzbc-trt.ini`,确认 `axis``xyzbc-trt-gui``xyzbc-trt-kins.so` 可运行。
3. 修改/运行 native evidence 采集脚本,让 `sourceRoot=/home/mes123456/cnc_wams/linuxcnc`
4. 依据新 native JSON 复核 Web UI、switchkins、Vismach 等效模型、刀具路径和 compare 规则。
## 2026-07-02 编译 `/home/mes123456/cnc_wams/linuxcnc`
### 本轮目标
按 run-in-place 方式编译 `/home/mes123456/cnc_wams/linuxcnc`,使其能够作为 `xyzbc-trt` native 真实执行基线。
### 已做事项
- 读取 `docs/INSTALL.adoc`,确认 RIP 构建流程为 `cd src``./autogen.sh``./configure --with-realtime=uspace``make``sudo make setuid`
- 执行 `./autogen.sh`,成功生成 configure/config.h.in。
- 执行 `./configure --with-realtime=uspace --disable-build-documentation`,配置成功,并生成 `scripts/linuxcnc``scripts/rip-environment``scripts/halrun` 等 RIP 脚本。
- 首次执行 `make -j"$(nproc)"` 失败,原因是 shell 环境变量 `DEBUG=release` 被 LinuxCNC Makefile 当作编译参数,导致 `gcc/c++``release: linker input file not found`
- 使用 `env -u DEBUG make -j"$(nproc)"` 重新编译,成功完成。
- 执行 `sudo -n make setuid`,成功设置 `bin/rtapi_app``bin/linuxcnc_module_helper` 的 root/setuid 权限。
### 验证情况
- 已生成 `scripts/rip-environment``scripts/linuxcnc`
- 已生成 `bin/axis``bin/xyzbc-trt-gui``bin/milltask``bin/linuxcncsvr``bin/halui`
- 已生成 `rtlib/xyzbc-trt-kins.so``rtlib/tpmod.so`
- `source scripts/rip-environment` 后,`command -v linuxcnc``axis``halcmd` 均指向 `/home/mes123456/cnc_wams/linuxcnc`
- `python3 -c "import linuxcnc"` 成功,模块路径为 `/home/mes123456/cnc_wams/linuxcnc/lib/python/linuxcnc.so`
- `git status --short` 无输出,说明没有 Git 跟踪文件改动;编译产物均在忽略/生成路径内。
### 下一步
1. 使用 `/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment` 重新采集 native `xyzbc-trt` evidence。
2.`native-xyzbc-trt-evidence.json.sourceRoot` 更新为 `/home/mes123456/cnc_wams/linuxcnc`
3. 用新 native JSON 重跑 Web evidence 和 compare。
## 2026-07-02 创建并执行 `xyzbc-trt` 快捷方式
### 本轮目标
`/home/mes123456/cnc_wams/linuxcnc` 中创建执行 `xyzbc-trt` 的桌面快捷方式,并实际启动该配置。
### 已做事项
- 检查显示环境,当前 `DISPLAY=:1``XDG_SESSION_TYPE=x11`
- 参考历史 `/home/mes123456/linuxcnc-master/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop`,创建新快捷方式:
```text
/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop
```
- 快捷方式 `Exec` 指向:
```text
/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
```
- 启动前发现历史 `/home/mes123456/linuxcnc-master``xyzbc-trt` 仍在运行。
- 尝试 `/home/mes123456/linuxcnc-master/scripts/linuxcnc -k` 后出现 pickconfig 窗口,未关闭旧实例;随后终止旧 LinuxCNC 相关进程。
- 使用 `setsid` 从新路径后台启动 `xyzbc-trt`
### 验证情况
- 新进程均来自 `/home/mes123456/cnc_wams/linuxcnc``scripts/linuxcnc``linuxcncsvr``rtapi_app``milltask``halui``hal_manualtoolchange``xyzbc-trt-gui``axis`
- `halcmd show pin motion.switchkins-type` 可读,值为 `0`
- LinuxCNC Python API 可读取状态:`file=./demos/xyzbc_switchkins.ngc``axis_mask=55``position=[0,0,0,0,0]`
- `desktop-file-validate` 无输出。
### 下一步
1. 用当前运行的新 native 实例重采集 `native-xyzbc-trt-evidence.json`
2. 将现有历史 `/home/mes123456/linuxcnc-master` evidence 替换为 `/home/mes123456/cnc_wams/linuxcnc` evidence。
3. 基于新 evidence 重跑 Web compare。

View File

@@ -0,0 +1,50 @@
# 04-任务矩阵
| 编号 | 任务 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| T-001 | 对标 `xyzbc-trt-runtime-files.md` 梳理运行文件 | 完成 | 文档列出 INI、PyVCP、HAL、Vismach、remap、tool table、parameter file |
| T-002 | 判断 `wasm-port` 是否满足 `xyzbc-trt` | 完成 | 明确列出 SDK/probe/remap/browser 覆盖和当前 artifact 缺口 |
| T-003 | 创建目标 Web app | 完成 | `web-rtcp-5axis-xyzbc-trt-sim-plan/app/index.html` 存在 |
| T-004 | 默认机型改为 `xyzbc-trt` | 完成 | `createSimulationStore().getState().machineProfile === "xyzbc-trt"` |
| T-005 | 接入 `xyzbc-trt` INI/profile | 完成 | profile 坐标为 `XYZBC`kinematics 为 `xyzbc-trt-kins` |
| T-006 | OPFS 路径隔离到目标项目 | 完成 | staged 文件 path 以 `web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/` 开头 |
| T-007 | 默认加载 `xyzbc_switchkins.ngc` | 完成 | profile `machineFileStaging.defaultProgramFilename``xyzbc_switchkins.ngc` |
| T-008 | Stage remap/tool/PyVCP 文件 | 完成 | staging 包含 `428remap.ngc``429remap.ngc``430remap.ngc``xyzbc-trt.tbl``xyzbc-trt.xml` |
| T-009 | 增加目标 Node smoke | 完成 | `tests/node/verify_xyzbc_trt_web_app.mjs` 存在并通过 |
| T-010 | 导入 `xyzbc.var` 基线参数文件 | 完成 | `wasm-port/vendor`/manifest 包含 `xyzbc.var`OPFS staging 可保存参数文件 |
| T-011 | 完整 kinematics WASM 验证 | 待前置 | `wasm-port/tests/wasm/node/verify_kinematics_wasm.sh` 通过 |
| T-012 | 完整 interpreter/remap WASM 验证 | 待前置 | `wasm-port/tests/wasm/node/verify_interp_wasm.sh` 通过并覆盖 `xyzbc_switchkins.ngc` |
| T-013 | 完整 task/HAL WASM 验证 | 待前置 | `wasm-port/tests/wasm/node/verify_task_hal_wasm.sh` 通过 |
| T-014 | 目标浏览器 smoke | 待前置 | 页面默认显示 `xyzbc-trt`worker runtime readycanvas 非空 |
| T-015 | native 真实执行 JSON 采集 | 完成 | `native-xyzbc-trt-evidence.json` 记录真实执行事件,状态 completed |
| T-016 | Web OPFS/WASM readiness JSON 采集 | 完成 | `web-xyzbc-trt-evidence.json` 记录 Web profile/INI/staging/WASM readiness |
| T-017 | native/Web JSON 对比 | 部分完成 | `compare-xyzbc-trt-evidence.json` 已生成;当前 11/12 通过,剩余 WASM artifact |
| T-018 | WASM artifact 构建前置 | 待前置 | `emcc 6.0.2` 已可用,需运行构建脚本让 `wasm-port/build/wasm` 生成所需 `.js/.wasm` |
| T-019 | native 刀具预览路径 JSON 采集 | 待实现 | `native-xyzbc-trt-evidence.json.previewPath.samples` 使用 20ms 周期记录 LinuxCNC 预览刀路 |
| T-020 | native 刀具执行路径 JSON 采集 | 待实现 | `native-xyzbc-trt-evidence.json.executionPath.samples` 使用 20ms 周期记录真实执行反馈路径 |
| T-021 | Web 刀具预览路径 JSON 采集 | 待实现 | `web-xyzbc-trt-evidence.json.previewPath.samples` 使用 20ms 周期记录 Web 预览刀路 |
| T-022 | Web 刀具执行路径 JSON 采集 | 待前置 | `web-xyzbc-trt-evidence.json.executionPath.samples` 使用 20ms 周期记录 WASM task/HAL 执行反馈路径 |
| T-023 | 刀路采样周期一致性检查 | 待实现 | compare 检查 native/Web `pathSampling.samplePeriodMs === 20`,否则 fail |
| T-024 | 刀路误差统计对比 | 待实现 | compare 输出 preview/execution 的 TCP、joint、toolAxis 误差统计和缺样本清单 |
| T-025 | 全量对标追踪矩阵 | 完成 | `07-全量对标追踪矩阵.md` 逐项映射 `xyzbc-trt-runtime-files.md` 的运行功能 |
| T-026 | AXIS 主界面等效功能 | 待实现 | Web 首屏包含程序、坐标、状态、MDI/switchkins、override、工具和预览/执行区域 |
| T-027 | POSTGUI HAL/PyVCP 连接等效 | 待实现 | JSON 记录 `pyvcp.* -> halui.mdi-command-* -> M428/M429/M430` 和 multilabel 状态 |
| T-028 | basic_sim 等效 task/HAL | 待前置 | Web task/HAL runtime 覆盖模拟回零、manual toolchange、spindle、joint feedback |
| T-029 | Vismach 3D 模型 pin 对标 | 待实现 | Web 3D 模型由 `table-x/saddle-y/spindle-z/tilt-b/rotate-c/tool-offset/x-offset/z-offset` 驱动 |
| T-030 | Ngcgui/remap 子程序全集 | 待实现 | staging 和执行覆盖 `xyzbc_switchkins_sub.ngc``centering.ngc``helix_bc.ngc` |
| T-031 | 演示程序全集 | 待实现 | staging 和 UI 程序选择覆盖 `xyzbc_switchkins.ngc``boat-xyzbc.ngc` |
| T-032 | TRAJ/AXIS/JOINT 限制对标 | 待实现 | JSON/UI 覆盖 XYZBC 单位、速度/加速度、B/C 限位、JOG_AXES、GEOMETRY |
| T-033 | kinematics HAL pins 对标 | 待实现 | JSON 记录 `x-offset=-20``z-offset=-15`、rot-point、conventional-directions、tool-offset |
| T-034 | tool table 到 tool-offset 闭环 | 待实现 | T/P/Z/D 解析影响 kinematics tool-offset、Web 模型刀长和 path JSON |
| T-035 | 全量 evidence JSON 字段 | 待实现 | native/Web JSON 包含 `startupSequence``iniDisplay``halNets``kinematicsPins``axisJointLimits``uiEquivalence` |
| T-036 | native 基线切换到 `/home/mes123456/cnc_wams/linuxcnc` | 完成 | `scripts/rip-environment``bin/axis``bin/xyzbc-trt-gui``rtlib/xyzbc-trt-kins.so` 已生成RIP 环境可导入 `linuxcnc` Python 模块 |
| T-037 | 基于新 native 基线重采集 JSON | 待前置 | `native-xyzbc-trt-evidence.json``sourceRoot``/home/mes123456/cnc_wams/linuxcnc`,执行状态 completed |
| T-038 | Web 界面按新 native 运行结果复核 | 待实现 | UI/逻辑与 `/home/mes123456/cnc_wams/linuxcnc` 真实 `xyzbc-trt` 的状态流、按钮、路径、HAL pin 对齐 |
| T-039 | 创建并执行 `xyzbc-trt` 快捷方式 | 完成 | `linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop` 已创建,进程从 `/home/mes123456/cnc_wams/linuxcnc` 启动 |
| T-040 | DOCX 任务书整合到 working | 完成 | `working/09-设计任务书与技术方案整合.md` 保留 DOCX 1-11 章、5 张图片引用、任务书、技术方案、程序逻辑和状态联锁内容 |
状态说明:
- 完成:本轮已实现并可通过静态/Node 验证。
- 待前置:代码已接入,但当前缺少 `wasm-port/build/wasm` artifact需先构建。
- 待实现:已记录验收要求,仍需修改采集或对比脚本。

View File

@@ -0,0 +1,491 @@
# 05-验收证据
## DOCX 整合验收
### 源文件
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-web-cnc-simulation-design-task-and-technical-plan.docx
```
### 输出文件
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
```
### 包结构检查结论
```text
DOCX 正文段落数507
DOCX 图片数5
图片文件:
- word/media/xyzbc-trt-axis-window.png
- word/media/xyzbc-trt-desktop.png
- word/media/xyzbc-trt-json-compare-flow.png
- word/media/xyzbc-trt-logic-map.png
- word/media/xyzbc-trt-web-architecture.png
```
### Markdown 输出检查
```bash
wc -l web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
rg -n "^## |图 1|图 2|图 3|图 4|图 5|状态联锁|Evidence JSON|开发任务分解|验收标准|风险" web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
rg -n "!\\[" web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
```
结果:
```text
364 web-rtcp-5axis-xyzbc-trt-sim-plan/working/09-设计任务书与技术方案整合.md
检索到 1-11 章关键章节。
检索到 5 张图片引用,均指向 ../doc/assets/。
```
结论:
- DOCX 任务书已整合到 `working/09-设计任务书与技术方案整合.md`
- 该 Markdown 保留任务书、技术方案、开发任务分解、验收标准、风险控制、源码级程序逻辑分析和状态联锁章节。
- `working/README.md``04-任务矩阵.md` 已登记该整合项。
## 本轮命令证据
### 读取对标文档
```bash
sed -n '1,240p' web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-runtime-files.md
sed -n '241,520p' web-rtcp-5axis-xyzbc-trt-sim-plan/doc/xyzbc-trt-runtime-files.md
```
结论:
- `xyzbc-trt.ini` 使用 `DISPLAY=axis``PYVCP=./xyzbc-trt.xml``OPEN_FILE=./demos/xyzbc_switchkins.ngc`
- `switchkins_postgui.hal` 连接 PyVCP 按钮到 `halui.mdi-command-00/01/02`
- `M429/M428/M430` 分别选择 identity、XYZBC TCP、userk。
### 检查 WASM 支撑
```bash
rg -n "xyzbc|xyzbc-trt|supportedLinuxCncKinematicsModules|linuxcnc_xyzbc" wasm-port web-rtcp-5axis-sim-plan/tests web-rtcp-5axis-sim-plan/app/src
```
结论:
- SDK 包含 `xyzbc-trt -> linuxcnc_xyzbc_trt_kinematics.wasm`
- native probe 包含 `linuxcnc_xyzbc_trt_kinematics_probe.cpp`
- remap 执行 harness 包含 `xyzbc-trt.ini``xyzbc_switchkins.ngc``boat-xyzbc.ngc`
### 检查当前 artifact
```bash
find wasm-port/build/wasm -maxdepth 3 -type f
```
结果:
```text
find: wasm-port/build/wasm: No such file or directory
```
结论:
- 当前仓库没有已生成的 WASM artifact。
- 完整浏览器运行前必须先构建 WASM。
### 检查参数文件基线
```bash
ls -l wasm-port/vendor/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var /home/mes123456/linuxcnc-master/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var
```
结果:
```text
/home/mes123456/linuxcnc-master/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var 存在
wasm-port/vendor/.../xyzbc.var 当前不存在
linuxcnc/.../xyzbc.var 当前不存在
```
结论:
- `xyzbc.var` 是需要补充导入的运行态参数文件基线。
- 历史轮次已从 `/home/mes123456/linuxcnc-master/.../xyzbc.var` 导入到 `wasm-port/vendor/linuxcnc/.../xyzbc.var`,并加入 `wasm-port/tools/source-manifest.txt`;后续若以 `/home/mes123456/cnc_wams/linuxcnc` 为新 native 基线,应重新核对该参数文件是否与当前运行树一致。
## 已运行验收
### native 基线切换验收
后续真实 LinuxCNC 对标基线统一为:
```text
/home/mes123456/cnc_wams/linuxcnc
```
必须先确认这些文件存在:
```bash
test -x /home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment
test -x /home/mes123456/cnc_wams/linuxcnc/bin/axis
test -x /home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui
test -f /home/mes123456/cnc_wams/linuxcnc/rtlib/xyzbc-trt-kins.so
test -f /home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
```
本轮自动检查结果:
```text
scripts/rip-environment: ok
scripts/linuxcnc: ok
bin/axis: ok
bin/xyzbc-trt-gui: ok
bin/milltask: ok
bin/linuxcncsvr: ok
bin/halui: ok
rtlib/xyzbc-trt-kins.so: ok
rtlib/tpmod.so: ok
lib/python/linuxcnc.so: ok
xyzbc-trt.ini: ok
```
说明:
- native evidence 的 `sourceRoot` 后续必须写为 `/home/mes123456/cnc_wams/linuxcnc`
- `/home/mes123456/linuxcnc-master` 只作为历史运行参考;新一轮 Web 对标和 compare 以 `/home/mes123456/cnc_wams/linuxcnc` 的真实执行结果为准。
### LinuxCNC RIP 编译证据
执行命令:
```bash
cd /home/mes123456/cnc_wams/linuxcnc/src
./autogen.sh
./configure --with-realtime=uspace --disable-build-documentation
env -u DEBUG make -j"$(nproc)"
sudo -n make setuid
```
关键过程:
- 首次直接执行 `make -j"$(nproc)"` 失败,原因是当前 shell 环境存在 `DEBUG=release`LinuxCNC Makefile 将 `$(DEBUG)` 拼入编译参数,导致 `gcc/c++` 把裸参数 `release` 当作输入文件。
- 使用 `env -u DEBUG make -j"$(nproc)"` 重新编译通过。
- `sudo -n make setuid` 成功设置 `bin/rtapi_app``bin/linuxcnc_module_helper` 的 root/setuid 权限。
验证命令:
```bash
source /home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment >/dev/null
command -v linuxcnc
command -v axis
command -v halcmd
python3 - <<'PY'
import linuxcnc
print("python_linuxcnc_import=ok")
print("linuxcnc_module=", linuxcnc.__file__)
PY
```
验证结果:
```text
/home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc
/home/mes123456/cnc_wams/linuxcnc/bin/axis
/home/mes123456/cnc_wams/linuxcnc/bin/halcmd
python_linuxcnc_import=ok
linuxcnc_module= /home/mes123456/cnc_wams/linuxcnc/lib/python/linuxcnc.so
```
### `xyzbc-trt` 快捷方式与执行证据
快捷方式路径:
```text
/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop
```
快捷方式内容:
```text
Exec=/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
Icon=/home/mes123456/cnc_wams/linuxcnc/linuxcncicon.png
```
执行方式:
```bash
setsid bash -lc 'cd /home/mes123456/cnc_wams/linuxcnc && exec /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' \
> /tmp/xyzbc-trt-cnc_wams-linuxcnc.log 2>&1 < /dev/null &
```
当前进程证据:
```text
/bin/bash /home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc .../xyzbc-trt.ini
linuxcncsvr -ini /home/mes123456/cnc_wams/linuxcnc/.../xyzbc-trt.ini
/home/mes123456/cnc_wams/linuxcnc/bin/rtapi_app load tpmod
milltask -ini /home/mes123456/cnc_wams/linuxcnc/.../xyzbc-trt.ini
halui -ini /home/mes123456/cnc_wams/linuxcnc/.../xyzbc-trt.ini
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/hal_manualtoolchange
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui
/usr/bin/python3.13 /home/mes123456/cnc_wams/linuxcnc/bin/axis -ini /home/mes123456/cnc_wams/linuxcnc/.../xyzbc-trt.ini
```
HAL/Python 验证:
```text
motion.switchkins-type = 0
loaded file = ./demos/xyzbc_switchkins.ngc
axis_mask = 55
position = [0.0, 0.0, 0.0, 0.0, 0.0]
```
目标 Node smoke
```bash
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run smoke:node
```
实际输出:
```text
xyzbc_trt_web_app_smoke=ok
```
静态 diff 检查:
```bash
git diff --check -- web-rtcp-5axis-xyzbc-trt-sim-plan
```
实际结果:无输出,退出码为 0。
WASM artifact 检查:
```bash
find wasm-port/build/wasm -maxdepth 3 -type f
```
实际输出:
```text
find: wasm-port/build/wasm: No such file or directory
```
完整 WASM 验收:
```bash
wasm-port/tools/build_kinematics_wasm.sh
wasm-port/tools/build_wasm_core.sh
wasm-port/tools/build_tp_wasm.sh
wasm-port/tools/build_task_hal_wasm.sh
wasm-port/tests/wasm/node/verify_kinematics_wasm.sh
wasm-port/tests/wasm/node/verify_interp_wasm.sh
wasm-port/tests/wasm/node/verify_task_hal_wasm.sh
```
### native/Web JSON 证据
真实 native 采集命令:
```bash
/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment \
python3 web-rtcp-5axis-xyzbc-trt-sim-plan/tools/collect-native-xyzbc-trt-evidence.py --run --timeout 90
```
输出:
```text
native_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json
```
结果摘要:
```text
status=ok
executionMode=auto-run
commandResult.status=completed
commandResult.events=1462
```
Web 采集命令:
```bash
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web
```
输出:
```text
web_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json
```
结果摘要:
```text
profileDefaultXyzbc=true
iniReady=true
opfsStaged=true
pyvcpXmlStaged=true
remapsStaged=true
toolTableStaged=true
parameterFileStaged=true
defaultProgramStaged=true
wasmArtifactsReady=false
```
对比命令:
```bash
npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare
```
输出:
```text
compare_xyzbc_trt_evidence=/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/compare-xyzbc-trt-evidence.json
compare_xyzbc_trt_status=fail fail_count=1
```
当前结论:
- 12 项对比中 11 项通过。
- 唯一失败项是 `required WASM artifacts available`
- 当前环境已安装 `emcc 6.0.2`;剩余前置是执行 `wasm-port` 构建脚本生成 artifact并重跑 evidence。
### 全量对标 JSON 验收要求
后续 native/Web evidence JSON 必须按 `07-全量对标追踪矩阵.md` 增加这些顶层或等效字段:
```text
startupSequence
iniDisplay
halNets
kinematicsPins
axisJointLimits
switchkinsTransitions
toolTable
toolOffsetFlow
uiEquivalence
vismachEquivalent
ngcguiSubroutines
demoPrograms
pathSampling
previewPath
executionPath
```
`compare-xyzbc-trt-evidence.json` 必须新增或扩展这些检查类别:
```text
startup-sequence
ini-display
hal-nets
kinematics-pins
axis-joint-limits
switchkins-transitions
tool-offset-flow
ui-equivalence
vismach-equivalence
ngcgui-subroutines
demo-programs
path-preview
path-execution
path-comparison
```
必须逐项验证:
- `.desktop/rip-environment/linuxcnc` 启动顺序在 Web 中有等效 `startupSequence`
- `[DISPLAY]``DISPLAY``GEOMETRY``OPEN_FILE``PYVCP``JOG_AXES``POSITION_OFFSET``POSITION_FEEDBACK``MAX_*``TOOL_EDITOR``NGCGUI_*` 有 Web 等效字段或 UI。
- `[TRAJ]``[KINS]``[EMCMOT]``[TASK]``[EMCIO]` 的关键配置进入 JSON。
- `switchkins_postgui.hal``pyvcp.*``halui.mdi-command-*` 的连接进入 `halNets`
- `basic_sim.tcl` 的模拟 joint/home/spindle/manualtoolchange 语义由 task/HAL evidence 证明。
- `xyzbc-trt-gui.py` 的 HAL pin 和模型层级由 `vismachEquivalent` 证明。
- `xyzbc-trt-kins` 的 offset、rot-point、conventional-directions、tool-offset pin 由 `kinematicsPins` 证明。
- `xyzbc_switchkins_sub.ngc``centering.ngc``helix_bc.ngc``xyzbc_switchkins.ngc``boat-xyzbc.ngc` 都进入 staging 和可执行验收。
- `xyzbc-trt.tbl``T1 P1 D1``T2 P2 Z10 D8` 解析后影响 tool offset、kinematics 和 Web 3D 刀具显示。
### 刀具预览/执行路径 JSON 验收要求
后续 native/Web evidence JSON 必须增加刀具预览路径和刀具执行路径:
```text
working/evidence/native-xyzbc-trt-evidence.json.pathSampling.samplePeriodMs = 20
working/evidence/web-xyzbc-trt-evidence.json.pathSampling.samplePeriodMs = 20
working/evidence/native-xyzbc-trt-evidence.json.previewPath.samples[]
working/evidence/native-xyzbc-trt-evidence.json.executionPath.samples[]
working/evidence/web-xyzbc-trt-evidence.json.previewPath.samples[]
working/evidence/web-xyzbc-trt-evidence.json.executionPath.samples[]
working/evidence/compare-xyzbc-trt-evidence.json.pathComparison
```
采样要求:
- `samplePeriodMs` 固定为 `20`native/Web 两侧必须一致。
- 样本必须通过 `sampleIndex``timeMs` 对齐。
- 若原始采集周期不同,采集脚本或 compare 脚本必须重采样为 20ms 后再比较。
- `previewPath` 只能表示预览/planner 路径;`executionPath` 必须来自真实执行反馈或 Web WASM task/HAL 执行反馈,不能用预览路径替代。
每个样本必须包含:
```text
sampleIndex
timeMs
line
motionType
activeKinematics
tool.id/tool.length/tool.diameter
joint.x/joint.y/joint.z/joint.b/joint.c
tcp.x/tcp.y/tcp.z
toolAxis.i/toolAxis.j/toolAxis.k
feed
spindle
```
compare 验收项:
```text
pathComparison.previewVsPreview
pathComparison.executionVsExecution
pathComparison.previewVsExecutionNative
pathComparison.previewVsExecutionWeb
```
每个对比项至少输出:
```text
maxTcpErrorMm
rmsTcpErrorMm
maxJointError
rmsJointError
maxToolAxisAngleDeg
sampleCountDelta
missingSamples
```
当前状态:
- 现有三份 `working/evidence/*.json` 还没有上述路径字段。
- 本轮未手工改写 JSON 证据文件;后续必须通过采集脚本重新生成。
- Web 执行路径采集依赖 WASM artifactartifact 缺失时 compare 必须保留 fail/blocker。
## 页面证据
目标页面:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/app/index.html
```
开发服务:
```bash
cd web-rtcp-5axis-xyzbc-trt-sim-plan/app
npm run dev
```
URL
```text
http://127.0.0.1:4174/
```

View File

@@ -0,0 +1,141 @@
# 06-决策记录
## D-012DOCX 任务书整合为 working Markdown
日期2026-07-02
决策:将 `doc/xyzbc-trt-web-cnc-simulation-design-task-and-technical-plan.docx` 的正文、表格和图片引用整合为 `working/09-设计任务书与技术方案整合.md`,并把它加入 `working` 索引和任务矩阵。
理由:
- DOCX 不便于命令行检索、diff、逐项验收和后续增量维护。
- `working` 目录是当前项目的开发和验收入口,任务书内容必须进入该目录才能和 01-08 工作文档形成闭环。
- Markdown 版本可以保留 DOCX 的完整任务书、技术方案、程序逻辑分析和状态联锁内容,同时继续引用 `doc/assets` 中的原始图片证据。
## D-001以 `wasm-port` 为 CNC 语义来源
日期2026-07-02
决策Web 项目不在 JavaScript 中重写 G-code、remap、tool table、parameter、kinematics 或 planner 语义,继续通过 `wasm-port` 的 LinuxCNC-derived SDK/WASM 获取语义。
理由:
- `wasm-port/AGENTS.md` 明确要求 LinuxCNC 源码是语义真源。
- `wasm-port` 已经包含 `xyzbc-trt` kinematics、remap、interp、task/HAL 的边界设计。
## D-002复制参考 app 后改为 `xyzbc-trt` 默认机型
日期2026-07-02
决策:复用 `web-rtcp-5axis-sim-plan/app` 的结构,创建目标目录独立 app并只做 `xyzbc-trt` 默认化和项目命名空间隔离。
理由:
- 参考 app 已包含 OPFS、WASM SDK、五轴可视化、profile、task/HAL、tool DB、session 等大部分产品外壳。
- 局部改造比重写界面风险低,且保留 LinuxCNC source-derived 边界。
## D-003目标项目 OPFS 根路径独立
日期2026-07-02
决策:目标项目使用 `web-rtcp-5axis-xyzbc-trt-sim-plan/machines``sessions``tool-db`,不复用旧项目 `web-rtcp-5axis-sim-plan` 路径。
理由:
- 防止两个项目在 OPFS 中互相覆盖机器文件、会话、tool DB。
- 便于后续按项目清理和验收。
## D-004默认程序使用 `xyzbc_switchkins.ngc`
日期2026-07-02
决策:为 `xyzbc-trt` profile 增加 `machineFileStaging.defaultProgramFilename = "xyzbc_switchkins.ngc"`
理由:
- LinuxCNC INI `[DISPLAY]OPEN_FILE` 指向 `./demos/xyzbc_switchkins.ngc`
- 参考 app 的自动选择逻辑按 `${profileId}_switchkins.ngc` 推导时会得到不存在的 `xyzbc-trt_switchkins.ngc`,必须显式覆盖。
## D-005完整浏览器验收等待 WASM artifact
日期2026-07-02
决策:本轮先完成代码、工作文档和不依赖 artifact 的 Node smoke完整 browser/WASM 验收记录为后续前置任务。
理由:
- 当前 `wasm-port/build/wasm` 不存在。
- 页面 runtime 代码已接入 worker/WASM但缺少 `.js/.wasm` 产物时无法完成真实浏览器执行。
## D-006受控导入 `xyzbc.var` staging
日期2026-07-02
决策:从当前真实运行树 `/home/mes123456/linuxcnc-master/.../xyzbc.var` 导入 `xyzbc.var``wasm-port/vendor/linuxcnc/.../xyzbc.var`,并加入 `wasm-port/tools/source-manifest.txt`
理由:
- `xyzbc-trt.ini` 明确声明 `PARAMETER_FILE = xyzbc.var`
- 若不导入OPFS machine-file staging 无法覆盖完整 runtime files。
- 直接在 Web wrapper 中引用运行树绝对路径不可复现;纳入 vendor/manifest 后Node/Web staging 可重复。
## D-007native/Web JSON 对比作为验收主线
日期2026-07-02
决策:新增 native、Web、compare 三个 JSON 证据脚本,作为后续完善项目的主验收链路。
理由:
- 用户要求真实 `xyzbc-trt` 与 Web 仿真分别写入 JSON再通过比对 JSON 完善项目。
- JSON 证据比单次截图或口头结论更容易复跑、归档和定位差异。
- 当前比较报告已把差异收敛到唯一环境前置:缺 WASM artifact。
## D-008WASM artifact 缺失不伪造通过
日期2026-07-02
决策:当前 `wasm-port/build/wasm` 为空Web evidence 和 compare evidence 保持 `blocked/fail`,不伪造 WASM 执行完成。`emcc 6.0.2` 已安装后,下一步是构建 artifact而不是改写证据为通过。
理由:
- `wasm-port` 规则要求 LinuxCNC 源码语义和 WASM 边界真实可验证。
- 没有 `.js/.wasm` artifact 时,浏览器 worker runtime 无法完成真实执行。
- 保留失败项可以明确下一步是激活已安装的 Emscripten 并构建 artifact而不是继续堆叠 Web UI 假状态。
## D-009刀具路径按统一 20ms 周期采样后比较
日期2026-07-02
决策native/Web 的刀具预览路径和刀具执行路径进入 evidence JSON 前,统一按 `samplePeriodMs = 20` 重采样compare 只对同一 `sampleIndex/timeMs` 的样本做逐点比较。
理由:
- LinuxCNC 真实系统和 Web 仿真系统的内部刷新、planner、HAL/task 采样频率可能不同,直接比较原始样本会产生时间错位。
- 固定 20ms 可以覆盖人眼可见刀路和 UI 动画判断,同时让 JSON 体积可控。
- 统一 `sampleIndex/timeMs`TCP、XYZBC joint、toolAxis、feed、spindle 的误差统计可以稳定复跑。
- 如果 Web 缺少 WASM task/HAL 执行反馈不允许用预览路径冒充执行路径compare 必须显式 fail/blocker。
## D-010以全量对标追踪矩阵作为开发和验收主索引
日期2026-07-02
决策:新增 `working/07-全量对标追踪矩阵.md`,作为 Web `xyzbc-trt` 仿真界面后续开发、JSON 采集和 compare 验收的主索引。
理由:
- `doc/xyzbc-trt-runtime-files.md` 覆盖的范围超过单个 INI/staging 检查,还包括 AXIS、PyVCP、POSTGUI HAL、basic_sim、Vismach、kinematics HAL pins、Ngcgui、演示程序和加载顺序。
- 若没有追踪矩阵,后续容易只完成页面可见部分,而漏掉 HAL/task/kinematics/tool-offset 等运行语义。
- 追踪矩阵把每个 LinuxCNC 功能点映射到 Web 对标目标和 evidence 字段,便于自动化 compare 脚本逐步落地。
## D-011native 真实执行基线切换到 `/home/mes123456/cnc_wams/linuxcnc`
日期2026-07-02
决策:后续 Web 界面和逻辑设计以 `/home/mes123456/cnc_wams/linuxcnc` 编译后执行 `xyzbc-trt` 的真实行为为 native 基线;`/home/mes123456/linuxcnc-master` 只保留为历史运行参考。
理由:
- 用户明确要求以已编译成功并能执行 `xyzbc-trt``/home/mes123456/cnc_wams/linuxcnc` 为对标依据。
- `/home/mes123456/cnc_wams/linuxcnc` 是干净 Git 源码仓库,便于把 native 行为、Web WASM 构建和后续代码追踪关联到同一源码树。
- 该路径已完成 run-in-place 编译,`scripts/rip-environment``bin/axis``bin/xyzbc-trt-gui``rtlib/xyzbc-trt-kins.so` 已生成;因此后续第一步是用该路径重新生成 native evidence。

View File

@@ -0,0 +1,117 @@
# 07-全量对标追踪矩阵
本文件把 `doc/xyzbc-trt-runtime-files.md` 中记录的 LinuxCNC `xyzbc-trt` 真实运行功能,逐项映射到 Web 数控系统仿真界面的目标、证据和缺口。
原则:
- Web 实现必须完全对标 `xyzbc-trt-runtime-files.md` 的运行语义。
- LinuxCNC 源码、INI、HAL、remap、tool table、parameter file 和 kinematics 是语义真源。
- AXIS、PyVCP、Vismach 这类桌面 UI 组件在 Web 中做同语义等效实现。
- 每项对标最终都要进入 native/Web evidence JSON 和 compare JSON不能只停留在 UI 文案。
- 后续 native 真实执行基线统一采用 `/home/mes123456/cnc_wams/linuxcnc``/home/mes123456/linuxcnc-master` 只作为历史运行树参考。
## 运行入口与进程对标
| LinuxCNC 功能 | 真实配置来源 | Web 对标目标 | Evidence/验收 |
| --- | --- | --- | --- |
| `.desktop` 启动 `rip-environment linuxcnc xyzbc-trt.ini` | `/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/.../xyzbc-trt.desktop` | Web profile 一键进入 `xyzbc-trt`,自动加载同一 INI/staging 文件集 | web JSON 记录 `profile=xyzbc-trt``iniPath``startupSequence` |
| `linuxcncsvr``rtapi_app``milltask``halui` | 当前进程清单 | Web runtime 用 worker/WASM/task-HAL 表示 server/task/halui 边界 | compare 检查 `runtimeComponents` 包含 `interp``tp``taskHal``haluiEquivalent` |
| AXIS 主界面进程 | `bin/axis -ini xyzbc-trt.ini` | Web 首屏直接进入 CNC 操作界面,不做营销页 | 浏览器 smoke 检查坐标、程序、switchkins、3D canvas 均可见 |
| Vismach 进程 | `loadusr -W xyzbc-trt-gui` | Web 3D 机床模型按 HAL pin 驱动 | evidence 记录 Vismach pin 等效映射 |
## INI 与显示配置对标
| INI 字段 | LinuxCNC 行为 | Web 对标目标 | 状态 |
| --- | --- | --- | --- |
| `[EMC] MACHINE = sim-xyzbc-trt-kins (switchkins)` | AXIS 标题/机器名 | 页面机器名、JSON machine name 一致 | 待验收 |
| `[DISPLAY] DISPLAY = axis` | 启动 AXIS | Web 实现 AXIS 等效操作面板 | 待全量验收 |
| `[DISPLAY] GEOMETRY = XYZB` | AXIS 几何显示 | Web 坐标/预览按 XYZB 几何显示C 轴仍参与机床/路径 | 待补充 |
| `[DISPLAY] JOG_AXES = XYZC` | 手动 jog 轴集合 | Web jog 控制至少覆盖 X/Y/Z/C并显示 B/C 状态 | 待补充 |
| `[DISPLAY] POSITION_OFFSET = RELATIVE` | 坐标偏置显示 | Web 默认显示相对坐标并可记录 work offset | 待补充 |
| `[DISPLAY] POSITION_FEEDBACK = ACTUAL` | 显示实际反馈位置 | Web 坐标读数来自 task/HAL actual feedback不只显示 commanded | 待 task-HAL |
| `[DISPLAY] MAX_FEED_OVERRIDE = 2` | 进给倍率最大 200% | Web feed override 控件范围 0-200% | 待补充 UI 验收 |
| `[DISPLAY] MAX_LINEAR_VELOCITY = 1000` | AXIS UI 限速 | Web UI 限速显示/约束一致 | 待补充 |
| `[DISPLAY] MAX_ANGULAR_VELOCITY = 360` | 角轴限速 | Web 角轴 jog/显示限速一致 | 待补充 |
| `[DISPLAY] PROGRAM_PREFIX = ../../nc_files` | 打开程序默认目录 | Web 程序文件浏览/staging 根目录记录等效路径 | 待补充 |
| `[DISPLAY] TOOL_EDITOR = tooledit z diam` | 工具编辑字段 | Web tool editor 至少支持 Z 和 diameter | 待补充 |
| `TKPKG/NGCGUI_*` | AXIS Ngcgui 面板加载子程序 | Web 需 stage 并提供子程序参数化调用入口或等效验证 | 待实现 |
## 文件 staging 对标
| 文件 | 作用 | Web 对标目标 | 当前要求 |
| --- | --- | --- | --- |
| `xyzbc-trt.ini` | 主配置 | OPFS/wasm runtime 必须使用同源 INI | 已有 staging需全量字段校验 |
| `xyzbc-trt.xml` | PyVCP switchkins 面板 | Web switchkins 面板由 XML/schema 驱动 | 已有,需 pin 连接证据 |
| `switchkins_postgui.hal` | PyVCP 到 halui MDI 的连接 | Web 需记录 `pyvcp.* -> halui.mdi-command-*` | 待 compare 检查 |
| `basic_sim.tcl` | 基础仿真 HAL | Web task/HAL runtime 等效模拟 joint/home/spindle/toolchange | 待 task-HAL 验收 |
| `xyzbc-trt_cmds.hal` | 运行后生成 HAL | Web evidence 需记录等效展开 HAL nets | 待实现 |
| `xyzbc-trt-gui.py` | Vismach 模型 | Web 3D pin/模型层级对标 | 待模型验收 |
| `axis.py` | AXIS 主界面行为 | Web 操作面板对标 AXIS 关键行为 | 待 UI 验收 |
| `xyzbc-trt-kins.c` | 运动学真源 | WASM kinematics 使用 source-derived artifact | 待构建 artifact |
| `xyzbc-trt.tbl` | 工具表 | Web tool DB 读取 T/P/Z/D | 已有 staging需 UI/tool-offset 验收 |
| `xyzbc.var` | 参数文件 | OPFS 保存/恢复参数 | 已有 staging需运行后变更验证 |
## HAL 与 switchkins 对标
| LinuxCNC HAL 语义 | Web 对标目标 | Evidence/验收 |
| --- | --- | --- |
| `motion.analog-out-03 => motion.switchkins-type` | Web remap/MDI 写入 switchkins type并暴露当前类型 | native/Web JSON 对比 switchkins transitions |
| `halui.mdi-command-00 = M429` | Web `IDENTITY` 按钮执行 M429 | 按钮事件、MDI 命令、switchkins type 都写入 evidence |
| `halui.mdi-command-01 = M428` | Web `TCP:XYZBC` 按钮执行 M428 | 同上 |
| `halui.mdi-command-02 = M430` | Web `userk` 按钮执行 M430 | 同上 |
| `kinstype.is-0/1/2 -> pyvcp.multilabel` | Web multilabel 显示当前 kinematics | UI state 与 HAL state 一致 |
| `pyvcp.vismach-clear -> vismach.plotclear` | Web clear 按钮清除 3D 轨迹/preview buffer | evidence 记录 clear 前后 path count |
| `joint.N.pos-fb -> xyzbc-trt-gui.*` | Web 3D 模型从 actual joint feedback 驱动 | path/execution JSON 记录 feedback 来源 |
| `motion.tooloffset.z -> xyzbc-trt-kins.tool-offset -> gui.tool-offset` | 工具长度同时影响 kinematics 和模型显示 | tool table、tool offset、TCP/toolAxis 误差检查 |
## 运动学与机床模型对标
| 项目 | LinuxCNC 来源 | Web 对标目标 |
| --- | --- | --- |
| `KINEMATICS = xyzbc-trt-kins sparm=identityfirst` | INI/KINS | 默认 switchkins type 0 为 identityM428 后为 XYZBC TCP |
| `JOINTS = 5` | INI/KINS | Web runtime 固定 XYZBC 五关节 |
| `x-offset = -20` | HALCMD sets | Web kinematics pin 默认值一致 |
| `z-offset = -15` | HALCMD sets | Web kinematics pin 默认值一致 |
| `x/y/z-rot-point = 0` | HALCMD setp | Web kinematics pin 默认值一致 |
| `conventional-directions = 0` | HALCMD setp | Web kinematics pin 默认值一致 |
| `table-x/saddle-y/spindle-z/tilt-b/rotate-c` | Vismach pins | Web 模型层级按这些反馈驱动 |
| `tool-offset/x-offset/z-offset` | Vismach/kines pins | Web 刀具和模型偏置一致 |
## G-code、remap 与子程序对标
| 文件/命令 | LinuxCNC 行为 | Web 对标目标 |
| --- | --- | --- |
| `M429` | kinstype=0Identity | Web MDI/remap 执行后 switchkins type 为 0 |
| `M428` | kinstype=1XYZBC/TCP | Web MDI/remap 执行后 switchkins type 为 1 |
| `M430` | kinstype=2USERK | Web MDI/remap 执行后 switchkins type 为 2 |
| `xyzbc_switchkins.ngc` | 默认打开并调用子程序 | Web 默认程序一致 |
| `xyzbc_switchkins_sub.ngc` | 四象限 switchkins/TCP 演示 | Web 必须 stage 并可执行 |
| `centering.ngc` | Ngcgui 子程序 | Web 必须 stage后续实现参数入口 |
| `helix_bc.ngc` | B/C helix 五轴轨迹 | Web 必须 stage 并进入路径对比 |
| `boat-xyzbc.ngc` | 额外演示程序 | Web 必须 stage 并可作为验收程序 |
## JSON 证据对标
native evidence、Web evidence、compare evidence 必须覆盖:
- `startupSequence`:启动/初始化顺序和等效组件。
- `iniDisplay`DISPLAY/TRAJ/KINS/TASK/EMCMOT/EMCIO 关键字段。
- `stagedFiles`:所有对标文件,包括 remap 子程序和 demo 程序全集。
- `halNets`switchkins、PyVCP、Vismach、tool-offset、joint feedback 连接。
- `kinematicsPins`offset、rot-point、conventional-directions、tool-offset。
- `axisJointLimits`X/Y/Z/B/C 和 JOINT_0..4 限制、单位、速度/加速度。
- `switchkinsTransitions`M429/M428/M430 的命令、HAL pin 和状态变化。
- `toolTable`T/P/Z/D 解析和当前工具偏置。
- `previewPath`刀具预览路径20ms 统一采样。
- `executionPath`刀具执行路径20ms 统一采样。
- `pathComparison`native/Web 预览与执行路径误差统计。
- `uiEquivalence`AXIS/PyVCP/Vismach 在 Web 中的等效控件和状态。
## 当前主要缺口
1. WASM artifact 尚未构建,`wasm-port/build/wasm` 缺少 kinematics/core/tp/task-hal `.js/.wasm`
2. Web evidence 还未记录完整 `startupSequence``halNets``kinematicsPins``axisJointLimits`
3. Web UI 还需按 AXIS 等效面板补齐 jog、override、tool editor、Ngcgui 子程序入口。
4. Vismach 等效模型还需按 `xyzbc-trt-gui.py` 的 pin 和模型层级做验收。
5. 刀具预览路径和执行路径 JSON 采集尚未实现。
6. `boat-xyzbc.ngc` 和 Ngcgui 子程序的 Web 可执行验收尚未完成。

View File

@@ -0,0 +1,369 @@
# 08-xyzbc-trt 界面与图标分析
## 目标
本文面向后续 Web 数控系统界面开发,集中整理 `xyzbc-trt` 相关的界面组成、交互入口和图标资产。分析依据来自:
- LinuxCNC `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini`
- LinuxCNC `xyzbc-trt.xml` PyVCP 面板与 `switchkins_postgui.hal`
- LinuxCNC `xyzbc-trt-gui.py` Vismach 三维机床模型
- Web 项目 `app/src/ui/gmoccapy-shell.js`
- Web 项目 `app/src/profiles/xyzbc-trt.js`
- Web 图标清单 `app/src/ui-reference/gmoccapy-button-icons.json`
- Web 图标注册表 `app/src/ui/gmoccapy-icon-registry.js`
## xyzbc-trt 机床界面基线
| 项 | 内容 |
| --- | --- |
| 机床配置 | `sim-xyzbc-trt-kins (switchkins)` |
| 坐标/轴 | `XYZBC`5 轴/5 joints |
| 主界面来源 | LinuxCNC AXIS |
| 右侧扩展面板 | PyVCP `SWITCHKINS` |
| 三维机床 | Vismach `xyzbc-trt-gui` |
| 默认程序 | `demos/xyzbc_switchkins.ngc` |
| 工具表 | `xyzbc-trt.tbl` |
| 参数文件 | `xyzbc.var` |
| 运动学 | `xyzbc-trt-kins sparm=identityfirst` |
| 切换模式 | `M429` identity、`M428` XYZBC TCP、`M430` USERK |
## 必须覆盖的界面
### 1. 主工作台 Shell
Web 首屏应直接是可操作 CNC 仿真界面,不做营销页。当前 `gmoccapy-shell` 已拆出以下区域:
| 区域 | Web region | 必备内容 | 关键状态 |
| --- | --- | --- | --- |
| 标题/会话栏 | `titlebar` | 项目名、profile 选择、会话名、来源、当前行、运行状态 | `machineProfile``sessionName``sourceMode``machine.mode` |
| 五轴预览 | `preview` | 3D/Canvas 机床、刀路、TCP、刀轴、当前程序、工具摘要、RTCP 状态 | `preview``toolPreview``toolAxisVector``rtcpState` |
| DRO 坐标 | `dro` | X/Y/Z/A/B/C、G54/Abs、DTG、TCP、tool-axis、RTCP 状态 | `dro``toolAxisVector` |
| G-code/MDI | `gcode` | 程序行、当前行、高亮、执行状态、LinuxCNC source 选择、staging、MDI 输入、MDI 历史 | `programLines``activeLine``machineFileStaging``mdiHistory` |
| 右侧状态栏 | `status-sidebar` | 急停、上电、复位、AUTO、MANUAL、JOG、MDI、IDENTITY、TCP | task gate、mode、estop、power、switchkins |
| 信息/诊断页 | `info-tabs` | Tool info、G-code properties、gmoccapy diagnostics、LinuxCNC parity、Task/HAL、HAL pins | runtime readiness、source map、HAL/model 状态 |
| Override | `override` | Rapid override、Feed override、ignore limits、optional block、optional stop | `feed``gmoccapyGui` |
| 主轴/冷却 | `spindle-coolant` | Flood、Mist、主轴 FWD/STOP/REV、RPM、spindle override | `coolant``spindle` |
| 底部控制栏 | `bottom-controls` | Open、Reload、Run、Stop、Pause/Resume、Step、Home、Tool、Touch、MDI、Full、Save/Restore、Audit | command gates、session、program run |
### 2. AXIS 等效页面
LinuxCNC 原生 `xyzbc-trt` 使用 AXIS因此 Web 需要覆盖这些 AXIS 语义:
| 原生 AXIS 区域 | Web 等效模块 | 开发要点 |
| --- | --- | --- |
| 菜单/工具栏 | 底部控制栏 + 文件/编辑/工具页入口 | 文件打开、重载、运行、暂停、停止、单步、从行运行、编辑 |
| 程序文本区 | G-code panel | 当前行高亮、执行进度、状态、解释器/canonical 来源 |
| 预览区 | Preview panel | 机床模型、完整预览路径、已执行路径、视角/缩放/清除 |
| 坐标显示 | DRO panel | XYZBC、DTG、G54/Abs、TCP、tool-axis |
| MDI | MDI panel | 输入框、执行按钮、历史/快捷命令、M428/M429/M430 |
| 状态栏 | Sidebar + titlebar | ESTOP、POWER、MODE、RUN、PAUSE、HOMED、INTERP/TASK |
| Override | Override panel | Feed/Rapid/Spindle override、可选段跳过、可选停止 |
### 3. PyVCP SWITCHKINS 面板
原生 `xyzbc-trt.xml` 提供一个必须在 Web 中等效实现的 PyVCP 面板:
| 控件 | 文本 | HAL pin/net | LinuxCNC 动作 | Web 动作 |
| --- | --- | --- | --- | --- |
| `kinstype-legends` | `0:IDENTITY` / `1: XYZBC` / `2: USERK` | `kinstype.is-0/1/2 -> pyvcp.multilabel.0.legend*` | 显示当前 kinematics 类型 | 高亮当前 switchkins 类型 |
| `type0-button` | `IDENTITY` | `pyvcp.type0-button -> halui.mdi-command-00` | `M429` | `SET_KINS_TYPE identity` |
| `type1-button` | `TCP:XYZBC` | `pyvcp.type1-button -> halui.mdi-command-01` | `M428` | `SET_KINS_TYPE tcp-xyzbc` |
| `type2-button` | `userk` | `pyvcp.type2-button -> halui.mdi-command-02` | `M430` | USERK 占位/受 gate 控制 |
| `vismach-clear` | `vismach-clear` | `pyvcp.vismach-clear -> vismach.plotclear` | 清除 Vismach 轨迹 | `CLEAR_PREVIEW` |
### 4. Vismach 等效三维机床界面
Web 五轴场景必须按 `xyzbc-trt-gui.py` 的 HAL 语义驱动,不应只画静态模型。
| Vismach/HAL 信号 | 来源 | 目标 | Web 展示 |
| --- | --- | --- | --- |
| `table-x` | `joint.0.pos-fb` | `xyzbc-trt-gui.table-x` | 工作台 X 平移 |
| `saddle-y` | `joint.1.pos-fb` | `xyzbc-trt-gui.saddle-y` | 鞍座 Y 平移 |
| `spindle-z` | `joint.2.pos-fb` | `xyzbc-trt-gui.spindle-z` | 主轴 Z 平移 |
| `tilt-b` | `joint.3.pos-fb` | `xyzbc-trt-gui.tilt-b` | B 倾斜轴 |
| `rotate-c` | `joint.4.pos-fb` | `xyzbc-trt-gui.rotate-c` | C 回转轴 |
| `tool-offset` | `motion.tooloffset.z` / `xyzbc-trt-kins.tool-offset` | GUI + kins | 刀长/刀具 TCP 偏置 |
| `x-offset` | `xyzbc-trt-kins.x-offset` | GUI | TRT 几何 X 偏置,默认 `-20` |
| `z-offset` | `xyzbc-trt-kins.z-offset` | GUI | TRT 几何 Z 偏置,默认 `-15` |
### 5. 文件/程序页面
| 页面/状态 | 必备能力 | 关联图标 |
| --- | --- | --- |
| 程序加载 | 打开本地 `.ngc/.nc/.tap/.gcode/.txt`,选择 LinuxCNC staged source | `open_file``select_file` |
| 文件浏览 | 上级目录、Home、Jump to、刷新、上一项/下一项、选择、返回 | `chevron_up``home_folder``user_defined_folder``refresh``chevron_left/right``back_to_app` |
| 程序运行 | Run、Stop、Pause、Step、Run from line、Reload、Optional block | `play``stop``pause``pause_active``step``run_from_line``refresh``skip_optional_*` |
| 编辑 | 编辑、保存、另存、新建、撤销、重做、注释、搜索、分屏预览 | `edit_code``save``save_as``new_document``edit_undo``edit_redo``comment``split_view` |
### 6. 手动/JOG/回零/对刀页面
| 页面 | 必备控件 | xyzbc-trt 注意点 |
| --- | --- | --- |
| 回零 | Ref all、Unref all、X/Y/Z/B/C 单轴回零、返回、分页 | XYZBC 应使用 X/Y/Z/B/CA 图标是资产存在但本机型不应作为主轴显示 |
| Touch off | X/Y/Z/B/C touch off、返回、分页、可选 block height | 同上,优先按当前 profile 轴生成 |
| Jog | 连续/增量、慢速/快速、Ignore limits、轴 jog、关节 jog | 非平凡 kinematics 下 joint jog 需要单独 gate |
| MDI | MDI 输入、历史命令、M428/M429/M430 快捷 | M428/M429/M430 是 switchkins 核心入口 |
### 7. 刀具/偏置/设置/诊断页面
| 页面 | 必备能力 | 说明 |
| --- | --- | --- |
| Tool page | 选择刀具、换刀、M61 Q 设置当前刀、X/Z tool touch off、ToolEdit 添加/删除/保存/刷新/计算器 | `xyzbc-trt.tbl` 是数据源 |
| Offset page | 坐标偏置计算器、编辑 offsets、set selected、zero G92 | 文字按钮为主,少量计算器图标 |
| Settings page | 声音、字体、DRO/DTG/offset 显示、键盘行为、窗口模式、run from line、unlock、tool measurement | 很多控件无图标,按表单控件实现 |
| Diagnostics | LinuxCNC parity、Task/HAL、INI、source map、HAL pins、gmoccapy comms、native/Web 对比 | 以只读诊断表格为主 |
## Web 已注册核心图标
`app/src/ui/gmoccapy-icon-registry.js` 当前直接注册的核心按钮如下,开发首屏应优先使用这些 id
| buttonId | 语义 | active 图标 | inactive/default 图标 |
| --- | --- | --- | --- |
| `tbtn_estop` | 急停/急停复位 | `main_switch_on` | `main_switch_off` |
| `tbtn_on` | 机器上电 | `power_on` | `power_off` |
| `rbt_manual` | 手动模式 | `mode_manual_active` | `mode_manual_inactive` |
| `rbt_mdi` | MDI 模式 | `mode_mdi_active` | `mode_mdi_inactive` |
| `rbt_auto` | Auto 模式 | `mode_auto_active` | `mode_auto_inactive` |
| `tbtn_setup` | 设置页 | `mode_settings_active` | `mode_settings_inactive` |
| `tbtn_user_tabs` | 用户/Jog 页 | `mode_user_tabs_active` | `mode_user_tabs_inactive` |
| `btn_load` | 打开程序 | - | `open_file` |
| `btn_reload` | 重载 | - | `refresh` |
| `btn_run` | 运行 | - | `play` |
| `btn_stop` | 停止 | - | `stop` |
| `tbtn_pause` | 暂停 | `pause_active` | `pause` |
| `btn_step` | 单步 | - | `step` |
| `btn_homing` | 回零菜单 | - | `ref_all` |
| `btn_tool` | 刀具页 | - | `hsk_mill_tool` |
| `btn_touch` | 对刀/坐标设定 | - | `touch_off` |
| `ref_all` | 全部回零 | - | `ref_all` |
| `btn_fullscreen` | 全屏预览 | `fullscreen_close` | `fullscreen_open` |
| `rbt_forward` | 主轴正转 | `spindle_right_on` | `spindle_right` |
| `rbt_reverse` | 主轴反转 | `spindle_left_on` | `spindle_left` |
| `rbt_stop` | 主轴停止 | `spindle_stop_on` | `spindle_stop` |
| `tbtn_flood` | Flood 冷却 | `coolant_flood_active` | `coolant_flood_inactive` |
| `tbtn_mist` | Mist 冷却 | `coolant_mist_active` | `coolant_mist_inactive` |
| `btn_zoom_in` | 放大 | - | `zoom_in` |
| `btn_zoom_out` | 缩小 | - | `zoom_out` |
| `rbt_view_x` | X 视角 | - | `tool_axis_x` |
| `rbt_view_y` | Y 视角 | - | `tool_axis_y` |
| `rbt_view_z` | Z 视角 | - | `tool_axis_z` |
| `rbt_view_p` | 透视/Fit | - | `tool_axis_p` |
| `tbtn_view_tool_path` | 刀路显示/清除 | - | `toolpath` |
| `tbtn_view_dimension` | 尺寸显示 | - | `dimensions` |
| `btn_exit` | 退出 | - | `logout` |
| `btn_save_session` | 保存会话 | - | `save` |
## 图标分类总览
原始 gmoccapy 图标清单包含 `211` 行记录,当前复制到项目资产中的图标文件为 `112` 个。按界面类别统计如下:
| 类别 | 行数 | 按钮数 | 主要按钮 |
| --- | ---: | ---: | --- |
| 右侧主状态栏 | 14 | 7 | `rbt_auto``rbt_manual``rbt_mdi``tbtn_estop``tbtn_on``tbtn_setup``tbtn_user_tabs` |
| 底部主按钮栏 | 7 | 6 | `btn_exit``btn_homing``btn_tool``btn_touch``tbtn_fullsize_preview0``tbtn_switch_mode` |
| Auto 程序运行栏 | 13 | 10 | `btn_edit``btn_from_line``btn_load``btn_reload``btn_run``btn_step``btn_stop``tbtn_pause` |
| MDI/宏按钮栏 | 11 | 9 | `calculator``keyboard``macro_0..4``next_button``previous_button` |
| 回零按钮栏 | 10 | 10 | `home_axis_x/y/z/a/b``ref_all``unref_all`、分页、返回 |
| 对刀/坐标设定按钮栏 | 9 | 9 | `touch_x/y/z/a/b`、分页、返回、`block_height` |
| 手动/Jog 面板 | 4 | 2 | `chk_ignore_limits``tbtn_turtle_jog` |
| Jog 增量选择栏 | 6 | 6 | `rbt_0..5` |
| Jog 轴按钮 | 10 | 10 | `x+/x-``y+/y-``z+/z-``a+/a-``b+/b-` |
| Jog 关节按钮 | 10 | 10 | `0+/0-``4+/4-` |
| 冷却/主轴控制 | 11 | 5 | `rbt_forward``rbt_reverse``rbt_stop``tbtn_flood``tbtn_mist` |
| 预览/视图 | 10 | 10 | 缩放、视角、尺寸、刀路、清除 |
| 编辑器搜索/编辑 | 8 | 8 | 注释、撤销、重做、搜索、替换 |
| 编辑页底部栏 | 9 | 8 | 返回、计算器、键盘、新建、重载、保存、另存、分屏 |
| 刀具页底部栏 | 6 | 6 | 返回、换刀、设置当前刀、按编号选择、X/Z tool touch off |
| 文件选择栏 | 9 | 9 | 返回、上级、home、jump、刷新、上一项、下一项、选择、排序 |
| 内嵌 ToolEdit 控件 | 5 | 5 | 添加、保存、计算器、删除、刷新 |
| 内嵌 OffsetPage 控件 | 4 | 4 | 计算器、编辑、设置选中、Zero G92 |
| 设置页控件 | 42 | 42 | 声音、字体、DRO、DTG、offset、键盘、窗口、unlock、tool measurement |
| Glade 静态按钮 | 13 | 13 | HAL meter/scope/show、status、calibration、classicladder 等 |
## 已复制图标文件清单
图标根目录:
```text
web-rtcp-5axis-xyzbc-trt-sim-plan/app/src/assets/gmoccapy-icons
```
### 状态/模式/电源
- `img_emergency__main_switch_on__48.png`
- `img_emergency_off__main_switch_off__48.png`
- `img_machine_on__power_on__48.png`
- `img_machine_off__power_off__48.png`
- `img_auto_on__mode_auto_active__48.png`
- `img_auto__mode_auto_inactive__48.png`
- `img_manual_on__mode_manual_active__48.png`
- `img_manual__mode_manual_inactive__48.png`
- `img_mdi_on__mode_mdi_active__48.png`
- `img_mdi__mode_mdi_inactive__48.png`
- `img_settings_on__mode_settings_active__48.png`
- `img_settings__mode_settings_inactive__48.png`
- `img_user_tabs_on__mode_user_tabs_active__48.png`
- `img_user_tabs__mode_user_tabs_inactive__48.png`
### 程序运行/编辑/文件
- `img_open__open_file__32.svg`
- `img_reload1__refresh__32.png`
- `img_run__play__32.png`
- `img_stop__stop__32.png`
- `img_pause__pause__32.png`
- `img_pause_active__pause_active__32.png`
- `img_step__step__32.png`
- `img_run_from__run_from_line__48.png`
- `img_skip_optional_active__skip_optional_active__32.png`
- `img_skip_optional_inactive__skip_optional_inactive__32.png`
- `img_editor__edit_code__32.png`
- `img_edit-undo__edit_undo__32.png`
- `img_edit-redo__edit_redo__32.png`
- `img_edit_comment__comment__32.png`
- `img_edit_menu_new__new_document__32.svg`
- `img_edit_menu_reload__refresh__32.png`
- `img_edit_menu_save__save__32.png`
- `img_edit_menu_save_as__save_as__32.png`
- `img_edit_menu_close__back_to_app__48.svg`
- `img_edit_menu_calculator__calculator_open__32.png`
- `img_edit_menu_keyboard__keyboard__32.png`
- `img_edit_menu_keyboard_hide__keyboard_hide__32.png`
- `img_split_view__split_view__32.png`
### 预览/视角/刀路
- `img_zoom_in__zoom_in__24.png`
- `img_zoom_out__zoom_out__24.png`
- `img_view_x__tool_axis_x__24.png`
- `img_view_y__tool_axis_y__24.png`
- `img_view_y2__tool_axis_y_inv__24.png`
- `img_view_z__tool_axis_z__24.png`
- `img_view_p__tool_axis_p__24.png`
- `img_tool_path__toolpath__24.png`
- `img_dimensions__dimensions__24.png`
- `img_tool_clear__clear__24.png`
- `img_fullsize_preview0_open__fullscreen_open__48.png`
- `img_fullsize_preview0_close__fullscreen_close__48.png`
- `img_fullsize_preview1_open__fullscreen_open__48.png`
- `img_fullsize_preview1_close__fullscreen_close__48.png`
### 主轴/冷却
- `img_spindle_forward__spindle_right__48.png`
- `img_spindle_forward_on__spindle_right_on__48.png`
- `img_spindle_reverse__spindle_left__48.png`
- `img_spindle_reverse_on__spindle_left_on__48.png`
- `img_spindle_stop__spindle_stop__48.png`
- `img_spindle_stop_on__spindle_stop_on__48.png`
- `img_coolant_on__coolant_flood_active__48.png`
- `img_coolant_off__coolant_flood_inactive__48.png`
- `img_mist_on__coolant_mist_active__48.png`
- `img_mist_off__coolant_mist_inactive__48.png`
### 回零/对刀/Jog
- `img_ref_all__ref_all__48.png`
- `img_ref_menu__ref_all__48.png`
- `img_unref_all__unref_all__48.png`
- `img_ref_x__ref_x__48.png`
- `img_ref_y__ref_y__48.png`
- `img_ref_z__ref_z__48.png`
- `img_ref_a__ref_a__48.png`
- `img_ref_b__ref_b__48.png`
- `img_ref_menu_close__back_to_app__48.svg`
- `img_ref_paginate_next__chevron_right__32.svg`
- `img_ref_paginate_prev__chevron_left__32.svg`
- `img_touch_off__touch_off__48.png`
- `img_touch_x__touch_x__48.png`
- `img_touch_y__touch_y__48.png`
- `img_touch_z__touch_z__48.png`
- `img_touch_a__touch_a__48.png`
- `img_touch_b__touch_b__48.png`
- `img_touch_menu_close__back_to_app__48.svg`
- `img_touch_paginate_next__chevron_right__32.svg`
- `img_touch_paginate_prev__chevron_left__32.svg`
- `img_continuous__jog_continuous__24.png`
- `img_turtle_jog__jog_speed_slow__32.png`
- `img_rabbit_jog__jog_speed_fast__32.png`
### 文件浏览/导航
- `img_back_file_load__back_to_app__48.svg`
- `img_back_tool__back_to_app__48.svg`
- `img_close__logout__48.png`
- `img_dir_up__chevron_up__32.svg`
- `img_home__home_folder__32.svg`
- `img_jump_to__user_defined_folder__32.svg`
- `img_refresh_dir__refresh__32.png`
- `img_sel_next__chevron_right__32.svg`
- `img_sel_prev__chevron_left__32.svg`
- `img_select__select_file__32.png`
- `img_up__chevron_up__24.svg`
- `img_down__chevron_down__24.svg`
### 刀具/ToolEdit/Offset
- `img_tools__hsk_mill_tool__48.png`
- `img_toolchange__mill_tool_change__48.png`
- `img_index_tool__mill_tool_set_num__48.svg`
- `img_tool_by_no__mill_tool_change_num__48.svg`
- `img_tool_add__add__32.png`
- `img_tool_save__save__32.png`
- `img_tool_calculator__calculator_open__32.png`
- `img_tool_delete__delete__32.png`
- `img_tool_reload__refresh__32.png`
- `img_offset_calculator__calculator_open__32.png`
### MDI/宏/键盘
- `img_macro_menu_calculator__calculator_open__32.png`
- `img_macro_menu_keyboard__keyboard__32.png`
- `img_macro_menu_keyboard_hide__keyboard_hide__32.png`
- `img_macro_menu_stop__stop__32.png`
- `macro_0__macro_image.png`
- `macro_4__macro_image.png`
## xyzbc-trt 专用界面规则
1. 轴显示以 `XYZBC` 为准。A 轴相关图标可保留为通用资产,但 `xyzbc-trt` 主界面、回零、Touch Off、DRO、Jog 应显示 X/Y/Z/B/C。
2. `TCP:XYZBC` 是核心按钮,不应写成 `TCP:XYZAC`。对应 MDI 命令为 `M428`
3. `IDENTITY` 对应 `M429`,在 `identityfirst` 配置中 switchkins type `0` 是 identity。
4. `USERK` 对应 `M430`,若 Web runtime 暂未实现完整 USERK应保留按钮但通过 gate/提示标明状态。
5. `vismach-clear` 必须清除 Web 机床/刀路预览,不应只清除文本状态。
6. B/C 角轴限制、joint 限制和 TCP/toolAxis 计算必须来自 profile/INI/kinematics runtime不应从 UI 字符串推断。
7. 诊断页面要明确区分“图标/界面参考已具备”和“WASM artifact/runtime 已具备”,避免把 UI 对标误判为运动语义完成。
## 开发组件拆分建议
| 组件 | 输入状态 | 输出动作 |
| --- | --- | --- |
| `MachineTitlebar` | profile、session、source、mode、activeLine | `select-profile` |
| `FiveAxisPreview` | path samples、joint pose、tcp、toolAxis、toolPreview、selectedView | view/zoom/fit/clear/fullscreen |
| `DroPanel` | XYZBC DRO、DTG、TCP、toolAxis、offset mode | 切换 DRO 显示模式 |
| `ProgramPanel` | program lines、activeLine、execution feedback、source list | open/reload/stage/select source/run MDI |
| `StatusSidebar` | task policy、estop、power、mode、switchkins | estop/power/reset/mode/kintype |
| `PyvcpSwitchkinsPanel` | kinstype active、panel schema | M429/M428/M430/clear |
| `OverridePanel` | feed/rapid/spindle override、optional block/stop | override step/reset/toggle |
| `SpindleCoolantPanel` | spindle、coolant、gates | FWD/STOP/REV/flood/mist |
| `HomingPanel` | axes、homed state | home axis/ref all/unref all |
| `TouchOffPanel` | axes、offset context | touch axis/block height |
| `JogPanel` | jog axis/joint mode、increment、limits | jog press/release、increment、ignore limits |
| `ToolPage` | tool table、selected tool、tool offsets | select/change/index/save/edit |
| `FilePage` | OPFS/project files、current dir、selected file | navigate/select/open |
| `SettingsPage` | gmoccapy settings | form updates |
| `DiagnosticsPage` | INI、HAL、Task/HAL、WASM、parity、evidence | audit/refresh |
## 最小首屏 icon 集合
如果先实现可运行首屏,必须先接入这些图标:
- 急停/上电:`tbtn_estop``tbtn_on`
- 模式:`rbt_manual``rbt_mdi``rbt_auto`
- 程序:`btn_load``btn_reload``btn_run``btn_stop``tbtn_pause``btn_step`
- Switchkins`IDENTITY``TCP:XYZBC``USERK` 可先用文字按钮,但状态要接 HAL/MDI 语义
- 预览:`rbt_view_x``rbt_view_y``rbt_view_z``rbt_view_p``btn_zoom_in``btn_zoom_out``tbtn_view_tool_path`
- 主轴/冷却:`rbt_forward``rbt_stop``rbt_reverse``tbtn_flood``tbtn_mist`
- 回零/刀具/对刀:`btn_homing``btn_tool``btn_touch`
- 会话/退出:`btn_save_session``btn_exit`

View File

@@ -0,0 +1,364 @@
<!-- 本文件由 doc/xyzbc-trt-web-cnc-simulation-design-task-and-technical-plan.docx 整合生成,用于 working 目录内继续开发和验收。 -->
> 来源 DOCX`../doc/xyzbc-trt-web-cnc-simulation-design-task-and-technical-plan.docx`
>
> 整合时间2026-07-02。本文保留 DOCX 的任务书、技术方案、程序逻辑分析和状态联锁内容,图片引用到 `../doc/assets/`。
# 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.ini | LinuxCNC 主启动入口Web 端需实现等价启动会话和配置装载流程。 |
| linuxcncsvr | NML/状态服务Web 端需提供统一运行状态中心。 |
| rtapi_app load tpmod | 运动规划模块Web 端需实现轨迹规划与采样接口。 |
| milltask | 任务解释和程序执行Web 端需实现程序状态机、运行、暂停、复位、MDI。 |
| halui | HAL UI 指令通道Web 端需复刻 PyVCP 按钮到 MDI 命令的连接。 |
| hal_manualtoolchange | 手动换刀流程Web 端需提供换刀提示和工具状态。 |
| xyzbc-trt-gui | Vismach 五轴机床模型Web 端需使用 Three.js 对标机床结构和运动。 |
| axis -ini xyzbc-trt.ini | AXIS 主界面Web 端需对标界面信息架构和操作入口。 |
![xyzbc-trt-axis-window.png](../doc/assets/xyzbc-trt-axis-window.png)
图 1真实 LinuxCNC 会话抓取的 AXIS 主界面包含预览、DRO、PyVCP SWITCHKINS 面板、程序区和状态栏。
![xyzbc-trt-desktop.png](../doc/assets/xyzbc-trt-desktop.png)
图 2桌面级运行截图用于保留真实执行环境和窗口布局证据。
2.3 HAL 状态基线
| HAL 项 | 当前值或连接 | Web 对标要求 |
| --- | --- | --- |
| motion.switchkins-type | 0由 :kinstype-select 驱动 | 实现 0:IDENTITY、1:XYZBC、2:USERK 三态切换。 |
| kinstype.is-0/1/2 | TRUE/FALSE/FALSE | 驱动 Web PyVCP multilabel 的当前模式显示。 |
| joint.0..4.pos-fb | X/Y/Z/B/C 五轴反馈均为 0 | 映射到 Web DRO、机床模型关节和路径采样。 |
| motion.tooloffset.z | 连接 :tool-offset | 影响 TCP 刀尖位置和机床模型刀具长度。 |
| xyzbc-trt-kins.x-offset | -20 | Web 运动学参数必须使用同值。 |
| xyzbc-trt-kins.z-offset | -15 | Web 运动学参数必须使用同值。 |
| xyzbc-trt-kins.conventional-directions | FALSE | Web 端旋转方向和矩阵约定必须一致。 |
## 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/02 和 vismach.plotclear。 | 实现 postgui HAL 装配层,保证 UI 控件不直接改状态,而是经 HAL 语义连接。 |
| LIB:basic_sim.tcl | 生成仿真 HAL 基础链路。 | 建立基础 HAL 信号、仿真 joint、motion、halui、pyvcp、vismach 命名空间。 |
| xyzbc-trt-kins.so | XYZBC table rotary/tilting 运动学和 switchkins。 | 实现或移植为 WASM/TypeScript 运动学模块,支持 identity、XYZBC TCP、userk。 |
| xyzbc-trt-gui | Vismach 三维机床模型,随 HAL 引脚运动。 | 使用 Three.js 建立桌台、转台、倾斜轴、主轴、刀具、工件和路径轨迹。 |
| xyzbc_switchkins.ngc | 默认打开的演示程序,调用 xyzbc_switchkins_sub。 | Web 端默认加载同一程序,预览曲线和执行曲线可导出 JSON。 |
| remap_subs/*.ngc | M428/M429/M430 以及演示子程序。 | 支持 remap 调用或预编译宏展开,保证模式切换轨迹一致。 |
| xyzbc-trt.tbl / xyzbc.var | 刀具表和 RS274 参数文件。 | Web 端加载、显示、持久化并参与 tooloffset 和程序执行。 |
![xyzbc-trt-web-architecture.png](../doc/assets/xyzbc-trt-web-architecture.png)
图 3LinuxCNC 原型系统与 Web 仿真系统的模块级对标关系。
## 4. Web 界面设计任务书
4.1 首屏布局
顶部:文件、机器、视图、帮助菜单,以及急停、上电、打开文件、运行、暂停、单步、停止、视图方向、清扫轨迹等图标按钮。
左侧Manual Control 与 MDI 标签页,包含 Joint 0 到 4 选择、连续/增量点动、Home、Touch Off、Tool Touch Off、主轴控制和倍率滑块。
中间Preview/DRO/程序标签页,预览页显示 Three.js 五轴机床、工件、刀具、坐标轴、尺寸标注和刀具路径。
右侧SWITCHKINS 面板,显示 0:IDENTITY、1:XYZBC、2:USERK并提供 IDENTITY、TCP:XYZBC、userk、vismach-clear 按钮。
底部G-code 程序区、Active G-Codes、状态栏、错误和日志输出。
4.2 视觉和交互要求
| 界面区域 | 对标要求 | 验收证据 |
| --- | --- | --- |
| AXIS 工具栏 | 保留关键数控操作入口,按钮使用明确图标和 tooltip。 | 截图比对,操作事件 JSON。 |
| DRO | 显示 X/Y/Z/B/C、joint 或 world 坐标、实际/命令位置。 | uiState.dro 与 LinuxCNC status 对比。 |
| PyVCP | 按钮和 multilabel 文案、状态、HAL 连线语义一致。 | halPins.kinstype 和 uiState.pyvcp。 |
| Preview | 显示默认程序的圆形/螺旋路径、刀尖、刀轴、XYZBC 坐标。 | previewPath.samples 和截图。 |
| Vismach 等价模型 | 五轴结构、B/C 旋转、X/Y/Z 平移、tooloffset、x/z offset 生效。 | 模型姿态 JSON 和截图。 |
## 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输出关节、世界坐标、刀尖和刀轴。 |
| 界面层 | Web UI 组件 | 对标 AXIS、PyVCP、DRO、MDI、程序窗口、状态栏。 |
| 三维层 | Three.js | 五轴机床、工件、刀具、路径、坐标系、清轨迹和相机视图。 |
| 证据层 | Evidence JSON + Compare report | 采集真实系统和 Web 系统,按同周期逐点比对。 |
5.2 switchkins 逻辑
Web 端必须复刻原型中的 switchkins 控制链路PyVCP 按钮触发 halui.mdi-command-00/01/02MDI 执行 M429/M428/M430remap 子程序改变 motion.analog-out-03再驱动 motion.switchkins-type。UI 当前模式由 kinstype.is-0/1/2 反向驱动,而不是由按钮直接写 UI 标签。
| 按钮 | HAL 目标 | MDI 命令 | 目标模式 |
| --- | --- | --- | --- |
| IDENTITY | halui.mdi-command-00 | M429 | 0:IDENTITY |
| TCP:XYZBC | halui.mdi-command-01 | M428 | 1:XYZBC |
| userk | halui.mdi-command-02 | M430 | 2:USERK |
| vismach-clear | vismach.plotclear | 无 | 清除三维路径显示 |
5.3 五轴运动学和模型
Web 端机床模型采用 XYZBC table rotary/tilting 结构。X 对应 table-xY 对应 saddle-yZ 对应 spindle-zB 对应 tilt-bC 对应 rotate-c。运动学参数使用原型系统当前 HAL 值x-offset=-20、z-offset=-15、旋转点均为 0、conventional-directions=false。刀具长度来自 motion.tooloffset.z。
三维模型不只显示程序预览曲线,还必须在执行时按采样点刷新桌台、转台、主轴和刀具姿态。执行暂停、复位、清轨迹、模式切换后,模型状态和 JSON 状态必须同步。
5.4 路径采样和 JSON 比对
曲线采样周期固定为 samplePeriodMs = 20即 50 Hz。LinuxCNC 真实系统和 Web 仿真系统必须使用相同采样周期、相同 sampleIndex、相同时间基准和相同坐标字段禁止一端 10 ms、另一端 20 ms 或使用不同插补点。
![xyzbc-trt-json-compare-flow.png](../doc/assets/xyzbc-trt-json-compare-flow.png)
图 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 系统采样点数量。 |
| maxPositionError | X/Y/Z/B/C 最大逐点误差。 |
| rmsPositionError | 路径整体均方根误差。 |
| maxToolTipError | TCP 刀尖位置最大误差。 |
| maxToolAxisErrorDeg | 刀轴方向最大角度误差。 |
| firstMismatch | 首个超差点的 sampleIndex、line、timeMs、native/web 值。 |
| uiEquivalence | AXIS/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.json、web-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=20JSON 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.xml | PyVCP SWITCHKINS 面板。 |
| switchkins_postgui.hal | PyVCP 与 HALUI、Vismach 清轨迹连接。 |
| demos/xyzbc_switchkins.ngc | 默认加载的演示程序。 |
| remap_subs/428remap.ngc、429remap.ngc、430remap.ngc | switchkins 模式切换 remap。 |
| xyzbc-trt.tbl / xyzbc.var | 刀具表和参数文件。 |
| bin/xyzbc-trt-gui | Vismach 原型模型入口。 |
| rtlib/xyzbc-trt-kins.so | 真实五轴运动学模块。 |
## 10. xyzbc-trt 程序逻辑全量分析
下面按“文件装载 - 运动学 - HAL - 界面 - 执行 - 证据”的顺序,把 xyzbc-trt 的实际逻辑拆开说明。这里不是抽象架构而是与当前源码、HAL pin 和界面行为一一对应的执行逻辑。
10.1 启动入口逻辑
| 步骤 | 逻辑 | 结果 |
| --- | --- | --- |
| 1 | rip-environment 先建立 run-in-place 环境,确保本地 bin/、lib/、rtlib/、bin/python 可被当前会话找到。 | 执行路径完全指向 /home/mes123456/cnc_wams/linuxcnc。 |
| 2 | linuxcnc xyzbc-trt.ini 读取主 INI按段装载 DISPLAY、RS274NGC、KINS、HAL、TRAJ、TASK、EMCIO。 | 界面、运动学和程序执行进入同一会话。 |
| 3 | AXIS、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.plotclear。 | Web 端的按钮必须走同样的“事件 - HAL - MDI - 状态”链路。 |
| xyzbc_switchkins.ngc | 默认加载的程序是演示切换程序,既包含路径,也包含模式切换场景。 | Web 必须默认回放同一程序并记录同一套证据字段。 |
10.3 switchkins 运动学逻辑
xyzbc-trt-kins 通过 switchkinsSetup() 绑定三个运动学分支:
- type0在当前配置里被重定义为 identity用于启动后的关节直接操控。
- type1xyzbc-trt-kins 本体,执行 XYZBC table rotary/tilting 的 TCP 运动学。
- type2用户自定义运动学 userk。
源码里明确设置了 kinsname = "xyzbc-trt-kins"、halprefix = "xyzbc-trt-kins"、required_coordinates = "xyzbc"、allow_duplicates = 1这意味着它既是一个五轴模块也是一个允许坐标字母重复映射的 switchkins 模块。identityfirst 参数把启动默认值切换成 identity而不是让机床类型本体成为 type0这正是 sim 配置的关键差异。
![xyzbc-trt-logic-map.png](../doc/assets/xyzbc-trt-logic-map.png)
图 5xyzbc-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/02 | PyVCP 按钮发出的 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-x 和 saddle-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 异常和约束逻辑
- 如果 motion.switchkins-type 没有连接,只有 type0 默认运动学可用,这属于兼容旧配置的行为。
- 如果切换到身份不匹配的运动学类型,程序逻辑必须在 G-code 中先检查 kinstype.is.N 或等价输入,再决定是否继续。
- 如果当前系统的坐标偏置、刀补、外部偏置在切换后不一致,必须先清理或重置偏置,再切换模式。
- 如果 Web 端和 LinuxCNC 真实系统的采样周期不一致,则即使图形看起来接近,也不能通过对标验收。
总的来说xyzbc-trt 的逻辑不是“一个五轴模型 + 一个预览窗口”,而是“配置驱动的状态机 + 可切换运动学 + HAL 事件 + 三维可视化 + 路径证据”的组合。Web 端要做到完全对标,必须把这五件事统一成一条链。
## 11. 开机、急停、回零与执行状态的联锁逻辑
这一节专门说明机床状态如何影响程序执行。核心不是某一个按钮,而是 ESTOP、Machine Power、Homing、Task Mode、Interp State、Paused、Auto/MDI/Manual 这些状态共同决定“能不能跑、能不能发 MDI、能不能执行程序、能不能继续暂停中的程序”。
| 状态或条件 | 含义 | 对执行的影响 |
| --- | --- | --- |
| ESTOP | 急停被触发,属于最高优先级禁止状态。 | 不能发运行/MDI/自动执行命令;必须先解除急停。 |
| Machine Power ON | 机床上电并使能轨迹规划。 | 没有上电时通常不能进入正常执行。 |
| Homed | 各关节完成回零。 | 未回零时只能做有限的点动或被配置允许的动作;运行 MDI/程序通常需要回零。 |
| Task Mode = MANUAL | 手动模式。 | 适合回零、点动、Touch Off、手动辅助动作不适合直接跑自动程序。 |
| Task Mode = MDI | 手动数据输入模式。 | 允许执行单行命令或小段命令,但仍受 ESTOP/上电/回零/解释器空闲限制。 |
| Task Mode = AUTO | 自动模式。 | 允许加载并运行 G-code 文件、单步、暂停、恢复、停止。 |
| Interp Idle | 解释器空闲。 | MDI 或启动新的自动程序前通常必须空闲。 |
| Paused | 程序暂停。 | 可以恢复、停止,某些界面允许在暂停态下做受限补位或回退。 |
LinuxCNC 的状态判断在 Python 接口里是明确的:发 MDI 前至少要满足“未急停、已上电、全部关节已回零、解释器空闲、模式是 MDI”运行程序前也要满足相应条件。AXIS 界面把这些限制做得比较“宽”,会自动切换到所需模式,但本质上仍然是同一组状态联锁。
对于本项目的 Web 仿真,这意味着:按钮是否可点、命令是否被执行、预览和执行是否允许开始,不能由前端自己臆造,而必须由一个统一状态机决定。
11.1 典型状态流转
| 阶段 | 典型动作 | 允许的下一步 |
| --- | --- | --- |
| 上电前 | ESTOP 解除前的初始化。 | 只能显示状态,不能执行加工。 |
| 解除急停 | ESTOP RESET。 | 可以请求 Machine Power ON。 |
| 上电 | Machine Power ON。 | 可以回零、可视情况进入手动或 MDI。 |
| 回零 | Home All / 单轴 Homing。 | 全部回零后,自动/MDI 执行条件才完整。 |
| 切换模式 | MANUAL / MDI / AUTO。 | 可按模式开始点动、发 MDI、或运行程序。 |
| 运行中 | AUTO RUN。 | 可 Pause、Stop、Step 或 Resume。 |
| 暂停中 | AUTO PAUSE。 | 可 Resume 或 Stop某些界面允许受限补位。 |
11.2 对 XYZBC 五轴程序的具体影响
xyzbc-trt 的默认程序 `xyzbc_switchkins.ngc` 不是单纯的路径文件,它还演示了 switchkins 切换逻辑。因此在分析程序执行时,必须考虑状态切换的前提条件:急停解除、机器上电、关节回零、模式与解释器状态匹配。尤其是 M428/M429/M430 这样的切换命令,不能在解释器忙、状态未同步或不在合适模式时随意插入。
如果机器处于 ESTOP 或未上电,那么即使 UI 看起来加载了程序,也不能真正开始执行。若未回零,某些运动限制还未生效或未完整生效;如果是 identity 运动学,则回零和点动可能与 XYZBC 模式下的坐标解释不同UI 必须明确呈现当前 kinstype。
11.3 Web 端需要实现的联锁规则
| Web 控件 | 可用条件 | 禁用时表现 |
| --- | --- | --- |
| 急停释放按钮 | 当前处于 ESTOP。 | 显示为不可执行或已触发状态。 |
| 上电按钮 | 急停已解除。 | 急停未解除时禁止上电。 |
| 回零按钮 | 机器已上电,且对应关节未回零或允许重复回零。 | 未上电时不允许回零。 |
| MDI 输入框 | 非 ESTOP、已上电、已回零、解释器空闲、模式为 MDI。 | 给出原因说明,不发送命令。 |
| 运行/自动按钮 | 非 ESTOP、已上电、已回零、文件已加载且解释器空闲。 | 程序不可启动。 |
| 暂停/继续 | 程序正在运行或已暂停。 | 非运行态时禁用。 |
| switchkins 切换按钮 | 应避免在程序执行中切换;若允许必须先同步并受限处理。 | 运行中直接切换应提示风险或禁止。 |
11.4 与证据 JSON 的关系
为了让真实 LinuxCNC 与 Web 仿真的行为可比,证据 JSON 不能只记录路径点,还要记录机床状态。至少要包含 `taskState``taskMode``interpState``paused``estop``enabled``homed``kinstype` 和按钮可用性。这样才能解释“为什么这一次能跑、那一次不能跑”。
例如:若 `estop=true`,那么 previewPath 也许还能生成,但 executionPath 必须为空或者标记为 blocked`homed` 未满足,则 manual/jog 可以存在,但 auto/mdi/run 不能开始;若 `interp_state != INTERP_IDLE`,则 MDI 不应该再进入。
11.5 对本项目的落地结论
本项目的 Web 仿真要完全对标 `xyzbc-trt`,不能只做“路径看起来一样”。必须同时复刻状态机联锁:开机、急停、回零、模式、解释器、暂停与恢复,共同决定后续执行是否允许。否则 Web 端即使曲线绘得对,也无法说明它是 LinuxCNC 真实逻辑的等价实现。

View File

@@ -0,0 +1,23 @@
# working 索引
本目录记录 `xyzbc-trt` Web 数控系统仿真推进资料,用于按任务矩阵继续开发和验收。
文件:
- `01-项目功能内容.md`目标功能、LinuxCNC 对标点、WASM/OPFS 满足度。
- `02-项目程序开发详细步骤.md`:从源码对标到 Web 实现、构建、验证的步骤。
- `03-推进台账.md`:每轮做了什么、改了哪些文件、验证了什么、下一步。
- `04-任务矩阵.md`:任务编号、状态、验收标准,防止重复做。
- `05-验收证据.md`:命令、输出、页面、证据路径和当前阻塞。
- `06-决策记录.md`:关键决策及理由。
- `07-全量对标追踪矩阵.md`:逐项映射 `xyzbc-trt-runtime-files.md` 的真实 LinuxCNC 功能到 Web 对标目标、JSON 证据和缺口。
- `08-xyzbc-trt-界面与图标分析.md`:面向 Web 界面开发的页面区域、PyVCP/SWITCHKINS、Vismach、业务页面和 gmoccapy 图标资产清单。
- `09-设计任务书与技术方案整合.md`:从 DOCX 设计任务书整合出的 Markdown 版本,保留任务书、技术方案、程序逻辑分析、状态联锁和图片引用。
当前新增关注点:
- DOCX 任务书已整合到 `working/09-设计任务书与技术方案整合.md`,后续开发和验收优先以 `working` 下 Markdown 文件为可检索工作入口。
- `working` 文档必须完全对标 `doc/xyzbc-trt-runtime-files.md`,不仅覆盖文件 staging也覆盖 AXIS、PyVCP、POSTGUI HAL、basic_sim、Vismach、switchkins、Ngcgui、tool-offset、kinematics pins 和加载顺序。
- native/Web evidence JSON 后续必须包含刀具预览路径 `previewPath` 和刀具执行路径 `executionPath`
- 路径曲线对比统一使用 `samplePeriodMs = 20`,通过相同 `sampleIndex/timeMs` 对齐。
- compare JSON 后续必须输出 `pathComparison`,覆盖预览对预览、执行对执行、预览对执行的一致性误差统计。

View File

@@ -0,0 +1,179 @@
{
"apiName": "xyzbc-trt-native-web-evidence-comparison",
"status": "fail",
"comparedAt": "2026-07-02T07:41:51.598Z",
"nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json",
"webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json",
"summary": {
"checkCount": 12,
"passCount": 11,
"failCount": 1,
"blockers": [
"missing-wasm-artifacts"
],
"nativeStatus": "ok",
"webStatus": "blocked"
},
"checks": [
{
"category": "profile",
"requirement": "native axis mask is XYZBC",
"status": "pass",
"evidence": {
"nativeAxisMask": 55
}
},
{
"category": "profile",
"requirement": "web default profile is xyzbc-trt",
"status": "pass",
"evidence": {
"webProfile": "xyzbc-trt"
}
},
{
"category": "ini",
"requirement": "native loaded xyzbc switchkins program",
"status": "pass",
"evidence": {
"nativeFile": "/home/mes123456/linuxcnc-master/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc"
}
},
{
"category": "ini",
"requirement": "web INI parse is ready",
"status": "pass",
"evidence": {
"webIniReady": true
}
},
{
"category": "switchkins",
"requirement": "native switchkins pin readable",
"status": "pass",
"evidence": {
"nativePin": {
"owner": "31",
"type": "float",
"direction": "IN",
"value": 0,
"linked": true,
"raw": " 31 float IN 0 motion.switchkins-type <== :kinstype-select"
}
}
},
{
"category": "switchkins",
"requirement": "web remap files staged",
"status": "pass",
"evidence": {
"remaps": [
{
"raw": "M428 modalgroup=10 ngc=428remap",
"code": "M428",
"modalGroup": 10,
"ngc": "428remap"
},
{
"raw": "M429 modalgroup=10 ngc=429remap",
"code": "M429",
"modalGroup": 10,
"ngc": "429remap"
},
{
"raw": "M430 modalgroup=10 ngc=430remap",
"code": "M430",
"modalGroup": 10,
"ngc": "430remap"
}
]
}
},
{
"category": "program",
"requirement": "web default xyzbc_switchkins program staged",
"status": "pass",
"evidence": {
"selected": {
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"filename": "xyzbc_switchkins.ngc",
"wasmProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc"
}
}
},
{
"category": "tool-table",
"requirement": "web tool table staged",
"status": "pass",
"evidence": {
"toolTable": "xyzbc-trt.tbl"
}
},
{
"category": "pyvcp",
"requirement": "web PyVCP XML staged",
"status": "pass",
"evidence": {
"pyvcpXmlPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml"
}
},
{
"category": "positions",
"requirement": "native joint feedback readable",
"status": "pass",
"evidence": {
"joints": {
"0": 0,
"1": 3.552713678800501e-15,
"2": 10,
"3": 3.552713678800501e-15,
"4": 7.105427357601002e-15
}
}
},
{
"category": "wasm",
"requirement": "required WASM artifacts available",
"status": "fail",
"evidence": {
"missing": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
]
}
},
{
"category": "parameters",
"requirement": "parameter file staged",
"status": "pass",
"evidence": {
"parameterFile": "xyzbc.var"
}
}
],
"requiredImprovements": [
{
"category": "wasm",
"requirement": "required WASM artifacts available",
"evidence": {
"missing": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
]
}
}
],
"semanticBoundary": "native_linuxcnc_vs_web_opfs_wasm_xyzbc_trt_evidence_comparison"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,514 @@
{
"apiName": "xyzbc-trt-web-opfs-wasm-evidence",
"status": "blocked",
"collectedAt": "2026-07-02T07:41:51.225Z",
"profile": {
"id": "xyzbc-trt",
"machineName": "sim-xyzbc-trt-kins (switchkins)",
"iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
"pyvcpXmlPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"toolTablePath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl",
"coordinates": [
"X",
"Y",
"Z",
"B",
"C"
],
"kinematics": "xyzbc-trt-kins",
"kinematicsModuleId": "xyzbc-trt",
"defaultProgramFilename": "xyzbc_switchkins.ngc",
"switchkinsTypes": [
{
"value": 0,
"label": "identity",
"mdiCommand": "M429",
"webKinsType": "identity"
},
{
"value": 1,
"label": "XYZBC TCP",
"mdiCommand": "M428",
"webKinsType": "tcp-xyzbc"
},
{
"value": 2,
"label": "USERK",
"mdiCommand": "M430",
"webKinsType": "userk"
}
],
"halPins": [
"motion.switchkins-type",
"motion.analog-out-03",
"motion.tooloffset.z",
"xyzbc-trt-kins.tool-offset",
"xyzbc-trt-kins.x-offset",
"xyzbc-trt-kins.z-offset",
"xyzbc-trt-kins.x-rot-point",
"xyzbc-trt-kins.y-rot-point",
"xyzbc-trt-kins.z-rot-point",
"xyzbc-trt-kins.conventional-directions",
"halui.mdi-command-00",
"halui.mdi-command-01",
"halui.mdi-command-02"
]
},
"ini": {
"ready": true,
"machineName": "sim-xyzbc-trt-kins (switchkins)",
"coordinates": "XYZBC",
"kinematicsName": "xyzbc-trt-kins",
"kinematicsModuleId": "xyzbc-trt",
"remaps": [
{
"raw": "M428 modalgroup=10 ngc=428remap",
"code": "M428",
"modalGroup": 10,
"ngc": "428remap"
},
{
"raw": "M429 modalgroup=10 ngc=429remap",
"code": "M429",
"modalGroup": 10,
"ngc": "429remap"
},
{
"raw": "M430 modalgroup=10 ngc=430remap",
"code": "M430",
"modalGroup": 10,
"ngc": "430remap"
}
],
"haluiMdiCommands": [
"M429",
"M428",
"M430"
],
"toolTable": "xyzbc-trt.tbl",
"parameterFile": "xyzbc.var",
"jointConfig": [
{
"id": 0,
"axis": "X",
"type": "LINEAR",
"home": 0,
"min": -200,
"max": 200,
"maxVelocity": 20,
"maxAcceleration": 300,
"homeSearchVelocity": 0,
"homeSequence": 0
},
{
"id": 1,
"axis": "Y",
"type": "LINEAR",
"home": 0,
"min": -100,
"max": 100,
"maxVelocity": 20,
"maxAcceleration": 300,
"homeSearchVelocity": 0,
"homeSequence": 0
},
{
"id": 2,
"axis": "Z",
"type": "LINEAR",
"home": 0,
"min": -120,
"max": 120,
"maxVelocity": 20,
"maxAcceleration": 300,
"homeSearchVelocity": 0,
"homeSequence": 0
},
{
"id": 3,
"axis": "B",
"type": "ANGULAR",
"home": 0,
"min": -100,
"max": 50,
"maxVelocity": 30,
"maxAcceleration": 300,
"homeSearchVelocity": 0,
"homeSequence": 0
},
{
"id": 4,
"axis": "C",
"type": "ANGULAR",
"home": 0,
"min": -36000,
"max": 36000,
"maxVelocity": 30,
"maxAcceleration": 300,
"homeSearchVelocity": 0,
"homeSequence": 0
}
]
},
"opfsStaging": {
"storageMode": "memory",
"opfsRoot": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt",
"fileCount": 20,
"summary": {
"fileCount": 20,
"totalBytes": 458514,
"gcodeFileCount": 16,
"kinds": {
"ini": 1,
"demo": 8,
"toolTable": 1,
"parameters": 1,
"remap": 8,
"pyvcp": 1
},
"opfsPaths": [
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc",
"web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml"
]
},
"files": [
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/xyzbc-trt.ini",
"kind": "ini",
"bytes": 4885,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"kind": "demo",
"bytes": 139,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/xyzbc-trt.tbl",
"kind": "toolTable",
"bytes": 22,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc.var",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/xyzbc.var",
"kind": "parameters",
"bytes": 1666,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/428remap.ngc",
"kind": "remap",
"bytes": 688,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/429remap.ngc",
"kind": "remap",
"bytes": 644,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/430remap.ngc",
"kind": "remap",
"bytes": 635,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/centering.ngc",
"kind": "remap",
"bytes": 1134,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/helix_ac.ngc",
"kind": "remap",
"bytes": 735,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/helix_bc.ngc",
"kind": "remap",
"bytes": 735,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/xyzac_switchkins_sub.ngc",
"kind": "remap",
"bytes": 1547,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/remap_subs/xyzbc_switchkins_sub.ngc",
"kind": "remap",
"bytes": 1547,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/boat-xyzac.ngc",
"kind": "demo",
"bytes": 70847,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/boat-xyzbc.ngc",
"kind": "demo",
"bytes": 76616,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/impeller-7bl-xyzac.ngc",
"kind": "demo",
"bytes": 294411,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins.ngc",
"kind": "demo",
"bytes": 139,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_1.ngc",
"kind": "demo",
"bytes": 419,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_2.ngc",
"kind": "demo",
"bytes": 475,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_3.ngc",
"kind": "demo",
"bytes": 304,
"executable": false
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/xyzbc-trt.xml",
"kind": "pyvcp",
"bytes": 926,
"executable": false
}
],
"gcodeSources": [
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/boat-xyzac.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"filename": "boat-xyzac.ngc",
"bytes": 70847,
"label": "boat-xyzac",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/boat-xyzbc.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"filename": "boat-xyzbc.ngc",
"bytes": 76616,
"label": "boat-xyzbc",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/impeller-7bl-xyzac.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"filename": "impeller-7bl-xyzac.ngc",
"bytes": 294411,
"label": "impeller-7bl-xyzac",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_1.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc",
"filename": "xyzac_switchkins_test_1.ngc",
"bytes": 419,
"label": "xyzac_switchkins_test_1",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_2.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc",
"filename": "xyzac_switchkins_test_2.ngc",
"bytes": 475,
"label": "xyzac_switchkins_test_2",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins_test_3.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc",
"filename": "xyzac_switchkins_test_3.ngc",
"bytes": 304,
"label": "xyzac_switchkins_test_3",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzac_switchkins.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc",
"filename": "xyzac_switchkins.ngc",
"bytes": 139,
"label": "xyzac_switchkins",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
},
{
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"wasmPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc",
"opfsPath": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"filename": "xyzbc_switchkins.ngc",
"bytes": 139,
"label": "xyzbc_switchkins",
"sourceMode": "linuxcnc-vendored-5axis-gcode",
"semanticBoundary": "linuxcnc_vendored_5axis_gcode_source_file"
}
],
"selectedProgram": {
"sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"filename": "xyzbc_switchkins.ngc",
"wasmProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc"
}
},
"store": {
"machineProfile": "xyzbc-trt",
"sessionName": "xyzbc-trt-web-session",
"machineProjectRoot": "web-rtcp-5axis-xyzbc-trt-sim-plan/machines/xyzbc-trt",
"activeProgram": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc",
"programSource": "linuxcnc-vendored-5axis-gcode",
"programLineCount": 3,
"selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc"
},
"wasm": {
"required": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
],
"files": [],
"missing": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
],
"ready": false,
"emscriptenAvailable": false
},
"coverage": {
"profileDefaultXyzbc": true,
"iniReady": true,
"opfsStaged": true,
"pyvcpXmlStaged": true,
"remapsStaged": true,
"toolTableStaged": true,
"parameterFileStaged": true,
"defaultProgramStaged": true,
"wasmArtifactsReady": false
},
"blockers": [
{
"id": "missing-wasm-artifacts",
"detail": "wasm-port/build/wasm does not contain all required kinematics/core/tp/task-hal artifacts.",
"required": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
],
"missing": [
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.js",
"wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm",
"wasm-port/build/wasm/core/linuxcnc_interp.js",
"wasm-port/build/wasm/core/linuxcnc_interp.wasm",
"wasm-port/build/wasm/tp/linuxcnc_tp.js",
"wasm-port/build/wasm/tp/linuxcnc_tp.wasm",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.js",
"wasm-port/build/wasm/task-hal/linuxcnc_task_hal.wasm"
]
}
],
"semanticBoundary": "web_opfs_wasm_runtime_readiness_for_linuxcnc_xyzbc_trt"
}

View File

@@ -0,0 +1 @@
import: unable to open X server `:109' @ error/import.c/ImportImageCommand/348.

View File

@@ -0,0 +1 @@
xwininfo: error: unable to open display ":109"

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB