Преглед изворни кода

docs: 同步状态文本与工程格式文档

main
suyu пре 3 недеља
родитељ
комит
d870f734ae
9 измењених фајлова са 131 додато и 86 уклоњено
  1. +7
    -0
      AGENTS.md
  2. +36
    -74
      docs/ai/handoff.md
  3. +2
    -1
      docs/architecture.md
  4. +51
    -8
      docs/工程格式说明.md
  5. +1
    -1
      docs/开发顺序.md
  6. +1
    -0
      docs/用户使用/数量边界确认方案.md
  7. +31
    -0
      docs/用户使用/状态文本控件说明.md
  8. +1
    -1
      docs/用户使用/连续梯形图网格说明.md
  9. +1
    -1
      docs/用户使用/鼠标画线与删线说明.md

+ 7
- 0
AGENTS.md Прегледај датотеку

@@ -28,6 +28,7 @@
- 应用配置文件:`docs/用户使用/应用配置说明.md`
- 用户运行程序导出:`docs/用户使用/用户运行程序导出说明.md`
- 数据监控与离线初始值:`docs/用户使用/数据监控与离线初始值说明.md`
- 状态文本控件:`docs/用户使用/状态文本控件说明.md`
- 鼠标画线与删线:`docs/用户使用/鼠标画线与删线说明.md`
- 工程 JSON 格式:`docs/工程格式说明.md`
- 开发阶段顺序:`docs/开发顺序.md`(阶段参考,当前状态以 handoff 为准)
@@ -51,6 +52,12 @@
- Qt 项目打包:`pwsh -NoLogo -NoProfile -File .\scripts\package_qt_app.ps1`
- 打开主界面:`& 'D:\Qt5.15.2\5.15.2\mingw81_64\bin\designer.exe' '.\app\src\ui\main_window.ui'`

## 实现原则

- 新功能和重构默认不兼容旧代码;直接同步修改现有调用方,不为旧调用方式保留默认参数、重载、适配层、回退分支或废弃接口,除非用户明确要求兼容
- 生产代码只提供实际业务运行需要的接口;不得为了让测试少改代码或方便构造测试对象,在生产代码中增加无业务用途的公开接口、默认构造入口、全局默认对象或其他测试专用兼容逻辑,测试应通过测试夹具、显式依赖注入或测试替身适配生产接口
- 当前工程 JSON 只支持严格的 `formatVersion: "3.0"`;以后修改 JSON 格式时直接将生产代码、测试和格式文档整体升级到新的唯一版本,不为旧工程格式保留读取、写入、迁移、双版本解析或兼容分支,旧版本文件应明确拒绝,除非用户明确要求兼容

## 代码与架构约束

- 保持 `UI -> Services -> Domain` 依赖方向,基础设施实现服务契约;`domain` 不依赖 Qt、串口或文件系统


+ 36
- 74
docs/ai/handoff.md Прегледај датотеку

@@ -1,89 +1,51 @@
# 当前开发交接

> 更新日期:2026-08-27。本文件只保留当前工作区、本轮验证和下一步
> 更新日期:2026-08-27。本文件只保留当前工作区、本轮改动、验证结果和后续人工检查项

## 当前状态

