Files
linuxcncWebWASM/docs/linuxcnc-web-wasm-simulation-coverage.md

387 lines
29 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.
# LinuxCNC 纯 Web/WASM 仿真全功能覆盖矩阵(第一版)
**对应路线**:[LinuxCNC 纯 Web/WASM 仿真机床技术路线](linuxcnc-web-wasm-technical-roadmap.md)
**执行治理**:[LinuxCNC Web/WASM 仿真项目执行与交付策略](linuxcnc-web-wasm-execution-strategy.md)
**源码关联**:[LinuxCNC Web/WASM 仿真功能与源程序关联目录](linuxcnc-web-wasm-source-map.md)
**前端与通信**:[LinuxCNC Web/WASM 仿真前端与通信详细设计](linuxcnc-web-wasm-frontend-communication-design.md)
**总控执行**:[LinuxCNC Web/WASM 仿真移植总控执行手册](linuxcnc-web-wasm-integration-playbook.md)
**目标**:覆盖 LinuxCNC 面向仿真机床的全部用户可见功能
**范围**:只做仿真,不接真实机床,不实现真实硬件访问
**基线**:仓库当前 LinuxCNC `2.10.0~pre0`
## 1. 覆盖规则
本矩阵不是功能愿望清单,而是验收清单。每一行都必须拥有实现、测试和差异报告;只有标记为 `REAL-EXCLUDED` 的真实硬件/物理安全项目不进入仿真覆盖率。任务拆分、固定 context lock、上下文包预算、断网接续和发布门禁遵循[执行与交付策略](linuxcnc-web-wasm-execution-strategy.md);端到端场景和任务依赖以[总控执行手册](linuxcnc-web-wasm-integration-playbook.md)为准;本矩阵只维护功能条目及其证据索引。
| 标记 | 含义 | 验收要求 |
|---|---|---|
| `SIM-CORE` | 直接复用 LinuxCNC C/C++ 核心 | 原生与 WASM golden 对照 |
| `SIM-ADAPTER` | 进程、NML、文件、时钟等兼容层 | API、状态和错误码对照 |
| `SIM-DEVICE` | 硬件功能的虚拟数字孪生 | pin、时序、故障、报警和状态可录制 |
| `WEB-EQUIV` | 桌面 GUI/工具在 Web 中等价实现 | 工作流和配置结果对照,不要求像素一致 |
| `PY-WASM` | Python/remap/过滤器在 Pyodide 中执行 | 受控宿主 API、异常和返回值对照 |
| `REAL-EXCLUDED` | 真实硬件、物理安全和实时内核 | 不实现,但必须明确报错和文档说明 |
完成定义:所有 `SIM-*`、`WEB-EQUIV`、`PY-WASM` 项在正常、边界、错误、暂停/恢复、持久化/离线和适用的跨域交互维度达到 100% 通过;`REAL-EXCLUDED` 项在配置检查中全部被识别且不会误报为已连接。单一百分比不能替代来源闭包、维度闭包和交互闭包。
条目状态使用执行策略定义的 `planned`、`in_progress`、`implemented`、`verified`、`accepted`、`blocked` 和 `REAL-EXCLUDED`。`accepted` 必须有 context lock、自动测试和差异报告;状态缺失、来源新增但无 manifest 项、或上下文包超预算均为 CI 阻断。
## 2. 功能来源和清单生成
覆盖清单必须从以下仓库来源自动生成,避免只依赖人工整理:
各功能域的实际源文件、配置入口和测试入口维护在[源程序关联目录](linuxcnc-web-wasm-source-map.md);本节定义扫描全集,两者共同构成 manifest 的来源合同。
| 来源 | 覆盖内容 |
|---|---|
| `linuxcnc/docs/src/Master_Documentation.adoc` | 用户、配置、HAL、ClassicLadder、运动、remap、GUI、G-code 和 Python 接口;Hardware Drivers/Examples 只生成排除项 |
| `linuxcnc/configs/sim/**` | 全部仿真 INI/HAL/TBL/NGC/PY/XML/TCL 配置和样例 |
| `linuxcnc/tests/**` | 启动、解释器、运动、HAL、IO、remap、工具、回零、限位和 UI 测试 |
| `linuxcnc/unit_tests/**` | TP、解释器和数学单元测试 |
| `linuxcnc/src/emc/**` | task、io、motion、kinematics、interpreter、tooldata、NML 接口 |
| `linuxcnc/src/hal/components/**` | 全部 `.comp`、C 组件、仿真组件、测试组件和组件模板 |
| `linuxcnc/src/hal/classicladder/**` | 梯形图、顺序功能图、变量、定时器、计数器、Modbus 逻辑和工程文件 |
| `linuxcnc/src/emc/usr_intf/**`、`lib/python/**` | AXIS、Gmoccapy、Touchy、Gscreen、QtVCP、PyVCP、GladeVCP、Vismach 等界面和脚本 |
构建脚本生成 `coverage/manifest.jsonl`,字段至少包括:`id`、`source`、`source_sha`、`domain`、`kind`、`dependencies`、`inputs`、`outputs`、`errors`、`sim_status`、`web_status`、`test_id`、`oracle`、`golden`、`difference`、`coverage_dimensions`、`context_id`、`exclusion_reason`。`source` 必须可定位到文档锚点、源码符号、配置文件或测试用例;`dependencies` 必须递归闭包;`oracle` 必须说明原生对照、规范结果或明确的 Web 等价判定。任何新增源码、文档功能或仿真配置没有 manifest 项时,CI 失败。
### 2.1 完整性闭包和防遗漏检查
每次生成 manifest 都执行以下闭包检查,并将结果作为构建产物:
1. 对文档标题、G/M/O/Python/HAL/API 名称、导出符号、`.comp`、ClassicLadder 对象、`configs/sim/**` 资源和测试入口做规范化扫描,记录来源总数和来源摘要。
2. 计算来源到 manifest 的反向索引;任何孤儿来源、重复 ID、空依赖、无测试、无 oracle 或状态字段缺失都使 CI 失败。
3. 对每个条目展开依赖图,确认依赖条目存在且没有未登记的真实硬件路径;仿真配置引用的排除功能必须有对应数字孪生条目。
4. 为每个条目生成正常、边界、错误、暂停/恢复、持久化/离线测试维度;G-code、HAL、IO、Python、UI 和存储之间的关键交互生成 pairwise/关键路径用例。
5. 比较原生参考运行器和 WASM 结果,保存首个差异 tick、状态/错误字段和容差;没有可比 oracle 的条目只能是 `blocked`,不能是 `accepted`。
6. 发布前生成完整性报告:已接受、进行中、阻断、排除、孤儿来源、未覆盖维度和未覆盖交互分别列出;任何非零的未覆盖或孤儿项阻止全功能声明。
## 3. 启动、工程和配置
| 功能 | Web/WASM 实现 | 标记 |
|---|---|---|
| LinuxCNC 启动、初始化、退出和重启 | Worker 内 `create/load/start/stop/reset/destroy` 状态机 | `SIM-ADAPTER` |
| 配置选择器和 sample 配置 | OPFS 工程浏览器;完整导入 `configs/sim/**` | `WEB-EQUIV` |
| INI 注释、section、变量和 include | 兼容解析、相对路径和循环检测 | `SIM-CORE` |
| `[EMC]`、`[DISPLAY]`、`[FILTER]`、`[RS274NGC]` | 仿真相关字段读取、校验、警告和 Web 配置编辑;桌面进程字段识别后映射或排除 | `SIM-ADAPTER` |
| `[EMCMOT]`、`[TASK]`、`[HAL]`、`[HALUI]`、`[APPLICATIONS]` | 仿真字段映射到虚拟运行时;外部宿主应用不执行 | `SIM-ADAPTER` |
| `[TRAJ]`、`[KINS]`、`[AXIS_*]`、`[JOINT_*]`、`[SPINDLE_*]`、`[EMCIO]` | 轴、关节、主轴、IO、回零和运动参数全部生效 | `SIM-ADAPTER` |
| 多入口 INI、include 目录和资源查找 | `/workspace` 虚拟 POSIX 路径 + OPFS | `SIM-ADAPTER` |
| HAL twopass、HALFILE 顺序、参数展开 | 解析、排序、重复加载和错误语义对照 | `SIM-ADAPTER` |
| HAL 命令 `loadrt/addf/setp/net/sets/ newsig/linksp/linkps` | Worker 内命令执行和状态回放 | `SIM-CORE` |
| 参数、变量、`.var`、tool table、tool database | 内存运行态 + OPFS 事务提交 | `SIM-ADAPTER` |
| 工程复制、删除、重命名、导入、导出 | OPFS journal + ZIP/目录导入导出 | `WEB-EQUIV` |
| 启动错误、配置警告、资源缺失 | 行号、路径、错误码和恢复建议 | `SIM-ADAPTER` |
## 4. G-code、O-code、M-code 和解释器
### 4.1 单词、模式和程序结构
| 功能 | 覆盖内容 | 标记 |
|---|---|---|
| 行语法 | `%`、序号 `N`、注释、空行、大小写、空格、行尾 | `SIM-CORE` |
| 轴/关节词 | `X Y Z A B C U V W`、额外关节和旋转轴 | `SIM-CORE` |
| 速度/主轴/刀具 | `F S T H D Q I J K L P R E` 等全部合法词 | `SIM-CORE` |
| 参数 | `#1..#5399`、命名参数、系统参数、数组、间接寻址 | `SIM-CORE` |
| O-code | sub、call、return、do/while、if/elseif/else、break、continue、repeat、call file、返回值、错误 | `SIM-CORE` |
| Fanuc 风格 | `M98/M99`、编号程序和参数传递 | `SIM-CORE` |
| 读前瞻/队列破坏 | MDI、M-code、输入等待、暂停、remap 的队列语义 | `SIM-ADAPTER` |
| 程序控制 | run、pause、optional stop、single block、step、abort、resume、restart、line seek | `WEB-EQUIV` |
| 错误 | 语法、表达式、参数、路径、运动学和运行时错误 | `SIM-CORE` |
### 4.2 G-code 全量列表
以下代码全部纳入解析、状态、canonical 输出和运动结果测试:
| 类别 | 代码 |
|---|---|
| 运动与停留 | `G0 G1 G2 G3 G4` |
| 样条/NURBS | `G5 G5.1 G5.2 G5.3` |
| 车床模式 | `G7 G8` |
| 参数/坐标/刀具写入 | `G10 L0 L1 L2 L10 L11 L20` |
| 平面 | `G17 G17.1 G18 G18.1 G19 G19.1` |
| 单位与预定义点 | `G20 G21 G28 G28.1 G30 G30.1` |
| 同步/探针 | `G33 G33.1 G38.2 G38.3 G38.4 G38.5` |
| 刀补 | `G40 G41 G41.1 G42 G42.1 G43 G43.1 G43.2 G49` |
| 坐标系 | `G52 G53 G54 G55 G56 G57 G58 G59 G59.1 G59.2 G59.3` |
| 轨迹控制 | `G61 G61.1 G64` |
| 车床循环 | `G70 G71 G71.1 G71.2 G72 G72.1 G72.2 G74 G76` |
| 铣削/钻孔循环 | `G73 G80 G81 G82 G83 G84 G85 G86 G87 G88 G89` |
| 距离/弧距离 | `G90 G90.1 G91 G91.1` |
| G92 | `G92 G92.1 G92.2 G92.3` |
| 进给与主轴模式 | `G93 G94 G95 G96 G97 G98 G99` |
### 4.3 M-code 全量列表
| 类别 | 代码及仿真行为 |
|---|---|
| 暂停/结束 | `M0 M1 M2 M30 M60`;由 Web 控制面板和虚拟托盘/换盘事件驱动 |
| 主轴 | `M3 M4 M5 M19`;虚拟主轴转速、方向、定向和到速状态 |
| 换刀 | `M6 M61`;虚拟手动/随机/非随机换刀、准备/完成状态和失败注入 |
| 冷却 | `M7 M8 M9`;虚拟雾/洪水/主轴冷却 pin 和状态 |
| 倍率 | `M48 M49 M50 M51 M52 M53`;进给、主轴、adaptive、feed stop |
| IO | `M62 M63 M64 M65 M66 M67 M68`;同步/立即数字和模拟 IO、输入等待和超时 |
| 模态 | `M70 M71 M72 M73`;保存、失效、恢复和自动恢复模态状态 |
| 子程序 | `M98 M99`;程序调用、返回和选择性模态恢复 |
| 用户命令 | `M100-M199`;映射为 OPFS 工程内白名单 Python/NGC 虚拟动作,不执行宿主命令 |
### 4.4 Remap、Python 和过滤器
| 功能 | Web/WASM 实现 | 标记 |
|---|---|---|
| 内置 remap prolog/epilog | 解释器内 C++ ABI 复用 | `SIM-CORE` |
| NGC remap | 虚拟文件工作区中的 O-code 执行 | `SIM-ADAPTER` |
| Embedded Python remap | Pyodide Worker,暴露 linuxcnc/hal/INI/参数虚拟模块 | `PY-WASM` |
| `T/M6/M61/S/F` remap | 完整参数、返回值、异常和顺序对照 | `PY-WASM` |
| 自定义 G/M code | 工程 manifest 注册和安全限额 | `PY-WASM` |
| `[FILTER]` 程序过滤器 | 在 Pyodide 中执行 `.py/.pyc` 的纯计算/文本过滤部分 | `PY-WASM` |
| CAD/CAM 外部程序 | 不执行宿主程序;提供内置转换插件接口和错误状态 | `WEB-EQUIV` |
| Python `subprocess/threading/socket/设备` | 虚拟 API 返回 LinuxCNC 约定错误 | `REAL-EXCLUDED` |
## 5. 运动、轨迹、轴、关节和运动学
| 功能域 | 全量覆盖项 | 标记 |
|---|---|---|
| TP | 直线、圆弧、球面弧、样条、NURBS、前瞻、blend、exact path、exact stop、速度/加速度/jerk 限制 | `SIM-CORE` |
| 运行模式 | coordinated、teleop、free/joint jog、MDI、单步、暂停、恢复、abort、queue-buster | `SIM-ADAPTER` |
| 轴/关节 | X/Y/Z/A/B/C/U/V/W、额外关节、随机/非随机配置、轴-关节映射 | `SIM-CORE` |
| 限制 | soft limit、hard limit、following error、backlash、offset limit、速度/加速度限制 | `SIM-ADAPTER` |
| 回零 | search/latch/final velocity、index、shared switch、offset、sequence、volatile、immediate、locking indexer、inhibit | `SIM-DEVICE` |
| 坐标 | machine/world/relative/display、G5x、G52、G92、rotation、scale、external offset、moveoff | `SIM-CORE` |
| 补偿 | cutter radius、tool length、dynamic tool length、additional tool offset、wear、螺距误差 | `SIM-CORE` |
| 主轴同步 | threading、G33/G33.1、rigid tapping、CSS、gear、orient、multiple spindle | `SIM-DEVICE` |
| 控制环 | PID、feed/velocity/position loop、encoder、stepgen、adaptive feed | `SIM-CORE` |
| 运动学模块 | `trivkins`、`5axiskins`、`corexykins`、`cubic`、`genhexkins`、`genserkins`、`lineardelta`、`maxkins`、`pentakins`、`rosekins`、`rotarydelta`、`rotatekins`、`scarakins`、`scorbot`、`tripod`、`xyzac-trt`、`xyzbc-trt`、`switchkins`、`ugenser/userkfuncs` | `SIM-CORE` |
| DH/机器人 | DH 参数、PUMA、SCARA、六足、Delta、Pentapod、Scorbot 和自定义静态 kinematics | `SIM-CORE` |
| 用户 kinematics | 构建期静态 WASM ABI、热切换由仿真状态机完成 | `SIM-ADAPTER` |
| 坐标/姿态显示 | joints、axes、pose、forward/inverse、tool orientation 和 singularity 错误 | `WEB-EQUIV` |
## 6. 机床类型和数字孪生
| 仿真机床 | 覆盖内容 | 标记 |
|---|---|---|
| 3/4/5/6/7/8/9 轴铣床 | 轴、关节、刀具、冷却、换刀、探针、坐标系和轨迹 | `SIM-DEVICE` |
| 车床 | G7/G8、G70/G71/G72/G76、主轴 CSS、刀尖半径、背刀塔、Fanuc Y、双主轴 | `SIM-DEVICE` |
| Gantry/CoreXY | 双关节、耦合、gantry HAL、同步误差和回零 | `SIM-DEVICE` |
| 机器人/Delta/Hexapod | 全部内置 kinematics、关节限位、姿态和模型 | `SIM-DEVICE` |
| 等离子 | torch enable、height control、arc-ok、ohmic、pierce、cut recovery、material table、qtplasmac 行为 | `SIM-DEVICE` |
| 激光 | laser power、PWM/模拟输出、动态功率和轨迹同步 | `SIM-DEVICE` |
| 泡沫切割 | 双平面/双 Z、foam kinematics、丝热功率和同步 | `SIM-DEVICE` |
| 探针/自动对刀 | probe input、触发位置、失败/超时、tool sensor 和宏 | `SIM-DEVICE` |
| 3D 打印/挤出 | 虚拟挤出轴、温度/风扇/材料状态(若 LinuxCNC 仿真配置启用) | `SIM-DEVICE` |
| 毛坯和切削 | 轨迹核心与可视化切削层分离;heightfield/voxel/SDF 按机床类型选择 | `WEB-EQUIV` |
| 故障注入 | 限位、跟随误差、探针不触发、主轴不到速、换刀失败、IO 超时、存储失败 | `SIM-DEVICE` |
## 7. HAL 全量和仿真 I/O
### 7.1 HAL 运行时契约
| 功能 | 覆盖内容 | 标记 |
|---|---|---|
| HAL 对象 | component、pin、signal、parameter、owner、type、direction、value、export/unexport | `SIM-CORE` |
| HAL 命令 | `loadrt`、`addf`、`start/stop`、`setp`、`sets`、`net`、`linksp`、`linkps`、`unlinkp`、`show`、`save`、`source` | `SIM-CORE` |
| HAL 线程 | base/servo/thread 周期、顺序、浮点标志、超时和 overrun 事件 | `SIM-ADAPTER` |
| `.comp` ABI | 全部组件模板的参数、pin、function、personality 和 lifecycle | `SIM-CORE` |
| HAL UI | `halui` 全 pin、模式、jog、home、abort、feed/spindle override 和消息 | `SIM-CORE` |
| HAL scope | 采样、触发、通道、缩放、保存和回放 | `WEB-EQUIV` |
| HAL show/meter | pin 图、实时值、类型和连接关系 | `WEB-EQUIV` |
### 7.2 组件 manifest
`linuxcnc/src/hal/components/**` 下的每个 `.comp`、C 组件和测试组件都必须在 manifest 中出现。按类别验收:
- 数学/转换:abs、scale、sum、mult、div、min/max、near、hypot、lincurve、lut、modmath、bit/float/s32/s64/u32/u64 转换。
- 逻辑/选择:and/or/not、mux、demux、select、logic、flipflop、toggle、tristate、oneshot、edge、multiswitch、multiclick。
- 时序/滤波:time、timedelay、timedelta、ton、tof、updown、counter、sample-hold、lowpass、ilowpass、biquad、filter-kalman、ddt、integ、deadzone。
- 运动/控制:PID、limit、limit-axis、limit1/2/3、blend、simple_tp、tpcomp、feedcomp、moveoff、gantry、corexy、millturn、orient、spindle、spindle-monitor、stepgen、encoder、encoder-ratio。
- 信号/诊断:message、watchdog、safety-latch、estop-latch、histobins、latencybins、sampler、streamer、lcd、matrix-kb。
- 设备/仿真:sim-axis-hardware、sim-encoder、sim-home-switch、sim-matrix-kb、sim-parport、sim-spindle、sphereprobe、probe、raster、laserpower、plasmac、thc/thcud、ohmic、charge-pump。
- 测试和用户模板:constant、test、thread、userkins、usercomp、所有 `*.comp` personality 和示例工程。
### 7.3 通用虚拟机床部件
Web 仿真不移植具体硬件驱动,而由稳定的通用模型为仿真配置提供输入输出:
| 通用模型 | 仿真能力 |
|---|---|
| 虚拟数字/模拟 I/O | pin 值、同步/立即变化、等待、延迟、噪声和故障注入 |
| 虚拟寄存器组 | 为 ClassicLadder/仿真 PLC 提供本地寄存器,不实现真实 Modbus transport |
| 虚拟 MPG/手轮/键盘 | Pointer/键盘/触控事件映射为脉冲和 HAL pin |
| 伺服/编码器 | 位置环、量化、噪声、丢脉冲、跟随误差模型 |
| 电机/主轴/冷却/阀 | 可配置惯性、加减速、到速、温度/压力/状态数字孪生 |
真实并口、GPIO、PCI、Mesa/HostMot2/FPGA、串口、VFD、Modbus transport、现场总线和协议工具统一为 `REAL-EXCLUDED`。
## 8. ClassicLadder、Modbus 和 PLC
| 功能 | 覆盖内容 | 标记 |
|---|---|---|
| 工程文件 | `.clp`、sections、symbols、variables、project load/save | `SIM-ADAPTER` |
| Ladder 对象 | contacts、coils、set/reset、timers、IEC timers、monostable、counters、compare、assignment、jump/call | `SIM-CORE` |
| 顺序控制 | GRAFCET steps/transitions/actions、状态和扫描顺序 | `SIM-CORE` |
| 扫描周期 | 虚拟 PLC thread、周期、overrun 和暂停恢复 | `SIM-ADAPTER` |
| Modbus 逻辑 | 使用虚拟寄存器、延迟和错误状态验证 Ladder 逻辑;不实现真实 serial/TCP transport | `SIM-DEVICE` |
| ClassicLadder UI | Web sections、ladder editor、variable/symbol/config/debug windows | `WEB-EQUIV` |
| PLC 与 HAL | pin 绑定、消息、工具换刀、E-stop、冷却和顺序动作 | `SIM-CORE` |
## 9. 工具、IO、主轴、换刀和探针
| 功能 | 覆盖内容 | 标记 |
|---|---|---|
| 工具表 | pocket/tool、X/Y/Z/A/B/C/U/V/W、diameter、front/rear angle、orientation、wear、offset | `SIM-CORE` |
| 工具数据库 | `db_program`、JSON/文本数据库、查询、更新、备份和迁移 | `SIM-ADAPTER` |
| 换刀 | manual、random、non-random、carousel、prepare/change、M6 remap、tool sensor、失败恢复 | `SIM-DEVICE` |
| IO control v1/v2 | tool prepare/change、coolant、lube、spindle brake、mist/flood、aux outputs | `SIM-DEVICE` |
| 主轴 | 多主轴、方向、速度、加减速、CSS、orient、gear、encoder、到速和故障 | `SIM-DEVICE` |
| 进给 | G93/G94/G95、feed hold、override、adaptive、feed stop、feed inhibit | `SIM-CORE` |
| 探针 | G38.x、probe input、位置锁存、宏、失败/超时和对刀 | `SIM-DEVICE` |
| 位置日志 | motion logger、采样、导出、回放和差异 | `WEB-EQUIV` |
## 10. GUI、VCP、可视化和配置工具
所有桌面界面不要求像素级复制,但必须覆盖其仿真工作流、状态、控制项、配置项和脚本接口。
组件信息架构、命令 pending/ack/result、通信信封、快照字段、事件/高频流、背压、错误/取消、离线恢复、多标签页租约、详细任务和 FE-M0..M5 退出条件见[前端与通信详细设计](linuxcnc-web-wasm-frontend-communication-design.md)。本节条目必须绑定该文档中的 UI 工作流和协议消息,不能只以页面存在作为验收。
| LinuxCNC 界面/工具 | Web 等价实现 |
|---|---|
| AXIS/Gremlin | 主控制台、程序、预览、3D 视图、状态、MDI、jog、override、报警、HAL 面板 |
| Gmoccapy/Gscreen | 工业面板、主题、消息、宏按钮、偏好、键盘和触控布局 |
| Touchy/QtTouchy | 触控操作、轴/关节 jog、home、MDI、程序控制和软键 |
| QtDragon/QtVCP | screen/widget schema、动态属性、signals/slots、tabs、custom widget、Vismach |
| QtPlasmaC | 等离子流程、材料表、切割参数、探高、arc-ok、暂停/恢复和日志 |
| PyVCP/GladeVCP | XML/descriptor 转 Web Component,全部 widget 属性、pin 和回调 |
| PanelUI/MDRO | 面板、数字输出、override、模式和用户按键 |
| NGCGUI/PyNGCGUI | 子程序参数表单、预览、生成/加载/运行和参数持久化 |
| HALShow/HALScope/HALMeter | pin 树、连接图、波形、触发、缩放、保存和回放 |
| Vismach | WebGL/WebGPU 机床模型、层级、关节、刀具和姿态 |
| 仿真配置编辑器 | 生成兼容的仿真 INI/HAL/工程 manifest;Stepconf/Pncconf 的驱动、板卡、引脚和时序配置排除 |
| Tooledit/Tool Database | 工具表、数据库查询、编辑、导入导出和换刀状态 |
| Image-to-G-code/NGC tools | 浏览器内纯计算插件;文件通过 OPFS/用户导入,不调用宿主程序 |
| 国际化/主题/快捷键 | 语言资源、主题变量、可配置快捷键和触摸交互 |
## 11. API、远程接口和脚本接口
| 接口 | 仿真实现 | 标记 |
|---|---|---|
| NML command/status/error | Worker 内 message bus,保留消息类型、顺序、状态和错误语义 | `SIM-ADAPTER` |
| `linuxcnc.command/stat/error` | TypeScript API + 可选 Pyodide Python binding | `PY-WASM` |
| `hal`/`hal_glib`/`pyhal` | 虚拟 pin/signal/param、监听、周期回调和类型转换 | `PY-WASM` |
| `gstat`/position logger | 状态快照、流式订阅、OPFS 日志和回放 | `WEB-EQUIV` |
| `linuxcncrsh`/远程命令 | 同源 Worker loopback;可选 WebSocket 仅连接当前仿真会话 | `SIM-ADAPTER` |
| `halcmd`/`haltcl`/`halrun` | Web 控制台命令解析;脚本只作用于当前虚拟工程 | `WEB-EQUIV` |
| MQTT/消息发布 | 本地事件总线和可选浏览器 WebSocket mock,不访问真实设备 | `SIM-DEVICE` |
| UI 插件/自定义面板 | manifest、权限、版本、生命周期和 OPFS 资源 | `WEB-EQUIV` |
### 11.1 诊断、开发和运维工具
| LinuxCNC 工具/能力 | 仿真实现 | 标记 |
|---|---|---|
| `linuxcnc_info` | 输出浏览器、WASM、Worker、OPFS、配置、组件和仿真能力报告 | `WEB-EQUIV` |
| `inivar`/INI 检查 | Web 配置查看、类型转换、include 展开和错误定位 | `WEB-EQUIV` |
| `lintini` | Worker 内静态检查全部 INI/HAL/资源引用 | `WEB-EQUIV` |
| `halcompile`/`modcompile` | 构建流水线中编译 `.comp`;Web 编辑器提供语法/接口检查 | `SIM-ADAPTER` |
| `runtests`/测试选择器 | 浏览器内按 manifest 运行 golden、回归和故障测试 | `WEB-EQUIV` |
| 仿真性能诊断 | 提供批处理耗时、Worker 延迟和 UI 帧率;`latency-test` 的内核实时延迟测试排除 | `WEB-EQUIV` |
| `debuglevel`/调试标志 | 虚拟运行时动态日志级别和 OPFS 日志 | `SIM-ADAPTER` |
| `tool_watch`/tool data monitor | 工具、换刀、数据库和快照监视器 | `WEB-EQUIV` |
| `motion-logger`/`halsampler`/`halstreamer` | 采样、导出、回放和差异可视化 | `WEB-EQUIV` |
| `axis-remote`/`schedrmt`/`linuxcnclcd`/`emclcd` | 同源命令/状态通道和虚拟显示终端 | `SIM-ADAPTER` |
| `linuxcncsvr`/远程 NML 服务 | 仅提供同源仿真会话服务;不监听宿主真实端口 | `SIM-ADAPTER` |
| `decode_dmesg`/系统诊断 | 虚拟设备和 WASM 运行时日志;无宿主内核日志 | `REAL-EXCLUDED` |
## 12. OPFS、快照和可重复仿真
| 功能 | 覆盖要求 | 标记 |
|---|---|---|
| 工程目录 | INI/HAL/TBL/VAR/NGC/PY/XML/TCL/CLP/模型/材料/日志全部可保存 | `SIM-ADAPTER` |
| 文件语义 | open/read/write/stat/readdir/rename/unlink/fsync、相对路径、大小写和错误 | `SIM-ADAPTER` |
| 事务 | prepare/commit、临时文件、SHA-256、原子替换、版本索引 | `SIM-ADAPTER` |
| 恢复 | 刷新、崩溃、半提交、版本迁移、损坏文件和回滚 | `SIM-ADAPTER` |
| 快照 | 任务、解释器、TP、运动、HAL、IO、Python、工具、参数和 UI 状态 | `SIM-ADAPTER` |
| 回放 | 从 tick/事件恢复后与连续运行结果一致 | `SIM-CORE` |
| 任务接续账本 | 请求超时、回答/工具结果丢失、重复响应、Worker 重启;按 `operation_id`、prepare/commit 和最后已验证步骤恢复 | `SIM-ADAPTER` |
| 配额 | estimate、persist、配额不足、清理 cache、导出备份 | `WEB-EQUIV` |
| 离线 | Service Worker 缓存 WASM、Pyodide、样例和 UI;无网加载已有工程 | `WEB-EQUIV` |
## 13. 测试覆盖模型
### 13.1 Golden 对照
原生 LinuxCNC 和 WASM 对每个 manifest 项输出:
- 解释器状态、当前行、模态、参数和返回值
- canonical motion、每 tick 位置/速度/加速度/跟随误差
- 轴/关节/姿态、运动学错误和限位状态
- HAL pin/signal/param、线程顺序和组件输出
- 主轴、工具、探针、换刀、冷却、等离子/激光/泡沫 IO
- Python/remap 输出、异常、日志和事件
- UI 命令、报警、状态和快照恢复结果
### 13.2 样本集合
1. `configs/sim/**` 下全部 INI 和关联资源,而不是只抽取 10 个样例。
2. `tests/**` 下全部可运行仿真测试;只依赖真实硬件、内核实时或驱动的测试登记为排除项。
3. `unit_tests/interp`、`unit_tests/tp`、posemath 和 kinematics 单元测试。
4. 每个 G/M/O 代码至少一个正常、边界、错误和暂停/恢复样例。
5. 每个 HAL 组件至少一个 pin 类型、周期、复位和异常样例。
6. 每种机床类型至少一个完整工程、模型、程序、工具表、IO 和故障回放。
7. 每个 Web UI 工作流覆盖首次启动、刷新恢复、离线、导入导出和键盘/触摸路径。
8. 每个可恢复任务至少覆盖一次请求失败、确认丢失、幂等重试和无法对账的阻断路径。
### 13.3 覆盖率门槛
- 覆盖率门槛与发布门禁 G4/G5 同步;来源、依赖、维度和交互闭包以及具体任务上下文和证据包格式见[执行与交付策略](linuxcnc-web-wasm-execution-strategy.md)第 2.1、3、7 节。
- `SIM-CORE`、`SIM-ADAPTER`、`SIM-DEVICE`、`WEB-EQUIV`、`PY-WASM`:100% manifest 条目有实现和自动测试。
- 每个条目的正常、边界、错误、暂停/恢复、持久化/离线及适用交互维度均有通过记录;缺失任一维度不得为 `accepted`。
- 关键状态和错误的原生/WASM 对照通过率:100%。
- 浮点误差按算法定义容差,默认机床单位目标 `1e-6`。
- OPFS 已提交数据在刷新、Worker 重启和模拟崩溃后可恢复。
- 任何 manifest 缺失、未测试或静默降级都阻止发布。
- 任何孤儿来源、未闭合依赖、无 oracle、未覆盖交互或未解释的差异都阻止发布。
- 前端通信条目必须同时有消息 schema、LinuxCNC 源程序映射、UI 工作流、错误/取消、背压和离线恢复测试;详细字段和 FE/COM 任务见[前端与通信详细设计](linuxcnc-web-wasm-frontend-communication-design.md)。
- `REAL-EXCLUDED` 不计入仿真覆盖率,但配置检查必须返回明确 `real_hardware_excluded`。
## 14. 实施顺序
本节的阶段 A-E 只描述功能交付顺序;对应的 M0-M5 里程碑、工作流边界、固定上下文和返工规则见[执行与交付策略](linuxcnc-web-wasm-execution-strategy.md)第 4、6、8 节。
### 阶段 A:全量清单和运行时骨架
- 生成 manifest,锁定所有文档、源码、配置和测试输入。
- 建立单 Worker、固定 tick、OPFS journal、快照和版本化 ABI。
- 建立 Python/Pyodide Worker 和虚拟 `linuxcnc/hal/gstat` 模块。
### 阶段 B:核心解释和运动全覆盖
- 移植全部 G/M/O、remap、参数、坐标系、补偿、TP、motion、全部 kinematics。
- 完成 mill/lathe/gantry/robot/delta/pentapod/foam/plasma/laser/probe 数字孪生。
### 阶段 C:HAL、PLC、IO 和虚拟机床部件
- 生成并编译全部 HAL 组件 manifest。
- 完成 ClassicLadder、虚拟寄存器、主轴/换刀/探针/编码器/stepgen/限位/故障模型。
- 完成 halcmd/haltcl/halui/HALScope/HALShow。
### 阶段 D:全部 Web UI 和配置工具
- 完成 AXIS、Gmoccapy、Touchy、Gscreen、QtVCP、QtDragon、QtPlasmaC、VCP、Vismach、NGCGUI 等仿真操作能力的 Web 等价工作流和仿真配置编辑器。
- 完成工程导入、导出、离线、国际化、主题和插件权限。
### 阶段 E:全量回归和发布
- 全部 configs/tests/golden/浏览器矩阵跑通。
- 生成版本化差异报告、兼容报告、许可证清单和工程迁移工具。
## 15. 明确排除项
以下不是仿真机床功能,因此不实现,也不能通过浏览器 API 绕过:
- 真实电机、驱动器、主轴、刀具、冷却、气路、液压和工件。
- 真实 Mesa/FPGA、并口、GPIO、PCI、串口、USB、Modbus 设备和现场总线。
- PREEMPT_RT、RTAI、Xenomai、内核模块、CPU 绑定、硬实时和物理步进脉冲。
- 真实急停、安全继电器、门锁、限位开关和人员/设备安全认证。
- 任意宿主路径、shell、fork/exec、子进程、设备文件和网络原始套接字。
排除项的仿真等价行为必须由第 6~9 节的数字孪生提供;例如“主轴不到速”要模拟成可配置状态和故障,而不是把主轴驱动标为“不支持”。