Files
linuxcncWebWASM/docs/linuxcnc-web-wasm-3axis-tutorial-state-machine.md

78 lines
3.7 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.
# 3axis Tutorial 状态机契约
本契约以 LinuxCNC `axis.py`、`linuxcnc` Python API 和 `emctaskmain/taskclass` 的源语义为 oracle。`sim_task.v1` 保持原有 schema;`axis_state` 是 Worker 响应中的附加 AXIS 视图。
## 源常量
| LinuxCNC 源常量 | 数值 | AXIS 视图 |
|---|---:|---|
| `STATE_ESTOP` | 1 | `machine_state=ESTOP` |
| `STATE_ESTOP_RESET` | 2 | `machine_state=ESTOP_RESET` |
| `STATE_OFF` | 3 | `machine_state=OFF` |
| `STATE_ON` | 4 | `machine_state=ON` |
| `MODE_MANUAL` | 1 | `source_mode=MANUAL` |
| `MODE_AUTO` | 2 | `source_mode=AUTO` |
| `MODE_MDI` | 3 | `source_mode=MDI` |
| `INTERP_IDLE` | 1 | `operation_state=IDLE` |
| `INTERP_READING` | 2 | `operation_state=RUNNING` |
| `INTERP_PAUSED` | 3 | `operation_state=PAUSED` |
| `INTERP_WAITING` | 4 | `operation_state=RUNNING`,`source_interp_state=INTERP_WAITING` |
## 八个 AXIS 核心状态
```text
ESTOP, ESTOP_RESET, OFF, ON, HOME, IDLE, RUNNING, PAUSED
```
`ESTOP/ESTOP_RESET/OFF/ON` 是 machine/task 层;`HOME` 是 home command 的 transient operation;`IDLE/RUNNING/PAUSED` 是 interpreter/task activity 层。响应字段:
```json
{
"axis_state": {
"state": "RUNNING",
"machine_state": "ON",
"operation_state": "RUNNING",
"source_task_state": "STATE_ON",
"source_interp_state": "INTERP_READING",
"source_mode": "AUTO"
}
}
```
## 源对齐迁移
| 当前 | 允许迁移 | 触发源行为 |
|---|---|---|
| `ESTOP` | `ESTOP_RESET`、`ESTOP` | AXIS `estop_clicked`: `command.state(STATE_ESTOP_RESET)` 或保持急停 |
| `ESTOP_RESET` | `ON`、`OFF`、`ESTOP` | AXIS `onoff_clicked`: `STATE_ON`;再次急停回 `ESTOP` |
| `OFF` | `ESTOP_RESET`、`ESTOP`、`OFF` | 上电必须先经过源定义的 reset 流程 |
| `ON` | `HOME`、`IDLE`、`RUNNING`、`PAUSED`、`OFF`、`ESTOP` | `manual_ok`、home、auto/mdi、off/estop |
| `HOME` | `ON`、`IDLE`、`ESTOP` | `axis.py::go_home`;本案例按 `Z -> X -> Y` individual home |
| `IDLE` | `HOME`、`RUNNING`、`PAUSED`、`OFF`、`ESTOP` | `manual_ok`、program run/pause、power/estop |
| `RUNNING` | `PAUSED`、`IDLE`、`ESTOP` | `INTERP_READING/WAITING`、pause/abort/complete/estop |
| `PAUSED` | `RUNNING`、`IDLE`、`ESTOP` | `INTERP_PAUSED`、resume/abort/estop |
`RUNNING -> HOME`、`PAUSED -> HOME`、`ESTOP -> HOME` 等迁移必须拒绝。Home 不是普通程序运行状态,必须先满足源 `manual_ok`:task `STATE_ON` 且不在 `MODE_AUTO/MDI` 非 idle 执行中。
## 按钮门控
- 急停按钮始终可用;`ESTOP` 时触发 reset,其他机器状态触发 estop。
- 上电按钮只有源状态允许时可用;`ESTOP_RESET` 才发送 `STATE_ON`,否则发送 `STATE_OFF`。
- Open/Load/MDI/Jog/Home 需要 `STATE_ON`,且 interpreter idle 或符合 MDI queue 条件。
- Run 需要 `STATE_ON + MODE_AUTO + INTERP_IDLE + task file`。
- Pause 只允许 `MODE_AUTO` 且 `INTERP_READING/INTERP_WAITING`。
- Resume 只允许 `INTERP_PAUSED`。
- Step 需要 machine on 和 task file,不能在 ESTOP/OFF 执行。
- Home 需要 machine on、manual mode、interpreter idle;本案例 UI 逐轴执行。
- Tool/spindle/coolant/probe 操作必须同时受 ESTOP、fault、interlock、spindle busy 和 tool lifecycle gate 约束。
## 验证
- 单元状态契约:`node web/worker/test_axis_state.mjs`
- 源序列:`node web/worker/test_axis3_tutorial_sequence.mjs`
- native recorder:`python3 scripts/run_axis3_tutorial_native_sequence.py`
- native/Worker sequence report:`coverage/axis3-tutorial-sequence.report.json`
- 现有 gate contract:`web/app/test_axis_contract.mjs`、`web/app/test_axis_operation_controller.mjs`
禁止修改锁定 ABI、protocol、`sim_task.v1` 字段来承载这组视图;状态契约新增字段只能作为 additive `axis_state`,并必须有 hash/迁移测试。