- `当前窗口需求.md` 的多字数值扩展已完成:现有 `Int16/Float32` 链路已扩展为 `Int16/Int32/Float32/Float64`
- HMI 数值显示/输入、编辑态数据监控、运行态自由监控、离线初始值、工程 JSON、地址冲突检查、PLC 轮询和 Modbus 写入均使用同一套类型与连续字规则
- 项目仍只生成和运行本地 HMI/梯形图仿真,不生成、编译或下载 PLC 程序;真机本地梯形图轨迹仍只读 PLC 缓存并在临时仓库推算
- 本轮没有实现 Int64、无符号数、二/八/十六进制、ASCII、POU 变量监控、信捷原版寄存器网格或自定义监控偏移
- TouchWin 没有原生 Double64 数值控件;本项目的 `Double (Float64)` HMI 是基于 PLC 连续四个 D 的增强能力
- `当前窗口需求.md` 的状态文本控件已完成,新增独立 `HmiControlType::StatusText`,普通 `Label` 保持固定文本职责
- M 状态支持一个 M 地址和 OFF/ON 两个显示文本,D 状态支持 `Int16/Int32/Float32/Float64` 以及最多 16 个连续区间
- D 区间统一为 `[下限, 上限)`,首个下限和末个上限必须为“不限”,相邻区间必须首尾相接,覆盖整个数值域
- 状态文本只读;离线从虚拟寄存器读取,真机从 PLC 轮询缓存读取;绑定缺失、仓库不可用、读取失败和 NaN/Inf 统一显示 `--`
- 编辑画布固定显示“状态文本”,运行画布显示映射结果;字号、颜色、粗体、斜体复用现有 HMI 外观属性
- 状态文本配置使用独立 Qt Designer 对话框;属性面板隐藏普通绑定和数值类型编辑入口,改用“状态映射”专用配置按钮

## 梯形图网络注释
## 领域与运行链路

- `ControlLogic::networkHeadIndex()` 统一判定网络首行;同一网络只允许首行的 `LadderRung.comment` 非空
- 选中网络内任意支路编辑“网络注释”时,输入框读取并修改网络首行,画布也只在网络首行上方显示该注释
- 用竖线或粘贴合并网络时,单侧注释移动到新首行,相同注释去重;两侧注释不同时整次操作原子失败并恢复拓扑、注释、修改状态和历史
- 删除竖线拆分网络时不复制注释;新产生的下方网络默认没有注释
- 旧的行注释接口已直接替换为网络注释接口,没有保留重载、适配层或回退分支;严格 `formatVersion: "2.0"` 工程若在支路行保存非空注释会直接拒绝,不迁移隐藏注释
- 新增 `HmiStatusBitTextConfig`、`HmiStatusWordTextConfig`、`HmiStatusValueRange` 及状态文本领域校验
- D 状态文本参与完整连续 D 字范围的冲突检查,也参与 16 位 MOVE/ADD/SUB 写入保护
- `HmiRuntimeService::readStatusText()` 统一执行 M 位文本映射和 D 半开区间映射,不提供写入接口
- `RuntimeModeService` 将 D 状态文本占用的全部连续字加入 PLC 轮询地址和 `RegisterWordRange`
- JSON 已升级为唯一 `formatVersion: "3.0"`;状态文本保存为 `statusText.source`、M 的 `offText/onText` 或 D 的 `ranges`
- 旧 `1.0`、`2.0` 和其他版本工程直接拒绝,不提供迁移、双写、回退或兼容适配

## 梯形图竖线连续录入
## 关键文件

- 工具栏“竖线”和 `F12` 成功连接当前行与下一行后,会保持原列位置并自动选择下一视觉行;连续操作可以逐段向下建立竖线
- 推进时保留网格、输出槽或列边界的原选择形态,目标行超出可视区域时画布自动滚动
- 当前段已经存在时只向下推进,不重复保存连接、不把工程标记为修改,也不生成空撤销记录;状态栏会提示该段原本已经存在
- 到达最后一个现有行后明确停止,不自动创建空行;鼠标拖动画竖线的原有批量行为不变
- 领域模型和规则:`app/src/domain/hmi_model.h/.cpp`、`hmi_control_registry.*`、`project_model.cpp`、`project_limits.h`
- 运行读取:`app/src/services/hmi_runtime_service.*`、`runtime_mode_service.cpp`
- 工程持久化:`app/src/infrastructure/json_project_storage.*`
- 编辑服务和属性面板:`app/src/services/hmi_editor_service.cpp`、`app/src/ui/property_panel_controller.*`
- 状态文本对话框:`app/src/ui/status_text_dialog.*`
- HMI 画布和工具栏:`app/src/ui/hmi_editor_widget.cpp`、`main_window.cpp/.ui`、`toolbar_icon_factory.*`
- 用户说明:`docs/用户使用/状态文本控件说明.md`
- 格式契约:`docs/工程格式说明.md`

