Procházet zdrojové kódy

docs: 补充梯形图布线说明与软件手册

main
suyu před 1 měsícem
rodič
revize
c0566a1c0a
5 změnil soubory, kde provedl 28 přidání a 13 odebrání
  1. +11
    -4
      docs/ai/handoff.md
  2. +7
    -6
      docs/architecture.md
  3. binární
      docs/pdf/1. 软件手册.pdf
  4. +7
    -1
      docs/工程格式说明.md
  5. +3
    -2
      docs/开发顺序.md

+ 11
- 4
docs/ai/handoff.md Zobrazit soubor

@@ -6,9 +6,10 @@

## 当前能力

- 梯形图条件使用递归 `Node / Series / Parallel` 表达式树,可表示 `A OR (B AND C)` 和嵌套串并联
- 编辑器使用固定行列网格和正交连线,支持当前节点后串联、单节点并联、连续节点范围并联、删除节点或网络以及设置输出线圈
- 画布只选择可见节点,不暴露内部表达式容器;橡皮框或多选连续节点后可直接建立并联支路
- 梯形图条件使用递归 `Node / Wire / Series / Parallel` 表达式树,可表示 `A OR (B AND C)`、嵌套串并联和无地址横线
- 编辑器使用固定行列网格和正交连线,支持当前节点或横线后串联、单节点并联、连续范围横线旁路、删除节点或网络以及设置输出线圈
- 触点、横线和竖线连接段都可以选择;横线可由触点原位替换,竖线映射到对应并联支路,内部表达式容器不作为通用选择对象暴露
- `F11/F12` 分别插入横线和建立连续范围旁路,`Shift+F11/Shift+F12` 分别删除所选横线和竖线支路
- 执行器递归求值并生成节点、表达式、网络轨迹,离线运行时画布显示导通路径和故障位置
- HMI 和梯形图直接配置 M/D 地址,不依赖预先创建的数据点
- HMI 控件描述注册表统一维护现有 8 种控件的稳定名称、默认值、绑定规则和运行值类型
@@ -53,7 +54,8 @@
- 按钮操作是工程 `1.0` 的必填字段,不兼容或迁移缺少该字段的旧按钮数据
- 不读取旧的 `stages/branches` 结构,不添加旧格式迁移和兼容层
- 梯形图编辑结构而不是自由线段,避免悬空线、环路和多个输出路径
- 网格仅作为编辑投影,不进入工程格式;服务层把连续范围操作转换为规范化表达式树
- 横线是保存 `columnSpan` 的恒真 `Wire` 叶子,竖线由 `Parallel` 边界派生,不保存竖线或像素坐标
- 网格仅作为编辑投影,不进入工程格式;服务层把连续范围操作原子转换为规范化表达式树
- 条件节点继续使用 `std::variant` 的独立配置类型,不向通用节点添加无关字段
- HMI、梯形图和通信共享 `M0~M4000`、`D0~D4000` 地址范围
- 已删除统一数据点表、主窗口数据点 Dock 和属性区数据点下拉框;M/D 注释作为独立的工程级地址元数据实现
@@ -65,6 +67,7 @@
- 工程 `1.0` 直接要求顶层 `registerComments` 和每个网络的 `comment` 字段,不增加旧工程迁移或缺省兼容
- 50 ms Qt 定时器只调度离线扫描;每个 TON 不创建独立 Qt 定时器,真机模式继续停止整个软件逻辑执行器
- 项目梯形图不下载到 PLC;真机模式停止本地软件逻辑执行器,只轮询新指令实际引用的 M/D 地址
- `Wire` 不绑定寄存器且不进入 M/D 轮询;离线轨迹使用上游输入电流决定横线是否显示导通

## 自动化验证

@@ -103,6 +106,8 @@ PLC 连接初始化会连续通知首读重置、正在连接和已连接。旧

本轮梯形图编辑重构还验证了:固定网格渲染、水平/垂直正交布线、工具栏直接建立并联支路,以及连续范围 `A AND ((B AND C) OR D)` 的结构变换和非连续范围拒绝。

本轮信捷风格布线增加了结构化横线和可选竖线连接段。自动化覆盖横线跨度边界、JSON 往返、连续范围旁路和非连续范围拒绝、触点原位替换横线、删除后的表达式归一化与撤销,以及 `F11/F12/Shift+F11/Shift+F12` 主窗口交互。横线逻辑值恒真,但只有上游输入导通时才显示运行电流;竖线仍由 `Parallel` 派生,不引入自由线段或 PLC 地址。

