diff --git a/AGENTS.md b/AGENTS.md index 9ecb757..7a46b72 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,6 +26,7 @@ - 原始需求:`docs/0_综合平台编程器_修改.md` - 数量边界最终规则:`docs/用户使用/数量边界确认方案.md` - 应用配置文件:`docs/用户使用/应用配置说明.md` +- 数据监控与离线初始值:`docs/用户使用/数据监控与离线初始值说明.md` - 工程 JSON 格式:`docs/工程格式说明.md` - 开发阶段顺序:`docs/开发顺序.md`(阶段参考,当前状态以 handoff 为准) - 测试约定:`docs/测试约定.md` diff --git a/docs/ai/handoff.md b/docs/ai/handoff.md index 1bf5f14..efd3960 100644 --- a/docs/ai/handoff.md +++ b/docs/ai/handoff.md @@ -8,6 +8,8 @@ - 核心闭环可用:HMI 编辑、结构化梯形图、离线仿真、工程 JSON、运行监控、自由监控和 Modbus RTU 真机读写均已实现 - D 区 Float32/REAL 读写已接入:HMI 和自由监控可选 Int16/Float32,底层仍保存原始 16 位字,Float32 使用低字/高字连续双 D 编解码 - 真机本地梯形图只读推算已实现:HMI/自由监控继续读写 PLC,本地梯形图只读 PLC 缓存并在临时仓库推算轨迹 +- 编辑态 M/D 数据监控已接入:监控面板可在编辑态修改虚拟 M/D,并将值作为下一次离线仿真的进程内初始值;运行输出不会污染初始值 +- 数据监控面板在编辑态停靠显示,进入离线/真机运行后隐藏编辑面板并复用运行监控中的同一监控服务;离线写虚拟仓库,真机写 PLC 缓存 - 应用外部配置业务已经完成,固定读取可执行文件目录下的 `config/application.ini` - 配置支持 6 个体验型数量上限、2 个新建 HMI 页面默认尺寸和 6 个 PLC 串口默认参数 - 配置启动时只读取一次,不热更新,不覆盖已有文件,不回写 PLC 配置窗口中的临时修改 @@ -15,7 +17,7 @@ ## 工作区状态 -- 当前未提交修改同时包含应用外部配置功能和真机本地只读推算功能,涉及启动加载、领域与服务动态上限、运行模式、PLC 轮询回调、UI 轨迹投影、测试和文档 +- 当前未提交修改同时包含应用外部配置功能、真机本地只读推算功能和 M/D 数据监控初始值功能,涉及启动加载、领域与服务动态上限、运行模式、PLC 轮询回调、UI 轨迹投影、监控停靠面板、测试和文档 - 工程树的新建页面、新建控制逻辑及重命名入口已统一禁止提交空名称或纯空白名称,确认按钮会随输入有效性即时启停 - 新增 `ApplicationSettings`、严格 UTF-8 INI 加载器及独立 `application_settings_tests` - 新增用户文档 `docs/用户使用/应用配置说明.md`,并同步架构、数量边界、测试约定和 `AGENTS.md` 索引 @@ -52,6 +54,7 @@ - 真机梯形图区显示只读边界提示:本地输出不写入 PLC 程序或 M/D,同时说明 HMI 和自由监控仍可写 PLC - 本地推算失败或 PLC 断线/通信故障时停止推算并退出真机运行;推算故障详情在退出后保留,下一次启动重新清理 - Float32 工程 JSON 固定保存 `dataType: "int16"` 或 `"float32"`;缺少字段直接拒绝加载,不增加旧结构兼容分支 +- 离线仿真启动前复制编辑态确认的初始 M/D 快照,停止或返回编辑态时恢复初始快照;初始值只存在进程内,不写工程 JSON - 普通梯形图比较、MOVE、ADD、SUB 继续按 Int16;普通整数指令可以读取 Float32 占用字,但不能写入其任一 D - 自由监控完全重复点拒绝,部分重叠允许但提示;Float32 批量地址步长为 2,并显示 D 起始~结束范围 - Float32 写入使用一次写两个连续保持寄存器,真机缓存等待轮询读回;Float32 轮询分块不会拆开两个连续字 @@ -61,11 +64,13 @@ - 2026-08-25 执行 `run_qt_tests.ps1 -Configuration Release -Suite All`,12 个 Release 功能测试目标和性能测试全部通过 - 2026-08-25 执行 `run_qt_tests.ps1 -Configuration Release -Suite Functional`,包含命令输入测试的 12 个功能测试目标全部通过 - 2026-08-25 重新执行 qmake 和 `mingw32-make -j2`,Release 主程序 `build/release/release/integrated_platform.exe` 链接通过 +- 2026-08-25 新增数据监控停靠面板和离线初始值生命周期;Release Functional 测试、主程序 qmake/`mingw32-make -j2` 和新增快照回归通过 - 2026-08-25 修复命令输入失焦、零长度连线黑点、删除后 Gap 复用和连续横线插入;Release Functional 测试及主程序构建通过 - 2026-08-25 修复已有节点双击无法进入命令输入;新增条件/输出节点替换回归测试,Release Functional 测试、主程序构建和 `git diff --check` 通过 - 2026-08-25 修复梯形图整网删除误报断路、网络内部无法启动框选;新增批量网络删除原子性测试,Release Functional 测试、主程序构建和 `git diff --check` 通过 - 2026-08-25 新增 Float32 编解码、HMI 双字读写、D3999/D4000 边界、HMI 重叠、自由监控步长/重叠/读写和 Float32 轮询元数据测试;All 套件全部通过 - `application_settings_tests` 覆盖首次创建与默认内容、完整加载、缺失和未知字段、重复字段、越界、非整数、版本不兼容、非法 UTF-8 及创建失败回退 +- 新增离线初始值和监控写入回归测试:编辑态 M/D/Float32 写入进入初始仓库,仿真输出在停止和重启时被丢弃 - 领域和服务测试覆盖 HMI 页面/控件、报警、控制逻辑/网络动态上限与新建页面默认尺寸 - 工程管理测试覆盖调低页面上限后拒绝两页面工程,并确认当前工程状态保持不变 - 性能基准通过:代表性软件扫描约 `0.203 ms`,4001 个虚拟寄存器边界工作量约 `0.0454 ms` diff --git a/docs/architecture.md b/docs/architecture.md index 14fac9f..eddc83b 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -45,7 +45,7 @@ main.cpp -> UI + Services + Infrastructure 运行界面统一投影到独立顶层 `RuntimeMonitorWindow` 中的唯一 `RuntimeMonitorWidget`。该窗口是编程器的工程师运行监控大屏,不是旧的纯 HMI 操作员窗口: - 进入离线或真机运行后,弹出并最大化运行监控窗口;主编程器窗口保留在后面且不改变布局,运行期间由同一份 `ModePolicy` 禁用编辑入口 -- 主窗口不保留运行监控页签,也不创建第二份监控控件;工程对象刷新和运行交互始终指向弹窗中的唯一实例 +- 主窗口不保留运行监控页签;编辑态主窗口提供独立的“数据监控”停靠面板,进入运行态后隐藏该面板并显示弹窗中的运行监控投影 - 离线时显示可交互 HMI、软件梯形图轨迹和自由监控;真机时同时显示可交互 HMI、自由监控和根据 PLC 缓存计算的“本地推算轨迹” - HMI 页面跳转、按钮和数值输入都通过同一份 `HmiNavigationService` 和活动寄存器仓库完成;离线写虚拟 M/D,真机写 PLC,仿真停止或通信不可用时禁止写入 - 运行监控只能通过界面内的返回编辑按钮请求 `MainWindow -> RuntimeModeService` 返回编辑态;运行期间系统窗口关闭路径被忽略,离线时先停止软件扫描,真机时保留 PLC 连接但撤销运行会话;应用退出时允许顶层窗口真正关闭 @@ -145,6 +145,9 @@ ConditionExpression 编辑:UI -> Editor Services -> ProjectService -> Project └── ProjectStorage -> JSON +编辑态数据监控:UI -> RegisterMonitorService -> VirtualRegisterRepository + └── 离线初始值 VirtualRegisterRepository(进程内) + 离线:运行监控弹窗 -> ActiveRegisterRepository -> VirtualRegisterRepository ^ OfflineSimulationService(SoftwareLogicExecutor) @@ -160,7 +163,7 @@ PLC <-> PlcCommunicationService <--------------------┘ | 模式 | 允许工程编辑 | 寄存器来源 | 软件逻辑执行器 | 进入条件 | | --- | --- | --- | --- | --- | -| 编辑态 | 是 | 无运行数据源 | 停止 | 运行态先退出 | +| 编辑态 | 是 | 数据监控使用虚拟 M/D 初始值;其他编辑操作不启用运行数据源 | 停止 | 运行态先退出 | | 离线运行 | 否 | 虚拟 M/D | 运行 | 工程通过运行校验 | | 真机运行 | 否 | HMI 使用 PLC 读回缓存;轨迹使用缓存副本 | 本地只读推算 | PLC 已连接并完成本次首读 | @@ -168,6 +171,8 @@ PLC <-> PlcCommunicationService <--------------------┘ 自由监控是会话级诊断工具,不属于 `Project`,不写入 JSON。每个监控点可选 `Int16` 或 `Float32`,Float32 批量添加按 2 个 D 偏移并显示实际占用范围;完全重复点拒绝,部分重叠点允许添加但提示。它通过活动仓库读取 M/D 或成对读取 Float32,并通过单字或双字请求写入;真机写入仍必须经过连接与首读门槛。 +编辑态数据监控写入虚拟 M/D 时,同时更新当前进程内的离线初始值仓库。启动离线仿真时,运行仓库先清空,再复制这份初始值;仿真扫描产生的线圈、MOVE、ADD 和 SUB 结果只写入本轮运行仓库。仿真停止或返回编辑态时丢弃本轮输出并恢复初始值。离线初始值和监控地址均不写入工程 JSON。运行态监控继续复用同一 `RegisterMonitorService`,离线写入虚拟仓库,真机写入 PLC 缓存并等待轮询确认。 + ## Modbus RTU 通信 `PlcCommunicationService` 使用 `QModbusRtuSerialMaster` 异步连接、轮询和单点写入,UI 线程不等待串口响应。Modbus 地址使用从 `0` 开始的原始地址。 diff --git a/docs/测试约定.md b/docs/测试约定.md index c95f138..82b754a 100644 --- a/docs/测试约定.md +++ b/docs/测试约定.md @@ -21,9 +21,9 @@ | `alarm_service_tests` | 报警定义和运行记录生命周期 | | `hmi_editor_service_tests` | HMI 编辑、原子删除、历史、导航和 Float32 数值控件读写 | | `logic_editor_service_tests` | 结构化梯形图编辑、归一化和历史 | -| `offline_simulation_service_tests` | 梯形图扫描语义、真机缓存副本推算、只读隔离、跨扫描状态和故障处理 | +| `offline_simulation_service_tests` | 梯形图扫描语义、离线初始 M/D 快照、真机缓存副本推算、只读隔离、跨扫描状态和故障处理 | | `project_management_tests` | JSON 往返、非法文件和工程保存状态 | -| `register_monitor_service_tests` | 监视地址、Int16/Float32 读写、批量步长、重叠提示和活动仓库 | +| `register_monitor_service_tests` | 监视地址、Int16/Float32 读写、离线初始值捕获、批量步长、重叠提示和活动仓库 | | `runtime_mode_service_tests` | 编辑、离线、真机只读轨迹和仓库切换 | | `runtime_panel_controller_tests` | 本地扫描排队回调和编辑态轨迹清理 | | `plc_connection_dialog_tests` | PLC 端口刷新及自动搜索开始、取消、进度和参数回填 | diff --git a/docs/用户使用/数据监控与离线初始值说明.md b/docs/用户使用/数据监控与离线初始值说明.md new file mode 100644 index 0000000..a0c7840 --- /dev/null +++ b/docs/用户使用/数据监控与离线初始值说明.md @@ -0,0 +1,17 @@ +# 数据监控与离线初始值 + +## 编辑态 + +打开主窗口的“数据监控”停靠面板,添加需要观察的 `M` 或 `D` 地址。编辑态写入的 M/D 不会写入 PLC;它们会同时保存为当前进程内的离线仿真初始值。 + +## 离线仿真 + +点击“离线运行”时,软件先清空上一轮运行值,再装载编辑态确认的初始 M/D。梯形图扫描产生的线圈、MOVE、ADD 和 SUB 结果只属于本轮仿真。 + +停止离线仿真或返回编辑态后,本轮运行输出会丢弃,监控面板恢复显示下一轮将使用的初始值。初始值只保存在当前进程,不写入工程 JSON。 + +## 真机运行 + +进入真机运行后使用同一个监控地址列表,但数据源切换为 PLC 读回缓存。写入请求必须在 PLC 已连接并完成有效首读后才能提交,写入结果等待后续轮询确认。 + +真机监控写入的是 PLC 的 M/D 数据,不会修改 PLC 程序,也不会把本地梯形图推算结果写回 PLC。