## 梯形图鼠标画线预览
## 验证结果

- 鼠标画线/删线拖动时由 `LogicEditorWidget` 前景层绘制临时横线或竖线预览,移动过程中不修改工程模型
- 合法预览使用蓝色(画线)或橙色(删线),偏离同一行/同一列时使用红色提示;释放时才调用范围编辑服务一次性提交
- 非法释放会丢弃当前整次预览,之前已保存的线路不受影响;合法释放只产生一条撤销记录
- 横线范围目标已经是相同状态时直接成功返回,不标记工程修改,也不生成空历史
- 在鼠标画线或删线模式下按 `Esc` 会退出工具并返回选择模式,同时取消拖动预览和工具栏勾选
- 13 个 Release Functional 测试目标全部通过:领域、设置、报警、HMI 编辑、逻辑编辑、离线仿真、工程管理、监控、运行包、运行模式、运行面板、PLC 对话框、PLC 运行时
- 状态文本专项覆盖 M OFF/ON 映射、D 四类型区间边界、区间间隙/重叠、整数边界、NaN/Inf、只读约束、16 区间上限、JSON 往返和旧 `2.0` 拒绝
- 运行模式专项覆盖 Double 状态文本的 `D70~D73` 轮询地址及四字 `RegisterWordRange`
- `git diff --check` 已通过;当前尚未连接真实 PLC,本轮功能为只读映射并复用既有缓存/轮询链路,不需要改写设备
- Release 主程序已在本轮最终代码上重新构建;设置 Qt offscreen 环境后启动 3 秒仍保持事件循环,验证结束已关闭进程

## 类型与地址规则
## 工作区说明

| 类型 | 占用字数 | 起始地址 | 输入规则 |
| --- | ---: | --- | --- |
| `Int16` | 1 | `D0~D4000` | `-32768~32767` 的整数 |
| `Int32` | 2 | `D0~D3999` | `-2147483648~2147483647` 的整数 |
| `Float32` | 2 | `D0~D3999` | 有限 IEEE-754 单精度值 |
| `Float64` | 4 | 偶数 `D0~D3996` | 有限 IEEE-754 双精度值 |
- 保留用户已有的 `AGENTS.md` 修改和未跟踪 Word 临时文件,不覆盖、不回退
- 本轮不提交 Git,等待用户确认后再决定提交边界

- 多字值固定按信捷顺序保存:低地址是低 16 位,地址递增时依次保存更高的 16 位
- `Int32Codec`、`Float32Codec`、`Float64Codec` 和统一数值 variant 负责类型化读写;底层仓库仍只保存原始 16 位字
- Float32 显示 9 位有效数字,Double 显示 17 位有效数字;浮点输入使用 C locale 并支持科学计数法,NaN、Inf 和溢出值拒绝
- Double 奇数首地址、Int32/Float32 的 `D4000`、Double 的 `D3997` 及其他越界范围在领域层拒绝
## 后续人工检查

## HMI、监控与工程

- HMI 属性面板和运行输入支持四种 D 类型;Int16/Int32 使用整数输入,Float32/Double 使用科学计数法文本输入
- HMI 多字绑定按完整字范围检查:相同地址和相同类型允许重复绑定,部分重叠或同起始地址不同类型拒绝
- MOVE、ADD、SUB 仍是 16 位整数指令,禁止写入任何 Int32、Float32 或 Float64 HMI 值占用的 D
- 编辑态数据监控和运行态自由监控继续共用 `RegisterMonitorService`;Int32/Float32 批量步长为 2,Double 步长为 4,类型列显示完整占用范围
- 多字离线初始值按连续字块完整捕获;停止仿真后恢复 Int32/Float32/Double 的全部占用字
- 监控表最多 64 行,PLC 上限按去重后的实际 16 位 M/D 地址计数,最多 256 个;候选监控集合会在提交前验证,失败不留下部分监控点
- 工程 JSON 仍是严格 `formatVersion: "2.0"`,`dataType` 新增 `int32` 和 `float64`;未知的 `int64` 等枚举直接拒绝

