对齐 gmoccapy XYZAB 模式互锁

This commit is contained in:
2026-06-26 18:19:49 -04:00
parent 0664ea9bd7
commit 544bfd4b4b
13 changed files with 591 additions and 6 deletions

View File

@@ -0,0 +1,56 @@
# 01-项目功能内容
## 目标
以 LinuxCNC `gmoccapy_XYZAB.ini` 五轴仿真配置为行为基准,执行、测试并完善 `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan`。数控系统仿真功能应尽量与 LinuxCNC 源程序行为一致;发现不一致时,在 Web 项目中修复并补充验收证据。
## 对标范围
### 启动与配置
- INI 解析:`[DISPLAY]``[TASK]``[EMCMOT]``[TRAJ]``[KINS]``[HAL]``[RS274NGC]``[PYTHON]` 等关键段。
- 启动顺序:`linuxcncsvr`、RTAPI/HAL、`milltask``halui`、HALFILE、`halcmd start``gmoccapy`、POSTGUI_HALFILE。
- 五轴配置:`COORDINATES = X Y Z A B``JOINTS = 5``trivkins coordinates=xyzab`
### 任务、状态与互锁
- NML 命令、状态、错误通道的 Web 等效模型。
- `STATE_ESTOP``STATE_ESTOP_RESET``STATE_OFF``STATE_ON`
- `MODE_MANUAL``MODE_MDI``MODE_AUTO`
- `INTERP_IDLE`、运行、暂停、停止、abort。
- `NO_FORCE_HOMING = 0` 下的全轴回零互锁。
- 自动运行、MDI、点动、回零、主轴、冷却、倍率、限位、换刀互锁。
### HAL 与仿真 IO
- `core_sim_XYZAB.hal`motmod、五轴位置反馈回环、急停回环、换刀回环、主轴/冷却信号。
- `spindle_sim.hal`:速度斜坡、编码器反馈、`spindle.0.at-speed`
- `simulated_home.hal`X/Y/Z 回零开关模拟。
- `gmoccapy_postgui.hal`GUI HAL pins、主轴反馈条、到速 LED、刀补显示、换刀回环。
- `HALUI = halui` 默认入口。
### G-code 解释与五轴运动
- RS274NGC 解释器行为。
- MDI 命令发送与状态回读。
- 自动运行文件、暂停、继续、单步、停止、从行运行。
- `M6``M61` REMAP 相关换刀语义。
- 五轴轨迹、单位换算、RTCP/运动学边界。
### gmoccapy 界面等效行为
- 周期轮询:`[DISPLAY] CYCLE_TIME = 100` ms。
- 按钮/页面敏感状态互锁。
- DRO、程序进度、主轴反馈、冷却液、工具/刀补、错误消息。
- 外部 HAL 硬按钮和点动 pin 驱动 GUI 后再通过命令通道进入任务层。
## 当前项目入口
- Web 应用:`/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app`
- 核心运行时:`app/src/runtime`
- gmoccapy UI`app/src/ui`
- 状态存储:`app/src/state`
- 机床配置/profile`app/src/profiles`
- Node 验证:`tests/node`
- 浏览器验证:`tests/browser`

View File

@@ -0,0 +1,48 @@
# 02-项目程序开发详细步骤
## 步骤 1建立工作控制文件
- 创建 README、功能内容、开发步骤、推进台账、任务矩阵、验收证据、决策记录。
- 把任务按 LinuxCNC 执行流程拆分为可验收条目。
## 步骤 2读取基准与现有实现
- 读取 `work/working3/gmoccapy_XYZAB_execution_analysis.md`
- 读取 Web 项目 runtime、state、profile、ui 和测试文件。
- 将 LinuxCNC 执行链路映射到 Web 项目模块。
## 步骤 3执行现有测试
-`app` 下运行 `npm run smoke:node`
- 运行构建:`npm run build`
- 运行浏览器冒烟:`npm run smoke`
- 如有失败,先定位是否为环境、测试夹具或功能差异。
## 步骤 4差异分析
按任务矩阵逐项检查:
- INI/HAL/profile 是否覆盖 `gmoccapy_XYZAB.ini` 的五轴语义。
- task/HAL runtime 是否覆盖状态机、互锁、回零、运行、暂停、停止、换刀、主轴、冷却、倍率。
- interpreter/kinematics/session 是否覆盖 LinuxCNC 解释和五轴运行边界。
- UI 是否按 gmoccapy 规则启停按钮并显示状态。
## 步骤 5修改实现
- 优先修复已有测试暴露的问题。
- 对未覆盖但属于 LinuxCNC 基准行为的差异,补测试后修实现。
- 修改范围保持在对应 runtime/state/ui/profile/tests 文件内,避免无关重构。
## 步骤 6回归验收
- 重新运行相关最小测试。
- 运行完整 Node 冒烟测试。
- 对 UI/浏览器改动运行构建与浏览器冒烟。
- 把命令、结果、证据路径写入 `05-验收证据.md`
## 步骤 7更新台账和任务矩阵
- 更新已完成任务状态。
- 写清本轮修改文件、验证命令和下一步。
- 对重要取舍写入 `06-决策记录.md`

