# 当前开发交接 > 更新日期:2026-08-23。本文件只保留当前状态和下一步;完成事项合并成结论,不追加按日期排列的开发流水账。 ## 当前状态 - 分支:`main` - 核心软件闭环已经可用:HMI 编辑、结构化梯形图、离线仿真、工程 JSON、统一运行监控大屏、自由监控和 Modbus RTU 真机读写均已实现 - HMI 外观属性和梯形图十列可选插入网格均已按逻辑完成提交;开始工作前仍需先看 `git status` 和相关 diff,不要重置来源不明的改动 - 梯形图并联短分支的视觉补线已统一为逐格可点击目标,可直接在任意可见补线格插入条件;空补线仍只属于 UI 投影,只有实际使用的间隔才写入 `Wire(span)` - 控制逻辑允许以 `rungs=[]` 启动和保存,不再预置“网络 1”;第一次添加条件、横线或输出时由编辑服务原子创建网络,删除最后一个网络后也能回到空逻辑 - 梯形图空网格只作为编辑位置,不绘制深色真实横线;只有模型中的 `Node / Wire` 和输出连接才绘制导线。连续追加单格横线满十列后,下一次追加自动进入新网络并可一次撤销 - 并联表达式中较短支路会由 UI 派生右侧汇合连接线,不向工程模型写入隐式 `Wire`,保证每条支路视觉上都接到右侧汇合点 - HMI 页面宽高已支持编辑态页面属性设置;业务范围统一为宽 `320~1600`、高 `200~800`,默认新建页面为 `800×400`,页面缩小导致控件越界时由服务层原子拒绝 - HMI 控件属性面板的显示文本输入统一限制为 12 个字符;领域层工程文件文本上限仍为 4096 个 UTF-8 字节 - `docs/二次开发/` 是已有未跟踪资料,不能因当前任务删除 - 提交测试已收敛为 9 个功能自动化目标(Domain、Service、JSON 和 Fake PLC)、独立 `performance_tests` 性能目标以及真实 PLC 人工验收;不再保留 Qt UI 自动化目标,长期测试规则见 `docs/测试约定.md` - 当前没有代码阻塞;实际设备 RUN 联动和离线演示均已完成,下一步是最终交付资料整理 ## 已实现能力 - 工程格式为严格的 `1.0`,保存多 HMI 页面、初始页、报警定义、M/D 注释、多控制逻辑和结构化梯形图;不读取旧 `dataPoints` 或 `stages/branches` 格式 - HMI 现有 8 类控件:Button、Indicator、NumericDisplay、NumericInput、Label、PageJump、AlarmList、ProgressBar - HMI 控件支持静态文字外观:`textColor` 使用 `#RRGGBB`,字体使用 `fontSize`、`fontBold` 和 `fontItalic`;缺失时使用原有默认样式,属性经现有 `properties` 保存,无需升级 JSON 版本 - 字体颜色和基础字体设置在编辑画布和统一运行监控 HMI 中共享同一绘制实现;它们不参与 M/D 绑定、PLC 轮询或离线控制逻辑 - 梯形图使用 `Node / Wire / Series / Parallel` 表达式树和正交网格,不保存自由线段;前 10 列为条件区,输出最多位于第 11 列 - 每个新建或已有网络都投影出 10 个可独立点击的条件网格;空网格横线只属于 UI 插入光标,不写入工程,点击远端空格后才按需保存前置 `Wire(span)` 和真实条件节点 - 已保存的多列 `Wire` 也按单格提供点击目标;在其中一格插入触点时,服务层原子拆分为前置横线、触点和后置横线,继续点击条件工具会逐格消费右侧横线,保持原总列宽以及撤销/重做语义 - 并联分支宽度不足时,渲染层为每个视觉补线格创建带分支 ID 和相对列号的插入目标;服务层按目标分支原子补齐必要横线并插入条件,网络内容区不再误命中整条网络背景 - 梯形图支持 M 触点与上下沿、T/C 触点、普通/置位/复位线圈、TON、CTU/CTD、MOVE、ADD/SUB - 只有输出、没有条件的网络按恒真执行;只有条件、没有输出的启用网络不能运行;空网络扫描时跳过 - 离线执行器按控制逻辑和网络顺序扫描,使用虚拟 M/D,并生成按逻辑 ID 隔离的运行轨迹 - 真机模式只使用 PLC 读回缓存,停止本地逻辑执行器,不下载本地梯形图,也不显示伪造的 PLC 梯形图轨迹 - 自由监控属于当前会话,支持 M/D 批量添加、去重、读取和单点写入,不写入工程 JSON - PLC 通信使用异步 Qt Modbus RTU;轮询地址来自 HMI、报警、梯形图和自由监控的引用并集,写入后等待轮询确认,不乐观修改缓存 - 真机进入要求当前连接完成首次读取;通信故障撤销首读资格并退出真机运行,恢复通信后仍停留在编辑态 - 进入离线或真机运行后,弹出并最大化唯一的工程师运行监控窗口,主编程器保留在后面且布局不变;离线时组合可交互 HMI、软件梯形图轨迹和自由监控,真机时组合可交互 HMI 和自由监控 - 所有数量上限和超限处理见 `docs/用户使用/数量边界确认方案.md`,核心常量集中在 `app/src/domain/project_limits.h` ## 最近完成 - 收敛提交测试体系:删除 Qt UI 自动化目标及其 2689 行测试代码,功能回归只保留 9 个 Domain、Service、JSON 和 Fake PLC 目标;性能测试改为通过 `-Suite Performance` 独立运行并输出 CSV,真实 PLC 继续人工实测和记录 - 整理寄存器仓库文件边界:`register_repository.h` 只保留访问契约和结果类型;新增 `virtual_register_repository.h/.cpp` 承载离线内存实现;应用与测试 qmake 清单及具体使用点均改为显式包含新头文件,PLC 仓库继续位于 `infrastructure` - 调整控制逻辑网络生命周期:新建工程和新建逻辑不自动创建网络,首次实际编辑才创建网络 1;首次条件不生成隐式 `Wire`,首次横线只保存一格 `Wire(span=1)`,首次输出生成无条件输出网络;删除最后网络允许恢复为空逻辑 - 收窄梯形图导线投影:空网格和并联补线格不再绘制真实水平线,无输出网络不再绘制条件末端到输出槽的长线;保留网格、选择态和必要的模型导线 - 增加横线连续追加的十列边界处理,普通追加达到十列后自动新建下一网络;自动建网与编辑共用一条撤销记录,串联、并联领域表达式和执行语义保持不变 - 修复短并联支路右端断线:新增支路宽度小于主支路时,渲染层补齐支路输出到右侧汇合点的水平结构连接,保留空网格不落盘和不绘制无逻辑横线的规则 - 修复首次横线自动建网后撤销再插入失败:梯形图重载时清除已被撤销的过期当前网络 ID,横线可以再次自动创建网络 - 修复并联补线格选中后横线视觉消失:补线格继续使用分支插入目标,但在选中框上层按运行激活状态重画派生横线,普通空网格仍不绘制真实导线 - 修复横线单格选区建立并联旁路时误使用整条横线宽度:新增按横线表达式 ID 和列偏移处理的服务接口,选中范围会原子拆分前置、旁路和后置横线,旁路宽度严格等于选中格数 - 修复视觉连续横线由多个相邻 `Wire` 表达式组成时误提示“必须来自同一条横线”:服务层按同一串联路径的绝对列合并相邻横线网格,仍拒绝跨触点、跨并联支路和跳列选区 - 明确拒绝空白并联格直接建立并联支路或竖线连接;空白格与节点/横线混选时给出明确提示,真实节点和横线网格分别路由到对应编辑用例 - 统一梯形图可见横线网格交互:新网络空格、持久横线格和并联补线格都可直接点击添加条件;并联远端格会只保存必要的中间 `Wire(span)`,不改变空网络、JSON 或运行语义 - 新增 `LogicEditorService::insertConditionInBranchAtColumn()`,校验目标必须位于直属并联分支的视觉补线范围内,并保持失败回滚、脏标记和一次撤销语义 - 网络背景图元命中范围收窄到标题栏,点击线路内容区不再意外选中整条网络;删除网络仍可通过点击标题栏完成 - 修复梯形图编辑失败回滚后错误保留工程脏标记的问题:回滚同时恢复工程内容和操作前的 `modified_` 状态;保存后超出十列的条件插入不会再触发退出保存提示,已有未保存修改也不会被失败操作清除 - 根据编程器面向设备交付、调试和验证工程师的需求定位,不恢复旧的纯 HMI 操作员窗口;新增职责明确的 `RuntimeMonitorWindow`,承载离线和真机共用的完整运行监控大屏 - 主窗口已移除运行监控页签和运行时布局切换;点击离线或真机运行会弹出最大化监控窗口,运行期间只允许监控界面内的返回按钮退出,系统窗口关闭路径被忽略,应用退出时才关闭顶层窗口,且全应用只创建一份 `RuntimeMonitorWidget` - CTU/CTD 输出节点保持现有梯形图网格宽度,将 CV 和 PV 拆成带水平内边距的两行显示,避免 `D4000`、`32767` 等边界配置在右侧电源轨处被裁剪 - 报警列表标题输入上限为 12 个字符,报警文本输入上限为 20 个字符;运行消息保持单行并在空间不足时显示省略号 - 新建报警列表默认尺寸调整为 `360×136`,默认字号比应用字体小 2pt;运行态按当前页 1~5 条记录收缩高度,超过 5 条可通过表头按钮翻页且确认命中使用当前页索引 - 主窗口默认工具栏布局调整为运行模式栏第一行,HMI 或梯形图编辑工具栏第二行;编辑工具栏仍允许用户拖动重新停靠 - 新增 HMI 保留外观属性键和领域校验:颜色为严格 `#RRGGBB`,字号为 `6~72`,粗体和斜体为 `true/false` - HMI 页面属性面板新增宽度和高度编辑;`HmiEditorService::resizePage()` 复用页面边界校验并纳入撤销/重做,成功后画布和工程树尺寸摘要同步刷新;JSON 页面尺寸也统一按 `320~1600 × 200~800` 校验 - 属性面板新增颜色输入与选择按钮、字号、粗体、斜体;通过既有 `HmiEditorService::updateControl()` 原子提交并保留撤销/重做 - `HmiGraphicsItem` 统一应用文字外观,保留地址提示、按钮禁用色、指示灯状态色、控件边框和选中框的原有语义 - 更新工程格式和数量边界文档;领域、HMI 编辑服务和 JSON 往返由自动化测试覆盖,主窗口工作流改为交付前人工验收 - 梯形图编辑器新增按绝对条件列插入和按横线单格替换的服务接口;UI 统一将空格、横线格、已有条件和无选择状态路由到对应编辑用例,选中条件后串联插入会优先替换紧邻的右侧横线格,再考虑扩展网络宽度 - 梯形图条件工具提示已明确支持在选中空网格或横线处插入;线圈等输出指令仍写入独立的固定输出槽 ## 最近验证 - 2026-08-23 从当前工作区重新构建并通过 9 个 Release 功能目标:Domain、Service、JSON 和 Fake PLC 全部通过 - 独立性能基准通过:100 个控制逻辑扫描约 `0.145 ms`,4001 个 M 寄存器完整读写约 `0.052 ms`;CSV 位于 `build/tests/release/performance_tests/benchmark.csv` - Qt Release 主程序已在 `build/release-submit/release/integrated_platform.exe` 构建并链接成功,`git diff --check` 通过 - 2026-08-20 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成真实 PLC 安全读写:`D4000` 从原值 `0` 临时写入并读回 `1`,随后恢复并读回 `0`;未下载 PLC 程序,未执行 RUN 动作 - 2026-08-21 使用 `json/motor_forward_reverse.json` 完成真实 PLC RUN 联动人工验收:正转启动、反转启动、停止和运行状态反馈正常 ## 待完成 1. 整理最终演示工程、构建说明和验收记录 2. 根据交付时间评估插件化、新设备适配等可选加分项,不影响当前核心验收闭环 ## 下一会话起点 1. 运行 `git status --short`,确认当前未提交和未跟踪文件仍在 2. 若继续扩展 HMI 外观,优先复用 `HmiAppearanceProperty` 的保留属性键、领域校验和统一绘制路径,避免把样式逻辑放入寄存器或运行服务 3. 若继续扩展梯形图插入交互,保持空网格为 UI 会话投影,只有真实 `Node / Wire / Series / Parallel` 表达式进入工程;条件区继续统一使用 `ProjectLimits::kMaximumConditionColumns` 4. 修改代码后运行受影响测试和 Release 构建;涉及真机通信时按 `AGENTS.md` 做 COM3 读写及恢复验证