# Current Handoff - Goal: 完成综合平台编程器的工程管理和后续编辑功能。 - Branch: `main`。 - Current status: 已完成开发顺序第 8 步,HMI、虚拟 M/D 和固定周期软件逻辑执行器的离线闭环已完成。 - Changed files: - `app/integrated_platform.pro` - `app/src/main.cpp` - `app/src/ui/main_window.h` - `app/src/ui/main_window.cpp` - `app/src/ui/main_window.ui` - `AGENTS.md` - `docs/C++代码规范.md` - `docs/architecture.md` - `app/src/domain/.gitkeep` - `app/src/services/.gitkeep` - `app/src/infrastructure/.gitkeep` - `app/tests/.gitkeep` - `scripts/build_and_run_qt.ps1` - `app/src/domain/register_address.h` - `app/src/domain/register_address.cpp` - `app/src/domain/register_repository.h` - `app/src/domain/register_repository.cpp` - `app/src/domain/hmi_model.h` - `app/src/domain/hmi_model.cpp` - `app/src/domain/control_logic_model.h` - `app/src/domain/control_logic_model.cpp` - `app/src/domain/project_model.h` - `app/src/domain/project_model.cpp` - `app/src/domain/runtime_state.h` - `app/src/domain/runtime_state.cpp` - `app/src/domain/project_storage.h` - `app/src/services/project_service.h` - `app/src/services/project_service.cpp` - `app/src/services/hmi_editor_service.h` - `app/src/services/hmi_editor_service.cpp` - `app/src/services/hmi_runtime_service.h` - `app/src/services/hmi_runtime_service.cpp` - `app/src/services/runtime_mode_service.h` - `app/src/services/runtime_mode_service.cpp` - `app/src/infrastructure/json_project_storage.h` - `app/src/infrastructure/json_project_storage.cpp` - `app/tests/domain_tests.pro` - `app/tests/domain_tests.cpp` - `app/tests/project_management_tests.pro` - `app/tests/project_management_tests.cpp` - `app/tests/hmi_editor_service_tests.pro` - `app/tests/hmi_editor_service_tests.cpp` - `app/tests/runtime_mode_service_tests.pro` - `app/src/services/software_logic_executor.h` - `app/src/services/software_logic_executor.cpp` - `app/src/services/offline_simulation_service.h` - `app/src/services/offline_simulation_service.cpp` - `app/tests/offline_simulation_service_tests.pro` - `app/tests/offline_simulation_service_tests.cpp` - `app/tests/runtime_mode_service_tests.cpp` - `app/tests/main_window_tests.pro` - `app/tests/main_window_tests.cpp` - `app/src/ui/hmi_editor_widget.h` - `app/src/ui/hmi_editor_widget.cpp` - `app/src/services/logic_editor_service.h` - `app/src/services/logic_editor_service.cpp` - `app/src/ui/logic_editor_widget.h` - `app/src/ui/logic_editor_widget.cpp` - `app/tests/logic_editor_service_tests.pro` - `app/tests/logic_editor_service_tests.cpp` - `app/tests/runtime_mode_service_tests.pro` - Decisions made: - Qt 应用源码位于 `app/`,构建输出位于被忽略的 `build/`。 - 使用 qmake、Qt Widgets、Qt SerialBus 和 MinGW 8.1。 - 主窗口只承载基础界面,不承担 PLC 通信或控制逻辑。 - 简单函数、构造函数和析构函数不添加重复性注释。 - 生产代码按 `UI -> Services -> Domain` 的方向依赖;基础设施实现领域接口。 - 领域模型仅使用 C++17 标准库,不依赖 Qt UI、串口或 Modbus。 - M 地址只承载布尔值,D 地址只承载带符号 16 位值,地址范围统一为 `0~4000`。 - `RegisterRepository` 统一虚拟寄存器和真实 PLC 缓存的访问契约。 - `ProjectStorage` 是领域层的工程文件存储契约,具体 JSON 和 Qt 文件 API 位于基础设施层。 - `ProjectService` 负责工程路径、修改状态和新建保存加载流程;加载成功后才替换当前工程。 - 工程文件格式版本当前为 `1.0`,保存使用 `QSaveFile` 原子提交。 - 控制逻辑节点使用 `std::variant` 组合触点、线圈和数值比较的独立配置类型。 - 当前控制逻辑范围不包含定时器;不得因为设备手册或旧开发计划提前加入未确认功能。 - 新增逻辑节点时增加独立配置类型,不向通用节点结构堆叠无关可选字段。 - 测试按业务风险分级 优先覆盖领域规则 服务闭环 工程存储和通信异常 不为简单访问器堆叠单测。 - 运行态之间不可直接切换;真机运行态必须先完成 PLC 初次读取,且不运行软件逻辑执行器。 - 主窗口采用工程树、中央编辑标签页、属性区、输出区和状态栏组成的可停靠工具布局。 - 编辑、离线运行和真机运行共用一个互斥模式入口,切换规则由服务层调用领域状态机。 - `RuntimeModeService` 直接复用领域模式、策略和结果类型,不维护一比一的服务层副本。 - 运行态禁用工程树和属性编辑区,中央页面保持可见供后续 HMI 运行画面使用。 - 当前尚未接入 PLC 通信,真机运行入口会按领域规则提示先连接并完成首次读取。 - 项目代码不使用自定义命名空间,分层由目录、接口和依赖方向表达。 - `HmiEditorService` 负责页面控件的添加、删除、移动和属性修改,画布项只保存控件标识。 - 控件拖动必须限制在页面内,控件标识在页面内唯一;未绑定控件可作为草稿保存,但不得进入离线运行。 - 新增控件先以未绑定状态进入编辑器,避免自动分配地址造成误绑定。 - 离线运行的按钮采用点击切换 M 位语义,数值输入写入一个带符号 16 位 D 字。 - `HmiRuntimeService` 仅通过 `RegisterRepository` 访问寄存器,不依赖虚拟寄存器、串口或 Modbus。 - 控制逻辑使用梯形图层级:逻辑包含网络,网络包含串联条件级,条件级内部包含并联条件,输出线圈固定在右侧。 - 条件级之间执行 AND,同级并联条件执行 OR;状态保持由常闭停止与“常开启动 OR 常开运行反馈”串联后驱动运行线圈。 - `LogicEditorService` 负责网络、串联条件、并联条件、输出线圈、属性和删除操作。 - `LogicEditorWidget` 自动布局母线、支路和节点,不允许自由拖动或手动画线,不保存节点坐标。 - 控制逻辑编辑器不访问 HMI、寄存器仓库或 PLC,工程格式版本保持 `1.0`。 - 新增 HMI 控件立即进入工程内存但默认未绑定,属性区明确显示“未绑定”,不再以 `M0/D0` 伪装默认绑定。 - 新增梯形图节点立即进入工程内存,但 `configured=false`;画布显示 `< M 地址 >`、`< D 地址 >` 或 `< 常量 >`,点击应用逻辑属性后才成为已配置节点。 - `Project::validate()` 是草稿保存和加载校验,允许未绑定 HMI、待配置节点及未完成网络;`Project::validateForRunning()` 额外校验可运行完整性。 - `RuntimeModeService` 依赖 `ProjectService` 的只读工程,在进入离线运行态前执行完整性校验,拒绝未配置或未完成的工程。 - JSON 节点新增 `configured` 字段;缺失字段的旧版 `1.0` 工程按历史逻辑视为已配置,保持兼容读取。 - 梯形图 UI 已按 LAD 可读性优化:普通线圈采用标准 `( )` 形状,导线连接元件端子而不穿透符号,比较条件显示为带数据类型和上下操作数的指令块。 - 软件逻辑执行器按逻辑、网络顺序扫描,级内 OR、级间 AND,前面网络写入对后面网络同周期可见。 - 普通线圈每周期写结果,置位/复位线圈只在网络成立时写入;同一地址混用不同线圈模式会在启动前被拒绝。 - 离线仿真以 50 ms 为目标扫描周期,启动时复制逻辑快照并清空虚拟 M/D,退出时先停止执行器再返回编辑态。 - 仿真状态使用 `Stopped`、`Running`、`Faulted`,记录扫描次数和逻辑/网络/节点错误上下文;故障后 HMI 保持最终值可见但禁止写入。 - Validation run and results: - 在 `build/baseline/` 执行 qmake 与 `mingw32-make -j2`,构建成功。 - 已启动 `integrated_platform.exe` 并正常退出。 - 已通过 `scripts/build_and_run_qt.ps1` 完成 Debug 构建和启动验证。 - 新增分层目录后再次完成 Debug 构建和启动验证。 - 已确认构建目录、临时目录和本地草稿文档被 `.gitignore` 忽略。 - 在 `build/core-model/` 重新执行 qmake 和 `mingw32-make -j2`,应用构建成功。 - 在 `build/domain-tests/` 构建并运行领域测试,输出 `domain tests passed`。 - 控制逻辑节点配置重构后再次构建应用和领域测试,均通过。 - 在 `build/project-management-tests/` 构建并运行工程管理测试,输出 `project management tests passed`。 - 工程管理加入应用后重新执行 Qt 应用构建,构建成功。 - 在 `build/main-window/` 构建主窗口和运行模式服务,Qt 5.15.2 Debug 构建成功。 - 运行模式服务测试输出 `runtime mode service tests passed`。 - 主窗口模式工作流测试输出 `main window tests passed`。 - 使用当前工作树重新构建并运行领域测试,输出 `domain tests passed`。 - 启动 Debug 应用完成窗口响应冒烟检查,程序正常启动和退出。 - 移除自定义命名空间后,Release 应用及五个测试工程构建成功,全部测试通过。 - 在 `build/hmi-editor/` 重新构建 Release 应用,构建成功并完成启动冒烟检查。 - 在 `build/hmi-editor-service-tests/` 构建并运行 HMI 服务测试,输出 `HMI editor service tests passed`。 - 重新构建并运行领域、工程管理和主窗口测试,全部通过。 - 控制逻辑编辑器完成后,领域、逻辑编辑服务、工程管理和主窗口测试全部通过。 - Debug 应用构建成功。 - 启动 Debug 应用确认主窗口创建成功,窗口标题为“综合平台编程器”。 - 梯形图结构重构后,领域、逻辑编辑服务、工程管理和主窗口测试重新构建并全部通过。 - 待配置节点改造后,Release 应用构建成功;领域、工程管理、逻辑编辑服务、运行模式和主窗口测试全部通过。 - 离线仿真实现后,Release 应用构建成功;离线仿真、领域、工程管理、HMI 编辑、逻辑编辑、运行模式和主窗口测试全部通过。 - Remaining work: 进入开发顺序第 9 步,实现 Modbus RTU 真机通信。 - Known risks / blockers: 无。 - Suggested next command: 建立异步 Modbus RTU 通信服务,先完成串口配置、连接和 M0/D0 安全读写。