From e8b9b18b617b53e0472b9fd180f1255242832ff4 Mon Sep 17 00:00:00 2001 From: suyu <1643689728@qq.com> Date: Sat, 22 Aug 2026 14:12:09 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E4=B8=8E=E4=BA=A4=E6=8E=A5=E8=B5=84=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ai/handoff.md | 22 +++++++++++++++++++++- docs/architecture.md | 2 ++ docs/工程格式说明.md | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/ai/handoff.md b/docs/ai/handoff.md index ce69b5a..0903e03 100644 --- a/docs/ai/handoff.md +++ b/docs/ai/handoff.md @@ -1,12 +1,16 @@ # 当前开发交接 -> 更新日期:2026-08-21。本文件只保留当前状态和下一步;完成事项合并成结论,不追加按日期排列的开发流水账。 +> 更新日期:2026-08-22。本文件只保留当前状态和下一步;完成事项合并成结论,不追加按日期排列的开发流水账。 ## 当前状态 - 分支:`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/二次开发/` 是已有未跟踪资料,不能因当前任务删除 @@ -22,6 +26,7 @@ - 梯形图使用 `Node / Wire / Series / Parallel` 表达式树和正交网格,不保存自由线段;前 10 列为条件区,输出最多位于第 11 列 - 每个新建或已有网络都投影出 10 个可独立点击的条件网格;空网格横线只属于 UI 插入光标,不写入工程,点击远端空格后才按需保存前置 `Wire(span)` 和真实条件节点 - 已保存的多列 `Wire` 也按单格提供点击目标;在其中一格插入触点时,服务层原子拆分为前置横线、触点和后置横线,继续点击条件工具会逐格消费右侧横线,保持原总列宽以及撤销/重做语义 +- 并联分支宽度不足时,渲染层为每个视觉补线格创建带分支 ID 和相对列号的插入目标;服务层按目标分支原子补齐必要横线并插入条件,网络内容区不再误命中整条网络背景 - 梯形图支持 M 触点与上下沿、T/C 触点、普通/置位/复位线圈、TON、CTU/CTD、MOVE、ADD/SUB - 只有输出、没有条件的网络按恒真执行;只有条件、没有输出的启用网络不能运行;空网络扫描时跳过 - 离线执行器按控制逻辑和网络顺序扫描,使用虚拟 M/D,并生成按逻辑 ID 隔离的运行轨迹 @@ -34,6 +39,14 @@ ## 最近完成 +- 调整控制逻辑网络生命周期:新建工程和新建逻辑不自动创建网络,首次实际编辑才创建网络 1;首次条件不生成隐式 `Wire`,首次横线只保存一格 `Wire(span=1)`,首次输出生成无条件输出网络;删除最后网络允许恢复为空逻辑 +- 收窄梯形图导线投影:空网格和并联补线格不再绘制真实水平线,无输出网络不再绘制条件末端到输出槽的长线;保留网格、选择态和必要的模型导线 +- 增加横线连续追加的十列边界处理,普通追加达到十列后自动新建下一网络;自动建网与编辑共用一条撤销记录,串联、并联领域表达式和执行语义保持不变 +- 修复短并联支路右端断线:新增支路宽度小于主支路时,渲染层补齐支路输出到右侧汇合点的水平结构连接,保留空网格不落盘和不绘制无逻辑横线的规则 + +- 统一梯形图可见横线网格交互:新网络空格、持久横线格和并联补线格都可直接点击添加条件;并联远端格会只保存必要的中间 `Wire(span)`,不改变空网络、JSON 或运行语义 +- 新增 `LogicEditorService::insertConditionInBranchAtColumn()`,校验目标必须位于直属并联分支的视觉补线范围内,并保持失败回滚、脏标记和一次撤销语义 +- 网络背景图元命中范围收窄到标题栏,点击线路内容区不再意外选中整条网络;删除网络仍可通过点击标题栏完成 - 修复梯形图编辑失败回滚后错误保留工程脏标记的问题:回滚同时恢复工程内容和操作前的 `modified_` 状态;保存后超出十列的条件插入不会再触发退出保存提示,已有未保存修改也不会被失败操作清除 - 根据编程器面向设备交付、调试和验证工程师的需求定位,不恢复旧的纯 HMI 操作员窗口;新增职责明确的 `RuntimeMonitorWindow`,承载离线和真机共用的完整运行监控大屏 - 主窗口已移除运行监控页签和运行时布局切换;点击离线或真机运行会弹出最大化监控窗口,右上角返回、关闭弹窗和应用退出分别按统一生命周期处理,且全应用只创建一份 `RuntimeMonitorWidget` @@ -51,6 +64,13 @@ ## 最近验证 +- 2026-08-22 网络生命周期和空网格导线调整已通过 `logic_editor_service_tests`、`main_window_tests` 及完整 Release 功能回归(`domain_tests`、`alarm_service_tests`、`hmi_editor_service_tests`、`offline_simulation_service_tests`、`project_management_tests`、`register_monitor_service_tests`、`runtime_mode_service_tests`、`plc_runtime_tests`),Qt Release 主程序在 `build/release-network-lifecycle` 构建并链接成功;本次不涉及 PLC 通信,因此未连接真实 PLC +- 2026-08-22 复现并修复短并联支路右端断线:修复前新增图形回归断言失败,修复后 `main_window_tests` 和 `logic_editor_service_tests` Release 均通过;本次只涉及梯形图 UI 投影,不涉及 PLC 通信,因此未连接真实 PLC + +- 2026-08-22 并联补线网格统一通过独立 Release 构建的 `logic_editor_service_tests` 和 `main_window_tests`;覆盖远端格自动补线、非法列原子拒绝、一次撤销、真实鼠标点击命中网格而非网络背景,以及插入后的剩余可点击横线 +- 2026-08-22 Qt Release 主程序已在 `build/release` 重新构建并链接成功;本次改动仅涉及梯形图编辑服务和 UI 投影,不涉及 PLC 通信或真机运行,因此未连接真实 PLC +- 2026-08-22 已补齐 `HmiPage::validate()` 的页面最小尺寸校验,领域、编辑服务、JSON 和 UI 统一使用 `320~1600 × 200~800`;重新构建并运行全部 10 个 Release 功能测试目标,均通过 +- 2026-08-22 页面领域校验修复后的 Qt Release 主程序已在 `build/release` 重新构建并链接成功;改动不涉及 PLC 通信,因此未连接真实 PLC - 脏标记回滚修复已通过独立 Release 构建的 `logic_editor_service_tests`、`project_management_tests` 和 `main_window_tests`;新增覆盖保存后第 11 个条件插入失败以及已有脏状态下失败操作的回归测试;Qt Release 主程序重新构建成功 - 独立运行监控窗口改动已通过重新生成 qmake 构建后的 `main_window_tests`、`hmi_editor_service_tests`、`offline_simulation_service_tests`、`runtime_mode_service_tests` 和 `plc_runtime_tests`;主窗口测试覆盖最大化弹窗、唯一监控实例、主窗口布局不变、离线与模拟真机 HMI 写入、页面跳转、返回编辑、关闭弹窗、通信故障隐藏、重复进入刷新和应用退出 - 独立运行监控窗口改动后的 Qt Release 主程序已在 `build/runtime-monitor-window-release` 完整构建并链接成功 diff --git a/docs/architecture.md b/docs/architecture.md index 76e86b6..55c511f 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -95,6 +95,8 @@ ConditionExpression 单网络前 10 列为条件区,输出最多位于第 11 列;横线只能占条件区。第 11 个条件、过深表达式或过多并联行会在编辑和加载阶段被拒绝,具体数值以数量边界文档为准。 +控制逻辑组可以暂时没有网络。新建工程和新建控制逻辑都保持 `rungs=[]`,用户第一次添加条件、横线或输出时,编辑服务在同一个原子操作中创建网络;删除最后一个网络后也允许回到空逻辑。画布中的空网格只表示可编辑位置,不绘制真实横线;模型中的 `Wire`、实际节点、输出连接,以及并联短支路到右侧汇合点的必要结构连接,才投影为梯形图导线。并联短支路的结构连接由 UI 从 `Parallel` 宽度派生,不额外写入 `Wire`。连续追加单格横线占满十个条件列后,下一次无选中目标的追加会在同一撤销记录中创建下一个网络。 + 网络运行语义: - 空网络不执行 diff --git a/docs/工程格式说明.md b/docs/工程格式说明.md index 35260cd..7928008 100644 --- a/docs/工程格式说明.md +++ b/docs/工程格式说明.md @@ -144,6 +144,8 @@ ProgressBar 使用绑定 D 地址的有符号 16 位字值,并将其限制在 `enabled` 决定离线执行器是否扫描该逻辑。所有启用逻辑按 `controlLogics` 数组顺序执行;禁用逻辑仍要求 ID、名称、网络和表达式结构合法,但允许保留未完成节点作为草稿。 +控制逻辑初始可以没有网络,`rungs` 为空不是错误。编辑器第一次添加条件、横线或输出时才创建网络;删除最后一个网络后可以再次保存为空逻辑。空网格属于界面编辑辅助,不写入 `Wire`,也不绘制真实梯形图导线。 + 网络、`Node / Wire / Series / Parallel` 条件表达式、触点、边沿、T/C 触点、比较、线圈和输出指令字段沿用当前结构化梯形图模型。横线保存为恒真的 `Wire` 叶子: ```json