View File

@@ -0,0 +1,59 @@
# 03-推进台账
## 2026-06-26 R1启动 working5 对标推进
做了什么:
- 创建 working5 工作文件结构。
- 建立与 `gmoccapy_XYZAB.ini` 执行流程对齐的任务矩阵和验收记录模板。
- 开始读取 LinuxCNC 执行分析和 Web 项目结构。
改了哪些文件:
- `/home/meswork/cnc_wams/work/working5/README.md`
- `/home/meswork/cnc_wams/work/working5/01-项目功能内容.md`
- `/home/meswork/cnc_wams/work/working5/02-项目程序开发详细步骤.md`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`
验证了什么:
- 待执行现有 Node、构建和浏览器冒烟测试。
下一步是什么:
- 执行 `npm run smoke:node`,根据失败项定位 LinuxCNC 行为差异。
## 2026-06-26 R2基线验证与 gmoccapy 模式互锁修复
做了什么:
- 执行现有 Node、构建、浏览器冒烟测试确认项目基线可运行。
- 对照 `gmoccapy_XYZAB_execution_analysis.md``gmoccapy.py``STATE_OFF``STATE_ON``all_homed` 逻辑,发现 Web 侧允许提前点击 Manual/MDI/Auto 模式按钮store 虽能拦截部分运行动作,但 UI 敏感状态不完全等同 gmoccapy。
- 修改 task policy`SET_MODE` 在机床未上电时禁止 Manual/MDI/Auto/Jog机床上电但未回零时只允许 Manual/Jog禁止 MDI/AutoAuto 运行中仍禁止离开 Auto。
- 修改 gmoccapy Web shell右侧 Manual/Jog/Auto/MDI 模式按钮统一使用 `gateLinuxCncTaskAction`,以 `disabled``data-command-ready``aria-disabled` 和 title 展示互锁原因。
- 补充 Node 和浏览器测试,锁定下电、上电未回零、回零后三个阶段的模式按钮行为。
改了哪些文件:
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/linuxcnc-task-policy.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_gmoccapy_xyzab_gates.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `/home/meswork/cnc_wams/work/working5/03-推进台账.md`
- `/home/meswork/cnc_wams/work/working5/04-任务矩阵.md`
- `/home/meswork/cnc_wams/work/working5/05-验收证据.md`
- `/home/meswork/cnc_wams/work/working5/06-决策记录.md`
验证了什么:
- `node ../tests/node/verify_gmoccapy_xyzab_gates.mjs && node ../tests/node/verify_run_preconditions.mjs && bash ../tests/browser/verify_gmoccapy_shell_browser.sh` 通过。
- `npm run smoke:node` 通过。
- `npm run build && npm run smoke` 通过。
下一步是什么:
- 下一轮可继续按任务矩阵深入核对 Tool/M6/M61 手动换刀对话框、限位 override、optional stop/block delete HAL pin 交叉行为等更细粒度 gmoccapy 行为。

View File

@@ -0,0 +1,16 @@
# 04-任务矩阵
| 任务编号 | 任务 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| W5-001 | 创建 working5 工作控制文件 | 完成 | README 和 01-06 文件存在,内容可指导后续推进 |
| W5-010 | 建立 LinuxCNC 执行流程到 Web 模块映射 | 完成 | 已映射到 profile、task policy、HAL model、communication model、interpreter/runtime、UI shell 和 tests |
| W5-020 | 执行现有 Node 冒烟测试 | 完成 | `npm run smoke:node` 通过 |
| W5-030 | 执行构建测试 | 完成 | `npm run build` 通过 |
| W5-040 | 执行浏览器冒烟测试 | 完成 | `npm run smoke` 通过 |
| W5-100 | 校验 gmoccapy XYZAB profile | 完成 | `verify_gmoccapy_xyzab_profile.mjs`、完整 Node 冒烟通过 |
| W5-110 | 校验 task 状态机和互锁 | 完成 | 修复并验证 Manual/MDI/Auto/Jog 模式按钮在下电、未回零、已回零状态下与 gmoccapy 一致 |
| W5-120 | 校验 HAL runtime | 完成 | `verify_gmoccapy_hal_model.mjs``verify_linuxcnc_task_hal_runtime.mjs`、完整 Node 冒烟通过 |
| W5-130 | 校验 G-code interpreter/runtime | 完成 | 自动运行、MDI、暂停/继续/停止、M6/M61 引用边界测试随完整 Node 冒烟通过 |
| W5-140 | 校验五轴运动和单位换算 | 完成 | kinematics、real LinuxCNC 5-axis cases、linear unit conversion 测试随完整 Node 冒烟通过 |
| W5-150 | 校验 gmoccapy UI 通信和按钮门控 | 完成 | 浏览器 smoke 验证 mode gate、NML/HAL 诊断、POSTGUI 顺序、按钮状态 |
| W5-900 | 更新验收证据和决策记录 | 完成 | 命令、结果、修改原因和后续项已记录 |

View File

@@ -0,0 +1,69 @@
# 05-验收证据
## 证据索引
| 证据编号 | 任务编号 | 类型 | 命令/页面/文件 | 结果 |
| --- | --- | --- | --- | --- |
| EV-W5-001 | W5-001 | 文件 | `/home/meswork/cnc_wams/work/working5` | 已创建 README 和 01-06 工作控制文件 |
| EV-W5-020 | W5-020/W5-100/W5-110/W5-120/W5-130/W5-140 | 命令 | `cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app && npm run smoke:node` | 通过,输出包含 `gmoccapy_xyzab_gates_smoke=ok``gmoccapy_hal_model_smoke=ok``real_linuxcnc_5axis_program_cases_smoke=ok``linear_unit_conversion_smoke=ok` |
| EV-W5-030 | W5-030 | 命令 | `cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app && npm run build` | 通过,输出 `gmoccapy_static_build=ok` |
| EV-W5-040 | W5-040/W5-150 | 命令 | `cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app && npm run smoke` | 通过,输出 `gmoccapy_shell_smoke=ok``gmoccapy_dist_smoke=ok` |
| EV-W5-110 | W5-110/W5-150 | 命令 | `node ../tests/node/verify_gmoccapy_xyzab_gates.mjs && node ../tests/node/verify_run_preconditions.mjs && bash ../tests/browser/verify_gmoccapy_shell_browser.sh` | 通过,验证下电禁用 Manual/Jog/MDI/Auto上电未回零只允许 Manual/Jog回零后允许 Auto/MDI |
## 命令记录
### 2026-06-26 R2
```bash
cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app
npm run smoke:node
```
结果:通过。
关键输出摘要:
- `linuxcnc_kinematics_runtime_smoke=ok`
- `linuxcnc_interpreter_runtime_smoke=ok`
- `linuxcnc_task_hal_runtime_smoke=ok`
- `full_linuxcnc_5axis_source_node_smoke=ok`
- `real_linuxcnc_5axis_program_cases_smoke=ok`
- `gmoccapy_xyzab_profile_smoke=ok`
- `gmoccapy_communication_model_smoke=ok`
- `gmoccapy_hal_model_smoke=ok`
- `gmoccapy_xyzab_gates_smoke=ok`
- `linear_unit_conversion_smoke=ok`
```bash
cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app
npm run build
```
结果:通过,输出 `gmoccapy_static_build=ok`
```bash
cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app
npm run smoke
```
结果:通过,输出:
- `gmoccapy_shell_smoke=ok`
- `gmoccapy_dist_smoke=ok`
```bash
cd /home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app
node ../tests/node/verify_gmoccapy_xyzab_gates.mjs && node ../tests/node/verify_run_preconditions.mjs && bash ../tests/browser/verify_gmoccapy_shell_browser.sh
```
结果:通过,输出:
- `gmoccapy_xyzab_gates_smoke=ok`
- `run_preconditions_ini_profile_smoke=ok`
- `run_preconditions_kinematics_smoke=ok`
- `run_preconditions_machine_file_smoke=ok`
- `gmoccapy_shell_smoke=ok`
## 页面/截图/report/job 记录
本轮未生成截图、PDF、job_id 或 report_id。浏览器验收由 headless Chromium smoke 脚本完成。

View File

@@ -0,0 +1,42 @@
# 06-决策记录
## DR-W5-001以 gmoccapy_XYZAB 执行流程作为本轮验收主线
日期2026-06-26
决策:
- 本轮不只验证图形 RTCP 轨迹,而是按 LinuxCNC 启动、INI/HAL、task/NML、interpreter、gmoccapy UI 通信和互锁全链路推进。
原因:
- 用户指定的基准文件覆盖了 `gmoccapy_XYZAB.ini` 五轴仿真从启动到界面通信的完整执行流程。
- 若只看轨迹显示容易遗漏回零、状态机、换刀、主轴到速、冷却、UI gate 等数控系统仿真关键行为。
影响:
- 任务矩阵按 LinuxCNC 行为拆分。
- 任何实现修改都需要补充对应测试或验收证据。
## DR-W5-002模式按钮门控前移到 `SET_MODE` 和 UI disabled 状态
日期2026-06-26
决策:
- Web 侧 `SET_MODE` 统一按 LinuxCNC/gmoccapy 状态门控。
- `STATE_OFF` 或未上电时Manual/Jog/MDI/Auto 都禁止切换。
- `STATE_ON` 但未全轴回零且 `NO_FORCE_HOMING = 0` 时,只允许 Manual/Jog禁止 MDI/Auto。
- 回零后 MDI/Auto 恢复可用Auto 解释器非 idle 时仍禁止离开 Auto。
原因:
- LinuxCNC `gmoccapy.py``on_hal_status_state_off()` 会禁用 `rbt_manual``rbt_mdi``rbt_auto`
- `on_hal_status_state_on()` 先只启用 `rbt_manual`,退出设置页时也明确区分“未回零只 Manual 可用”和“已回零三种模式可用”。
- 旧 Web 实现主要在 `RUN``RUN_MDI` 时拦截,模式按钮本身仍可点击,不符合 gmoccapy 的按钮敏感状态。
影响:
- `app/src/state/linuxcnc-task-policy.js` 成为模式切换和执行动作的统一互锁入口。
- `app/src/ui/gmoccapy-shell.js` 侧边模式按钮使用同一 gate 输出 disabled、`data-command-ready``aria-disabled`
- Node 和浏览器测试增加下电、未回零、已回零三个阶段的断言。

27
work/working5/README.md Normal file
View File

@@ -0,0 +1,27 @@
# working5 README 索引
本目录用于推进 `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan` 与 LinuxCNC `gmoccapy_XYZAB.ini` 五轴仿真执行流程的一致性验证、修复和验收。
对标基准:
- `/home/meswork/cnc_wams/work/working3/gmoccapy_XYZAB_execution_analysis.md`
- `/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.ini`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/usr_intf/gmoccapy/`
- `/home/meswork/cnc_wams/linuxcnc/configs/sim/gmoccapy/*.hal`
工作文件:
1. [01-项目功能内容.md](01-项目功能内容.md)
2. [02-项目程序开发详细步骤.md](02-项目程序开发详细步骤.md)
3. [03-推进台账.md](03-推进台账.md)
4. [04-任务矩阵.md](04-任务矩阵.md)
5. [05-验收证据.md](05-验收证据.md)
6. [06-决策记录.md](06-决策记录.md)
推进规则:
- 先按 `04-任务矩阵.md` 选择任务,避免重复做同一项。
- 每轮结束更新 `03-推进台账.md`,记录做了什么、改了哪些文件、验证了什么、下一步是什么。
- 所有命令、页面、报告、截图、测试输出摘要写入 `05-验收证据.md`
- 影响架构、兼容性或验收口径的判断写入 `06-决策记录.md`