ソースを参照

docs: 更新界面控制器与HMI注册表架构

main
suyu 1ヶ月前
コミット
5e55a922b9
2個のファイルの変更38行の追加4行の削除
  1. +23
    -0
      docs/ai/handoff.md
  2. +15
    -4
      docs/architecture.md

+ 23
- 0
docs/ai/handoff.md ファイルの表示

@@ -11,6 +11,7 @@
- 画布只选择可见节点,不暴露内部表达式容器;橡皮框或多选连续节点后可直接建立并联支路
- 执行器递归求值并生成节点、表达式、网络轨迹,离线运行时画布显示导通路径和故障位置
- HMI 和梯形图直接配置 M/D 地址,不依赖预先创建的数据点
- HMI 控件描述注册表统一维护现有 7 种控件的稳定名称、默认值、绑定规则和运行值类型
- `ActiveRegisterRepository` 在离线虚拟仓库与 PLC 缓存仓库之间切换
- `PlcCommunicationService` 使用 Qt SerialBus 异步连接、轮询和单点写入,UI 不阻塞
- 真机连接收集 HMI、报警定义和梯形图实际引用地址,按 M/D 分区并合并相邻地址读取
@@ -20,6 +21,9 @@
- PLC 故障态可直接“重新配置”,连接前自动清理旧串口会话,不再要求用户先手动点击断开
- PLC 日志区分连接阶段串口无法打开与已连接后的本地串口意外中断;后者自动转为已断开并禁用重复断开操作
- 主窗口静态控件已迁入 `main_window.ui`,PLC 参数由独立配置对话框收集后再发起连接
- 主窗口界面协调已拆为 `ProjectWorkspaceController`、`PropertyPanelController` 和
`RuntimePanelController`,分别负责工程树与会话选择、属性编辑、运行监控与仿真反馈;
`MainWindow` 保留窗口级动作、工程文件操作和跨区域模式切换
- 已增加运行监控工作台:离线仿真同时显示 HMI、梯形图轨迹和自由监控,真机运行只显示 HMI 和自由监控
- 自由监控支持 `M0~M4000`、`D0~D4000` 地址输入、连续批量添加、去重、删除、清空和最多 64 项限制
- 自由监控读取活动寄存器仓库,离线使用虚拟 M/D,真机使用 PLC 缓存,通信故障保留并标记最后有效值
@@ -168,6 +172,25 @@ HMI 图元现已分离编辑选择与运行输入状态。运行按钮悬停时
加载、离线执行、主窗口入口和真机轮询地址覆盖已通过,项目 Release 构建通过。真机仍只验证
M/D 通信,不执行或下载这些本地梯形图指令。

本轮在不修改领域、服务和通信规则的前提下拆分主窗口三个界面控制器。`main_window.cpp` 从
约 2200 行降至约 1300 行,原工程树、属性面板和运行刷新实现已从主窗口移除,没有保留重复
死代码。Qt Release 生产工程和 `main_window_tests` 均使用独立构建目录重新构建并通过,
`git diff --check` 无空白错误。

2026-08-17 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成本轮重构后的真机只读复核,成功读取
`M0~M2 = OFF`、`D0 = 0`,测试结束后正常关闭串口,全程没有执行 PLC 写操作。

本轮建立无 Qt 依赖的 HMI 控件描述注册表,将 Button、Indicator、NumericDisplay、
NumericInput、Label、PageJump 和 AlarmList 的工程稳定类型名、界面名称、默认 ID 前缀、
默认文字、默认尺寸、绑定规则和运行值类型集中维护。领域校验、编辑创建、运行读取、JSON
编解码和属性面板已改为查询注册表,原有重复类型辅助函数和分支表已删除;专用绘制与交互
行为保持原模块边界。注册表完整性测试覆盖枚举和稳定名称双向查询、名称唯一性、默认尺寸、
M/D 绑定与运行值匹配及未知类型拒绝。10 个自动化测试工程全部重新构建并通过,Qt Release
主工程完成独立构建,`git diff --check` 无空白错误。

2026-08-17 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成本轮注册表重构后的真机只读复核,
成功读取 `M0~M2 = OFF`、`D0 = 0`,测试结束后正常关闭串口,全程没有执行 PLC 写操作。

## 待完成事项

1. 在 PLC STOP 状态确认 COM2 参数和 RS-485 A/B 接线


+ 15
- 4
docs/architecture.md ファイルの表示

@@ -13,7 +13,7 @@ app/
├── integrated_platform.pro qmake 工程入口
├── src/
│ ├── main.cpp 对象创建与依赖注入
│ ├── ui/ Qt Widgets 视图和交互协调
│ ├── ui/ Qt Widgets 视图和界面控制器
│ ├── domain/ 工程、HMI、梯形图和寄存器模型
│ ├── services/ 编辑、仿真、运行模式和通信契约
│ └── infrastructure/ JSON、PLC 缓存和 Qt Modbus RTU 实现
@@ -35,8 +35,13 @@ main.cpp -> UI + Services + Infrastructure
- `main.cpp` 负责组合依赖,不承载业务规则

