Files
linuxcncWebWASM/doc-rtcp/gmoccapy-control-panel-data-control-flow.md

324 lines
13 KiB
Markdown
Raw Permalink 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.
# GMOCCAPY 控制面板功能、数据流与控制流
更新时间:2026-08-25
本文是后续分析 GMOCCAPY 控制面板的总入口。它把普通三轴 `gmoccapy.ini` 和五轴 XYZAC RTCP 案例放在同一套模型中,区分 UI 控件、GMOCCAPY Python handler、LinuxCNC command/status、TASK/motion、HAL 和 Vismach 的责任边界。
## 1. 范围与版本边界
| 项目 | 当前工作区/运行时 |
|---|---|
| 仓库源码 | `linuxcnc/VERSION = 2.10.0~pre0` |
| 仓库 GMOCCAPY 源码 | `linuxcnc/src/emc/usr_intf/gmoccapy/gmoccapy.py`,`_RELEASE = 3.4.3` |
| 实际系统 GUI | `/usr/bin/gmoccapy`,运行时版本 `3.5.2`,系统 LinuxCNC `2.10.0~pre1` |
| 普通面板入口 | [`run-gmoccapy.sh`](../run-gmoccapy.sh),默认 `configs/sim/gmoccapy/gmoccapy.ini` |
| 五轴 RTCP 入口 | [`run-5axis-rtcp.sh`](../run-5axis-rtcp.sh),默认 XYZAC TRT switchkins |
| 发布/仿真边界 | POSIX non-realtime 仿真;不等同于实时硬件验证 |
截图中的 `Important change(s)` 弹窗来自系统 GMOCCAPY 3.5.2,不存在于仓库 3.4.3 源文件中;两套来源不能混为一个源码版本。详细证据见 [GMOCCAPY 分析报告](gmoccapy-analysis.md)。
## 2. 总体架构
```text
快捷方式 / linuxcnc -r CASE.ini
│
▼
LinuxCNC 启动器与 INI 解析
│
├── linuxcncsvr / NML 状态与命令通道
├── milltask / RS274NGC interpreter / task mode
├── motmod + kinematics / fixed servo cycle
├── HAL files / HALUI / simulated devices
└── DISPLAY=gmoccapy 或 DISPLAY=axis
│
▼
GMOCCAPY Gtk/Glade 控制面板
│
┌─────────┴─────────┐
│ │
用户点击/键盘/HAL linuxcnc.stat/HAL status
│ ▲
▼ │
Python handler ── command ─┴── TASK/motion/HAL feedback
│
├── 模式/按钮页切换
├── 程序加载/预览
├── AUTO 运行/暂停/停止/单步
├── MDI 命令
└── homing、tool、offset、spindle、coolant
```
GMOCCAPY 不是运动学计算器。它负责把操作员动作转换为 LinuxCNC command,并把 LinuxCNC status/HAL status 投影回界面;真正的解释器、轨迹规划、逆解/正解和关节命令由 LinuxCNC runtime 完成。
## 3. 启动控制流
### 3.1 快捷方式层
`run-gmoccapy.sh` 和 `run-5axis-rtcp.sh` 都遵循相同模式:
1. 计算仓库绝对路径,避免从任意工作目录启动时相对路径漂移。
2. 校验 INI、演示程序、LinuxCNC launcher 是否存在。
3. 进入 LinuxCNC 根目录。
4. 执行 `/usr/bin/linuxcnc -r CASE.ini`,保留终端诊断。
五轴快捷方式额外检查 RTCP 子程序中确实存在 `M428`,并支持 `xyzac-trt.ini` 与 `xyzbc-trt.ini` 两个变体。
### 3.2 INI 到进程
以普通 GMOCCAPY 为例:
```text
[DISPLAY] DISPLAY=gmoccapy
[TASK] TASK=milltask
[HAL] core_sim.hal + spindle_sim.hal + simulated_home.hal
[EMCIO] TOOL_TABLE=tool.tbl
[RS274NGC] PARAMETER_FILE=sim.var, SUBROUTINE_PATH=macros
[KINS] trivkins coordinates=xyz
```
启动器随后创建 `linuxcncsvr`、`milltask`、`halui` 和 GMOCCAPY。GMOCCAPY 进程通过 `-ini` 得到同一个 INI 路径,不能自行替代 TASK/motion/HAL。
### 3.3 GMOCCAPY 初始化顺序
仓库源码 `gmoccapy.py` 的主初始化顺序为:
1. 解析 `-user_mode`、`-logo` 参数(约 `243-270` 行)。
2. 读取 INI(`_get_ini_data()`,约 `272-275` 行)。
3. 读取偏好文件(`_get_pref_data()`)。
4. 动态创建 DRO、home、touch-off、jog、macro 等控件(约 `280-305` 行)。
5. 建立 GMOCCAPY HAL pins(约 `307` 行)。
6. 连接 Glade signals(约 `315-320` 行)。
7. 显示主窗口(约 `324-325` 行)。
8. 初始化主题、G-code preview、kinematics view、offset/tool editor、keyboard 和文件选择器(约 `327-342` 行)。
系统 3.5.2 运行时在 GUI 初始化后额外调用 `_startup_message()`,生成版本提示弹窗;它属于安装包新增功能,不属于仓库 3.4.3 初始化链。
## 4. 控制面板模式和按钮门控
### 4.1 模式按钮
Glade 中的主要模式控件:
| 控件 | 作用 | handler/状态 |
|---|---|---|
| `rbt_manual` | MANUAL/JOG | `on_rbt_manual_pressed()` 发出 `MODE_MANUAL` |
| `rbt_mdi` | MDI | `on_rbt_mdi_pressed()` 发出 `MODE_MDI` |
| `rbt_auto` | AUTO | `on_rbt_auto_pressed()` 发出 `MODE_AUTO` |
| `tbtn_setup` | 设置页 | 进入设置前强制 MANUAL,并禁用模式按钮 |
| `tbtn_user_tabs` | 用户页 | 切换主 notebook 页面 |
`on_hal_status_mode_auto()` 在收到 HAL status 后将主页面切回 page 0,把按钮 notebook 切到 `_BB_AUTO`,并将 jog notebook 切到 AUTO 页面(约 `2804-2824` 行)。因此“点击 AUTO 图标”与“看到 AUTO 按钮组”是同一个状态转换的两个可观察结果。
### 4.2 急停、上电、homing 门控
`on_tbtn_setup_toggled()` 和 HAL status handler 根据以下条件设置按钮敏感度:
```text
ESTOP → manual/mdi/auto 均禁用
ON + 未 homed → 只允许 manual
ON + all_homed 或 NO_FORCE_HOMING → manual/mdi/auto 全部可用
```
对应仓库源码约为 `3793-3808` 行。未满足条件时,点击 AUTO 会被 `on_hal_status_mode_auto()` 拒绝,显示 `It is not possible to change to Auto Mode at the moment`,并回到 MANUAL。
这解释了为什么控制面板可能“没有加载按钮”:加载按钮不在 MANUAL 页面,而且 AUTO 页面本身可能因状态门控没有激活。
## 5. G-code 加载数据流
### 5.1 控件链
```text
rbt_auto
│ on_hal_status_mode_auto()
▼
hbtb_auto / _BB_AUTO
│
│ btn_load(图标 img_open,tooltip=Load a new program)
│ on_btn_load_clicked()
▼
_BB_LOAD_FILE + IconFileSelection1
│
│ 用户选中路径
│ btn_select / IconFileSelection1_selected
▼
hal_action_open.load_file(path)
▼
LinuxCNC task/interpreter + preview/status
▼
ntb_preview page 0 + ntb_button _BB_AUTO + stat.file
```
### 5.2 打开文件界面
`on_btn_load_clicked()`(`gmoccapy.py:5046-5078`)执行:
1. `ntb_button.set_current_page(_BB_LOAD_FILE)`。
2. `ntb_preview.set_current_page(3)`。
3. 打开 full-size preview。
4. `_show_iconview_tab(True)`。
5. 刷新 `IconFileSelection1` 文件列表。
6. 暂时禁用 MANUAL、MDI 和设置按钮,避免文件选择过程中切换模式。
文件选择器在 `_init_IconFileSelection()` 和 `_init_file_to_load()` 中读取 `PROGRAM_PREFIX` 与 `[FILTER] PROGRAM_EXTENSION`。普通案例 `PROGRAM_PREFIX = ../../nc_files/` 最终指向仓库的 `linuxcnc/nc_files`。
### 5.3 确认文件
`on_IconFileSelection1_selected()`(`gmoccapy.py:5114-5125`)执行:
1. 将选中的 `path` 交给 `hal_action_open.load_file(path)`。
2. 恢复 preview page 0。
3. 关闭 full-size preview 和 icon view。
4. 把按钮 notebook 切回 `_BB_AUTO`。
5. 重新启用 MANUAL、MDI 和设置按钮。
这一步是“加载程序”,不是“运行程序”。运行还需要 `btn_run`/`AUTO_RUN`;源码键盘 handler 将 `R` 映射为运行、`P` 映射为暂停、`S` 映射为恢复。
### 5.4 启动时自动加载
`on_window1_show()` 会读取偏好项 `open_file`(约 `2920-2924` 行)。如果用户在设置页指定“启动时加载文件”,GMOCCAPY 会在窗口显示后直接调用 `hal_action_open.load_file(file)`。这条路径绕过手动点击文件选择器,但仍通过同一个 LinuxCNC load action。
## 6. AUTO 运行控制流
```text
btn_run / R
▼
linuxcnc.command().auto(AUTO_RUN, line)
▼
milltask / RS274NGC interpreter
▼
TP queue → motion controller → kinematics → joint commands
▼
HAL simulated device / spindle / coolant / tool change
▼
linuxcnc.stat + hal_status
▼
GMOCCAPY DRO、progress、preview、button sensitivity
```
相关按钮属于 `hbtb_auto`:`btn_load`、`btn_reload`、`btn_run`、`btn_stop`、`tbtn_pause`、`btn_step`、`btn_from_line`、`tbtn_optional_blocks`、`btn_edit`。Glade 负责控件和 signal 绑定,Python handler 负责调用 LinuxCNC command;运动本身不在 GTK handler 中实现。
## 7. MDI、Jog、Home、Tool 和 Offset 数据流
### MDI
`rbt_mdi` 将 task mode 设为 `MODE_MDI`。MDI 输入提交后进入 LinuxCNC interpreter;G-code 解析错误通过 LinuxCNC error channel 返回,再由 GMOCCAPY notification/error handler 显示。
### Jog
JOG 按钮由 `_make_jog_button()` 动态生成;轴/关节列表来自 INI 的 `COORDINATES`、kinematics 类型和 joint-axis mapping。Jog 命令仍经 LinuxCNC command 通道,不直接改变 DRO;DRO 的真值来自 status feedback。
### Home
Home 按钮最终调用 `command.home(joint_or_axis)`。仿真 HAL 的 `sim_home_switch` 或自定义 home HAL 决定 home switch 状态;`all_homed` HAL status 决定 MDI/AUTO 是否重新开放。
### Tool/Offset
工具表来自 `[EMCIO] TOOL_TABLE`,offset page 和 tool editor 通过 LinuxCNC tool data/action 更新。G43/G49/G43.1 的解释器语义由 RS274NGC 负责;GMOCCAPY 只显示和提交工具/offset 操作。系统 3.5.2 的启动提示明确提醒:AUTO 中换刀后的 G43 不能假定由界面自动恢复,应由程序/REMAP 明确处理。
## 8. 五轴 XYZAC RTCP 控制流
### 8.1 配置层
五轴案例 `xyzac-trt.ini` 的关键字段:
```text
[DISPLAY] OPEN_FILE = ./demos/xyzac_switchkins.ngc
[RS274NGC] SUBROUTINE_PATH = ./remap_subs
[RS274NGC] REMAP = M428 ... ngc=428remap
[RS274NGC] REMAP = M429 ... ngc=429remap
[RS274NGC] REMAP = M430 ... ngc=430remap
[KINS] KINEMATICS = xyzac-trt-kins sparm=identityfirst
[TRAJ] COORDINATES = XYZAC
[HAL] HALCMD = net ... motion.switchkins-type
[HAL] HALCMD = loadusr -W xyzac-trt-gui
```
### 8.2 switchkins 状态
`xyzac-trt-kins.c` 将 `sparm=identityfirst` 定义为:
```text
switchkins-type 0 → identity kinematics
switchkins-type 1 → xyzac TRT kinematics
switchkins-type 2 → userk kinematics
```
`trtfuncs.c` 为 XYZAC/XYZBC 实现 forward/inverse mapping,并声明 `tool-offset`、旋转中心和轴 offset HAL pins。XYZAC 的五个关节是 `X Y Z A C`;A 是倾斜台,C 是水平旋转台。
### 8.3 M428/M429 控制链
```text
G-code M428
▼
428remap.ngc
├── M68 E3 Q1 写 motion.analog-out-03 = 1
├── M66 E0 L0 等待同步
└── 检查 motion.switchkins-type == 1
▼
xyzac-trt-kins inverse/forward
▼
XYZAC joint commands with TCP/RTCP compensation
```
`M429` 对称地写入 `Q0`,切回 identity;`M430` 写入 `Q2`,进入 userk。`helix_ac.ngc` 演示了典型顺序:先用 M429 在 machine coordinates 安全定位,再用 M428 执行带 A/C 姿态变化的螺旋插补,结束后再切回 M429 做返回定位。
### 8.4 Vismach feedback
INI 中的 HAL nets 将以下反馈送到 `xyzac-trt-gui`:
```text
joint.0.pos-fb → table-x
joint.1.pos-fb → saddle-y
joint.2.pos-fb → spindle-z
joint.3.pos-fb → tilt-a
joint.4.pos-fb → rotate-c
motion.tooloffset.z → tool-offset
xyzac-trt-kins.y-offset/z-offset → Vismach geometry
```
因此 Vismach 不是运动 authority;它是 joint feedback、tool offset 和 geometry offset 的可视化消费者。
## 9. 状态真值与可观察结果
| 状态 | authority | 面板表现 |
|---|---|---|
| 急停 | TASK/motion state | E-stop active,模式按钮禁用 |
| 上电 | TASK state + HAL | Power icon active,允许进一步操作 |
| all homed | HAL status / joint state | MDI/AUTO 解除门控 |
| 当前模式 | `stat.task_mode` | MANUAL/MDI/AUTO 页面切换 |
| 当前文件 | `stat.file` / file-loaded status | 顶部文件名、G-code view、Run gate |
| 解释器状态 | `stat.interp_state` | Run/Pause/Step/Stop 敏感度 |
| 当前 G/M codes | `stat.gcodes` / `stat.mcodes` | G-Code 信息区域 |
| 机床位置 | `stat.position` / joint feedback | DRO 和 Vismach |
| kinematics mode | `motion.switchkins-type` | AXIS switchkins 面板/RTCP 模式 |
任何未来 Web/WASM 控制面板都应消费这些 authority 的 snapshot/event,而不是在 JS/GUI 层镜像一套可写的机床状态。
## 10. 现有证据与复现
```bash
./run-gmoccapy.sh
./run-5axis-rtcp.sh
./run-5axis-rtcp.sh xyzbc-trt.ini
```
已验证的五轴运行证据:
- [5axis-rtcp-running.png](5axis-rtcp-running.png)
- [5axis-rtcp-shortcut.md](5axis-rtcp-shortcut.md)
- `linuxcnc` 状态返回 `file=./demos/xyzac_switchkins.ngc`
- AXIS 标题包含 `sim-xyzac-trt-kins (switchkins)`
- `xyzac-trt-gui` 进程和五轴 Vismach 预览存在
## 11. 后续分析顺序
分析任何新的 GMOCCAPY/五轴控制问题时,按以下顺序取证:
1. 先记录实际运行时路径、LinuxCNC 版本、GMOCCAPY 版本;不要把系统安装脚本和仓库源码混为一份。
2. 读取 INI 的 DISPLAY/TASK/HAL/RS274NGC/KINS/TRAJ/EMCIO 段,建立配置闭包。
3. 在 Glade 中找到 widget ID,再在 `gmoccapy.py` 找 signal handler;不要只根据截图猜按钮语义。
4. 追踪 handler 发出的 `linuxcnc.command()`,确认 command 进入 TASK/motion/HAL 的路径。
5. 用 `linuxcnc.stat()`、HAL pins、日志和 Vismach feedback 交叉验证,不把 DRO 或 preview 当作 authority。
6. 五轴问题先确认 kinematics type、M428/M429 状态、tool offset、rotation center/axis offset,再分析轨迹差异。
7. 任何缺失的官方 oracle、实时硬件、浏览器或资源输入都保留为明确 blocker,不以 GUI 截图替代完整等价证明。