Files
linuxcncWebWASM/docs/linuxcnc-axis-web-wasm-detailed-flowcharts.md

15 KiB
Raw Blame History

LinuxCNC AXIS Web/WASM 控制面板详细技术流程图

更新时间:2026-09-03

本文将 LinuxCNC AXIS 的可见控制入口、按钮相互制约关系、WASM 命令、状态回执和显示数据画成可执行流程。目标案例为 XYZAC TRT;所有程序、运动和设备结果必须来自 LinuxCNC WASM,React 只负责输入、传输、投影和显示。

1. 总体技术边界

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 按钮互斥总图

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. 机床状态图

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. 通用命令流

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

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. 验收

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。

页面临时上下文使用 Worker-only OPFS 双槽位 JSON;它不进入 CNC protocol sequence,也不保存运动 authority。断电 checkpoint 由 Worker 写入 OPFS,下一次 LOAD_WORKSPACE 时再提交给 LinuxCNC WASM 校验和恢复。