Преглед на файлове

docs: 更新架构与交接资料

main
suyu преди 4 седмици
родител
ревизия
e8b9b18b61
променени са 3 файла, в които са добавени 25 реда и са изтрити 1 реда
  1. +21
    -1
      docs/ai/handoff.md
  2. +2
    -0
      docs/architecture.md
  3. +2
    -0
      docs/工程格式说明.md

+ 21
- 1
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` 完整构建并链接成功


+ 2
- 0
docs/architecture.md Целия файл

@@ -95,6 +95,8 @@ ConditionExpression

单网络前 10 列为条件区,输出最多位于第 11 列;横线只能占条件区。第 11 个条件、过深表达式或过多并联行会在编辑和加载阶段被拒绝,具体数值以数量边界文档为准。

控制逻辑组可以暂时没有网络。新建工程和新建控制逻辑都保持 `rungs=[]`,用户第一次添加条件、横线或输出时,编辑服务在同一个原子操作中创建网络;删除最后一个网络后也允许回到空逻辑。画布中的空网格只表示可编辑位置,不绘制真实横线;模型中的 `Wire`、实际节点、输出连接,以及并联短支路到右侧汇合点的必要结构连接,才投影为梯形图导线。并联短支路的结构连接由 UI 从 `Parallel` 宽度派生,不额外写入 `Wire`。连续追加单格横线占满十个条件列后,下一次无选中目标的追加会在同一撤销记录中创建下一个网络。

网络运行语义:

- 空网络不执行


+ 2
- 0
docs/工程格式说明.md Целия файл

@@ -144,6 +144,8 @@ ProgressBar 使用绑定 D 地址的有符号 16 位字值,并将其限制在

`enabled` 决定离线执行器是否扫描该逻辑。所有启用逻辑按 `controlLogics` 数组顺序执行;禁用逻辑仍要求 ID、名称、网络和表达式结构合法,但允许保留未完成节点作为草稿。

控制逻辑初始可以没有网络,`rungs` 为空不是错误。编辑器第一次添加条件、横线或输出时才创建网络;删除最后一个网络后可以再次保存为空逻辑。空网格属于界面编辑辅助,不写入 `Wire`,也不绘制真实梯形图导线。

网络、`Node / Wire / Series / Parallel` 条件表达式、触点、边沿、T/C 触点、比较、线圈和输出指令字段沿用当前结构化梯形图模型。横线保存为恒真的 `Wire` 叶子:

```json


Зареждане…
Отказ
Запис