项目采用 UI、领域、服务和基础设施分层。HMI 编辑、离线仿真和真机联机使用同一套领域模型,UI 不直接依赖串口或 Modbus 实现。
app/
├── integrated_platform.pro qmake 工程入口
├── src/
│ ├── main.cpp 应用组合入口
│ ├── ui/ Qt Designer 界面、视图和交互协调
│ ├── domain/ 工程、HMI、逻辑、M/D 地址等纯业务模型
│ ├── services/ 用例编排、运行模式和仿真服务
│ └── infrastructure/ 工程文件、Modbus RTU 等外部实现
└── tests/ 单元测试与集成测试工程
生产代码必须保持单向依赖:
UI -> Services -> Domain
Infrastructure -> Domain
main.cpp -> UI + Services + Infrastructure
domain 不依赖 UI、串口、文件系统或具体 PLC 库。services 只通过领域定义的接口使用寄存器、工程存储等能力。infrastructure 实现外部能力,例如 JSON 工程文件和 Qt Modbus RTU。ui 只调用服务并展示状态;MainWindow 只组织界面,不实现业务规则、寄存器读写或通信流程。main.cpp 负责创建对象并注入依赖,不承载业务逻辑。用户操作 HMI
-> UI 发起服务请求
-> 服务校验并更新领域模型或寄存器接口
-> 仿真服务 / 真机 Modbus 实现执行
-> 服务发布状态变化
-> UI 刷新控件和状态栏
离线模式由服务连接虚拟 M/D 寄存器与软件逻辑执行器;真机模式由服务连接 PLC 寄存器缓存与 Modbus RTU 服务。两种模式共用 HMI 绑定模型,且软件逻辑执行器不得在真机模式运行。
领域模型位于 app/src/domain/,只使用 C++17 标准库,不包含 Qt 界面、串口或 Modbus
类型:
| 文件 | 职责 |
|---|---|
register_address.* |
定义 M/D 地址值对象,统一校验项目地址范围 0~4000。 |
register_repository.* |
定义 M 位和 D 字的统一读写接口,并提供离线内存实现。 |
hmi_model.* |
定义 HMI 页面、控件、位置、扩展属性和寄存器绑定。 |
control_logic_model.* |
使用独立配置类型定义触点、线圈和数值比较节点,并校验地址区域与连接引用。 |
project_model.* |
聚合工程元数据、HMI 页面和控制逻辑,并校验工程内标识唯一性。 |
runtime_state.* |
定义编辑态、离线运行态、真机运行态及合法切换规则。 |
RegisterRepository 是 HMI、逻辑执行器和运行服务唯一可见的寄存器边界。离线运行使用
VirtualRegisterRepository;真机运行后续注入由基础设施层实现的 PLC 缓存仓库。仓库读取的是
最近一次有效值,写入成功只表示请求被仓库接受;真实 PLC 的异步确认由服务层负责反馈。
控制逻辑节点使用 std::variant 组合独立配置类型。初版只包含 M 区触点、M 区线圈和 D 值与
常量比较。新增节点时应增加独立配置类型及其校验和执行处理,不得向通用 LogicNode 持续
添加只对单一节点有效的可选字段。定时器不是当前原始需求范围,不提前建立模型或执行逻辑。
| 模式 | 允许编辑工程 | 寄存器来源 | 软件逻辑执行器 | 进入约束 |
|---|---|---|---|---|
| 编辑态 | 是 | 无运行仓库 | 停止 | 运行态必须先回到编辑态。 |
| 离线运行态 | 否 | 虚拟 M/D | 运行 | 仅可从编辑态进入。 |
| 真机运行态 | 否 | PLC 读回缓存 | 停止 | 仅可从编辑态进入,且必须先完成 PLC 初次读取。 |
离线运行态与真机运行态不得直接互切。进入真机运行态时不复制或写入离线仓库值,避免误写
PLC;退出任一运行态后才能重新编辑工程。
测试按业务风险和模块边界安排,不要求为每个简单访问器或转发函数单独编写测试:
| 优先级 | 测试对象 | 重点验证内容 |
|---|---|---|
| 高 | domain |
地址边界、M/D 类型约束、模型校验、工程唯一性和运行模式切换 |
| 高 | services |
HMI、寄存器仓库和逻辑执行器之间的离线闭环 |
| 高 | 工程存储 | 保存加载往返、版本字段、缺失字段和非法文件 |
| 中 | infrastructure |
Modbus 帧解析、超时、CRC、断线和错误反馈 |
| 中 | ui |
新建工程、编辑、运行切换和错误提示等关键工作流 |
| 冒烟 | 真机联调 | 少量安全地址的读写和 RUN 联动验证 |
domain 和 services 的自动化测试不依赖 Qt 界面或真实 PLC。基础设施优先使用模拟串口
和测试文件,真机测试只覆盖无法在模拟环境确认的通信和联动行为。