diff --git a/README.md b/README.md index db97be1..6414e34 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ - 路线对齐的 React 前端位于 `web/react`:React + TypeScript + Vite + Tailwind + Radix UI + Three.js,React 只通过 protocol.v1/WorkerClient 访问 Dedicated Worker;FE-M1 构建证据见 `coverage/react-frontend-m1.report.json`。 - AXIS 主界面完全对标的源程序功能清单、菜单/工具栏/状态门控、严格差异流程、任务分解和 M0-M7 验收门槛见 [`LinuxCNC AXIS 完全对标规范与执行计划`](docs/linuxcnc-axis-complete-parity-spec.md)。该文档以锁定的 `linuxcnc/share/axis/tcl/axis.tcl`、Gremlin/GLCanon、原始 bitmap 和 `configs/sim/axis` 为唯一 source oracle。 - Web 控制面板操作必须遵守 [`LinuxCNC AXIS Web 铁律`](docs/linuxcnc-axis-web-iron-law.md):AXIS 源码和 LinuxCNC WASM 是唯一操作权威,React/JavaScript/Three.js 不得成为第二套运动或状态实现。 +- 每个控制按钮的前置、互斥、后置状态及数据流见 [`LinuxCNC AXIS Web/WASM 详细技术流程图`](docs/linuxcnc-axis-web-wasm-detailed-flowcharts.md)。 ## 当前发布范围 diff --git a/docs/linuxcnc-axis-web-wasm-detailed-flowcharts.md b/docs/linuxcnc-axis-web-wasm-detailed-flowcharts.md new file mode 100644 index 0000000..a466f02 --- /dev/null +++ b/docs/linuxcnc-axis-web-wasm-detailed-flowcharts.md @@ -0,0 +1,272 @@ +# LinuxCNC AXIS Web/WASM 控制面板详细技术流程图 + +更新时间:2026-09-03 + +本文将 LinuxCNC AXIS 的可见控制入口、按钮相互制约关系、WASM 命令、状态回执和显示数据画成可执行流程。目标案例为 XYZAC TRT;所有程序、运动和设备结果必须来自 LinuxCNC WASM,React 只负责输入、传输、投影和显示。 + +## 1. 总体技术边界 + +~~~mermaid +flowchart LR + USER[用户] --> APP[React AXIS UI] + APP --> CLIENT[WorkerClient] + CLIENT --> WORKER[Dedicated Worker] + WORKER --> SESSION[SimSession] + SESSION --> GATE[WASM Task gate] + GATE --> RUNTIME[LinuxCNC WASM runtime] + RUNTIME --> INTERP[WASM interpreter] + RUNTIME --> TP[LinuxCNC source TP] + RUNTIME --> KINS[WASM kinematics] + RUNTIME --> IO[WASM HAL/IO] + RUNTIME --> SNAP[panel_snapshot] + SNAP --> CLIENT + CLIENT --> APP +~~~ + +## 2. 全部按钮矩阵 + +| 控件 | WASM 命令 | 前置条件 | 互斥/阻断 | 成功后 | +| --- | --- | --- | --- | --- | +| Emergency Stop | ESTOP | session ready | 无,最高优先级 | ESTOP | +| Release E-stop | ESTOP false | machine=ESTOP | 非 ESTOP 禁用 | ESTOP_RESET | +| Power On | POWER true | non-estop、无 fault | estop/fault/spindle busy | ON | +| Power Off | POWER false | ON | OFF 时禁用 | OFF,程序保留 | +| Reset | RESET | reset gate | WASM gate 决定 | task/IO reset | +| HOME ALL | HOME all | ON、manual_ok | OFF/ESTOP/运行中 | 五轴 homed | +| Run | PROGRAM_RUN | ON、homed、loaded | running/paused/aborted | RUNNING | +| Pause | PROGRAM_PAUSE | RUNNING | 不得和 Resume 并发 | PAUSED,保留 queue | +| Resume | PROGRAM_RESUME | PAUSED | 不得和 Pause 并发 | RUNNING | +| Stop | PROGRAM_ABORT | RUNNING/PAUSED | 先停止 poll | STOPPED,queue=0 | +| Step | PROGRAM_STEP | AUTO、queue idle | running 时禁用 | 单块后 PAUSED | +| Restart | PROGRAM_RESTART | aborted/completed/loaded | 运行中禁用 | loaded | +| Manual 页签 | SET_MODE MANUAL | 非运行 | running/paused 阻断 | MANUAL | +| MDI 页签 | SET_MODE MDI | 非运行 | running/paused 阻断 | MDI | +| Jog X/Y/Z/A/C | JOG_START | MANUAL、ON、homed | OFF/ESTOP/运行 | WASM TP queue | +| Jog Stop | JOG_STOP | jog active | 不是 PROGRAM_PAUSE | queue=0 | +| MDI Go | MDI_EXECUTE | MDI、ON、homed | running/queue full | MDI queue | +| Spindle CW/CCW | SPINDLE_COMMAND | MANUAL、ON、IO ready | estop/fault | IO spindle state | +| Spindle Stop | SPINDLE_COMMAND off | spindle gate | 不只改 UI | speed decays | +| Brake | SPINDLE_BRAKE | spindle gate | IO busy/fault | brake state | +| Mist/Flood | COOLANT_COMMAND | IO ready | estop/fault | device IO state | +| Prepare/Change tool | TOOL_PREPARE/CHANGE | tool gate/handshake | running/fault | tool state | +| Arm/Disarm probe | PROBE_CONFIG | probe gate | estop/fault | probe state | +| Feed/Spindle/Max override | SET_* | override gate | out of range | WASM override | +| Clear plot | VISUAL_CLEAR | session ready | 不清 program | visual empty | +| Views/Zoom/DRO | UI projection | 任意 | 不改 runtime | camera/display | +| Block delete/Optional pause | disabled | ABI unavailable | 不得 JS 模拟 | blocked_by_abi | +| Override Limits | disabled | ABI unavailable | 不得 JS 模拟 | blocked_by_abi | + +### 2.6 逐控件完整索引 + +| 区域 | 控件/按钮 | 命令或动作 | 必须启用时 | 必须禁用/互斥时 | 成功/变化后的唯一来源 | +| --- | --- | --- | --- | --- | --- | +| File menu | Reload editor | LOAD_WORKSPACE + PROGRAM_LOAD | 非运行、非加载中、load gate | RUNNING/PAUSED/loading | WASM program source、preview、source_hash | +| File menu | Edit tool data | host boundary notice | 浏览器环境仅提示 | 不得伪造 desktop editor | command status | +| File menu | Quit | host boundary notice | 浏览器标签页不退出进程 | 始终不可执行 desktop quit | command status | +| Machine menu | Emergency Stop | ESTOP | session ready | 无互斥,最高优先级 | WASM IO/task ESTOP | +| Machine menu | Power On/Off | POWER | power gate | estop/fault/busy 或已处于目标状态 | IO ready、axis_state | +| Machine menu | Reset machine | RESET | reset gate | gate disabled 时 | WASM task/IO reset | +| Machine menu | Run program | PROGRAM_RUN | run gate | OFF、未回零、running、paused、aborted | task/program RUNNING | +| Machine menu | Step | PROGRAM_STEP | step gate | RUNNING 或 queue 非空 | 一个 WASM canonical block | +| Machine menu | Pause | PROGRAM_PAUSE | pause gate | idle、paused、非 AUTO reading | task/program PAUSED | +| Machine menu | Resume | PROGRAM_RESUME | resume gate | 非 paused | task/program RUNNING | +| Machine menu | Stop | PROGRAM_ABORT | abort gate | 无活动程序时由 WASM gate 决定 | STOPPED、queue=0 | +| View menu | Preview | 仅切换右侧 tab | 始终 | 不影响 runtime | visual snapshot | +| View menu | DRO | 仅切换右侧 tab | 始终 | 不影响 runtime | pose/joints snapshot | +| View menu | Manual Control | SET_MODE(MANUAL) | 非运行/暂停 | AUTO active | task.mode | +| View menu | MDI | SET_MODE(MDI) | 非运行/暂停 | AUTO active | task.mode | +| Toolbar | Open G-code file | file picker -> PROGRAM_LOAD | 非运行、非加载中 | RUNNING/PAUSED/loading | WASM program/preview | +| Toolbar | Load exact XYZAC case | LOAD_WORKSPACE + PROGRAM_LOAD | load gate | running/loading | configuration/program snapshot | +| Toolbar | Reopen editor defaults | LOAD_WORKSPACE + PROGRAM_LOAD | load gate、非运行 | running/loading | 默认案例 WASM preview | +| Toolbar | Run current file | PROGRAM_RUN | run gate | 同 Run program | RUNNING | +| Toolbar | Execute next line | PROGRAM_STEP | step gate | RUNNING/queue active | PAUSED/current line | +| Toolbar | Pause/Resume icon | PROGRAM_PAUSE 或 PROGRAM_RESUME | 对应 gate | 状态相反时禁用 | PAUSED/RUNNING | +| Toolbar | Stop icon | PROGRAM_ABORT | abort gate | 无活动时禁用 | STOPPED/aborted | +| Toolbar | Block delete | 无当前 ABI | 始终禁用 | 不得 JS 模拟 | blocked_by_abi | +| Toolbar | Optional pause | 无当前 ABI | 始终禁用 | 不得 JS 模拟 | blocked_by_abi | +| Toolbar | Zoom in/out | view transform | 始终 | 不改变 runtime | camera zoom | +| Toolbar | Top view | view=z | 始终 | 不改变 runtime | camera projection | +| Toolbar | Rotated top view | view=z2 | 始终 | 不改变 runtime | camera projection | +| Toolbar | Side view | view=x | 始终 | 不改变 runtime | camera projection | +| Toolbar | Front view | view=y | 始终 | 不改变 runtime | camera projection | +| Toolbar | Inverted front view | view=y2 | 始终 | 不改变 runtime | camera projection | +| Toolbar | Perspective view | view=p | 始终 | 不改变 runtime | camera projection | +| Toolbar | Drag/rotate mode | rotateMode | 始终 | 不改变 runtime | camera pose | +| Toolbar | Clear live plot | VISUAL_CLEAR | session ready | 不清程序、不改 TP | visual layer | +| XYZAC | Identity | KINEMATICS_SELECT(0) | queue=0、非运行 | active motion/queue | WASM switchkins active_type=0 | +| XYZAC | TCP: XYZAC | KINEMATICS_SELECT(1) | queue=0、非运行 | active motion/queue | active_type=1 | +| XYZAC | User K | KINEMATICS_SELECT(2) | queue=0、非运行 | active motion/queue | active_type=2 | +| XYZAC | Clear plot | VISUAL_CLEAR | session ready | 不清程序 | visual layer | +| Manual | Axis X/Y/Z/A/C radio | local selection | manual tab | 不直接产生 motion | next JOG payload | +| Manual | Jog -/+ | JOG_START | MANUAL、ON、homed | running/MDI/off/estop | WASM TP queue | +| Manual | Jog Stop | JOG_STOP | jog active/safe stop | 不得转为 PROGRAM_PAUSE | queue=0 | +| Manual | Increment selector | JOG_START payload | MANUAL | 非法值由 WASM 拒绝 | TP increment | +| Manual | Home Axis | HOME(axis) | home gate | running/estop/off | home_limit | +| Manual | Home All | HOME(all=true) | home gate | running/estop/off | homed_axes | +| Manual | Touch Off | MDI_EXECUTE(G92) | coordinate/MDI gate | running、ABI 不可用 | WASM coordinates | +| Manual | Tool Touch Off | TOOL_TOUCH_OFF | 完整 ABI 可用时 | 当前配置 blocked_by_abi | WASM tool/coordinate | +| Manual | Spindle CCW/CW | SPINDLE_COMMAND | MANUAL、IO ready | estop/fault/not ready | io.spindles[0] | +| Manual | Spindle Stop | SPINDLE_COMMAND off | spindle gate | 不只改 pressed | speed/enable | +| Manual | Spindle -/+ | SPINDLE_COMMAND delta | spindle gate | 范围错误 | command_rpm | +| Manual | Brake | SPINDLE_BRAKE | spindle gate | IO busy/fault | brake | +| Manual | Mist | COOLANT_COMMAND(mist) | coolant gate | estop/fault | device_io.coolant.mist | +| Manual | Flood | COOLANT_COMMAND(flood) | coolant gate | estop/fault | device_io.coolant.flood | +| Manual | Prepare T1 | TOOL_PREPARE | tool gate | running/fault | tool.prepared | +| Manual | Change | TOOL_CHANGE | prepared/handshake | running/unprepared | current_tool/tool_state | +| Manual | Arm Probe | PROBE_CONFIG(arm) | probe gate | estop/fault | probe.state | +| Manual | Disarm | PROBE_CONFIG(disarm) | probe gate | estop/fault | probe.state | +| MDI | Command input | local draft | MDI tab | 不直接执行 | input text | +| MDI | Go | MDI_EXECUTE | MDI、ON、homed、queue 未满 | running/paused/off/full | WASM interpreter/TP | +| MDI | History item | 回填 input | 始终 | 不直接执行 | input text | +| Metrics | Jog Speed | SET_JOG_SCALE | jog gate | out of range | WASM TP scale | +| Metrics | Feed Override | SET_OVERRIDE | override gate | loading/out of range | WASM feed override | +| Metrics | Spindle Override | SET_SPINDLE_OVERRIDE | override gate | out of range | WASM spindle override | +| Metrics | Max Velocity | SET_MAX_VELOCITY | override gate | out of range | WASM TP velocity | +| Metrics | path/live/limits/velocity/offsets/extents | visual layer toggle | 始终 | 不改 runtime | existing snapshot fields | +| Program | Load | PROGRAM_LOAD | load gate、非运行 | running/paused/loading | WASM source/preview | +| Program | Run | PROGRAM_RUN | run gate | same Run constraint | program status | +| Program | Step | PROGRAM_STEP | step gate | running/queue active | paused/current line | +| Program | Editor text | local draft | 非运行可编辑 | 不等于 runtime load | PROGRAM_LOAD 后才生效 | +| Program | Preview/DRO tab | local tab | 始终 | 不影响 runtime | existing snapshot | + +### 2.7 按钮互斥总图 + +~~~mermaid +flowchart TD + WASM[WASM snapshot] --> IOREADY{io.ready 且非 estop?} + IOREADY -->|否| SAFE[仅 ESTOP/Release/Power/Load 等安全动作] + IOREADY -->|是| MACHINE{machine_state=ON?} + MACHINE -->|否| POWER[Power On] + MACHINE -->|是| HOMED{homed_axes 五轴 true?} + HOMED -->|否| HOME[HOME ALL / HOME AXIS] + HOMED -->|是| MODE{task.mode} + MODE -->|MANUAL| MANUAL[JOG / spindle / coolant / tool / probe] + MODE -->|MDI| MDI[MDI Go / queued MDI] + MODE -->|AUTO| AUTO[Run / Pause / Resume / Step / Abort] + MANUAL --> RUNNING{program active?} + MDI --> RUNNING + RUNNING -->|是| BLOCKMAN[阻断 JOG / MDI / HOME / SET_MODE / switchkins] + RUNNING -->|否| ALLOWMAN[允许 manual_ok 等价动作] + AUTO --> PAUSEQ{program paused?} + PAUSEQ -->|否| PAUSE[Pause 可用] + PAUSEQ -->|是| RESUME[Resume 可用] + AUTO --> ABORT[Abort/Stop 始终受 abort gate] + ABORT --> ABORTED[program=aborted] + ABORTED --> RELOAD[Restart / Program Load] + RELOAD --> LOADED[program=loaded] + LOADED --> RUNQ{run gate enabled?} + RUNQ -->|是| RUN[Run] + RUNQ -->|否| WAIT[保持禁用并显示 gate reason] +~~~ + +### 2.8 按钮互斥规则的优先级 + +发生多个条件时按下面优先级处理,优先级高的条件覆盖低优先级: + +1. ESTOP 和 fault:停止运动,禁用所有非安全运动/设备按钮。 +2. protocol/schema/sequence/tick 错误:拒绝当前命令,不执行副作用。 +3. machine OFF 或未上电:只允许 Power、Release/ESTOP、Reset、Load 等安全/准备动作。 +4. 未回零:允许 HOME,禁止依赖机床坐标的 JOG、MDI 和程序运行。 +5. AUTO/MDI 解释器运行:允许 Pause/Resume/Abort/Power Off/ESTOP,禁止 Manual、MDI、JOG、HOME、switchkins。 +6. PAUSED:只允许 Resume、Abort、Power、ESTOP 和只读 snapshot,禁止自动 SET_MODE。 +7. program aborted:必须 Restart 或重新 Load,禁止直接 Run。 +8. ABI unavailable:按钮必须保持 disabled,显示 blocked_by_abi,不得由 JavaScript 替代。 + +任何按钮由禁用变为可用,都必须先收到新的 WASM snapshot;React 不得仅依据点击事件自行解除互斥。 + +## 3. 机床状态图 + +~~~mermaid +stateDiagram-v2 + [*] --> OFF + OFF --> ESTOP: ESTOP + ESTOP --> ESTOP_RESET: release + ESTOP_RESET --> ON: POWER ON + OFF --> ON: POWER ON + ON --> HOME: HOME ALL + HOME --> IDLE: all homed + IDLE --> RUNNING: RUN + RUNNING --> PAUSED: PAUSE + PAUSED --> RUNNING: RESUME + RUNNING --> STOPPED: ABORT + PAUSED --> STOPPED: ABORT + STOPPED --> ON: recovery/load/restart + RUNNING --> OFF: POWER OFF + PAUSED --> OFF: POWER OFF +~~~ + +## 4. 通用命令流 + +~~~mermaid +flowchart TD + CLICK[用户操作] --> OP[operation_id] + OP --> ENV[protocol envelope] + ENV --> VALIDATE[validate schema/context/seq/tick] + VALIDATE -->|error| PERR[protocol ERROR] + VALIDATE -->|ok| ACCEPT[WASM sim_protocol_accept] + ACCEPT --> GATE[WASM Task gate] + GATE -->|disabled| REJECT[gate_reason + ERROR] + GATE -->|enabled| EVENT[event log + timeline] + EVENT --> HANDLER[WASM handler] + HANDLER -->|error| FAIL[rollback + ERROR] + HANDLER -->|success| SNAP[WASM snapshot/hash] + SNAP --> RESULT[COMMAND_RESULT] + RESULT --> REDUCER[React reducer] + REDUCER --> UI[显示状态] +~~~ + +## 5. 固定 tick + +~~~mermaid +flowchart TD + STEP[SIM_STEP] --> TASK[WASM Task/program] + TASK --> INTERP[interpreter canonical] + INTERP --> TP[LinuxCNC source TP] + TP --> KINS[IK/switchkins/RTCP] + KINS --> MOTION[motion queue] + MOTION --> FEEDBACK[FK/feedback] + FEEDBACK --> LIMIT[home/limit] + LIMIT --> HAL[HAL/PLC] + HAL --> IO[spindle/coolant/tool/probe] + IO --> TRACE[execution trace] + TRACE --> SNAP[pose/joints/velocity/current line/queue/hash] +~~~ + +## 6. AXIS 对照 + +| AXIS 源入口 | Web/WASM | +| --- | --- | +| manual_ok | WASM command gate | +| ensure_mode | SET_MODE | +| open_file_guts | PROGRAM_LOAD transaction | +| reload_file | PROGRAM_RESTART/Reopen | +| task_run | PROGRAM_RUN | +| task_pause | PROGRAM_PAUSE | +| task_resume | PROGRAM_RESUME | +| task_stop | PROGRAM_ABORT | +| task_step | PROGRAM_STEP | +| jog_on/jog_off_actual | JOG_START/JOG_STOP | +| spindle_forward_toggle | SPINDLE_COMMAND | +| brake_on/off | SPINDLE_BRAKE | +| mist_toggle/flood_toggle | COOLANT_COMMAND | +| send_mdi_command | MDI_EXECUTE | +| clear_live_plot | VISUAL_CLEAR | + +## 7. 验收 + +~~~mermaid +flowchart LR + SOURCE[AXIS source/config lock] --> NATIVE[native LinuxCNC] + SOURCE --> WASM[WASM C tests] + WASM --> WORKER[Worker tests] + WORKER --> REACT[React build] + REACT --> BROWSER[Chromium audit] + NATIVE --> COMPARE[逐字段/逐 tick compare] + WASM --> COMPARE + WORKER --> COMPARE + BROWSER --> COMPARE + COMPARE -->|all formal oracle| CANDIDATE[release candidate] + COMPARE -->|difference| STOP[STOP_RELEASE] +~~~ + +当前浏览器审计要求:WASM authority 标记正确、browser_errors=0、所有按钮有 command result 或明确 gate/ABI 原因;面板 verified 不等于完整 TP oracle verified。