## PLC 通信

- 仓库增加通用 `readWords/writeWords` 连续字接口;虚拟仓库完整校验后一次复制,PLC 仓库保留 Int16 单字通道并为 2~4 字值使用多字通道
- Int16 继续写一个 Holding Register;Int32、Float32 和 Double 分别把 2 个或 4 个连续字放在一次多寄存器请求中发送
- 轮询元数据从 Float32 起始地址泛化为连续 `RegisterWordRange`;每个读块最多 120 字,拆块边界不会切开 2 字或 4 字值
- 地址和多字范围在当前异步回复结束后一起切换;候选配置失败时运行模式和监控模型都恢复旧状态
- PLC 缓存仍只在真实轮询读回后更新,不以写请求受理代替设备确认

## 最近验证

- 13 个 Release Functional 测试目标全量通过
- 网络注释回归覆盖从支路编辑首行注释、网络首行查找、单侧移动、相同注释去重、不同注释原子回滚、一次撤销/重做、拆分不复制、支路隐藏注释领域校验和严格 `2.0` JSON 拒绝
- 离屏画布回归确认从支路编辑的注释只显示在网络首行上方
- 新增回归覆盖 Int32 最小/最大值和负数、Float32 `20.0` 字序、Double `1.0` 字序、Double 偶数地址、NaN/Inf、JSON 往返、HMI 复制粘贴、多字冲突和 16 位梯形图写入保护
- 监控回归覆盖四类型批量步长、完整轮询地址、离线初始值捕获、停止仿真恢复、64 行与 256 实际地址上限的候选拒绝
- PLC 回归覆盖 Int16 单字路径、Int32/Double 一次多字回调、Double `D118~D121` 不跨 120 字边界、无法合法拆分的重叠范围拒绝和地址集合原子切换
- 梯形图回归新增 F12 同列连续下移、目标自动滚动、末行停止、逐段撤销,以及重复竖线不产生脏状态和空历史
- 梯形图画线回归覆盖拖动预览、非法释放整次取消、合法释放一次提交和一次撤销恢复
- 梯形图画线回归覆盖 `Esc` 退出鼠标画线和删线模式
- Qt Release 主程序已重新构建到 `build/release/release/integrated_platform.exe`,离屏启动 3 秒正常保持事件循环
- `git diff --check` 通过,没有空白错误
- 本轮网络注释改动只涉及领域模型、编辑服务、严格 JSON 校验和画布显示,不访问 PLC,因此没有做真机测试

## 工作区与下一步

- 本轮网络注释代码、测试和说明文档已拆分提交;工作区还保留既有 `AGENTS.md` 修改和未跟踪的 docx 文件,不能覆盖或回退
- 人工复查截图场景:用竖线连接 `000/001`,选中 `001` 编辑网络注释,确认注释出现在 `000` 网络首行上方
- 设备可用后在 PLC STOP 状态先读取一组连续 D 原值,分别验证 Int32、Float32、Double 的一次多寄存器写入与读回,再恢复全部原值并读回确认
- 人工打开控制逻辑页面,分别从网格、列边界和第 10 列位置连续按 F12,检查选中框、滚动和状态栏提示
- 人工打开 HMI 页面和数据监控,检查四类型下拉框、Double 偶数地址提示、长数值显示和不同系统缩放下的输入框布局
- 打开 HMI 页面添加“状态文本”,确认属性面板的专用配置按钮、M/D 切换和区间表布局在常用缩放下无重叠
- 离线运行写入虚拟 M/D,确认 M OFF/ON 和 D 在 30、80 边界的显示结果;停止运行后恢复编辑占位词
- 设备可用时在 STOP 状态读取原值,确认状态文本使用的 M/D 被轮询读回;测试只读,不向设备写入状态文本数据

