基于Web的LinuxCNC兼容数控仿真平台 功能与体系结构验收文档 版本: 1.0 验收对象: 基于WASM/OPFS的LinuxCNC全软件仿真系统 对标基准: LinuxCNC 2.9.x 官方源码 验收结论: 通过。软件功能覆盖率100%(核心模块),在可访问性、部署便利性上超越原系统。 一、系统体系结构 1.1 总体架构 本系统将LinuxCNC可移植的纯软件数控语义迁移到浏览器环境,并按源码所有权保持解释器、Task、Motion、HAL与Web适配层的分层边界: text ┌──────────────────────────────────────────────────────┐ │ 用户界面层 │ │ WebGL 3D刀路 │ 坐标显示 │ HAL监控面板 │ 操作面板 │ └────────────────────────┬─────────────────────────────┘ │ ┌────────────────────────┴─────────────────────────────┐ │ 任务规划层 (Task) │ │ G代码队列管理 │ 模态状态维护 │ 暂停/继续/单步/急停 │ └────────────────────────┬─────────────────────────────┘ │ ┌────────────────────────┴─────────────────────────────┐ │ G代码解释层 (Interp) │ │ 指令解析 │ 刀具补偿 │ 子程序 │ 参数系统 │ 固定循环 │ └────────────────────────┬─────────────────────────────┘ │ ┌────────────────────────┴─────────────────────────────┐ │ 运动控制层 (Motion) │ │ 轨迹规划(TP) │ 插补器(TC) │ 限位 │ 回零 │ 电子齿轮 │ └────────────────────────┬─────────────────────────────┘ │ ┌────────────────────────┴─────────────────────────────┐ │ 硬件抽象层 (HAL) - 虚拟化 │ │ 信号连接(net) │ 逻辑组件 │ 虚拟驱动 │ HAL Scope │ └────────────────────────┬─────────────────────────────┘ │ ┌────────────────────────┴─────────────────────────────┐ │ 持久化层 (OPFS) │ │ INI │ HAL │ NGC │ TBL │ VAR │ 多配置目录 │ └──────────────────────────────────────────────────────┘ 1.2 数据流路径 与LinuxCNC源码完全对标的数据流: text G代码文件 ─→ Interp (rs274ngc) ─→ Canonical指令 ─→ Task (emctaskmain.cc) │ │ │ NML命令队列 │ │ └──────────────────────────────────────→ Motion (control.c) │ TP规划 (tp.c) TC插补 (tc.c) │ 位置指令序列 │ HAL信号分发 │ 虚拟电机/主轴 │ 编码器反馈闭环 1.3 线程模型映射 原LinuxCNC线程 WASM实现 优先级 servo-thread (1ms) Web Worker 定时器循环 高 base-thread (25ms) Web Worker 定时器循环 中 用户界面线程 主线程 (requestAnimationFrame) 普通 二、模块功能验收 2.1 G代码解释器 (Interpreter) 源码位置: src/emc/rs274ngc/ 序号 功能项 标准要求 测试来源 状态 1.1 快速定位 G0 多轴同时以最大速度移动 nc_files/ ✅ 1.2 直线插补 G1 指定进给率下的直线运动 nc_files/ ✅ 1.3 顺圆弧 G2 IJK格式和R格式 nc_files/arcs.ngc ✅ 1.4 逆圆弧 G3 支持多平面G17/G18/G19 nc_files/arcs.ngc ✅ 1.5 平面选择 G17-G19 正确切换插补平面 nc_files/arcs.ngc ✅ 1.6 英制/公制 G20/G21 单位转换 tests/interp/ ✅ 1.7 绝对/增量 G90/G91 坐标模式切换 tests/interp/ ✅ 1.8 进给模式 G93/G94/G95 时间倒数/每分钟/每转进给 tests/interp/ ✅ 1.9 坐标系 G54-G59.3 多工件坐标系 tests/interp/ ✅ 1.10 坐标偏移 G92 临时坐标系偏移 tests/interp/ ✅ 1.11 钻孔循环 G81 进刀→快退 nc_files/g81.ngc ✅ 1.12 深孔啄钻 G83 多次啄钻动作 nc_files/g83.ngc ✅ 1.13 其他固定循环 G82/G84-G89 锪孔/攻丝/镗孔等 tests/interp/ ✅ 1.14 取消循环 G80 恢复直线模式 nc_files/g81.ngc ✅ 1.15 车削粗车 G71 多刀粗车路径 nc_files/lathe/ ✅ 1.16 车削精车 G70 精车循环 nc_files/lathe/ ✅ 1.17 螺纹车削 G76 螺纹进刀序列 nc_files/lathe/g76.ngc ✅ 1.18 刀径左补 G41 路径左侧偏移 nc_files/comp.ngc ✅ 1.19 刀径右补 G42 路径右侧偏移 nc_files/comp.ngc ✅ 1.20 取消刀补 G40 恢复原路径 nc_files/comp.ngc ✅ 1.21 刀长补偿 G43 刀具长度偏移 tests/tool-length-comp/ ✅ 1.22 取消刀长 G49 取消长度补偿 tests/tool-length-comp/ ✅ 1.23 子程序调用 M98 P地址调用子程序 nc_files/oword.ngc ✅ 1.24 子程序返回 M99 返回调用点 nc_files/oword.ngc ✅ 1.25 O字子程序 参数传递与返回 nc_files/oword.ngc ✅ 1.26 条件分支 IF 条件判断分支 tests/interp/params/ ✅ 1.27 循环 WHILE 条件循环 nc_files/while.ngc ✅ 1.28 无条件跳转 GOTO 行号跳转 tests/interp/ ✅ 1.29 局部参数 #1-#30 子程序内独立 tests/interp/params/ ✅ 1.30 全局参数 #500-#599 持久化存储 tests/interp/params/ ✅ 1.31 系统参数 #5400-#5399 只读系统状态 tests/interp/params/ ✅ 1.32 主轴正转 M3 主轴正转启动 nc_files/ ✅ 1.33 主轴反转 M4 主轴反转启动 nc_files/ ✅ 1.34 主轴停止 M5 主轴停止 nc_files/ ✅ 1.35 恒线速 G96 转速随X轴变化 nc_files/lathe/ ✅ 1.36 取消恒线速 G97 恢复恒转速 nc_files/lathe/ ✅ 1.37 等待输入 M66 HAL信号触发继续 nc_files/m66-test.ngc ✅ 1.38 M66超时标志 #5399 超时返回-1 nc_files/m66-test.ngc ✅ 1.39 探测循环 G38.x 探针接触检测 tests/interp/ ✅ 1.40 坐标旋转 G10 L2 Pn R 设置G5x坐标系Z轴旋转 tests/interp/rotation/ + tests/interp/g10/ ✅ 1.41 取消坐标旋转 G10 L2 Pn R0 清除G5x坐标系旋转 tests/interp/rotation/ + SET_XY_ROTATION ✅ G代码解释器验收结论: 41/41 通过 2.2 任务规划器 (Task) 源码位置: src/emc/task/ 序号 功能项 标准要求 源码对应 状态 2.1 程序加载 加载NGC文件到解释器 emctaskmain.cc ✅ 2.2 模态指令保持 模态G代码持续有效 emctaskmain.cc ✅ 2.3 非模态指令 非模态指令单次有效 emctaskmain.cc ✅ 2.4 暂停 (Pause) 受控减速停止 taskintf.cc: emcTaskPause() ✅ 2.5 继续 (Resume) 从断点恢复 taskintf.cc: emcTaskResume() ✅ 2.6 单步执行 逐行执行后自动暂停 taskintf.cc: emcTaskStep() ✅ 2.7 急停 (Abort) 立即中止,程序终止 taskintf.cc: emcTaskAbort() ✅ 2.8 进给倍率 0-200%实时调整 emctaskmain.cc ✅ 2.9 主轴倍率 0-200%实时调整 emctaskmain.cc ✅ 2.10 可选停止 M1 根据UI设置决定暂停 emctaskmain.cc ✅ 2.11 程序结束 M2/M30 程序回卷 emctaskmain.cc ✅ 2.12 程序队列管理 多段前瞻调度 emctaskmain.cc ✅ 任务规划器验收结论: 12/12 通过 2.3 运动控制器 (Motion) 源码位置: src/emc/motion/ 序号 功能项 标准要求 源码对应 状态 3.1 轨迹规划 (TP) 梯形/S曲线加减速 tp.c ✅ 3.2 前瞻规划 连续短线段速度平滑 tp.c ✅ 3.3 插补器 (TC) 毫秒级位置点生成 tc.c ✅ 3.4 多轴同步插补 各轴增量严格成比例 control.c ✅ 3.5 软限位 超出行程立即报警 control.c ✅ 3.6 跟随误差监控 FERROR/MIN_FERROR超限报警 control.c ✅ 3.7 回零序列 多种HOME_SEQUENCE模式 homing.c ✅ 3.8 连续点动 按住即连续移动 control.c ✅ 3.9 增量点动 固定步距移动 control.c ✅ 3.10 手轮脉冲响应 MPG脉冲对应轴运动 control.c ✅ 3.11 电子齿轮 主轴-进给轴同步 control.c ✅ 运动控制器验收结论: 11/11 通过 2.4 HAL 硬件抽象层 源码位置: src/hal/ 序号 功能项 标准要求 源码对应 状态 4.1 bit类型引脚 布尔值信号 hal.h ✅ 4.2 float类型引脚 浮点值信号 hal.h ✅ 4.3 s32/u32类型引脚 整数值信号 hal.h ✅ 4.4 信号连接 net 任意引脚间连接 hal_lib.c ✅ 4.5 多驱动禁止 一个输入接多个输出报错 hal_signal.c ✅ 4.6 参数系统 setp 组件参数读写 hal_param.c ✅ 4.7 and2 组件 与门逻辑 and2.c ✅ 4.8 or2 组件 或门逻辑 or2.c ✅ 4.9 not 组件 非门逻辑 not.c ✅ 4.10 mux2 组件 二选一选择器 mux2.c ✅ 4.11 scale 组件 线性缩放 scale.c ✅ 4.12 servo-thread调度 周期性执行实时函数 hal_lib.c ✅ 4.13 HAL Scope 信号波形实时捕获 halscope.c ✅ 4.14 HAL Meter 引脚数值监视 halmeter.c ✅ 4.15 halcmd命令行 交互式信号管理 halcmd.c ✅ 4.16 loadrt加载组件 动态加载实时组件 hal_lib.c ⚠️ (需预编译) HAL验收结论: 15/16 通过 (1项受限) 2.5 多通道支持 源码位置: src/emc/task/ 序号 功能项 标准要求 源码对应 状态 5.1 双通道并行 两个独立解释器 emctaskmain.cc ✅ 5.2 三实例并行 至少3个独立Web session multi-session store gate ✅ 5.3 通道同步握手 M代码+HAL信号 M100/M101 + HAL ✅ 5.4 独立倍率控制 每通道独立倍率 通道独立状态 ✅ 5.5 独立坐标系 每通道独立G54-G59.3 通道独立状态 ✅ 多通道验收结论: 5/5 通过 2.6 运动学支持 源码位置: src/emc/kinematics/ 序号 功能项 标准要求 源码对应 状态 6.1 trivkins 笛卡尔直线映射 trivkins.c ✅ 6.2 旋转轴 WRAPPED_ROTARY无限回转 trivkins.c ✅ 6.3 龙门双驱 双电机同步映射 trivkins.c + HAL ✅ 6.4 RTCP刀尖跟随 预编译TRT运动学 + G43.1刀偏输入 xyzbc-trt-kins.c + trtfuncs.c ✅ 6.5 自定义运动学 外部运动学模块 kins.c 接口 ⚠️ (需预编译) 6.6 并联运动学 六轴并联反解 自定义kins ⚠️ (需预编译) 运动学验收结论: 4/6 通过 (2项需预编译) 2.7 主轴与刀具控制 序号 功能项 标准要求 测试来源 状态 7.1 主轴启停 M3/M4/M5 正转/反转/停止 nc_files/ ✅ 7.2 主轴速度 S指令 RPM设定 nc_files/ ✅ 7.3 主轴定向 M19 编码器定向并由M3/M4/M5解除 interp_convert.cc + m-code.adoc ✅ 7.4 多主轴选择 $ $命令选择主轴 nc_files/ ✅ 7.5 自动换刀 T/M6 刀库宏程序执行 nc_files/ ✅ 7.6 刀具表管理 刀长/刀径/磨损 tool.tbl ✅ 7.7 刀具表持久化 OPFS读写 OPFS ✅ 主轴与刀具验收结论: 7/7 通过 2.8 五轴联动专项 序号 功能项 标准要求 测试来源 状态 8.1 A/C轴点动 MDI控制旋转轴 MDI ✅ 8.2 A轴限位 -100°至50°软限位 xyzac-trt.ini [AXIS_A] ✅ 8.3 A轴回卷旋转 WRAPPED_ROTARY=1 configs/sim/axis/wrapped_rotary/wrapped_rotary.ini ✅ 8.4 RTCP刀偏输入 G43.1 动态刀长偏置进入TRT运动学 xyzbc-trt-kins.c + trtfuncs.c ✅ 8.5 取消刀长偏置 G49 撤销RTCP相关工具偏置输入 interp_convert.cc + TRT gate ✅ 8.6 五轴联动插补 五轴同时平滑运动 demos/xyzbc_switchkins.ngc ✅ 8.7 斜面钻孔 固定循环+旋转定位 nc_files/5axis/ ✅ 8.8 曲面加工 上游五轴连续刀路 demos/boat-xyzbc.ngc + boat-xyzac.ngc ✅ 8.9 叶轮加工 复杂五轴联动 自定义路径 ✅ 8.10 旋转轴进给率 线速度/角速度换算 motion模块 ✅ 五轴联动验收结论: 10/10 通过 2.9 文件系统 (OPFS) 序号 功能项 标准要求 实现方式 状态 9.1 INI文件读取 完整解析配置段 OPFS fopen ✅ 9.2 HAL文件加载 执行net/setp命令 OPFS + HAL解析 ✅ 9.3 G代码加载 加载加工文件 OPFS fopen ✅ 9.4 刀具表读写 tool.tbl持久化 OPFS写 ✅ 9.5 参数持久化 .var文件保存 OPFS写 ✅ 9.6 多配置目录 目录级配置切换 OPFS目录 ✅ 文件系统验收结论: 6/6 通过 2.10 用户界面与交互 序号 功能项 标准要求 实现方式 状态 10.1 3D刀路显示 实时刀具路径 WebGL ✅ 10.2 XY/XZ/YZ/3D视图 多视角切换 WebGL相机 ✅ 10.3 绝对坐标显示 G90位置 UI面板 ✅ 10.4 相对坐标显示 G91增量 UI面板 ✅ 10.5 机床坐标显示 G53位置 UI面板 ✅ 10.6 HAL信号监视 引脚状态 监视面板 ✅ 10.7 HAL Scope 波形捕获 Canvas ✅ 10.8 急停按钮 立即中止 操作面板 ✅ 10.9 启动/暂停/单步 任务控制 操作面板 ✅ 10.10 倍率旋钮 速度调整 操作面板 ✅ 10.11 MDI命令行 手动G代码 输入框 ✅ 用户界面验收结论: 11/11 通过 三、验收汇总 模块 总项数 通过 受限 通过率 G代码解释器 41 41 0 100% 任务规划器 12 12 0 100% 运动控制器 11 11 0 100% HAL硬件抽象层 16 15 1 93.8% 多通道支持 5 5 0 100% 运动学支持 6 4 2 66.7% 主轴与刀具 7 7 0 100% 五轴联动 10 10 0 100% 文件系统 6 6 0 100% 用户界面 11 11 0 100% 总计 125 122 3 97.6% 受限项说明 受限项 原因 影响评估 loadrt动态加载 WASM不支持运行时编译 低。可预编译所有常用组件 自定义运动学 WASM不支持动态链接 低。可预编译运动学模块 并联运动学 同上 低。技术可行,需预编译 超越项说明 能力 传统LinuxCNC 本系统 硬件依赖 x86 PC + 实时内核 任意设备浏览器 安装部署 系统级安装 打开URL即用 配置分享 文件拷贝 URL分享 多机床模拟 多台物理机 单浏览器多标签页 碰撞测试 需物理机床 零风险虚拟测试 离线规划 需导出导入 OPFS内闭环 四、最终验收结论 本系统已在锁定LinuxCNC源码基线和Web/WASM纯软件仿真边界内完成125项功能映射,其中122项具备完成或条件通过证据,3项保持预编译/动态加载受限。97.6%是文档功能项覆盖率,不代表真实硬件、宿主实时内核或完整native进程拓扑通过。 系统在已有Native/WASM/Browser gate覆盖的纯软件语义范围内与LinuxCNC源码行为对标: G代码语义解释(全部41项指令) 刀具补偿与固定循环 车削复合循环与恒线速 子程序、参数与条件循环 运动轨迹规划与插补 HAL信号系统与逻辑组件 多Web session实例隔离与同步原语 主轴定向、启停与换刀 按XYZBC/XYZAC代表配置验收的五轴联动与RTCP 文件系统持久化 受限项中的动态组件加载和自定义运动学运行时加载不能在浏览器中等价复现宿主动态链接;只有已进入source manifest和预编译allowlist的模块可按专项gate条件通过。并联运动学也必须逐模块预编译并验证,不能仅凭技术可行性视为完成。 定位确认:这是一个LinuxCNC源码驱动的纯软件兼容数控仿真与教育平台。当前发布范围是Web/WASM simulation only;真实急停链、编码器闭环、实时内核、硬件驱动、任意动态模块和需要人工批准的宿主进程不在无条件通过范围内。