本轮自由监控与运行工作台实现还验证了:地址字符串解析和边界、连续范围展开、去重和数量
上限、活动仓库切换、离线工作台三区域同时可见、真机工作台只显示 HMI 与自由监控、离线
监控读取虚拟 M/D,以及真机运行期间新增地址立即进入 PLC 聚合轮询集合。PLC 动态轮询在
@@ -200,6 +205,8 @@ M/D 绑定边界;主窗口测试覆盖创建、属性编辑、运行绘制和
2026-08-17 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成本轮注册表重构后的真机只读复核,
成功读取 `M0~M2 = OFF`、`D0 = 0`,测试结束后正常关闭串口,全程没有执行 PLC 写操作。

2026-08-18 完成本轮信捷风格横线/竖线功能后的生产通信服务只读回归。`COM3 / 9600 / 8E1 / 站号 1` 在约 288 ms 完成 `M0~M2` 和 `D0` 首次读取,结果为 `M0=0`、`M1=0`、`M2=0`、`D0=0`;真机模式前置状态切换成功,并在约 407 ms 正常断开。探针只调用读取、模式切换和断开接口,没有执行 PLC 写入或程序下载。Qt Release 主程序也已完成最新构建、窗口启动和退出码 0 的正常关闭冒烟。

## 待完成事项

1. 在 PLC STOP 状态确认 COM2 参数和 RS-485 A/B 接线


+ 7
- 6
docs/architecture.md Zobrazit soubor