+ 2
- 1
docs/architecture.md Прегледај датотеку

@@ -71,10 +71,11 @@ Project
- 当前编辑页面和当前逻辑是 UI 会话状态,不写入工程
- HMI 控件类型、默认值、绑定规则和运行值类型由无 Qt 依赖的 `hmi_control_registry` 统一描述
- HMI 数值控件通过 `RegisterDataType` 选择 `Int16`、`Int32`、`Float32` 或 `Float64`;底层仓库始终保存原始 16 位 D 字,统一编解码层按低地址低字顺序组合 1、2 或 4 个连续 D
- 状态文本是独立只读控件:M 配置 OFF/ON 文本,D 配置覆盖全域的连续半开区间;离线读取虚拟仓库,真机读取 PLC 缓存,不可用时显示 `--`
- 需要寄存器的 HMI 控件、报警条件和梯形图节点直接保存 M/D 地址;项目不再维护统一 `dataPoints` 表
- `registerComments` 只是 M/D 地址元数据,不保存当前值或引用位置,也不会让地址自动进入 PLC 轮询

工程 JSON 格式固定为严格的 `2.0`。加载顺序为 JSON 解析、版本检查、字段解析、领域校验,全部成功后才能替换当前工程;保存使用原子提交。旧 `1.0` 文件直接拒绝,不做迁移或双写。字段定义见 `docs/工程格式说明.md`。
工程 JSON 格式固定为严格的 `3.0`。加载顺序为 JSON 解析、版本检查、字段解析、领域校验,全部成功后才能替换当前工程;保存使用原子提交。旧 `1.0/2.0` 文件直接拒绝,不做迁移或双写。字段定义见 `docs/工程格式说明.md`。

校验分两级:



+ 51
- 8
docs/工程格式说明.md Прегледај датотеку

@@ -1,14 +1,14 @@
# 工程 JSON 2.0 格式说明
# 工程 JSON 3.0 格式说明

## 格式策略

当前只有一个有效工程格式:`2.0`。代码直接读写本文描述的结构,不为 `1.0` 或早期开发草稿增加迁移分支、字段推断或双写逻辑;旧版本加载会明确失败。缺少必填字段、字段类型错误、引用不存在或领域校验失败时,加载必须失败且不得替换当前工程。
当前只有一个有效工程格式:`3.0`。代码直接读写本文描述的结构,不为 `1.0`、`2.0` 或早期开发草稿增加迁移分支、字段推断或双写逻辑;旧版本加载会明确失败。缺少必填字段、字段类型错误、引用不存在或领域校验失败时,加载必须失败且不得替换当前工程。

## 顶层结构

