综合平台编程器项目的远程存储
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

7.5 KiB

综合平台编程器架构

目标与边界

项目采用 UI、领域、服务和基础设施分层。HMI 编辑、结构化梯形图、离线仿真和真机联机共用工程模型,UI 不直接依赖文件系统、串口或 Modbus 实现。

当前目标是完成基础设备控制闭环,不生成、编译或下载 PLC 程序,不实现 XDPPro 的完整指令集,也不提供任意自由画线。

目录与依赖

app/
├── integrated_platform.pro     qmake 工程入口
├── src/
│   ├── main.cpp                对象创建与依赖注入
│   ├── ui/                     Qt Widgets 视图和交互协调
│   ├── domain/                 工程、HMI、梯形图、数据点和寄存器模型
│   ├── services/               编辑、仿真、运行模式和通信契约
│   └── infrastructure/         JSON、PLC 缓存和 Qt Modbus RTU 实现
└── tests/                      单元测试与集成测试工程

生产代码保持以下依赖方向:

UI -> Services -> Domain
Infrastructure -> Services contracts + Domain
main.cpp -> UI + Services + Infrastructure
  • domain 不依赖 Qt、串口和文件系统
  • services 编排用例,通过接口使用工程存储、寄存器和 PLC 通信
  • infrastructure 实现 JSON 工程文件、PLC 缓存和异步 Modbus RTU
  • ui 只提交操作并展示模型、运行轨迹和错误状态
  • main.cpp 负责组合依赖,不承载业务规则

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

核心领域模型

文件 职责
register_address.* 定义 M0~M4000D0~D4000 地址和值域规则
register_repository.* 定义 M/D 统一读写接口和离线内存实现
active_register_repository.* 在虚拟仓库与 PLC 缓存仓库之间切换当前数据源
data_point_model.* 定义地址、名称和注释统一数据点
hmi_model.* 定义页面、控件、布局和寄存器绑定
control_logic_model.* 定义梯形图表达式树、条件节点和输出线圈
project_model.* 聚合数据点、HMI 页面和控制逻辑并执行工程校验
runtime_state.* 定义编辑、离线运行和真机运行状态机

工程文件格式保持 1.0。当前版本直接保存表达式树和数据点,不读取旧的 stages/branches 结构,也不包含旧格式迁移代码。加载必须先完成 JSON 解析、版本检查和领域校验,成功后才能替换当前工程;保存使用原子提交。

Project::validate() 允许未绑定控件、待配置节点和未完成网络作为编辑草稿保存。Project::validateForRunning() 额外拒绝未绑定 HMI、待配置节点、空条件和缺少输出的网络。

结构化梯形图

网络条件采用递归表达式:

ConditionExpression
├── Node       单个触点或比较条件
├── Series     子表达式依次串联,执行 AND
└── Parallel   子表达式并联,执行 OR

例如 A OR (B AND C) 表达为:

Parallel
├── Node(A)
└── Series
    ├── Node(B)
    └── Node(C)

LogicEditorService 支持在节点前后串联插入、与节点并联、与整个支路并联、删除节点或支路,以及设置或替换输出线圈。删除后会归一化空容器和只有一个子项的容器,防止无效嵌套进入执行器。

LogicEditorWidget 根据表达式树计算布局并自动生成横线、竖线和支路汇合线。画布可选择节点或表达式范围,并显示选中范围和插入位置;用户编辑结构而不是直接保存线段,因此不会产生悬空线、环路和多输出路径。

条件节点使用 std::variant 保存独立配置类型,当前包含 M 常开/常闭触点和 D 值与常量比较。输出支持普通、置位和复位 M 线圈。新增节点类型时应增加独立配置类型及校验、存储和执行分支,不能向通用节点堆叠无关字段。

执行与运行反馈

SoftwareLogicExecutor 按控制逻辑、网络顺序扫描,并递归求值 Node / Series / Parallel。普通线圈每周期写入网络结果,置位和复位线圈只在网络成立时写入;前面网络的写入对后面网络同一扫描周期立即可见。

每次扫描生成 LogicTraceSnapshot,记录节点、表达式、网络和线圈的导通状态。逻辑画布在运行时以绿色显示导通节点和路径;执行错误携带逻辑、网络和节点上下文,画布选择并以红色突出故障位置。

OfflineSimulationService 以 50 ms 目标周期驱动扫描,启动时复制逻辑快照并清空虚拟 M/D。故障后停止扫描并保留最终寄存器值,HMI 可继续显示但禁止写入。该周期不提供硬实时保证。

数据点管理

DataPointService 维护统一数据点表:

地址 | 类型 | 名称 | 注释 | 当前值 | 引用位置

地址和名称在工程内唯一。引用位置从 HMI 绑定和梯形图节点动态计算;仍被引用的数据点不能删除或修改地址,但可以修改名称和注释。HMI 和梯形图属性区从同一数据点集合选择地址,运行时当前值由活动寄存器仓库读取。

寄存器与 Modbus RTU

HmiRuntimeService 和运行界面只访问 RegisterRepositoryActiveRegisterRepository 在两种数据源之间切换:

  • 离线运行使用 VirtualRegisterRepository
  • 真机运行使用 PlcRegisterRepository 的最近一次有效缓存

PlcCommunicationService 使用 QModbusRtuSerialMaster 异步连接、读取和写入。连接时从数据点、HMI 和梯形图收集 M/D 地址,去重后按区域合并相邻地址进行轮询。M 使用线圈,D 使用保持寄存器;所有 Modbus 地址均为从 0 开始的原始地址。

HMI 写入只表示异步请求已受理,不乐观修改 PLC 缓存,实际值由后续读回确认。超时、协议错误或断线会停止轮询、保留最后一次有效值并进入故障状态,错误通过运行模式服务交给 UI 展示。

运行模式边界

模式 允许编辑 寄存器来源 软件逻辑执行器 进入约束
编辑态 无运行数据源 停止 运行态必须先退出
离线运行 虚拟 M/D 运行 工程通过运行校验
真机运行 PLC 读回缓存 停止 PLC 已连接且首次读取完成

离线运行与真机运行不得直接互切。进入真机模式不复制或下发离线值;PLC 内部程序是控制源,PC 端软件逻辑执行器必须停止。

测试边界

优先级 测试对象 重点内容
领域模型 地址边界、表达式校验与归一化、工程唯一性
编辑服务 嵌套串并联插入、删除、数据点引用保护
执行与模式服务 递归求值、轨迹、离线闭环、仓库切换和首次读取约束
工程存储 1.0 往返、缺失字段、非法结构和不支持版本
PLC 通信 缓存有效性、地址集合、异步读写和错误反馈
UI 编辑、运行切换、选择和错误定位工作流
冒烟 真机 STOP 状态安全读写 M0/D0,随后 RUN 联动

自动化测试不依赖真实 PLC。串口接线、PLC 参数和设备 RUN 行为只能通过现场真机测试确认。