@@ -88,6 +88,7 @@ HMI 按钮操作作为工程 `1.0` 的强类型字段保存,支持 `置 ON`、
```text
ConditionExpression
├── Node 单个触点或比较条件
├── Wire 恒真的横线叶子,保存网格列跨度
├── Series 子表达式依次串联,执行 AND
└── Parallel 子表达式并联,执行 OR
```
@@ -102,11 +103,11 @@ Parallel
└── Node(C)
```

`LogicEditorService` 支持在当前节点后串联插入,并为单个节点或同一网络中的连续逻辑范围建立并联支路。例如选择 `B、C` 后建立并联会得到 `A AND ((B AND C) OR D)`。服务层负责校验范围连续性和子表达式完整性,拒绝跨网络、非连续或截断内部子表达式的选择。删除后会归一化空容器和只有一个子项的容器,防止无效嵌套进入执行器。
`LogicEditorService` 支持在当前节点或横线后串联插入,并为单个叶子或同一网络中的连续逻辑范围建立并联支路。例如选择 `B、C` 后建立并联会得到 `A AND ((B AND C) OR D)`。横线使用 `Wire` 叶子保存 `1~256` 列跨度;围绕连续范围建立竖线时,服务层原子创建一个同跨度的横线旁路和 `Parallel` 容器。服务层负责校验范围连续性和子表达式完整性,拒绝跨网络、非连续或截断内部子表达式的选择。删除后会归一化空容器和只有一个子项的容器,防止无效嵌套进入执行器。

`LogicEditorWidget` 将表达式树投影到固定行列网格,串联节点横向占列,并联分支纵向占行,所有连接只使用水平线和竖线。用户只选择画布中可见的节点:单击定位当前节点,橡皮框或多选连续节点后可直接建立并联支路。内部 `Series / Parallel` 容器不作为可选 UI 对象暴露。网格是编辑投影,不持久化自由线段,因此不会产生悬空线、环路和多输出路径。
`LogicEditorWidget` 将表达式树投影到固定行列网格,串联节点横向占列,并联分支纵向占行,所有连接只使用水平线和竖线。触点、横线和竖线连接段都可以在画布选择;竖线连接段映射到对应的并联子表达式,删除竖线会删除该支路并归一化结构。内部 `Series / Parallel` 容器仍不作为通用 UI 对象暴露。竖线来自 `Parallel` 边界,不保存为独立领域对象;网格和像素坐标只是编辑投影,不持久化自由线段,因此不会产生悬空线、环路和多输出路径。

工具栏中的常开、常闭、上升沿、下降沿、T 触点和比较条件在没有选择时追加到当前网络末尾,选中一个条件节点时插入到该节点后。并联支路按钮默认建立常开触点,下拉菜单可选择常闭、边沿、T 触点或比较条件。新增节点保持待配置状态,并自动选中供属性区继续编辑。
工具栏中的常开、常闭、上升沿、下降沿、T 触点和比较条件在没有选择时追加到当前网络末尾,选中一个条件节点时插入到该节点后;选中横线后使用条件动作会原位替换横线。`F11` 在所选条件或横线后插入横线,没有选择时追加;`F12` 为所选连续范围建立横线旁路和竖线连接;`Shift+F11` 和 `Shift+F12` 分别删除所选横线和竖线支路。并联支路按钮继续用于新增可配置条件分支。新增节点保持待配置状态,并自动选中供属性区继续编辑。

条件节点使用 `std::variant` 保存独立配置类型,当前包含 M 常开/常闭触点、M 上升沿/下降沿触点、T 常开/常闭触点、C 常开/常闭触点和 D 值与常量比较。输出支持普通、置位、复位 M 线圈、非保持 TON、CTU/CTD、MOVE 以及 ADD/SUB。边沿节点在每个扫描周期比较当前 M 值与该逻辑节点自己的上一扫描值,只产生一个扫描周期的脉冲。T 地址是 `T0~T4000` 的离线资源,C 地址是 `C0~C4000` 的离线计数器资源,两者都不是 M/D 地址。新增节点类型时应增加独立配置类型及校验、存储和执行分支,不能向通用节点堆叠无关字段。

@@ -114,7 +115,7 @@ CTU/CTD 的 C 编号只标识软件执行器中的计数器实例;计数当前

## 执行与运行反馈

`SoftwareLogicExecutor` 按 `controlLogics` 数组顺序扫描所有已启用逻辑,再按网络顺序递归求值 `Node / Series / Parallel`。禁用逻辑仅保留结构校验,未完成的禁用草稿不会阻止离线运行。普通线圈每周期写入网络结果,置位和复位线圈只在网络成立时写入;前面逻辑或网络的写入对后面逻辑和网络在同一扫描周期立即可见。
`SoftwareLogicExecutor` 按 `controlLogics` 数组顺序扫描所有已启用逻辑,再按网络顺序递归求值 `Node / Wire / Series / Parallel`。`Wire` 的逻辑值恒真,但导通轨迹等于其输入电流,因此上游断开时横线不会错误显示为导通。禁用逻辑仅保留结构校验,未完成的禁用草稿不会阻止离线运行。普通线圈每周期写入网络结果,置位和复位线圈只在网络成立时写入;前面逻辑或网络的写入对后面逻辑和网络在同一扫描周期立即可见。

上升沿和下降沿是标准的一次扫描脉冲,运行状态按逻辑 ID 和节点 ID 隔离。TON 是正常非保持接通延时:输入接通后记录 `steady_clock` 起点,`ET` 使用实际经过的毫秒数,达到 `PT` 后 `Q` 为真;输入断开立即清零 `ET/Q`。TON 的输出状态保存在离线执行器的 T 资源表中,T 触点只读取对应 TON 的 `Q`。CTU 计数值在 `0~32767` 范围内递增,达到 PV 后保持完成;CTD 复位时装载 PV,在 `0~32767` 范围内递减,达到 0 后保持完成。ADD/SUB 使用有符号 16 位 D 值,先以更宽的中间类型计算,超出 `-32768~32767` 时饱和到边界并在运行轨迹标记 `overflow`,不会因单次算术溢出停止整个扫描。MOVE、ADD/SUB 只有网络条件成立时才写入目标 D,并在同一扫描周期对后续网络可见。软件不为每个 TON 创建 Qt `QTimer`,现有 50 ms `QTimer` 只负责扫描调度,因此不会与 Qt 事件循环或 PLC 轮询形成额外定时器线程。

@@ -126,7 +127,7 @@ CTU/CTD 的 C 编号只标识软件执行器中的计数器实例;计数当前

HMI 控件和梯形图节点直接绑定 `M0~M4000`、`D0~D4000` 地址,不要求预先创建数据点。地址是程序和通信的真实标识,属性面板只编辑区域与地址。

M/D 是外部地址类型:M 保存位输入、复位信号和线圈结果,D 保存字操作数、MOVE/ADD/SUB 目标以及计数器 CV。T/C 是软件逻辑资源类型,只在离线模式维护运行状态,不在工程中映射为 PLC 的 T/C 区寄存器;项目不把梯形图下载到 PLC,因此真机模式只通信访问新指令引用的 M/D 地址。
M/D 是外部地址类型:M 保存位输入、复位信号和线圈结果,D 保存字操作数、MOVE/ADD/SUB 目标以及计数器 CV。T/C 是软件逻辑资源类型,只在离线模式维护运行状态,不在工程中映射为 PLC 的 T/C 区寄存器;`Wire` 只是无地址的逻辑结构,不进入 M/D 引用收集和 PLC 轮询。项目不把梯形图下载到 PLC,因此真机模式只通信访问节点实际引用的 M/D 地址。

工程级 `registerComments` 只保存 M/D 地址和注释文本,作为地址元数据供编辑器和注释对话框使用,不保存当前值、引用位置或缓存状态,也不会因为存在注释而加入 PLC 轮询。`LadderRung.comment` 保存单个网络的说明文本。两者在 JSON 中分开建模,不能重新引入混合“名称、注释、当前值、引用位置”的数据点表。

@@ -159,7 +160,7 @@ M/D 是外部地址类型:M 保存位输入、复位信号和线圈结果,D

`PlcCommunicationService` 使用 `QModbusRtuSerialMaster` 异步连接、读取和写入。轮询集合由
HMI 引用、报警定义、梯形图中的 M/D 引用和自由监控地址合并而成,去重后按区域合并相邻地址。
T/C 触点、TON、CTU/CTD 的 C 资源和工程级注释不会进入该集合;只有计数器 CV、PV 的 D 引用、复位 M 以及 MOVE/ADD/SUB 的 M/D 条件和操作数会进入集合。M 使用线圈,D 使用保持寄存器;所有 Modbus 地址均为从 `0` 开始的原始地址。
T/C 触点、TON、CTU/CTD 的 C 资源、横线和工程级注释不会进入该集合;只有计数器 CV、PV 的 D 引用、复位 M 以及 MOVE/ADD/SUB 的 M/D 条件和操作数会进入集合。M 使用线圈,D 使用保持寄存器;所有 Modbus 地址均为从 `0` 开始的原始地址。

PLC 连接后可以动态增删自由监控地址。存在读取请求时,新的轮询集合在当前响应处理完成后
应用,旧响应仍按发出时的读取块解析。连接级首次读取完成后,动态增加地址不会撤销真机


binární
docs/pdf/1. 软件手册.pdf Zobrazit soubor


+ 7
- 1
docs/工程格式说明.md Zobrazit soubor

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

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

网络、`Node / Series / Parallel` 条件表达式、触点、边沿、T/C 触点、比较、线圈和输出指令字段沿用当前结构化梯形图模型。网格坐标、画布连线和运行轨迹是 UI 或运行会话投影,不进入 JSON。节点配置的类型和值域如下:
网络、`Node / Wire / Series / Parallel` 条件表达式、触点、边沿、T/C 触点、比较、线圈和输出指令字段沿用当前结构化梯形图模型。横线保存为恒真的 `Wire` 叶子:

```json
{"id": "wire-1", "kind": "wire", "columnSpan": 2}
```

`columnSpan` 是必填整数,范围为 `1~256`。它表示横线占用的逻辑网格列数,不是像素长度。竖线不保存为独立对象,而是由 `Parallel` 表达式的支路边界派生。画布像素坐标、自由连线和运行轨迹是 UI 或运行会话投影,不进入 JSON;横线不绑定寄存器,也不产生 M/D 轮询地址。节点配置的类型和值域如下:

```json
{"type": "edgeContact", "address": {"area": "M", "index": 0}, "mode": "rising"}