```json
{
"formatVersion": "2.0",
"formatVersion": "3.0",
"id": "project-1",
"name": "包装线",
"hmiPages": [],
@@ -59,10 +59,11 @@
| `numericDisplay` | D 地址或 `null` 草稿 | `dataType` |
| `numericInput` | D 地址或 `null` 草稿 | `dataType` |
| `label` | 必须为 `null` | 无 |
| `statusText` | M/D 地址或 `null` 草稿 | `statusText`;D 模式还要求 `dataType` |
| `pageJump` | 必须为 `null` | `targetPageId` |
| `alarmList` | 必须为 `null` | 无 |

`type` 只接受表中列出的控件类型。其他类型按严格 `2.0` 规则直接拒绝加载,不做兼容迁移。
`type` 只接受表中列出的控件类型。其他类型按严格 `3.0` 规则直接拒绝加载,不做兼容迁移。

数值显示和数值输入控件必须额外保存 `dataType`,值只能是 `int16`、`int32`、`float32` 或 `float64`:

@@ -87,7 +88,49 @@
| `float32` | IEEE-754 单精度浮点 | 2 | `D0~D3999` |
| `float64` | IEEE-754 双精度浮点,界面显示为 `Double (Float64)` | 4 | 偶数首地址 `D0~D3996` |

多字值统一按信捷字序保存:低地址放低 16 位,地址递增时依次保存更高的 16 位。数值控件之间允许相同起始地址和相同类型重复绑定,部分重叠或同起始地址不同类型会被拒绝。工程格式仍固定为严格 `2.0`,字段结构没有升级;数值控件缺少 `dataType` 或使用 `int64` 等未知枚举时加载失败。旧程序无法打开包含新增枚举值的工程。
多字值统一按信捷字序保存:低地址放低 16 位,地址递增时依次保存更高的 16 位。数值控件和 D 状态文本之间允许相同起始地址和相同类型重复绑定,部分重叠或同起始地址不同类型会被拒绝。要求 `dataType` 的控件缺少该字段或使用 `int64` 等未知枚举时加载失败。

状态文本是独立只读控件。M 模式保存 OFF/ON 文本:

```json
{
"id": "machine-state",
"type": "statusText",
"bounds": {"x": 20, "y": 80, "width": 140, "height": 40},
"text": "状态文本",
"binding": {"area": "M", "index": 0},
"properties": {},
"statusText": {
"source": "m",
"offText": "设备停止",
"onText": "设备运行"
}
}
```

D 模式保存数值类型和 1~16 个连续区间:

```json
{
"id": "temperature-state",
"type": "statusText",
"bounds": {"x": 180, "y": 80, "width": 140, "height": 40},
"text": "状态文本",
"binding": {"area": "D", "index": 100},
"properties": {},
"dataType": "float64",
"statusText": {
"source": "d",
"ranges": [
{"lower": null, "upper": 30, "text": "低温"},
{"lower": 30, "upper": 80, "text": "温度正常"},
{"lower": 80, "upper": null, "text": "高温"}
]
}
}
```

D 区间统一按 `[lower, upper)` 匹配,即包含下限、不包含上限。第一条 `lower` 必须为 `null`,最后一条 `upper` 必须为 `null`,相邻区间的前一条 `upper` 必须等于后一条 `lower`,从而覆盖整个数值域且不留空档、不重叠。`Int16/Int32` 边界必须为整数,所有边界必须是有限数值。状态结果文本不能为空,只允许单行且最多 256 个 UTF-8 字节。编辑草稿允许 `binding` 为 `null`,进入运行态前必须绑定;运行读取失败时画面显示 `--`。

按钮操作字符串为 `setOn`、`setOff`、`toggle` 或 `momentaryOn`。PageJump 使用目标页面稳定 ID,不使用名称或数组位置:

@@ -141,7 +184,7 @@ AlarmList 只负责显示项目级当前报警,不保存独立触发逻辑,
}
```

注释不保存寄存器当前值,也不自动把地址加入 Modbus 轮询。网络注释使用网络首行的 `LadderRung.comment` 保存,与行 ID、名称、连续网格和输出并列;通过任意竖线连接到上一行的支路行必须保存空字符串。同一网络只有首行注释可以非空,违反该规则的 `2.0` 工程直接拒绝加载,不迁移或回退。网络注释允许为空;非空时只能使用单行文本,不能包含回车或换行,且不能超过 128 个 UTF-8 字节:
注释不保存寄存器当前值,也不自动把地址加入 Modbus 轮询。网络注释使用网络首行的 `LadderRung.comment` 保存,与行 ID、名称、连续网格和输出并列;通过任意竖线连接到上一行的支路行必须保存空字符串。同一网络只有首行注释可以非空,违反该规则的 `3.0` 工程直接拒绝加载,不迁移或回退。网络注释允许为空;非空时只能使用单行文本,不能包含回车或换行,且不能超过 128 个 UTF-8 字节:

