|
|
|
@@ -14,7 +14,7 @@ app/ |
|
|
|
├── src/ |
|
|
|
│ ├── main.cpp 对象创建与依赖注入 |
|
|
|
│ ├── ui/ Qt Widgets 视图和交互协调 |
|
|
|
│ ├── domain/ 工程、HMI、梯形图、数据点和寄存器模型 |
|
|
|
│ ├── domain/ 工程、HMI、梯形图和寄存器模型 |
|
|
|
│ ├── services/ 编辑、仿真、运行模式和通信契约 |
|
|
|
│ └── infrastructure/ JSON、PLC 缓存和 Qt Modbus RTU 实现 |
|
|
|
└── tests/ 单元测试与集成测试工程 |
|
|
|
@@ -34,7 +34,7 @@ main.cpp -> UI + Services + Infrastructure |
|
|
|
- `ui` 只提交操作并展示模型、运行轨迹和错误状态 |
|
|
|
- `main.cpp` 负责组合依赖,不承载业务规则 |
|
|
|
|
|
|
|
主窗口的菜单、工具栏、属性表单和数据点面板由 Qt Designer 的 |
|
|
|
主窗口的菜单、工具栏和属性表单由 Qt Designer 的 |
|
|
|
`main_window.ui` 定义。C++ 仅创建 HMI/梯形图自定义画布、填充运行时数据并连接服务层信号。 |
|
|
|
真实 PLC 的串口与轮询参数由独立的 `PlcConnectionDialog` 收集,主窗口只保留配置连接和断开入口。 |
|
|
|
|
|
|
|
@@ -45,13 +45,12 @@ main.cpp -> UI + Services + Infrastructure |
|
|
|
| `register_address.*` | 定义 `M0~M4000`、`D0~D4000` 地址和值域规则 | |
|
|
|
| `register_repository.*` | 定义 M/D 统一读写接口和离线内存实现 | |
|
|
|
| `active_register_repository.*` | 在虚拟仓库与 PLC 缓存仓库之间切换当前数据源 | |
|
|
|
| `data_point_model.*` | 定义地址、名称和注释统一数据点 | |
|
|
|
| `hmi_model.*` | 定义页面、控件、布局和寄存器绑定 | |
|
|
|
| `control_logic_model.*` | 定义梯形图表达式树、条件节点和输出线圈 | |
|
|
|
| `project_model.*` | 聚合数据点、HMI 页面和控制逻辑并执行工程校验 | |
|
|
|
| `project_model.*` | 聚合 HMI 页面和控制逻辑并执行工程校验 | |
|
|
|
| `runtime_state.*` | 定义编辑、离线运行和真机运行状态机 | |
|
|
|
|
|
|
|
工程文件格式保持 `1.0`。当前版本直接保存表达式树和数据点,不读取旧的 `stages/branches` 结构,也不包含旧格式迁移代码。加载必须先完成 JSON 解析、版本检查和领域校验,成功后才能替换当前工程;保存使用原子提交。 |
|
|
|
工程文件格式保持 `1.0`。当前版本直接保存 HMI 和梯形图表达式树,不读取旧的 `stages/branches` 和 `dataPoints` 结构,也不包含旧格式迁移和兼容代码。加载必须先完成 JSON 解析、版本检查和领域校验,成功后才能替换当前工程;保存使用原子提交。 |
|
|
|
|
|
|
|
`Project::validate()` 允许未绑定控件、待配置节点和未完成网络作为编辑草稿保存。`Project::validateForRunning()` 额外拒绝未绑定 HMI、待配置节点、空条件和缺少输出的网络。 |
|
|
|
|
|
|
|
@@ -92,15 +91,11 @@ Parallel |
|
|
|
|
|
|
|
`OfflineSimulationService` 以 50 ms 目标周期驱动扫描,启动时复制逻辑快照并清空虚拟 M/D。故障后停止扫描并保留最终寄存器值,HMI 可继续显示但禁止写入。该周期不提供硬实时保证。 |
|
|
|
|
|
|
|
## 数据点管理 |
|
|
|
## M/D 地址使用 |
|
|
|
|
|
|
|
`DataPointService` 维护统一数据点表: |
|
|
|
HMI 控件和梯形图节点直接绑定 `M0~M4000`、`D0~D4000` 地址,不要求预先创建数据点。地址是程序和通信的真实标识,属性面板只编辑区域与地址。 |
|
|
|
|
|
|
|
```text |
|
|
|
地址 | 类型 | 名称 | 注释 | 当前值 | 引用位置 |
|
|
|
``` |
|
|
|
|
|
|
|
地址和名称在工程内唯一。引用位置从 HMI 绑定和梯形图节点动态计算;仍被引用的数据点不能删除或修改地址,但可以修改名称和注释。HMI 和梯形图属性区从同一数据点集合选择地址,运行时当前值由活动寄存器仓库读取。 |
|
|
|
软元件注释、网络注释和命令语视图不属于当前实现。后续如增加注释,应把地址级软元件注释和网络级说明分开建模,不能重新引入“名称、注释、当前值、引用位置”混合的数据点表。 |
|
|
|
|
|
|
|
## 寄存器与 Modbus RTU |
|
|
|
|
|
|
|
@@ -109,7 +104,7 @@ Parallel |
|
|
|
- 离线运行使用 `VirtualRegisterRepository` |
|
|
|
- 真机运行使用 `PlcRegisterRepository` 的最近一次有效缓存 |
|
|
|
|
|
|
|
`PlcCommunicationService` 使用 `QModbusRtuSerialMaster` 异步连接、读取和写入。连接时从数据点、HMI 和梯形图收集 M/D 地址,去重后按区域合并相邻地址进行轮询。M 使用线圈,D 使用保持寄存器;所有 Modbus 地址均为从 `0` 开始的原始地址。 |
|
|
|
`PlcCommunicationService` 使用 `QModbusRtuSerialMaster` 异步连接、读取和写入。连接时从 HMI 和梯形图的实际引用中收集 M/D 地址,去重后按区域合并相邻地址进行轮询。M 使用线圈,D 使用保持寄存器;所有 Modbus 地址均为从 `0` 开始的原始地址。 |
|
|
|
|
|
|
|
HMI 写入只表示异步请求已受理,不乐观修改 PLC 缓存,实际值由后续读回确认。超时、协议错误或断线会停止轮询、保留最后一次有效值并进入故障状态,错误通过运行模式服务交给 UI 展示。 |
|
|
|
|
|
|
|
@@ -128,7 +123,7 @@ HMI 写入只表示异步请求已受理,不乐观修改 PLC 缓存,实际 |
|
|
|
| 优先级 | 测试对象 | 重点内容 | |
|
|
|
| --- | --- | --- | |
|
|
|
| 高 | 领域模型 | 地址边界、表达式校验与归一化、工程唯一性 | |
|
|
|
| 高 | 编辑服务 | 嵌套串并联插入、删除、数据点引用保护 | |
|
|
|
| 高 | 编辑服务 | 嵌套串并联插入、删除和地址配置 | |
|
|
|
| 高 | 执行与模式服务 | 递归求值、轨迹、离线闭环、仓库切换和首次读取约束 | |
|
|
|
| 高 | 工程存储 | `1.0` 往返、缺失字段、非法结构和不支持版本 | |
|
|
|
| 中 | PLC 通信 | 缓存有效性、地址集合、异步读写和错误反馈 | |
|
|
|
|