+ 3
- 2
docs/开发顺序.md Zobrazit soubor

@@ -57,8 +57,9 @@

## 7. 实现控制逻辑编辑器

- 使用 `Node / Series / Parallel` 表达式树建立梯形图逻辑模型,支持嵌套串并联关系。
- 使用 `Node / Wire / Series / Parallel` 表达式树建立梯形图逻辑模型,支持嵌套串并联关系和无地址横线
- 支持节点前后串联插入、与节点并联、与整个支路并联、删除和输出线圈配置。
- 支持选择横线后用触点原位替换;`F11/F12` 插入横线或为连续范围建立竖线旁路,`Shift+F11/Shift+F12` 删除对应横线或并联支路。
- 实现常开、常闭、上升沿、下降沿、T/C 触点、普通线圈、置位/复位、TON、CTU/CTD、MOVE、ADD/SUB 以及 D 值与常量比较。
- 上升沿和下降沿按一次扫描脉冲执行;TON 使用离线执行器的 `steady_clock` 和 T 资源表,不为每个 TON 创建独立 Qt 定时器;CTU/CTD 使用 C 资源和 D 区 CV,按上升沿计数。
- 明确 M/D 为外部地址、T/C 为离线资源;ADD/SUB 以有符号 16 位结果饱和处理溢出,不能让一次越界中止扫描。
@@ -66,7 +67,7 @@
- 新增节点类型时使用独立配置类型,不向通用节点结构持续堆叠无关字段。
- 编辑器只生成逻辑模型,不直接修改 HMI 或 PLC。
- 工程可包含多个有序控制逻辑,离线执行器按顺序扫描全部启用项,运行工作台只切换当前轨迹投影。
- 画布按表达式结构自动布线,显示节点或支路选择范围,不允许节点自由拖动,也不保存自由线段。
- 画布按表达式结构自动布线,横线作为结构叶子保存列跨度,竖线由并联结构派生;不允许节点自由拖动,也不保存自由像素线段。

完成标准:能够表达 `A OR (B AND C)` 等嵌套逻辑,并配置启动、停止和状态保持逻辑。



Načítá se…
Zrušit
Uložit