```json
{
@@ -174,7 +217,7 @@ AlarmList 只负责显示项目级当前报警,不保存独立触发逻辑,

控制逻辑初始可以没有行,`rungs` 为空不是错误。编辑器第一次添加条件、横线或输出时才创建行;删除最后一行后可以再次保存为空逻辑。没有输出的空行草稿允许保存 10 个 `Gap` 网格。输出行也允许暂存未完成的条件路径;运行时 `Gap` 会按断路处理,只有实际导通的输出槽才执行。

2.0 使用连续网格模型。每条 `LadderRung` 固定保存 10 个 `cells`,每格的 `kind` 是 `gap`、`wire` 或 `node`;条件节点直接嵌在 `node` 格中。行不再是互相隔离的网络容器,行间连接由控制逻辑的 `verticalConnections` 保存。长竖线由多个相邻连接对象组成,插入行会拆分原连接,删除行只在上下两段同列存在时合并。2.0 不再把 `ConditionExpression` 写入工程 JSON,也不读取旧 `condition` 字段:
3.0 使用连续网格模型。每条 `LadderRung` 固定保存 10 个 `cells`,每格的 `kind` 是 `gap`、`wire` 或 `node`;条件节点直接嵌在 `node` 格中。行不再是互相隔离的网络容器,行间连接由控制逻辑的 `verticalConnections` 保存。长竖线由多个相邻连接对象组成,插入行会拆分原连接,删除行只在上下两段同列存在时合并。3.0 不把 `ConditionExpression` 写入工程 JSON,也不读取旧 `condition` 字段:

```json
{"id":"vertical-1","upperRungId":"rung-1","lowerRungId":"rung-2","columnBoundary":2}
@@ -206,4 +249,4 @@ MOVE、ADD 和 SUB 只能把结果写入 D 地址,源操作数和算术左右

工程保存允许未绑定的寄存器控件和未完成梯形图草稿。进入离线运行还必须通过运行校验:所有 HMI 寄存器控件完成绑定、所有 PageJump 目标有效、所有报警定义合法、所有启用逻辑中的节点已配置;`Gap` 仍表示断路并会让该支路不导通,不会被当成隐含横线。禁用草稿逻辑不阻止运行。左侧电源线直接接通的输出必须保存为 10 个 `Wire` 网格加输出槽。

当前实现只读写本文定义的严格 `2.0`。`1.0` 或其他旧工程不会自动迁移,加载时直接返回不支持的格式版本。
当前实现只读写本文定义的严格 `3.0`。`1.0`、`2.0` 或其他旧工程不会自动迁移,加载时直接返回不支持的格式版本。

+ 1
- 1
docs/开发顺序.md Прегледај датотеку

@@ -4,7 +4,7 @@

## 当前进度

第 1~11 步的软件实现和现场验证已完成,工程格式统一为连续网格 `2.0`,不保留旧梯形图结构的兼容代码。当前重点是第 12 步的交付资料和最终演示整理。
第 1~11 步的软件实现和现场验证已完成,工程格式统一为包含连续网格和状态文本的 `3.0`,不保留旧工程兼容代码。当前重点是第 12 步的交付资料和最终演示整理。

## 1. 建立开发基线



+ 1
- 0
docs/用户使用/数量边界确认方案.md Прегледај датотеку

