Files
linuxcncWebWASM/doc-rtcp/xyzac-panel-button-parity-test-report.md

168 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# XYZAC TRT 面板按钮对标测试报告
## 结论
本报告针对当前选定案例
`linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini`,
按 LinuxCNC AXIS 的命令、门控、状态和错误语义执行了一轮完整面板验收。
`selected_case_status: VERIFIED_WITH_SCOPE_GAPS`
`release_status: STOP_RELEASE`
这表示已执行并通过选定 XYZAC 案例的 WASM/Worker 控制闭环,但不宣称整个 LinuxCNC 或所有 AXIS 配置已经数值完全对标。
## 对标输入
| 作用 | LinuxCNC 原始输入 | Web/WASM 输入 |
| --- | --- | --- |
| AXIS 菜单、快捷键、状态轮询 | `linuxcnc/src/emc/usr_intf/axis/scripts/axis.py`、`linuxcnc/share/axis/tcl/axis.tcl` | `web/react/src/App.tsx`、`web/app/axis-contract.mjs` |
| 程序/暂停/恢复/停止 | `axis.py:task_run/task_step/task_pause/task_resume/task_stop` | `PROGRAM_RUN/STEP/PAUSE/RESUME/ABORT` -> `SimTask` + LinuxCNC source TP |
| JOG/HOME | `axis.py:jog_on/jog_off/home_all_joints/home_joint` | `JOG_START/JOG_STOP/HOME` -> `WasmLinuxcncTp/WasmHomeLimit` |
| MDI/Touch Off | `axis.py:send_mdi_command/touch_off_system/touch_off_tool` | `MDI_EXECUTE` -> `linuxcnc-wasm-sim_program` |
| Feed/rapid/spindle override | `axis.py:set_feedrate/set_rapidrate/set_spindlerate` | `SET_OVERRIDE` -> WASM TP/IO |
| 主轴、刹车、冷却、刀具、探针 | `axis.py:spindle/brake/mist/flood/change_tool` | `SPINDLE_COMMAND/SPINDLE_BRAKE/COOLANT_COMMAND/TOOL_*/PROBE_CONFIG` -> WASM IO |
| 预览、实时轨迹、清屏 | `linuxcnc/lib/python/rs274/glcanon.py` | `XyzacToolPreview`,只投影 WASM preview/motion trace |
| XYZAC M428/M429/M430 | `switchkins_postgui.hal`、`remap_subs/428remap.ngc` 等 | `KINEMATICS_SELECT` -> WASM kinematics/switchkins |
源码输入哈希:
```text
axis.py 328c038a1e8fefd952e53c8e398e3fa98b04602351c44318edd1b044e8f63ffa
glcanon.py 0dfb20f1fdc05289894f3aa638357d98e1063fbd53329c723c777399ec7b33b7
xyzac-trt.ini f985970db293b70c055e4c41fc316d0c16037b5dc7ce07490e18f554e851f811
source slices c9f0b4dc686717b37565f85fb0ab8cc8ded9cfa0028cc0aaaccdbcf808c4c524
```
AXIS 源控件清单:菜单 80、工具栏 20、快捷键 10,共 110 条,来自 `web/workspace/xyzac-trt-source-slices.mjs`。
## 按钮/控件矩阵
下表中的“通过”包含正常路径和刻意触发的 LinuxCNC 门控拒绝;拒绝不是失败,必须返回可解释的 gate/error key。
| 面板区域 | Web 控件 | LinuxCNC 命令/源函数 | WASM 权威输出 | 结果 |
| --- | --- | --- | --- | --- |
| 会话 | HELLO、SESSION_ATTACH | AXIS 启动/状态轮询 | `sim_protocol`、`SimTask` | 通过 |
| Machine | Emergency Stop、Release E-stop | `General_Halt`、`emcTaskAbort` | WASM IO + Task ESTOP/RESET | 通过 |
| Machine | Power On/Off | `commands.power`、`emcTaskSetState` | `sim_io_set_power` | 通过 |
| Machine | Reset | `commands.reset` | WASM Task/IO reset | 通过 |
| Machine | HOME ALL | `home_all_joints` | `WasmHomeLimit` 五关节回零 | 通过 |
| Machine | Run Startup Sequence | release -> power -> home -> run | Worker 固定顺序 | 通过 |
| Program | Load | `open_file_guts` | WASM interpreter preview | 通过 |
| Program | Run | `task_run` / `AUTO_RUN` | WASM program + source TP | 通过 |
| Program | Pause / Resume | `task_pause` / `task_resume` | WASM interpreter + TP pause/resume | 通过 |
| Program | Stop | `task_stop` / `c.abort` | WASM TP abort,队列清零 | 通过 |
| Program | Restart | `reload_file` / first line | WASM program reload | 通过 |
| Program | Step / Seek | `task_step` / `set_first_line` | WASM interpreter | 通过 |
| JOG | X、Y、Z、A、C +/-、Stop | `jog_plus/jog_minus/jog_on/jog_off` | WASM motion queue | 通过 |
| JOG | 越界/非有限速度 | LinuxCNC motion limit/ferror | WASM 错误 key | 通过拒绝 |
| MDI | Go、历史命令 | `send_mdi_command` | WASM interpreter/canonical | 通过 |
| MDI | 运行中 MDI | `manual_ok` | `mdi_while_program_active` | 通过拒绝 |
| Override | Feed Override 50%/200% | `set_feedrate` | WASM TP feed override | 通过 |
| Override | Feed > 200% | `set_feedrate` range | `motion_override_range` | 通过拒绝 |
| Spindle | CW/CCW/Stop | `spindle_forward_toggle/spindle` | WASM spindle command | 通过 |
| Spindle | +/- | `SPINDLE_INCREASE/DECREASE` | WASM signed delta | 通过 |
| Spindle | Brake | `EMC_SPINDLE_BRAKE_ENGAGE/RELEASE` | WASM IO brake state | 通过 |
| Coolant | Mist/Flood | `mist_toggle/flood_toggle` | WASM device IO | 通过 |
| Tool | Prepare、Prepared、Change、Changed | iocontrol/tool handler | WASM IO tool state | 通过 |
| Probe | Arm、Disarm、Trip | probe canonical/HAL | WASM IO + HAL | 通过 |
| Switchkins | Identity/M429、TCP: XYZAC/M428、User K/M430 | `switchkins_postgui.hal` + remap files | WASM kinematics `active_type` | 通过 |
| Preview | Preview、DRO、路径/实时/限位/速度/偏置/范围 | `glcanon.py` draw layers | WASM pose/joints/toolpath | 通过投影 |
| Preview | 缩放、平移、旋转、原点坐标系 | AXIS view handlers | React/Three display-only state | 通过显示 |
| Diagnostics | 状态、门控、错误、恢复 | AXIS status/error channel | Worker snapshot/ledger | 通过 |
## 本轮自动化结果
聚合用例:`web/worker/test_xyzac_panel_buttons.mjs`
```json
{
"schema": "xyzac-panel-button-parity.v1",
"source": "linuxcnc-wasm-worker",
"verified_paths": 94,
"expected_error_paths": 8,
"blocked_by_abi_paths": 7,
"selected_case_release_status": "STOP_RELEASE"
}
```
94 条通过路径包括:
- Machine:HELLO、SESSION_ATTACH、LOAD_WORKSPACE、ESTOP、ESTOP_RESET、POWER、RESET、HOME ALL、启动序列;
- Program:LOAD、RUN、SIM_STEP、PAUSE、SNAPSHOT、RESUME、ABORT/STOP、RESTART、STEP、SEEK、按行恢复;
- JOG:XYZAC 五轴启动、固定 tick 采样和停止;
- MDI:正常 G-code、运行中门控和非法 G-code 错误回显;
- Feed Override:50%、200% 和 201% 拒绝;
- 主轴:CW、signed increase/decrease、Stop、Brake engage/release;
- Coolant、Tool prepare/change ack、Probe arm/disarm、ESTOP recovery;
- M428/M429/M430、VISUAL_CLEAR 和诊断快照。
8 条错误路径是刻意验证的拒绝:OFF 状态 Run/HOME/JOG/MDI/M428、Feed 201%、非法 MDI、运行中 MDI。它们均返回 LinuxCNC/WASM 可读原因,没有把拒绝当成成功。
3D_Chips 长程序补充验证:
```text
source_length: 200509
line_count: 4711
preview_segments: 4684
fixed_tick_samples: 1500
execution_line: 168
execution_trace_entries: 166
motion_authority: wasm
```
## 当前未闭合项
这些项目在本轮明确记录为 `blocked_by_abi`,没有伪造通过:
1. `Home Axis`:当前 WASM home 状态只暴露 aggregate `homed`,没有 LinuxCNC 每关节 homed mask;当前按钮调用的是统一 home。
2. `Override Limits`:原始 AXIS `toggle_override_limits` 有独立 motion command;选定 XYZAC WASM 配置目前把 limits 作为配置所有权,尚无等价 command ABI。
3. `Jog Speed` 和 `Max Velocity` slider:当前是 React 控件状态,尚未接入 WASM jog/max velocity command。
4. `Block delete` 和 `Optional pause`:当前是 React toggle,尚未写入 WASM interpreter modal/control state。
5. `Tool Touch Off`:当前按钮发送固定 `G43`;原始 AXIS 先取得用户值,再发送 `G10 L10/L11` 和 `G43`,交互输入流程尚未闭合。
6. `Edit tool data`、`Quit`:依赖桌面进程/外部编辑器,属于浏览器 `HOST_BOUNDARY`,不在仿真 Web 范围内。
## 复现命令
```bash
scripts/build-wasm.sh
npm run build --prefix web/react
node --experimental-strip-types web/worker/test_xyzac_panel_buttons.mjs
node --experimental-strip-types web/worker/test_xyzac_button_constraints.mjs
node --experimental-strip-types web/worker/test_xyzac_workflow.mjs
node --experimental-strip-types web/worker/test_xyzac_manual_control.mjs
node --experimental-strip-types web/worker/test_xyzac_feed_override.mjs
node --experimental-strip-types web/worker/test_xyzac_trt_io_authority.mjs
node --experimental-strip-types web/worker/test_xyzac_3d_chips.mjs
bash -n run-5axis-rtcp.sh
```
本轮结果:WASM 构建通过,原生 CTest 22/22 通过,XYZAC 聚合按钮测试通过,3D_Chips 固定 tick 长程序测试通过。发布站点 UI 运行/暂停/恢复/停止也已在 Chromium 仿真环境执行;Safari 和真实物理断电不属于本项目范围。
发布站点 r5 浏览器冒烟:
```text
url: https://49.232.250.35:58010/
result: verified
startup -> pause -> resume -> stop: verified
pause_tick: 140 (position held while PAUSED)
resume_tick: 160 -> continued running
stop: IDLE / queue cleared
JOG X/Y/Z/A/C, spindle CW/CCW/+/-/brake, coolant, tool/probe,
Feed Override, M428/M429/M430, VISUAL_CLEAR, Preview/DRO/MDI/Diagnostics
and view controls: clicked with no browser errors
output_sha256: bdf705473e6cda94d721aa23329257adf4a68b705add7650da5cc47012ab70b0
```
## 证据哈希
```text
panel_button_test_output 4447f37d8db6724fcd43518e8ddcd18d54e40faaedc77be9ea01abdc573226bc
3d_chips_test_output 493ed6c901d18fae8fa02d0dc26ee0575ce78c53557351a468fc1df622e48ea4
wasm_io_source 1cb066d185dd2c5bbf435e022c2518483bd44962e5a0303248757b2da51740f7
wasm_io_c_source 09bce1430d6f71702ca0b3bf29ac50db377a6f232ce0d1a9b2c1eaac7ea2162e
panel_button_test_source 80782fc1f85f88beb48ec3dfaf638a93f2edb912e694840199dbff504477fe74
```
报告对应提交前工作树保留了既有 coverage 大文件和 LinuxCNC 子模块改动;本轮只提交面板 WASM I/O 修正、step 状态修正、聚合测试和本报告。