mainNode / Series / Parallel 表达式树,可表示 A OR (B AND C) 和嵌套串并联ActiveRegisterRepository 在离线虚拟仓库与 PLC 缓存仓库之间切换PlcCommunicationService 使用 Qt SerialBus 异步连接、轮询和单点写入,UI 不阻塞main_window.ui,PLC 参数由独立配置对话框收集后再发起连接M0~M4000、D0~D4000 地址输入、连续批量添加、去重、删除、清空和最多 64 项限制COM3 / 9600 / 8E1 / 站号 1 上完成只读联机验证,项目通信服务可完成 M/D 首次读取并进入真机运行前置状态1.0,当前文件只保存 HMI 和梯形图表达式树,不保留 dataPoints 结构及兼容代码1.0 的必填字段,不兼容或迁移缺少该字段的旧按钮数据stages/branches 结构,不添加旧格式迁移和兼容层std::variant 的独立配置类型,不向通用节点添加无关字段M0~M4000、D0~D4000 地址范围0 开始的原始 Modbus 地址1.0 JSON,不重新引入数据点表以下测试均已完成干净构建并通过:
domain_testslogic_editor_service_testsoffline_simulation_service_testsproject_management_testshmi_editor_service_testsruntime_mode_service_testsplc_runtime_testsmain_window_testsregister_monitor_service_testsmain_window_tests 还覆盖 PLC 配置参数往返、独立配置弹窗入口,以及主窗口不再内嵌串口参数控件。
2026-08-13 真机排查发现 QModbusRtuSerialMaster::connectDevice() 在当前 Windows
串口驱动上会同步触发 ConnectedState。旧实现随后再次写入 Connecting,导致已经发出的
读取响应因服务状态不是 Connected 而被丢弃,首次读取标志永远不能完成。现已把
Connecting 状态设置移动到 Qt 连接调用之前,并在真实 PLC 上验证首轮 M0~M2、D0
读取约 288 ms 完成,缓存值为 M0=1、M1=1、M2=0、D0=0。主窗口现在会显示
连接、首读完成和具体中文通信故障,生产代码中的业务错误提示已统一为中文,JSON 字段和协议标记保持不变。
PLC 连接初始化会连续通知首读重置、正在连接和已连接。旧主窗口把每次通知都排队处理,
队列执行时读取到的已经是同一个最终状态,因此输出区会连续追加三条相同的“正在首读”。
现已在主窗口合并同一事件循环内的 PLC 状态刷新,并拒绝连续追加完全相同的输出消息。
真实 COM3 主窗口联调确认“正在首读”和“首次读取完成”各输出一次。
本轮已完整删除统一数据点业务,包括领域模型、服务、主窗口 Dock、属性区下拉框、JSON 字段和独立测试工程。当前开发阶段不保留 dataPoints 旧结构的迁移或兼容逻辑。主窗口测试明确验证已删除控件不存在,PLC 轮询测试改为验证从 HMI 实际绑定收集地址。
本轮梯形图编辑重构还验证了:固定网格渲染、水平/垂直正交布线、工具栏直接建立并联支路,以及连续范围 A AND ((B AND C) OR D) 的结构变换和非连续范围拒绝。
本轮自由监控与运行工作台实现还验证了:地址字符串解析和边界、连续范围展开、去重和数量
上限、活动仓库切换、离线工作台三区域同时可见、真机工作台只显示 HMI 与自由监控、离线
监控读取虚拟 M/D,以及真机运行期间新增地址立即进入 PLC 聚合轮询集合。PLC 动态轮询在
读取请求空闲后应用新集合,连接首读完成后不会因新增监控地址而回退。
运行工作台的 HMI 和梯形图是独立于编辑画布的模型投影。此前同一页面或逻辑 ID 在编辑态
发生变化后,运行投影的 setPageId() / setLogicId() 会因 ID 未变化而跳过重建,导致新建
HMI 控件在离线运行工作台中显示为空白。现在每次同步运行对象都会显式重建两个投影,主窗口
测试会保留一个已配置 HMI 控件,并断言离线运行视图实际包含该控件,而不再只检查区域可见。
Qt Release 应用已完成干净构建,并执行了启动与正常退出冒烟验证。git diff --check 无空白错误。
本轮修正 PLC 故障恢复状态链。通信服务发生错误时会清除当前连接的首次读取资格,运行模式
服务同时校验 PLC 必须处于 Connected 且当前连接已完成首读;真机运行期间发生故障会自动
返回编辑态,避免使用旧连接的首读结果重新进入真机运行。故障状态下主窗口开放“PLC 重新
配置”,用户确认后自动断开并清理旧会话,再发起新连接。旧连接未完成的异步回复使用连接代次
隔离,不能污染重连后的新会话。
PLC 错误分类已拆到独立基础设施模块。连接阶段无法打开串口时直接报告端口不存在或被占用,
保持未连接状态;已连接后收到 ConnectionError 或意外进入 UnconnectedState 时统一报告本地
串口连接已中断,自动清理并转为未连接状态,不再依赖错误瞬间的 Windows COM 口枚举结果。
本轮新增自动化测试覆盖故障自动退回编辑态、首读资格撤销、故障后禁止重新进入真机、故障态
直接重连清理旧会话、主窗口重新配置入口和五类核心通信错误。plc_runtime_tests、
runtime_mode_service_tests、main_window_tests 均通过,Qt Release 工程完成干净构建。
本轮参照 TouchWin 按钮业务新增四种位操作:置 ON、置 OFF、取反、瞬时 ON。按钮操作
使用领域枚举并写入工程 1.0 JSON;运行服务按 Pressed/Released 事件生成写值,瞬时 ON
按下写 1、释放写 0,其他模式释放不重复写入。属性面板只在选中按钮时显示操作模式,新建
按钮默认瞬时 ON。相关服务、离线闭环、JSON 往返与主窗口测试已覆盖。
HMI 图元现已分离编辑选择与运行输入状态。运行按钮悬停时改变底色,按下时按钮面下移并
加深,释放后回弹;禁止写入时显示灰色且不接收鼠标写操作。运行态关闭图元选择,避免点击
后出现编辑选中框。主窗口测试使用真实鼠标按下和释放事件验证瞬时按钮写入、视觉状态切换、
手型光标、禁止写入和无运行选中框。
M0、D0M0、D0 并由 PLC 监控和下一次轮询确认运行 Release 应用,配置实际 COM 口、站号、波特率和校验方式,在 PLC STOP 状态完成 M0、D0 首次安全读写。未确认设备程序与负载安全前不要在 RUN 状态写控制地址。