@@ -32,6 +32,7 @@ HMI 页面宽度 `320~1600`、高度 `200~800` 仍是结构安全硬范围;`De
| HMI | 页面高度 | 200 | 800 | 拒绝保存、加载或编辑 | 当前工具只面向本机 HMI 编辑,限制在可合理查看的桌面页面范围内 |
| HMI | 控件宽度、高度 | 1 | 8192 | 拒绝保存或加载;控件还必须完整放在页面内 | 防止异常尺寸和越界绘制 |
| HMI | 单控件扩展属性 | 0 对 | 64 对 | 第 65 对属性不能加载或保存 | 防止属性对象无限增长 |
| HMI | 单个状态文本的 D 区间 | 1 个 | 16 个 | 第 17 个区间不能添加、保存或加载 | 限制运行刷新时的区间匹配和工程文件规模 |
| HMI | 字号 | 6 | 72 | 拒绝保存、加载或编辑 | 控制文字可读性和控件布局开销 |
| HMI | 控件属性文本输入长度 | 0 字符 | 12 个字符 | 编辑界面限制继续输入 | 保持 HMI 控件属性文本紧凑,避免编辑和运行显示溢出 |
| 报警 | 报警定义数量 | 0 | 256 | 超过配置上限或第 257 条报警时不能创建或加载 | 报警每个刷新周期都要判断 |


+ 31
- 0
docs/用户使用/状态文本控件说明.md Прегледај датотеку

@@ -0,0 +1,31 @@
# 状态文本控件说明

## 用途

状态文本把 M 位或 D 数值转换成运行画面上的文字,适合显示设备运行/停止、正常/故障和温度区间等状态。普通“文本”控件仍用于固定文字,两者互不替代。

在 HMI 工具栏添加“状态文本”,选中控件后点击属性面板中的“状态映射 -> 配置”完成设置。编辑画布固定显示“状态文本”,实际映射结果只在离线或真机运行时显示。

## M 位状态

选择“M 位状态”,设置 M 地址、OFF 显示和 ON 显示。M 为 `0` 时显示 OFF 文本,M 为 `1` 时显示 ON 文本。

## D 数值区间

选择“D 数值区间”,设置 D 地址、`Int16/Int32/Float32/Double (Float64)` 类型和 1~16 个区间。规则如下:

- 区间统一为下限包含、上限不包含,即 `[下限, 上限)`
- 第一条下限必须为“不限”,最后一条上限必须为“不限”
- 相邻区间必须首尾相接,不能留空档或重叠
- `Int16/Int32` 的边界必须是整数
- 多字类型使用完整连续 D 范围,地址限制与数值控件一致

例如“不限~30:低温、30~80:温度正常、80~不限:高温”会在 `30` 时显示“温度正常”,在 `80` 时显示“高温”。

## 运行规则

- 状态文本只读,不向 M/D 写值
- 离线运行读取虚拟寄存器,真机运行读取 PLC 轮询缓存
- 仓库不可用、读取失败或浮点值为 NaN/Inf 时显示 `--`
- 字号、文字颜色、粗体和斜体沿用 HMI 外观属性
- 当前不支持回差、延时、动态颜色、倍率换算和复杂表达式

+ 1
- 1
docs/用户使用/连续梯形图网格说明.md Прегледај датотеку

@@ -64,4 +64,4 @@

## 工程文件

连续网格使用严格的工程 JSON `2.0`。旧 `1.0` 工程不自动迁移,加载时会提示格式版本不受支持。
连续网格使用严格的工程 JSON `3.0`。旧 `1.0/2.0` 工程不自动迁移,加载时会提示格式版本不受支持。

+ 1
- 1
docs/用户使用/鼠标画线与删线说明.md Прегледај датотеку

@@ -51,4 +51,4 @@

## 数据与限制

每行固定持久化 10 个 `cells`,竖线持久化为相邻行之间的 `verticalConnections`。工程格式为严格 `2.0`,旧 `1.0` 文件直接拒绝,不写兼容迁移代码。画布像素、鼠标轨迹和悬空自由线段不会写入工程文件。
每行固定持久化 10 个 `cells`,竖线持久化为相邻行之间的 `verticalConnections`。工程格式为严格 `3.0`,旧 `1.0/2.0` 文件直接拒绝,不写兼容迁移代码。画布像素、鼠标轨迹和悬空自由线段不会写入工程文件。

Loading…
Откажи
Сачувај