| @@ -11,7 +11,8 @@ | |||||
| - 画布只选择可见节点,不暴露内部表达式容器;橡皮框或多选连续节点后可直接建立并联支路 | - 画布只选择可见节点,不暴露内部表达式容器;橡皮框或多选连续节点后可直接建立并联支路 | ||||
| - 执行器递归求值并生成节点、表达式、网络轨迹,离线运行时画布显示导通路径和故障位置 | - 执行器递归求值并生成节点、表达式、网络轨迹,离线运行时画布显示导通路径和故障位置 | ||||
| - HMI 和梯形图直接配置 M/D 地址,不依赖预先创建的数据点 | - HMI 和梯形图直接配置 M/D 地址,不依赖预先创建的数据点 | ||||
| - HMI 控件描述注册表统一维护现有 7 种控件的稳定名称、默认值、绑定规则和运行值类型 | |||||
| - HMI 控件描述注册表统一维护现有 8 种控件的稳定名称、默认值、绑定规则和运行值类型 | |||||
| - HMI ProgressBar 使用 D 区 Word 值和可配置范围显示百分比,支持越界钳制、JSON 往返和运行态只读展示 | |||||
| - `ActiveRegisterRepository` 在离线虚拟仓库与 PLC 缓存仓库之间切换 | - `ActiveRegisterRepository` 在离线虚拟仓库与 PLC 缓存仓库之间切换 | ||||
| - `PlcCommunicationService` 使用 Qt SerialBus 异步连接、轮询和单点写入,UI 不阻塞 | - `PlcCommunicationService` 使用 Qt SerialBus 异步连接、轮询和单点写入,UI 不阻塞 | ||||
| - 真机连接收集 HMI、报警定义和梯形图实际引用地址,按 M/D 分区并合并相邻地址读取 | - 真机连接收集 HMI、报警定义和梯形图实际引用地址,按 M/D 分区并合并相邻地址读取 | ||||
| @@ -188,6 +189,14 @@ NumericInput、Label、PageJump 和 AlarmList 的工程稳定类型名、界面 | |||||
| M/D 绑定与运行值匹配及未知类型拒绝。10 个自动化测试工程全部重新构建并通过,Qt Release | M/D 绑定与运行值匹配及未知类型拒绝。10 个自动化测试工程全部重新构建并通过,Qt Release | ||||
| 主工程完成独立构建,`git diff --check` 无空白错误。 | 主工程完成独立构建,`git diff --check` 无空白错误。 | ||||
| 本轮新增 HMI ProgressBar 控件。进度条使用 D 区 Word 绑定,保存最小值、最大值和是否显示百分比, | |||||
| 运行态将读回值钳制到配置范围后绘制水平填充,不接收鼠标写入。属性面板支持范围编辑,JSON | |||||
| 严格要求 `minimumValue`、`maximumValue` 和 `showValue`,领域测试覆盖无效范围、越界映射和 | |||||
| M/D 绑定边界;主窗口测试覆盖创建、属性编辑、运行绘制和只读交互。 | |||||
| 此前的 7 种控件已升级为 8 种控件,ProgressBar 的稳定类型名为 `progressBar`,默认范围为 | |||||
| `0~100`,默认尺寸为 `240x36`。 | |||||
| 2026-08-17 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成本轮注册表重构后的真机只读复核, | 2026-08-17 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成本轮注册表重构后的真机只读复核, | ||||
| 成功读取 `M0~M2 = OFF`、`D0 = 0`,测试结束后正常关闭串口,全程没有执行 PLC 写操作。 | 成功读取 `M0~M2 = OFF`、`D0 = 0`,测试结束后正常关闭串口,全程没有执行 PLC 写操作。 | ||||
| @@ -64,10 +64,10 @@ main.cpp -> UI + Services + Infrastructure | |||||
| `Project::validate()` 允许未绑定控件、待配置节点和未完成网络作为编辑草稿保存。`Project::validateForRunning()` 额外拒绝未绑定 HMI、待配置节点、空条件和缺少输出的网络,并检查已启用逻辑中的 T 触点必须有唯一的 TON 驱动。 | `Project::validate()` 允许未绑定控件、待配置节点和未完成网络作为编辑草稿保存。`Project::validateForRunning()` 额外拒绝未绑定 HMI、待配置节点、空条件和缺少输出的网络,并检查已启用逻辑中的 T 触点必须有唯一的 TON 驱动。 | ||||
| HMI 控件公共描述由无 Qt 依赖的 `hmi_control_registry` 模块统一提供。当前 7 种控件的工程稳定类型名、 | |||||
| HMI 控件公共描述由无 Qt 依赖的 `hmi_control_registry` 模块统一提供。当前 8 种控件的工程稳定类型名、 | |||||
| 界面名称、默认 ID 前缀、默认文字、默认尺寸、M/D 绑定规则和运行值类型只在注册表中定义一次。 | 界面名称、默认 ID 前缀、默认文字、默认尺寸、M/D 绑定规则和运行值类型只在注册表中定义一次。 | ||||
| 领域校验、编辑服务、运行服务、JSON 存储和属性面板共同查询该描述;控件绘制、按钮写入、 | 领域校验、编辑服务、运行服务、JSON 存储和属性面板共同查询该描述;控件绘制、按钮写入、 | ||||
| PageJump 导航和 AlarmList 展示等专用行为仍留在各自模块,不进入公共描述表。 | |||||
| PageJump 导航、AlarmList 展示和 ProgressBar 范围计算等专用行为仍留在各自模块,不进入公共描述表。 | |||||
| HMI 按钮操作作为工程 `1.0` 的强类型字段保存,支持 `置 ON`、`置 OFF`、`取反` 和 | HMI 按钮操作作为工程 `1.0` 的强类型字段保存,支持 `置 ON`、`置 OFF`、`取反` 和 | ||||
| `瞬时 ON`。新建按钮默认使用瞬时 ON;按钮按下和释放事件由 UI 转交运行服务解释,UI | `瞬时 ON`。新建按钮默认使用瞬时 ON;按钮按下和释放事件由 UI 转交运行服务解释,UI | ||||
| @@ -77,6 +77,10 @@ HMI 按钮操作作为工程 `1.0` 的强类型字段保存,支持 `置 ON`、 | |||||
| `AlarmList` 是不绑定单个寄存器的运行状态投影。项目级 `AlarmDefinition` 只支持 M 位为 ON、D 值大于等于阈值和 D 值小于等于阈值三种条件,不设置提示、警告、故障等级。`AlarmEditorService` 负责定义增删改,`AlarmService` 统一读取活动寄存器仓库并维护当前报警的发生时间和确认状态,所有页面上的 AlarmList 共享这份状态。报警条件恢复后立即删除对应运行记录;运行态没有报警时 AlarmList 隐藏,出现报警时显示并置顶。返回编辑态时清空运行记录,工程 JSON 只保存报警定义。 | `AlarmList` 是不绑定单个寄存器的运行状态投影。项目级 `AlarmDefinition` 只支持 M 位为 ON、D 值大于等于阈值和 D 值小于等于阈值三种条件,不设置提示、警告、故障等级。`AlarmEditorService` 负责定义增删改,`AlarmService` 统一读取活动寄存器仓库并维护当前报警的发生时间和确认状态,所有页面上的 AlarmList 共享这份状态。报警条件恢复后立即删除对应运行记录;运行态没有报警时 AlarmList 隐藏,出现报警时显示并置顶。返回编辑态时清空运行记录,工程 JSON 只保存报警定义。 | ||||
| `ProgressBar` 绑定 D 区字地址,以 `minimumValue` 和 `maximumValue` 将读回值钳制并映射到 | |||||
| `0~100%`。进度条配置还保存 `showValue`,最小值必须严格小于最大值;控件只读,不产生 PLC | |||||
| 写请求。运行值读取沿用 `HmiRuntimeService` 的 Word 读取契约,绘制层只接收运行值和领域配置。 | |||||
| ## 结构化梯形图 | ## 结构化梯形图 | ||||
| 网络条件采用递归表达式: | 网络条件采用递归表达式: | ||||
| @@ -48,6 +48,7 @@ | |||||
| | `label` | 必须为 `null` | 无 | | | `label` | 必须为 `null` | 无 | | ||||
| | `pageJump` | 必须为 `null` | `targetPageId` | | | `pageJump` | 必须为 `null` | `targetPageId` | | ||||
| | `alarmList` | 必须为 `null` | 无 | | | `alarmList` | 必须为 `null` | 无 | | ||||
| | `progressBar` | D 地址或 `null` 草稿 | `minimumValue`、`maximumValue`、`showValue` | | |||||
| 按钮操作字符串为 `setOn`、`setOff`、`toggle` 或 `momentaryOn`。PageJump 使用目标页面稳定 ID,不使用名称或数组位置: | 按钮操作字符串为 `setOn`、`setOff`、`toggle` 或 `momentaryOn`。PageJump 使用目标页面稳定 ID,不使用名称或数组位置: | ||||
| @@ -67,6 +68,11 @@ | |||||
| AlarmList 只负责显示项目级当前报警,不保存独立触发逻辑,也不直接绑定单个寄存器。多个页面放置 AlarmList 时共享同一组当前报警和确认状态。运行态没有报警时控件隐藏;报警恢复后对应记录立即移除,最后一条报警恢复后控件再次隐藏。 | AlarmList 只负责显示项目级当前报警,不保存独立触发逻辑,也不直接绑定单个寄存器。多个页面放置 AlarmList 时共享同一组当前报警和确认状态。运行态没有报警时控件隐藏;报警恢复后对应记录立即移除,最后一条报警恢复后控件再次隐藏。 | ||||
| ProgressBar 使用绑定 D 地址的有符号 16 位字值,并将其限制在 `minimumValue` 到 | |||||
| `maximumValue` 的范围后映射为百分比。`minimumValue` 和 `maximumValue` 必须是有符号 16 位整数, | |||||
| 且最小值严格小于最大值;`showValue` 为布尔值,决定是否在进度条上显示百分比。ProgressBar | |||||
| 是只读控件,不产生 PLC 写请求。 | |||||
| ## 报警定义 | ## 报警定义 | ||||
| ```json | ```json | ||||