主窗口的菜单、工具栏和属性表单由 Qt Designer 的
`main_window.ui` 定义。C++ 仅创建 HMI/梯形图自定义画布、填充运行时数据并连接服务层信号。
真实 PLC 的串口与轮询参数由独立的 `PlcConnectionDialog` 收集,主窗口只保留配置连接和断开入口。
`main_window.ui` 定义。界面交互按职责由三个 UI 控制器协调:

- `ProjectWorkspaceController` 负责工程树、页面/逻辑会话选择和工程对象刷新
- `PropertyPanelController` 负责 HMI/梯形图选择状态、属性面板和编辑器信号
- `RuntimePanelController` 负责运行监控工作台、运行值刷新和离线执行器反馈

`MainWindow` 负责组合这些控制器、处理窗口级菜单和跨区域模式切换,不重复实现工程校验或寄存器业务规则。真实 PLC 的串口与轮询参数由独立的 `PlcConnectionDialog` 收集。

## 核心领域模型

@@ -48,16 +53,22 @@ main.cpp -> UI + Services + Infrastructure
| `register_monitor_model.*` | 保存当前调试会话的自由监控 M/D 地址集合 |
| `alarm_model.*` | 定义项目级 M ON、D 高限和 D 低限报警条件 |
| `hmi_model.*` | 定义页面、控件、布局和寄存器绑定 |
| `hmi_control_registry.*` | 集中描述 HMI 控件的稳定名称、默认值、绑定规则和运行值类型 |
| `control_logic_model.*` | 定义梯形图表达式树、边沿/触点/比较/TON 节点和输出线圈 |
| `project_model.*` | 聚合 HMI 页面、报警定义和控制逻辑并执行工程校验 |
| `runtime_state.*` | 定义编辑、离线运行和真机运行状态机 |

工程文件格式保持 `1.0`。当前 `1.0` 直接保存有序 `hmiPages`、`initialHmiPageId`、有序 `alarmDefinitions`、工程级 `registerComments`、有序 `controlLogics` 和梯形图表达式树,不读取其他结构,也不包含迁移和兼容代码。加载必须先完成 JSON 解析、版本检查和领域校验,成功后才能替换当前工程;保存使用原子提交。完整字段定义见 `docs/工程格式说明.md`。

`HmiPage.id` 和 `ControlLogic.id` 是稳定内部标识,名称可修改,数组顺序分别决定工程树页面顺序和离线逻辑扫描顺序。`MainWindow` 保存 `current_hmi_page_id_` 与 `current_logic_id_` 作为编辑会话选择,它们不进入 JSON。`Project.initialHmiPageId` 是运行态每次启动 HMI 时使用的持久化初始页,与编辑器当前正在查看的页面相互独立。
`HmiPage.id` 和 `ControlLogic.id` 是稳定内部标识,名称可修改,数组顺序分别决定工程树页面顺序和离线逻辑扫描顺序。`MainWindow` 保存 `current_hmi_page_id_` 与 `current_logic_id_` 作为编辑会话选择,`ProjectWorkspaceController` 负责将它们同步到工程树和编辑画布,它们不进入 JSON。`Project.initialHmiPageId` 是运行态每次启动 HMI 时使用的持久化初始页,与编辑器当前正在查看的页面相互独立。

`Project::validate()` 允许未绑定控件、待配置节点和未完成网络作为编辑草稿保存。`Project::validateForRunning()` 额外拒绝未绑定 HMI、待配置节点、空条件和缺少输出的网络,并检查已启用逻辑中的 T 触点必须有唯一的 TON 驱动。

HMI 控件公共描述由无 Qt 依赖的 `hmi_control_registry` 模块统一提供。当前 7 种控件的工程稳定类型名、
界面名称、默认 ID 前缀、默认文字、默认尺寸、M/D 绑定规则和运行值类型只在注册表中定义一次。
领域校验、编辑服务、运行服务、JSON 存储和属性面板共同查询该描述;控件绘制、按钮写入、
PageJump 导航和 AlarmList 展示等专用行为仍留在各自模块,不进入公共描述表。

HMI 按钮操作作为工程 `1.0` 的强类型字段保存,支持 `置 ON`、`置 OFF`、`取反` 和
`瞬时 ON`。新建按钮默认使用瞬时 ON;按钮按下和释放事件由 UI 转交运行服务解释,UI
不直接决定写入值。当前版本不迁移缺少按钮操作字段的旧工程文件。


読み込み中…
キャンセル
保存