From a1b3863726ab94fde901b6d274922f1084e6535c Mon Sep 17 00:00:00 2001 From: suyu <1643689728@qq.com> Date: Mon, 24 Aug 2026 10:08:58 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=90=8C=E6=AD=A5=E6=A2=AF=E5=BD=A2?= =?UTF-8?q?=E5=9B=BE=E8=83=BD=E5=8A=9B=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AGENTS.md | 10 +- docs/XDH-60T4-E指令与Modbus要点.md | 13 +- docs/ai/handoff.md | 99 +--- docs/architecture.md | 8 +- docs/工程格式说明.md | 11 +- docs/开发顺序.md | 10 +- docs/测试约定.md | 2 +- docs/用户使用/数量边界确认方案.md | 9 +- docs/用户使用/软件使用帮助.md | 544 ------------------ 9 files changed, 59 insertions(+), 647 deletions(-) delete mode 100644 docs/用户使用/软件使用帮助.md diff --git a/AGENTS.md b/AGENTS.md index 2d548fd..921ce4f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,11 +10,13 @@ 2. 涉及模块边界、数据流、运行模式或持久化时,再读 `docs/architecture.md` 3. 按任务读取下方索引中的业务文档;Markdown 没有答案时再查 `docs/pdf/` -三个入口文档各自只负责一类信息: +三个入口文档各自只负责一类信息,不互相复制正文: -- `AGENTS.md`:长期有效的开发、构建和安全约束 -- `docs/architecture.md`:稳定的分层、模块边界、核心模型和数据流 -- `docs/ai/handoff.md`:当前进度、工作区状态、最近验证和下一步;更新时替换旧状态,不追加开发流水账 +- `AGENTS.md`:长期有效的协作、构建、验证、安全和 Git 约束;不记录当前功能清单或开发进度 +- `docs/architecture.md`:当前代码的稳定分层、模块边界、核心模型和数据流;不记录未提交文件和按日期排列的验证结果 +- `docs/ai/handoff.md`:当前工作区状态、本轮改动、最近验证和下一步;更新时替换旧状态,不追加开发流水账或重复专题文档 + +格式字段、数量边界、测试范围和硬件资料分别以对应专题文档为准。功能变化时更新所属专题文档,入口文档只保留导航、稳定约束或当前交接信息。 ## 关键文件索引 diff --git a/docs/XDH-60T4-E指令与Modbus要点.md b/docs/XDH-60T4-E指令与Modbus要点.md index 450acd4..bca1671 100644 --- a/docs/XDH-60T4-E指令与Modbus要点.md +++ b/docs/XDH-60T4-E指令与Modbus要点.md @@ -22,19 +22,22 @@ M 是普通辅助继电器,不可直接驱动外部负载;真机设备是否 ## 2. 简化梯形图仿真的实现范围 -厂商手册包含完整指令集,但本项目只需要模拟常见设备控制逻辑。初版逻辑执行器支持以下元素即可: +厂商手册包含完整指令集,但本项目只模拟当前交付需要的常见设备控制逻辑。逻辑执行器支持以下元素: | 逻辑元素 | 语义 | 对应应用场景 | | --- | --- | --- | | 常开触点 | 绑定位为 `true` 时导通。 | 启动条件、运行条件。 | | 常闭触点 | 绑定位为 `false` 时导通。 | 停止、互锁、故障条件。 | +| 上升沿/下降沿触点 | M 位变化时产生一次扫描脉冲。 | 单次触发、变化检测。 | +| 数值比较 | 将 D 值与有符号 16 位常量比较。 | 水位、温度、剩余量判断。 | | 普通线圈 | 网络导通时写入目标 M 位。 | 运行状态。 | | 置位/复位线圈 | 将目标 M 位锁存为开或关。 | 启动保持、故障复位。 | -| 数值比较 | 比较 D 值与常量。 | 水位、温度、剩余量判断。 | +| MOVE | 将常量或 D 值写入目标 D。 | 参数传送、状态赋值。 | +| ADD/SUB | 对常量或 D 值做饱和加减并写入目标 D。 | 简单数值计算。 | -离线仿真按固定扫描周期执行:读取当前 M/D 值,计算每条网络,提交写入,再刷新 HMI。该语义用于验证项目示例逻辑,不承诺与 XDH 的全部指令、扫描细节和固件行为完全一致。 +离线仿真按固定扫描周期和工程顺序执行,前面网络的 M/D 写入在同一扫描周期对后面网络可见,完成一轮后刷新运行投影。该语义用于验证项目示例逻辑,不承诺与 XDH 的全部指令、扫描细节和固件行为完全一致。 -定时器以及 D 寄存器之间的比较属于可选扩展,不在当前原始需求范围内。后续只有在需求明确时才扩展领域模型、编辑器和逻辑执行器,不能因为厂商手册提供相关指令就默认纳入项目范围。 +当前不支持 T/C 触点、TON、CTU 或 CTD。后续只有在需求明确时才扩展领域模型、编辑器、JSON、逻辑执行器和测试,不能因为厂商手册提供相关指令就默认纳入项目范围。 ## 3. XDH 的 Modbus 地址映射 @@ -104,7 +107,7 @@ HMI 控件不直接收发串口数据。通信服务更新联机寄存器缓存 ### 5.2 读写策略 -1. 收集当前 HMI 页面绑定的 M/D 地址。 +1. 合并 HMI、报警、梯形图和自由监控实际引用的 M/D 地址。 2. 合并相邻地址,分别使用 `0x01` 批量读 M 区、`0x03` 批量读 D 区。 3. 用户点击按钮时使用 `0x05` 写 M 区;提交数值时使用 `0x06` 写 D 区。 4. 写入成功后等待下一次轮询确认实际值,不以本地点击状态代替 PLC 响应。 diff --git a/docs/ai/handoff.md b/docs/ai/handoff.md index 951d139..04a077a 100644 --- a/docs/ai/handoff.md +++ b/docs/ai/handoff.md @@ -1,90 +1,47 @@ # 当前开发交接 -> 更新日期:2026-08-23。本文件只保留当前状态和下一步;完成事项合并成结论,不追加按日期排列的开发流水账。 +> 更新日期:2026-08-24。本文件只保留当前工作区状态、最近验证和下一步,不记录历史开发流水账;稳定架构和业务细节分别以 `docs/architecture.md` 及对应专题文档为准。 ## 当前状态 - 分支:`main` -- 核心软件闭环已经可用:HMI 编辑、结构化梯形图、离线仿真、工程 JSON、统一运行监控大屏、自由监控和 Modbus RTU 真机读写均已实现 -- HMI 外观属性和梯形图十列可选插入网格均已按逻辑完成提交;开始工作前仍需先看 `git status` 和相关 diff,不要重置来源不明的改动 -- 梯形图并联短分支的视觉补线已统一为逐格可点击目标,可直接在任意可见补线格插入条件;空补线仍只属于 UI 投影,只有实际使用的间隔才写入 `Wire(span)` -- 控制逻辑允许以 `rungs=[]` 启动和保存,不再预置“网络 1”;第一次添加条件、横线或输出时由编辑服务原子创建网络,删除最后一个网络后也能回到空逻辑 -- 梯形图空网格只作为编辑位置,不绘制深色真实横线;只有模型中的 `Node / Wire` 和输出连接才绘制导线。连续追加单格横线满十列后,下一次追加自动进入新网络并可一次撤销 -- 并联表达式中较短支路会由 UI 派生右侧汇合连接线,不向工程模型写入隐式 `Wire`,保证每条支路视觉上都接到右侧汇合点 -- HMI 页面宽高已支持编辑态页面属性设置;业务范围统一为宽 `320~1600`、高 `200~800`,默认新建页面为 `800×400`,页面缩小导致控件越界时由服务层原子拒绝 -- HMI 控件属性面板的显示文本输入统一限制为 12 个字符;领域层工程文件文本上限仍为 4096 个 UTF-8 字节 -- `docs/二次开发/` 是已有未跟踪资料,不能因当前任务删除 -- 提交测试已收敛为 9 个功能自动化目标(Domain、Service、JSON 和 Fake PLC)、独立 `performance_tests` 性能目标以及真实 PLC 人工验收;不再保留 Qt UI 自动化目标,长期测试规则见 `docs/测试约定.md` -- 当前没有代码阻塞;实际设备 RUN 联动和离线演示均已完成,下一步是最终交付资料整理 +- 核心闭环仍可用:HMI 编辑、结构化梯形图、离线仿真、工程 JSON、运行监控、自由监控和 Modbus RTU 真机读写均已实现 +- 当前梯形图条件只包含 M 常开/常闭触点、M 上升沿/下降沿触点和 D 与常量比较;输出只包含普通/置位/复位 M 线圈、MOVE、ADD 和 SUB +- T/C 触点、TON、CTU、CTD 已从领域模型、JSON、编辑服务、离线执行器、属性面板、工具栏、图标和自动化测试中整条移除,不是仅隐藏界面按钮 +- 工程格式仍为严格的 `1.0`;包含 `timerContact`、`counterContact`、`ton` 或 `counter` 节点的工程现在会因节点类型不受支持而加载失败,不做自动迁移 +- 当前没有代码阻塞,下一步是完成人工界面检查并整理提交 -## 已实现能力 +## 工作区状态 -- 工程格式为严格的 `1.0`,保存多 HMI 页面、初始页、报警定义、M/D 注释、多控制逻辑和结构化梯形图;不读取旧 `dataPoints` 或 `stages/branches` 格式 -- HMI 现有 8 类控件:Button、Indicator、NumericDisplay、NumericInput、Label、PageJump、AlarmList、ProgressBar -- HMI 控件支持静态文字外观:`textColor` 使用 `#RRGGBB`,字体使用 `fontSize`、`fontBold` 和 `fontItalic`;缺失时使用原有默认样式,属性经现有 `properties` 保存,无需升级 JSON 版本 -- 字体颜色和基础字体设置在编辑画布和统一运行监控 HMI 中共享同一绘制实现;它们不参与 M/D 绑定、PLC 轮询或离线控制逻辑 -- 梯形图使用 `Node / Wire / Series / Parallel` 表达式树和正交网格,不保存自由线段;前 10 列为条件区,输出最多位于第 11 列 -- 每个新建或已有网络都投影出 10 个可独立点击的条件网格;空网格横线只属于 UI 插入光标,不写入工程,点击远端空格后才按需保存前置 `Wire(span)` 和真实条件节点 -- 已保存的多列 `Wire` 也按单格提供点击目标;在其中一格插入触点时,服务层原子拆分为前置横线、触点和后置横线,继续点击条件工具会逐格消费右侧横线,保持原总列宽以及撤销/重做语义 -- 并联分支宽度不足时,渲染层为每个视觉补线格创建带分支 ID 和相对列号的插入目标;服务层按目标分支原子补齐必要横线并插入条件,网络内容区不再误命中整条网络背景 -- 梯形图支持 M 触点与上下沿、T/C 触点、普通/置位/复位线圈、TON、CTU/CTD、MOVE、ADD/SUB -- 只有输出、没有条件的网络按恒真执行;只有条件、没有输出的启用网络不能运行;空网络扫描时跳过 -- 离线执行器按控制逻辑和网络顺序扫描,使用虚拟 M/D,并生成按逻辑 ID 隔离的运行轨迹 -- 真机模式只使用 PLC 读回缓存,停止本地逻辑执行器,不下载本地梯形图,也不显示伪造的 PLC 梯形图轨迹 -- 自由监控属于当前会话,支持 M/D 批量添加、去重、读取和单点写入,不写入工程 JSON -- PLC 通信使用异步 Qt Modbus RTU;轮询地址来自 HMI、报警、梯形图和自由监控的引用并集,写入后等待轮询确认,不乐观修改缓存 -- 真机进入要求当前连接完成首次读取;通信故障撤销首读资格并退出真机运行,恢复通信后仍停留在编辑态 -- 进入离线或真机运行后,弹出并最大化唯一的工程师运行监控窗口,主编程器保留在后面且布局不变;离线时组合可交互 HMI、软件梯形图轨迹和自由监控,真机时组合可交互 HMI 和自由监控 -- 所有数量上限和超限处理见 `docs/用户使用/数量边界确认方案.md`,核心常量集中在 `app/src/domain/project_limits.h` +- 删除定时器/计数器能力的 21 个 `app` 源码和测试文件仍处于未提交修改状态,属于当前任务成果,不能回退 +- `app/src/services/offline_simulation_service.cpp` 只修正了“重启会话时清空 T/C 状态”的过时注释,没有行为改动 +- `docs/用户使用/软件使用帮助.md` 处于已删除状态,本轮按现有工作区保留删除,不恢复旧内容 +- 本轮已同步入口文档、工程格式、数量边界、开发顺序、测试约定和 XDH 指令摘要;各文档只保留自身负责的信息 +- `build/` 只保存本地构建和测试输出,不纳入 Git -## 最近完成 +## 本轮变更结论 -- 收敛提交测试体系:删除 Qt UI 自动化目标及其 2689 行测试代码,功能回归只保留 9 个 Domain、Service、JSON 和 Fake PLC 目标;性能测试改为通过 `-Suite Performance` 独立运行并输出 CSV,真实 PLC 继续人工实测和记录 -- 整理寄存器仓库文件边界:`register_repository.h` 只保留访问契约和结果类型;新增 `virtual_register_repository.h/.cpp` 承载离线内存实现;应用与测试 qmake 清单及具体使用点均改为显式包含新头文件,PLC 仓库继续位于 `infrastructure` -- 调整控制逻辑网络生命周期:新建工程和新建逻辑不自动创建网络,首次实际编辑才创建网络 1;首次条件不生成隐式 `Wire`,首次横线只保存一格 `Wire(span=1)`,首次输出生成无条件输出网络;删除最后网络允许恢复为空逻辑 -- 收窄梯形图导线投影:空网格和并联补线格不再绘制真实水平线,无输出网络不再绘制条件末端到输出槽的长线;保留网格、选择态和必要的模型导线 -- 增加横线连续追加的十列边界处理,普通追加达到十列后自动新建下一网络;自动建网与编辑共用一条撤销记录,串联、并联领域表达式和执行语义保持不变 -- 修复短并联支路右端断线:新增支路宽度小于主支路时,渲染层补齐支路输出到右侧汇合点的水平结构连接,保留空网格不落盘和不绘制无逻辑横线的规则 -- 修复首次横线自动建网后撤销再插入失败:梯形图重载时清除已被撤销的过期当前网络 ID,横线可以再次自动创建网络 -- 修复并联补线格选中后横线视觉消失:补线格继续使用分支插入目标,但在选中框上层按运行激活状态重画派生横线,普通空网格仍不绘制真实导线 -- 修复横线单格选区建立并联旁路时误使用整条横线宽度:新增按横线表达式 ID 和列偏移处理的服务接口,选中范围会原子拆分前置、旁路和后置横线,旁路宽度严格等于选中格数 -- 修复视觉连续横线由多个相邻 `Wire` 表达式组成时误提示“必须来自同一条横线”:服务层按同一串联路径的绝对列合并相邻横线网格,仍拒绝跨触点、跨并联支路和跳列选区 -- 明确拒绝空白并联格直接建立并联支路或竖线连接;空白格与节点/横线混选时给出明确提示,真实节点和横线网格分别路由到对应编辑用例 - -- 统一梯形图可见横线网格交互:新网络空格、持久横线格和并联补线格都可直接点击添加条件;并联远端格会只保存必要的中间 `Wire(span)`,不改变空网络、JSON 或运行语义 -- 新增 `LogicEditorService::insertConditionInBranchAtColumn()`,校验目标必须位于直属并联分支的视觉补线范围内,并保持失败回滚、脏标记和一次撤销语义 -- 网络背景图元命中范围收窄到标题栏,点击线路内容区不再意外选中整条网络;删除网络仍可通过点击标题栏完成 -- 修复梯形图编辑失败回滚后错误保留工程脏标记的问题:回滚同时恢复工程内容和操作前的 `modified_` 状态;保存后超出十列的条件插入不会再触发退出保存提示,已有未保存修改也不会被失败操作清除 -- 根据编程器面向设备交付、调试和验证工程师的需求定位,不恢复旧的纯 HMI 操作员窗口;新增职责明确的 `RuntimeMonitorWindow`,承载离线和真机共用的完整运行监控大屏 -- 主窗口已移除运行监控页签和运行时布局切换;点击离线或真机运行会弹出最大化监控窗口,运行期间只允许监控界面内的返回按钮退出,系统窗口关闭路径被忽略,应用退出时才关闭顶层窗口,且全应用只创建一份 `RuntimeMonitorWidget` -- CTU/CTD 输出节点保持现有梯形图网格宽度,将 CV 和 PV 拆成带水平内边距的两行显示,避免 `D4000`、`32767` 等边界配置在右侧电源轨处被裁剪 -- 报警列表标题输入上限为 12 个字符,报警文本输入上限为 20 个字符;运行消息保持单行并在空间不足时显示省略号 -- 新建报警列表默认尺寸调整为 `360×136`,默认字号比应用字体小 2pt;运行态按当前页 1~5 条记录收缩高度,超过 5 条可通过表头按钮翻页且确认命中使用当前页索引 -- 主窗口默认工具栏布局调整为运行模式栏第一行,HMI 或梯形图编辑工具栏第二行;编辑工具栏仍允许用户拖动重新停靠 -- 新增 HMI 保留外观属性键和领域校验:颜色为严格 `#RRGGBB`,字号为 `6~72`,粗体和斜体为 `true/false` -- HMI 页面属性面板新增宽度和高度编辑;`HmiEditorService::resizePage()` 复用页面边界校验并纳入撤销/重做,成功后画布和工程树尺寸摘要同步刷新;JSON 页面尺寸也统一按 `320~1600 × 200~800` 校验 -- 属性面板新增颜色输入与选择按钮、字号、粗体、斜体;通过既有 `HmiEditorService::updateControl()` 原子提交并保留撤销/重做 -- `HmiGraphicsItem` 统一应用文字外观,保留地址提示、按钮禁用色、指示灯状态色、控件边框和选中框的原有语义 -- 更新工程格式和数量边界文档;领域、HMI 编辑服务和 JSON 往返由自动化测试覆盖,主窗口工作流改为交付前人工验收 -- 梯形图编辑器新增按绝对条件列插入和按横线单格替换的服务接口;UI 统一将空格、横线格、已有条件和无选择状态路由到对应编辑用例,选中条件后串联插入会优先替换紧邻的右侧横线格,再考虑扩展网络宽度 -- 梯形图条件工具提示已明确支持在选中空网格或横线处插入;线圈等输出指令仍写入独立的固定输出槽 +- `LogicNodeConfig` 不再包含 Timer/Counter 地址、触点或输出配置,运行前也不再做 T/C 资源引用检查 +- `SoftwareLogicExecutor` 只保留 M/D 读写、边沿触点跨扫描状态、线圈和字操作执行;轨迹不再保存定时器或计数器状态 +- JSON 读写只接受 `contact`、`edgeContact`、`coil`、`compare`、`move` 和 `arithmetic` +- 梯形图工具栏、指令对话框、属性面板、绘制和图标工厂均不再提供 T/C、TON、CTU、CTD 入口 +- 自动化测试已删除对应领域、JSON、编辑和离线执行断言,同时保留当前指令、结构化梯形图、运行模式和 PLC 轮询回归 ## 最近验证 -- 2026-08-23 从当前工作区重新构建并通过 9 个 Release 功能目标:Domain、Service、JSON 和 Fake PLC 全部通过 -- 独立性能基准通过:100 个控制逻辑扫描约 `0.145 ms`,4001 个 M 寄存器完整读写约 `0.052 ms`;CSV 位于 `build/tests/release/performance_tests/benchmark.csv` -- Qt Release 主程序已在 `build/release-submit/release/integrated_platform.exe` 构建并链接成功,`git diff --check` 通过 -- 2026-08-20 使用 `COM3 / 9600 / 8E1 / 站号 1` 完成真实 PLC 安全读写:`D4000` 从原值 `0` 临时写入并读回 `1`,随后恢复并读回 `0`;未下载 PLC 程序,未执行 RUN 动作 -- 2026-08-21 使用 `json/motor_forward_reverse.json` 完成真实 PLC RUN 联动人工验收:正转启动、反转启动、停止和运行状态反馈正常 +- 2026-08-24 重新构建并通过 9 个 Release 功能测试目标:Domain、Service、JSON 和 Fake PLC 全部通过 +- 独立 Release 性能目标通过:100 个控制逻辑扫描约 `0.123 ms`,4001 个 M 寄存器完整读写约 `0.048 ms`;CSV 位于 `build/tests/release/performance_tests/benchmark.csv` +- Qt Release 主程序已构建并链接成功:`build/release-docs/release/integrated_platform.exe` +- 本轮未连接真实 PLC:改动没有触及 Modbus 通信、真机运行模式或地址映射;继续沿用已有 COM3 安全读写和 RUN 联动验收结果 ## 待完成 -1. 整理最终演示工程、构建说明和验收记录 -2. 根据交付时间评估插件化、新设备适配等可选加分项,不影响当前核心验收闭环 +1. 人工打开主界面,确认梯形图工具栏、属性面板和指令对话框不再出现 T/C、TON、CTU、CTD,当前保留指令仍能正常添加和编辑 +2. 如需兼容历史 `1.0` 工程中的定时器/计数器节点,单独确定格式升级或迁移方案;当前实现按不兼容并拒绝加载处理 +3. 提交前再次确认 `git status --short` 和提交范围,将代码删除与配套文档作为一个逻辑完整改动提交 ## 下一会话起点 -1. 运行 `git status --short`,确认当前未提交和未跟踪文件仍在 -2. 若继续扩展 HMI 外观,优先复用 `HmiAppearanceProperty` 的保留属性键、领域校验和统一绘制路径,避免把样式逻辑放入寄存器或运行服务 -3. 若继续扩展梯形图插入交互,保持空网格为 UI 会话投影,只有真实 `Node / Wire / Series / Parallel` 表达式进入工程;条件区继续统一使用 `ProjectLimits::kMaximumConditionColumns` -4. 修改代码后运行受影响测试和 Release 构建;涉及真机通信时按 `AGENTS.md` 做 COM3 读写及恢复验证 +1. 先运行 `git status --short`,保留当前源码、测试、文档修改和使用帮助删除 +2. 涉及梯形图能力时以 `LogicNodeConfig` 当前六类配置为准;Qt 的 `QTimer` 只是轮询或界面刷新机制,不代表梯形图定时器指令 +3. 修改代码后运行受影响测试、独立性能目标、Release 构建和 `git diff --check`;涉及真机通信时再按 `AGENTS.md` 做 COM3 读写及恢复验证 diff --git a/docs/architecture.md b/docs/architecture.md index cd3e872..3ffd0aa 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -4,7 +4,7 @@ 项目是面向设备交付、调试和验证工程师的单工程、单 PLC、多 HMI 页面和多控制逻辑 Qt 桌面编程器,提供 HMI 编辑、结构化梯形图、离线仿真和 Modbus RTU 真机联机。 -本项目不生成、编译或下载 PLC 程序,不读取 PLC 内部程序与网络轨迹,不实现完整 XDPPro 指令集,也不支持任意自由画线。真机运行时 PLC 内部程序是唯一控制源,PC 只读写工程实际引用的 M/D 地址。 +本项目不生成、编译或下载 PLC 程序,不读取 PLC 内部程序与网络轨迹,不实现完整 XDPPro 指令集,也不支持任意自由画线。当前梯形图模型不包含 T/C 触点、TON 或 CTU/CTD。真机运行时 PLC 内部程序是唯一控制源,PC 只读写工程实际引用的 M/D 地址。 ## 分层与依赖 @@ -104,9 +104,9 @@ ConditionExpression - 有输出但没有条件的网络是恒真网络,每次扫描执行输出 - `Wire` 的逻辑值为真,但运行轨迹是否导通仍取决于上游电流 -节点配置使用 `std::variant` 的独立类型。当前条件包括 M 触点与上下沿、T/C 触点和 D 比较;输出包括普通/置位/复位 M 线圈、TON、CTU/CTD、MOVE、ADD/SUB。新增指令必须增加独立配置、校验、JSON、执行、编辑和测试分支,不能向通用节点堆叠无关字段。 +节点配置使用 `std::variant` 的独立类型。当前条件包括 M 常开/常闭触点、M 上升沿/下降沿触点和 D 与常量比较;输出包括普通/置位/复位 M 线圈、MOVE、ADD 和 SUB。新增或恢复指令必须增加独立配置、校验、JSON、执行、编辑和测试分支,不能向通用节点堆叠无关字段。 -`SoftwareLogicExecutor` 按 `controlLogics` 和网络数组顺序扫描已启用逻辑,前面网络的 M/D 写入在同一扫描周期对后面网络可见。T/C 是离线执行器内部资源,不映射 PLC T/C 区,也不进入 Modbus 轮询;计数器 CV/PV 等显式 M/D 引用仍使用统一仓库。扫描轨迹按逻辑 ID 分区,避免不同逻辑中的重复节点 ID 相互覆盖。 +`SoftwareLogicExecutor` 按 `controlLogics` 和网络数组顺序扫描已启用逻辑,前面网络的 M/D 写入在同一扫描周期对后面网络可见。执行器只通过寄存器仓库读写 M/D,并仅为边沿触点保留跨扫描输入状态;扫描轨迹按逻辑 ID 分区,避免不同逻辑中的重复节点 ID 相互覆盖。 ## 数据源与运行模式 @@ -139,7 +139,7 @@ PLC <-> PlcCommunicationService <--------------------┘ `PlcCommunicationService` 使用 `QModbusRtuSerialMaster` 异步连接、轮询和单点写入,UI 线程不等待串口响应。Modbus 地址使用从 `0` 开始的原始地址。 -轮询集合由 HMI、报警、梯形图中的显式 M/D 引用和自由监控地址合并,按区域去重并合并相邻地址。T/C 内部资源、横线和注释不进入轮询。动态修改监控地址时,当前请求按旧快照解析,空闲后再应用新集合。 +轮询集合由 HMI、报警、梯形图中的显式 M/D 引用和自由监控地址合并,按区域去重并合并相邻地址。横线和注释不进入轮询。动态修改监控地址时,当前请求按旧快照解析,空闲后再应用新集合。 PLC 缓存只保存最后一次成功读回值。写请求受理后不乐观修改缓存,界面等待后续轮询确认真实值。真机运行资格属于当前连接代次:必须完成完整首读,旧连接的异步回复不能污染重连后的状态。 diff --git a/docs/工程格式说明.md b/docs/工程格式说明.md index 7928008..5f7ae09 100644 --- a/docs/工程格式说明.md +++ b/docs/工程格式说明.md @@ -146,7 +146,7 @@ ProgressBar 使用绑定 D 地址的有符号 16 位字值,并将其限制在 控制逻辑初始可以没有网络,`rungs` 为空不是错误。编辑器第一次添加条件、横线或输出时才创建网络;删除最后一个网络后可以再次保存为空逻辑。空网格属于界面编辑辅助,不写入 `Wire`,也不绘制真实梯形图导线。 -网络、`Node / Wire / Series / Parallel` 条件表达式、触点、边沿、T/C 触点、比较、线圈和输出指令字段沿用当前结构化梯形图模型。横线保存为恒真的 `Wire` 叶子: +网络、`Node / Wire / Series / Parallel` 条件表达式、M 触点、M 边沿、D 比较、M 线圈和字操作指令字段沿用当前结构化梯形图模型。横线保存为恒真的 `Wire` 叶子: ```json {"id": "wire-1", "kind": "wire", "columnSpan": 2} @@ -155,17 +155,16 @@ ProgressBar 使用绑定 D 地址的有符号 16 位字值,并将其限制在 `columnSpan` 是必填整数,范围为 `1~10`。它表示横线占用的条件区逻辑网格列数,不是像素长度。单个网络前 10 列是条件区,第 11 列固定放输出指令。竖线不保存为独立对象,而是由 `Parallel` 表达式的支路边界派生。画布像素坐标、自由连线和运行轨迹是 UI 或运行会话投影,不进入 JSON;横线不绑定寄存器,也不产生 M/D 轮询地址。节点配置的类型和值域如下: ```json +{"type": "contact", "address": {"area": "M", "index": 0}, "mode": "normallyOpen"} {"type": "edgeContact", "address": {"area": "M", "index": 0}, "mode": "rising"} {"type": "edgeContact", "address": {"area": "M", "index": 0}, "mode": "falling"} -{"type": "timerContact", "timer": {"index": 0}, "mode": "normallyOpen"} -{"type": "ton", "timer": {"index": 0}, "presetMs": 1000} -{"type": "counterContact", "counter": {"index": 0}, "mode": "normallyOpen"} -{"type": "counter", "counter": {"index": 0}, "mode": "up", "currentValueAddress": {"area": "D", "index": 10}, "preset": {"kind": "constant", "value": 10}, "resetAddress": {"area": "M", "index": 0}} +{"type": "compare", "address": {"area": "D", "index": 0}, "comparison": "greaterThanOrEqual", "value": 10} +{"type": "coil", "address": {"area": "M", "index": 1}, "mode": "normal"} {"type": "move", "source": {"kind": "register", "address": {"area": "D", "index": 1}}, "destination": {"area": "D", "index": 2}} {"type": "arithmetic", "operation": "add", "left": {"kind": "register", "address": {"area": "D", "index": 2}}, "right": {"kind": "constant", "value": 1}, "destination": {"area": "D", "index": 2}} ``` -T/C 资源地址范围均为 `0~4000`,TON `presetMs` 范围为 `1~86400000`。C 仅标识离线计数器实例,计数当前值必须绑定 D 地址,复位必须绑定 M 地址,PV 可为有符号 16 位常量或 D 地址。CTU/CTD 按条件上升沿分别递增/递减;CTU 复位将 CV 置 0,CTD 复位将 CV 装载 PV,CV 始终限制在 `0~32767`,C 触点读取完成状态。上升沿和下降沿是一次扫描脉冲;TON 是非保持接通延时,输入断开时 `ET/Q` 立即清零。T/C 不参与 Modbus,也不写入 M/D 仓库。 +当前 `LogicNodeConfig` 只接受 `contact`、`edgeContact`、`coil`、`compare`、`move` 和 `arithmetic`。`timerContact`、`counterContact`、`ton`、`counter` 等未支持类型会使工程加载失败,不会被忽略或自动迁移。触点模式为 `normallyOpen / normallyClosed`,边沿模式为 `rising / falling`,线圈模式为 `normal / set / reset`;比较运算支持 `equal / notEqual / lessThan / lessThanOrEqual / greaterThan / greaterThanOrEqual`,算术运算使用 `add / subtract`。上升沿和下降沿在离线执行器中产生一次扫描脉冲。 MOVE、ADD 和 SUB 只能把结果写入 D 地址,源操作数和算术左右操作数可以是有符号 16 位常量或 D 地址。指令仅在所在网络条件成立时执行;ADD/SUB 使用更宽中间类型计算,结果超出 `-32768~32767` 时饱和到对应边界,并在离线运行轨迹中记录 `overflow: true`,不会中止扫描。 diff --git a/docs/开发顺序.md b/docs/开发顺序.md index 43e896d..6f6d080 100644 --- a/docs/开发顺序.md +++ b/docs/开发顺序.md @@ -60,9 +60,9 @@ - 使用 `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 位结果饱和处理溢出,不能让一次越界中止扫描。 +- 实现 M 常开/常闭触点、M 上升沿/下降沿触点、D 值与常量比较、普通/置位/复位 M 线圈以及 MOVE、ADD/SUB。 +- 上升沿和下降沿按一次扫描脉冲执行;ADD/SUB 以有符号 16 位结果饱和处理溢出,不能让一次越界中止扫描。 +- 梯形图节点只引用项目统一的 M/D 地址;新增或恢复指令时,必须同步领域模型、编辑器、JSON、执行器和测试。 - M/D 注释作为工程级地址元数据保存,网络注释作为 `LadderRung` 字段保存,两者都不改变寄存器轮询行为。 - 新增节点类型时使用独立配置类型,不向通用节点结构持续堆叠无关字段。 - 编辑器只生成逻辑模型,不直接修改 HMI 或 PLC。 @@ -73,9 +73,9 @@ ## 8. 实现离线仿真运行 -- 实现虚拟 M/D 寄存器和固定周期的软件逻辑执行器,T/C 仅作为离线仿真内部资源,计数器 CV 通过 D 地址可观测。 +- 实现虚拟 M/D 寄存器和固定周期的软件逻辑执行器,边沿触点的上一轮输入按逻辑 ID 和节点 ID 隔离保存。 - 将 HMI、虚拟寄存器和控制逻辑形成完整闭环。 -- 验证 TON 的接通延时、断开复位、多个 T 独立计时、CTU/CTD 上升沿计数、复位/完成状态、MOVE 和 ADD/SUB 的网络顺序语义。 +- 验证常开/常闭、边沿脉冲、线圈模式、MOVE 和 ADD/SUB 的网络顺序语义。 - 实现启动、停止、异常和当前运行状态反馈。 - 记录节点、支路和网络导通轨迹,在画布突出导通路径和故障节点。 diff --git a/docs/测试约定.md b/docs/测试约定.md index 5c55d17..c45ca1e 100644 --- a/docs/测试约定.md +++ b/docs/测试约定.md @@ -20,7 +20,7 @@ | `alarm_service_tests` | 报警定义和运行记录生命周期 | | `hmi_editor_service_tests` | HMI 编辑、原子删除、历史和导航 | | `logic_editor_service_tests` | 结构化梯形图编辑、归一化和历史 | -| `offline_simulation_service_tests` | 扫描语义、定时器、计数器和故障 | +| `offline_simulation_service_tests` | 梯形图扫描语义、跨扫描状态和故障处理 | | `project_management_tests` | JSON 往返、非法文件和工程保存状态 | | `register_monitor_service_tests` | 监视地址、读写和活动仓库 | | `runtime_mode_service_tests` | 编辑、离线和真机状态转换 | diff --git a/docs/用户使用/数量边界确认方案.md b/docs/用户使用/数量边界确认方案.md index 89713e6..a81be42 100644 --- a/docs/用户使用/数量边界确认方案.md +++ b/docs/用户使用/数量边界确认方案.md @@ -8,12 +8,7 @@ | --- | --- | ---: | ---: | --- | --- | | PLC 软元件 | M 地址 | 0 | 4000 | 拒绝保存、加载或连接使用 | 项目需求已经明确限定 | | PLC 软元件 | D 地址 | 0 | 4000 | 拒绝保存、加载或连接使用 | 项目需求已经明确限定 | -| PLC 软元件 | T 定时器编号 | 0 | 4000 | 拒绝保存或运行 | 和本项目 M/D 范围保持一致,低于信捷硬件范围 | -| PLC 软元件 | C 计数器编号 | 0 | 4000 | 拒绝保存或运行 | 和本项目 M/D 范围保持一致,低于信捷硬件范围 | | 数值 | D 字、比较值、阈值、普通常量 | -32768 | 32767 | 编辑和加载时拒绝越界值,运算溢出时压到边界值 | D 是有符号 16 位数据 | -| 计数器 | 常量预设值 PV | 0 | 32767 | 负数或更大值直接拒绝 | 16 位普通计数不能使用负预设值 | -| 计数器 | D 地址提供的 PV、当前值 CV | 0 | 32767 | 读到负数按 0 使用,超过范围按 32767 使用 | 计数语义不能出现负数量 | -| 定时器 | TON 预设时间 | 1 ms | 86400000 ms | 拒绝保存或运行 | 0 没有定时意义,最大值固定为 24 小时 | | 工程文件 | 单个 JSON 文件大小 | 0 | 16 MiB | 读取 JSON 前直接拒绝 | 防止超大文件一次性占满内存 | | HMI | 页面数量 | 0 | 128 | 第 129 个页面不能创建或加载 | 控制工程树和运行页面的内存开销 | | HMI | 单页控件数量 | 0 | 512 | 第 513 个控件不能创建或加载 | 保证编辑画布和运行刷新可控 | @@ -80,8 +75,8 @@ ## 3. 这些数字从哪里来 - `docs/pdf/0_综合平台编程器_修改.pdf` 第 2 页明确要求 M 区和 D 区使用 `0~4000` -- `XD、XL系列可编程控制器用户手册(基本指令篇)` PDF 第 272 页的 XDH/XLH 表中,实际 M/D 资源达到 `0~20479`,T/C 达到 `0~4095`。本项目仍统一收紧为 `0~4000`,不会超出 XDH-60T4-E 的资源范围 -- 同一手册 PDF 第 28 页说明 D 是有符号 16 位寄存器,16 位普通计数范围为 `1~32767`。本项目允许 PV 为 0,表示尚未设定或立即完成,不允许负数 +- `XD、XL系列可编程控制器用户手册(基本指令篇)` PDF 第 272 页的 XDH/XLH 表中,Modbus 可访问的 M/D 范围达到 `0~20479`。本项目仍统一收紧为 `0~4000`,不会超出 XDH-60T4-E 的可访问范围 +- 同一手册 PDF 第 28 页说明 D 是有符号 16 位寄存器,因此本项目的 D 字、比较值和普通常量统一限制为 `-32768~32767` - 同一手册 PDF 第 274 页说明 Modbus RTU 数据区最多 252 字节,站号最大可到 254。本项目单读块固定为 120 个,站号固定为 `1~247` - 同一手册 PDF 第 311 页给出 Modbus 重试次数 `0~5`、回复超时 `0~65535`。本项目采用重试 `0~5`,并把超时进一步收紧为 `100~30000 ms`,避免无限等待 - 页面、控件、报警、逻辑、JSON 大小、日志等数字在信捷手册里没有规定,所以按本软件的内存、绘制、扫描和通信成本给出固定安全预算 diff --git a/docs/用户使用/软件使用帮助.md b/docs/用户使用/软件使用帮助.md deleted file mode 100644 index e0c448b..0000000 --- a/docs/用户使用/软件使用帮助.md +++ /dev/null @@ -1,544 +0,0 @@ -# 综合平台编程器用户使用帮助 - -> 适用版本:第一版(工程格式 `1.0`) -> 适用对象:设备调试、交付和验证人员 -> 文档目的:帮助用户完成工程创建、HMI 配置、控制逻辑编辑、离线仿真和 PLC 真机联机 - -## 1. 先看懂这个软件 - -综合平台编程器把 HMI 画面、简化梯形图、寄存器监控和 PLC 通信放在同一个工程里。一般可以按下面的顺序使用: - -1. 新建或打开一个工程。 -2. 在 HMI 页面中添加按钮、指示灯、数值显示等控件,并配置 M/D 地址。 -3. 在控制逻辑中编写需要验证的梯形图网络。 -4. 保存工程,先进入离线运行检查逻辑。 -5. 确认接线和 PLC 参数无误后,再连接真实 PLC 做真机运行。 - -软件有三种工作状态: - -| 状态 | 适合做什么 | 数据来自哪里 | 能不能编辑工程 | -| --- | --- | --- | --- | -| 编辑态 | 新建工程、配置 HMI、编辑梯形图 | 不读取运行值 | 可以 | -| 离线运行态 | 不接 PLC 做逻辑仿真和画面联动 | 软件内部的虚拟 M/D | 不可以 | -| 真机运行态 | 与现场 PLC 联调和查看状态 | PLC 最近一次成功读回的 M/D | 不可以 | - -有两点请先记住: - -- 软件可以保存和仿真本地梯形图,但**不会生成、编译或下载 PLC 程序**。 -- 真机运行时,PLC 内部已有程序是唯一的控制逻辑来源,软件不会执行本地梯形图,也不会把离线仿真的值自动写入 PLC。 - -## 2. 第一次打开软件 - -### 2.1 主窗口布局 - -打开软件后,主窗口通常包含以下区域: - -- 顶部菜单:文件、编辑、运行、视图。 -- 运行模式工具栏:编辑、离线运行、真机运行、PLC 配置和断开 PLC。 -- HMI 编辑工具栏:添加 HMI 控件。当前正在编辑 HMI 页面时显示。 -- 控制逻辑工具栏:新建网络、插入横线/竖线、并联支路、触点和输出指令。切换到“控制逻辑”页签后显示。 -- 左侧“工程”树:管理 HMI 页面和控制逻辑。 -- 中间编辑区:显示当前 HMI 页面或梯形图。 -- 右侧“属性”面板:编辑当前页面、控件或逻辑节点的参数。 -- 底部“输出”区域和状态栏:显示保存、运行、通信和错误提示。 - -> **截图占位:主窗口整体布局** -> 建议截取完整主窗口,能同时看到顶部菜单、运行模式工具栏、左侧工程树、中间 HMI 画布、右侧属性面板和底部输出区域 - -### 2.2 编辑工具的基本操作 - -- 选择对象:在画布或工程树中单击对象。 -- 移动 HMI 控件:在编辑态下拖动控件,控件会被限制在页面范围内。 -- 删除:选中对象后按 `Delete`,也可以使用“编辑 → 删除所选”。 -- 清除选择:按 `Esc`,或使用“编辑 → 清除选择”。 -- 撤销:`Ctrl+Z`。重做:`Ctrl+Y`。 -- HMI 和梯形图分别维护编辑历史,撤销/重做针对当前正在查看的编辑页签。 -- 进入离线或真机运行后,编辑工具会自动禁用;需要点击运行监控中的“返回编辑态”才能继续修改。 - -## 3. 工程管理 - -### 3.1 新建工程 - -1. 点击“文件 → 新建工程”,或按 `Ctrl+N`。 -2. 在弹出的对话框中输入工程名称。 -3. 确认后,软件会创建一个新的空工程,并自动准备一个默认 HMI 页面和一组控制逻辑。 -4. 默认 HMI 页面大小为 `800 × 400`。控制逻辑刚创建时可以没有网络,第一次添加条件、横线或输出时才会生成网络。 -5. 建议马上使用“文件 → 工程另存为”保存到一个容易找到的位置。 - -如果当前工程有未保存修改,新建工程前软件会先询问是否保存。选择“取消”可以放弃本次新建操作。 - -### 3.2 保存、另存为和加载 - -| 操作 | 菜单 | 快捷键 | 说明 | -| --- | --- | --- | --- | -| 保存工程 | 文件 → 保存工程 | `Ctrl+S` | 已经有文件路径时直接保存;第一次保存会转到另存为 | -| 工程另存为 | 文件 → 工程另存为 | `Ctrl+Shift+S` | 选择新的 JSON 文件路径,并把它作为当前工程文件 | -| 加载工程 | 文件 → 加载工程 | `Ctrl+O` | 选择工程 JSON 文件并替换当前工程 | - -工程文件使用 JSON 格式,建议保留软件生成的 `.json` 文件,不要手工删除必填字段。当前版本只支持工程格式 `1.0`;格式不对、内容不完整或超出软件规则的文件会加载失败,当前打开的工程不会被替换。 - -软件标题栏出现 `*` 时,表示工程还有未保存修改。保存成功后,状态栏和底部输出区域都会显示结果。 - -### 3.3 使用左侧工程树 - -工程树分为“**HMI 页面**”和“**控制逻辑**”两部分。右键页面或逻辑项,可以看到对应操作: - -- 新建页面:输入页面名称。 -- 新建控制逻辑:输入逻辑名称。 -- 重命名:修改页面或逻辑名称。 -- 删除:删除选中的页面或逻辑。 -- 上移、下移:调整页面顺序或逻辑顺序。 -- 设为初始页面:指定进入运行态时首先显示的 HMI 页面。 -- 启用/禁用控制逻辑:禁用的逻辑保留在工程中,但离线运行时不会扫描。 - -> **截图占位:工程树和右键菜单** -> 建议截取页面、逻辑、初始页标记以及右键菜单,帮助用户快速找到新建、重命名、排序和启停逻辑入口 - -注意事项: - -- 已经存在页面时,不能删除最后一个页面。 -- 某个页面被“页面跳转”控件引用时,不能直接删除该页面。先修改或删除跳转控件,再删除页面。 -- 逻辑的顺序就是离线扫描顺序。前面的网络写入 M/D 后,后面的网络在同一扫描周期可以读到更新后的值。 -- 禁用逻辑仍会保存,但不能用它来替代运行前检查。需要运行的逻辑请确认工程树中没有“已禁用”标记。 - -## 4. 编辑 HMI 页面 - -### 4.1 新建和选择页面 - -在左侧工程树中单击某个 HMI 页面,软件会切换到“HMI 页面”页签并显示该页面。页面标题和当前尺寸会显示在画布上方。 - -选中工程树中的页面后,右侧属性面板会显示“页面宽度”和“页面高度”: - -- 宽度范围:`320~1600`。 -- 高度范围:`200~800`。 -- 修改数值后点击“应用页面尺寸”。 -- 页面缩小后如果会让已有控件越出页面,软件会拒绝本次修改,原尺寸和控件位置保持不变。 - -> **截图占位:HMI 页面属性面板** -> 建议显示页面画布、页面尺寸摘要以及右侧“应用页面尺寸”按钮 - -### 4.2 添加控件 - -在 HMI 编辑工具栏中可以直接添加常用控件。工具栏空间不足时,点击“更多控件”按钮查看其他类型。 - -| 控件 | 作用 | 是否需要绑定 | -| --- | --- | --- | -| 按钮 | 向 M 位发送开、关、取反或瞬时 ON 操作 | M 地址 | -| 指示灯 | 根据 M 位显示开/关状态 | M 地址 | -| 数值显示 | 显示 D 寄存器的当前值,只读 | D 地址 | -| 数值输入 | 在运行态输入一个数值并写入 D 寄存器 | D 地址 | -| 文本 | 显示固定文字,不随寄存器变化 | 不需要 | -| 页面跳转 | 点击后切换到另一个 HMI 页面 | 选择目标页面 | -| 报警列表 | 显示当前运行中的报警记录 | 不绑定单个地址,报警条件在“报警配置”中设置 | -| 进度条 | 把 D 值按设定的最小值和最大值换算成百分比 | D 地址 | - -新控件添加后会自动选中,右侧属性面板会显示“未绑定”或“未配置”。这不是软件故障,继续配置属性即可。 - -### 4.3 配置控件属性 - -选中画布中的控件后,在右侧属性面板中填写或修改以下内容: - -- **控件 ID**:用于区分同一页面上的控件,通常保持软件自动生成的值即可。 -- **显示文本**:控件显示的标题或提示文字。编辑界面最多输入 12 个字符。 -- **X、Y、宽度、高度**:调整控件位置和大小。也可以直接在画布中拖动控件。 -- **绑定区域、绑定地址**:按钮/指示灯选择 M,数值类控件和进度条选择 D,地址范围为 `0~4000`。 -- **按钮操作**:选择“置 ON”“置 OFF”“取反”或“瞬时 ON”。 -- **目标页面**:页面跳转控件必须选择一个已经存在的页面。 -- **最小值、最大值、显示百分比**:只对进度条有效。最小值必须小于最大值。 -- **字体颜色**:可以直接填写类似 `#E53935` 的颜色值,也可以点击“选择”。 -- **字号**:范围为 `6~72`。 -- **粗体、斜体**:按需要勾选。 - -填好后点击“应用属性”。如果输入内容不合法,软件会提示原因,并且不会留下半成品修改。 - -> **截图占位:HMI 控件属性配置** -> 建议选中一个按钮或数值输入控件,画面中同时显示绑定区域、地址、按钮操作、颜色、字号和“应用属性”按钮 - -### 4.4 编辑时和运行时的控件操作 - -编辑态下,HMI 控件主要用于选择、拖动和修改属性。进入运行态后,控件行为会变成实际操作: - -- 按钮:按下按钮即可执行配置好的 M 位操作。选择“瞬时 ON”时,按下为 ON,松开后恢复 OFF。 -- 指示灯:只读取 M 位,不产生写入。 -- 数值显示:只显示 D 值,不产生写入。 -- 数值输入:双击控件,在“输入数值”对话框中填写 `-32768~32767` 的整数并确认写入。 -- 页面跳转:单击控件切换页面。 -- 报警列表:单击未确认的报警记录可以确认;报警超过当前页可显示数量时,点击表头左右箭头翻页。 -- 进度条:根据 D 值在最小值和最大值之间的位置显示百分比。 - -运行态中,按钮和数值输入只有在当前数据源可写时才会启用。真机通信故障或尚未完成首次读取时,写入入口会自动禁用。 - -## 5. 配置报警 - -### 5.1 新增报警定义 - -报警配置入口在 HMI 工具栏的“更多控件”菜单中,选择“报警配置”。打开窗口后按下面操作: - -1. 选择地址区域:M 或 D。 -2. 输入地址,范围为 `0~4000`。 -3. 选择触发条件: - - M:`M 为 ON`。 - - D:`D 大于等于阈值` 或 `D 小于等于阈值`。 -4. D 报警需要填写阈值,范围为 `-32768~32767`。 -5. 输入报警文本,编辑界面最多 20 个字符。 -6. 点击“新增”。 - -表格中选中已有报警后,可以修改输入内容并点击“更新”,也可以点击“删除”移除定义。删除前软件会再次确认。 - -> **截图占位:报警配置窗口** -> 建议显示报警表格、地址区域、触发条件、阈值、报警文本以及新增/更新/删除按钮 - -### 5.2 在 HMI 中显示和确认报警 - -添加“报警列表”控件后,它会显示工程中所有报警定义在当前运行会话产生的报警记录。报警列表不需要再绑定 M 或 D 地址。 - -- 没有活动报警时,运行态的报警列表会隐藏。 -- 有报警时,列表按当前控件大小显示记录,每页最多显示 5 条。 -- 超过 5 条时,点击表头左右箭头切换页面。 -- 点击未确认的报警行可以确认报警。 -- 报警条件恢复后,该条记录会自动清除。 -- 多个 HMI 页面放置报警列表时,共享同一组报警记录和确认状态。 - -## 6. 维护 M/D 软元件注释 - -如果希望在梯形图编辑和逻辑排查时看到地址含义,可以打开“视图 → 软元件注释”。 - -在窗口中: - -1. 选择 M 或 D。 -2. 输入地址 `0~4000`。 -3. 填写注释,例如“启动按钮”“当前温度”。 -4. 点击“保存”。 -5. 需要删除时,先在表格中选中地址,再点击“删除”。 - -软元件注释只用于说明地址,不会改变寄存器值,也不会因为添加注释就自动加入 PLC 轮询。 - -## 7. 编辑控制逻辑(梯形图) - -### 7.1 新建逻辑和网络 - -1. 在左侧工程树中右键“控制逻辑”,选择“新建控制逻辑”,输入逻辑名称。 -2. 单击新逻辑,软件会切换到“控制逻辑”页签。 -3. 点击工具栏的“新建网络”,在当前逻辑末尾创建一个网络。 -4. 也可以不先点“新建网络”,直接添加条件、横线或输出,软件会在同一个操作中自动创建网络。 - -梯形图网络是从左到右的条件区和最右侧输出槽: - -- 条件区最多 10 列。 -- 输出指令固定放在第 11 列。 -- 一个网络最多配置一个输出指令。 -- 空网格只是可编辑位置,不代表已经保存了一条真实横线。 -- 软件按结构自动连线,不支持任意拖动画自由线段。 - -> **截图占位:梯形图编辑区** -> 建议显示“新建网络、横线、竖线、并联支路、触点、输出”工具栏,以及一个包含串联和并联的示例网络 - -### 7.2 添加和配置条件 - -先在梯形图中单击目标网格或已有节点,再点击工具栏按钮。不同选择状态下,软件的插入位置如下: - -- 选中空网格:把条件放到该列。 -- 选中横线网格:用条件替换该格横线。 -- 选中已有条件:在该条件后面串联插入。 -- 没有选择:追加到当前网络末尾。 - -可用条件如下: - -| 工具 | 作用 | -| --- | --- | -| 常开 | M 位为 ON 时导通 | -| 常闭 | M 位为 OFF 时导通 | -| 上升沿 | M 位从 OFF 变为 ON 时产生一个扫描周期的脉冲 | -| 下降沿 | M 位从 ON 变为 OFF 时产生一个扫描周期的脉冲 | -| T 触点 | 读取离线仿真中的定时器完成状态 | -| C 触点 | 读取离线仿真中的计数器完成状态 | -| D 比较 | 将 D 值与常量比较,支持等于、不等于、小于、小于等于、大于、大于等于 | - -“常开”和“常闭”在工具栏上直接可见;上升沿、下降沿、T 触点和 C 触点在“更多触点”菜单中;“D 比较”在工具栏中直接可见。 - -添加节点后,选中节点并在右侧属性面板中修改地址、工作方式、比较运算和比较常量,最后点击“应用属性”。M、D、T、C 地址均使用 `0~4000` 范围。 - -### 7.3 设置网络输出 - -输出指令位于网络最右侧的固定输出槽。可用输出包括: - -- **线圈**:网络导通时写入目标 M 位。 -- **置位**:网络导通时把目标 M 置为 ON,并保持。 -- **复位**:网络导通时把目标 M 置为 OFF。 -- **TON**:非保持接通延时定时器。配置定时器编号和预设时间,范围为 `1 ms~86400000 ms`。 -- **CTU**:按条件上升沿加计数。 -- **CTD**:按条件上升沿减计数。 -- **MOVE**:把常量或 D 寄存器的值写入目标 D。 -- **ADD**:两个常量/D 值相加,结果写入目标 D。 -- **SUB**:两个常量/D 值相减,结果写入目标 D。 - -点击 TON、CTU、CTD、MOVE、ADD 或 SUB 后,软件会打开配置对话框。按照对话框填写定时器/计数器资源、CV/PV、复位输入、操作数和目标 D 地址,再点击确定。 - -ADD/SUB 的结果按有符号 16 位数处理,超出 `-32768~32767` 时会压到边界值,不会因为一次溢出中止离线扫描。 - -### 7.4 建立并联支路 - -有两种常见方法: - -1. 选中一段连续的条件节点,点击“并联支路”,在新支路中添加或配置触点。 -2. 选中连续的横线网格,点击“竖线”(快捷键 `F12`),建立横线旁路和竖线连接。 - -并联操作要求选择范围连续,并且必须来自同一网络、同一支路。只选空白网格不能直接建立并联;如果选择不合法,软件会提示原因并回退整个操作。 - -### 7.5 横线、竖线和删除 - -| 操作 | 菜单/工具 | 快捷键 | -| --- | --- | --- | -| 插入横线 | 横线 | `F11` | -| 插入竖线和并联旁路 | 竖线 | `F12` | -| 删除横线 | 编辑 → 删除横线 | `Shift+F11` | -| 删除竖线及对应并联支路 | 编辑 → 删除竖线 | `Shift+F12` | -| 删除节点或网络 | 删除节点/网络,或按 `Delete` | `Delete` | - -横线最多占用条件区 10 列。横线占满当前网络后,继续在没有选择的情况下追加横线,软件会自动在同一次操作中创建下一个网络,方便连续编辑。 - -### 7.6 网络注释和逻辑启停 - -- 单击网络标题后,点击“网络注释”,可以填写网络说明,例如“启动保持”“温度高报警”。 -- 网络注释只建议写一行短说明。 -- 右键左侧工程树中的逻辑项,可以在“禁用控制逻辑”和“启用控制逻辑”之间切换。 -- 只有启用逻辑才会参与离线扫描。 -- 只有条件、没有输出的网络属于未完成网络,不能进入运行态。 -- 只有输出、没有条件的网络表示条件恒为真,进入运行后会周期性执行该输出。 -- 删除最后一个网络后,逻辑可以恢复为空,软件不会自动留下一个看不见的网络。 - -## 8. 离线仿真 - -### 8.1 进入离线运行 - -进入离线运行前,先保存工程并检查以下内容: - -- 需要读写的按钮、指示灯、数值控件和进度条已经绑定正确的 M/D 地址。 -- 所有页面跳转控件都指向现有页面。 -- 报警地址和阈值填写完整。 -- 所有启用的控制逻辑都包含可运行的输出。 -- CTU/CTD、TON、MOVE、ADD/SUB 等指令已经完成配置。 - -然后点击顶部“离线运行”,或选择“运行 → 离线运行”。如果工程未通过运行检查,软件会在状态栏或输出区域说明原因,修正后再试。 - -进入成功后,软件会弹出并最大化“运行监控”窗口,主编程器窗口会留在后面。 - -> **截图占位:离线运行监控窗口** -> 建议显示顶部“离线仿真 · 虚拟 M/D”、HMI 运行视图、梯形图运行状态、逻辑选择框和自由监控区域 - -### 8.2 使用离线运行监控 - -运行监控窗口通常分为三块: - -- **HMI 运行视图**:操作按钮、双击数值输入、跳转页面和确认报警。 -- **梯形图运行状态**:离线模式下显示软件逻辑的导通轨迹;有多组启用逻辑时可以在下拉框中切换查看。 -- **自由监控**:临时添加 M/D 地址,查看或写入虚拟寄存器。 - -离线运行时: - -- HMI 按钮写入的是虚拟 M,不会碰真实 PLC。 -- 数值输入写入的是虚拟 D。 -- 软件逻辑执行器按逻辑和网络顺序持续扫描。 -- 梯形图的导通状态会反映在运行状态视图中。 -- 可以通过自由监控直接改变虚拟 M/D,观察 HMI 和逻辑是否按预期变化。 - -### 8.3 返回编辑态 - -运行期间请点击运行监控顶部的“返回编辑态”按钮。系统窗口的关闭按钮在运行期间不会代替这个操作,避免用户误关窗口后仍以为已经退出运行。 - -返回编辑态后: - -- 离线软件扫描会停止。 -- HMI、逻辑和工程树重新恢复可编辑。 -- 离线虚拟值只属于本次运行会话,不会自动保存到工程 JSON。 - -## 9. 自由监控 - -自由监控位于运行监控窗口下方,是临时查看寄存器的工具,不属于工程内容,不会写入工程 JSON。 - -### 9.1 添加监控地址 - -1. 在“起始地址”中输入 `M0` 或 `D0` 这样的地址。 -2. 在“连续个数”中输入需要添加的数量,范围为 `1~64`。 -3. 点击“添加”,也可以在地址输入框中按回车。 -4. 软件会自动去重,已经存在的地址不会重复添加。 - -当前会话最多保留 64 个去重后的监控地址,地址范围仍为 `M0~M4000`、`D0~D4000`。 - -### 9.2 查看和写入 - -监控表包含“地址、类型、当前值、目标值、写入、状态”几列: - -- M 地址的目标值选择 `OFF` 或 `ON`。 -- D 地址的目标值填写有符号整数,范围为 `-32768~32767`。 -- 点击对应行的“写入”按钮发送单点写入。 -- 写入后不要只看按钮动作,要等待下一次轮询,在“当前值”中确认 PLC 或虚拟仓库已经读回目标值。 -- 前一笔写请求还没有完成时,新的写请求可能会被拒绝,等待状态更新后再操作。 - -可以选中一行或多行后点击“删除”,也可以点击“清空”清除当前自由监控表。 - -> **截图占位:自由监控区域** -> 建议显示起始地址、连续个数、添加按钮、M/D 监控表以及一次写入后的状态提示 - -## 10. 连接真实 PLC - -真机联机前请先确认现场接线、PLC 程序和设备状态。软件的真机功能是读写 M/D 寄存器,不负责配置 PLC 内部程序。 - -### 10.1 联机前检查 - -以 XDH-60T4-E 为例,常用接线和检查顺序如下: - -1. PLC 已正常供电。 -2. 使用 PLC 的 `COM2` RS-485 接口。 -3. PC 通过 USB 转 RS-485 转换器连接 PLC。 -4. 转换器 A 接 PLC A,转换器 B 接 PLC B。无响应时优先检查 A/B 是否接反。 -5. 使用信捷官方工具把 PLC 的 COM2 配置为 Modbus RTU 从站,并确认站号、波特率、数据位、校验位和停止位。 -6. 修改 PLC 串口参数后按设备要求重启 PLC,使设置生效。 -7. 第一次联机建议在安全条件下先读取 M0、D0,再进行 HMI 联动。 - -> **截图占位:PLC RS-485 接线示意** -> 这张图建议放在正式交付版本中,标明 PC、USB 转 RS-485、PLC COM2、A/B 线序 - -### 10.2 配置和连接 - -在编辑态点击“运行 → PLC 配置”,或点击运行模式工具栏中的“PLC 配置”。对话框包含: - -- 端口:选择或输入 PC 上的 COM 端口。 -- PLC 站号:`1~247`。 -- 波特率:`9600、19200、38400、57600、115200`。 -- 数据位:`7` 或 `8`。 -- 校验方式:无校验、奇校验或偶校验。 -- 停止位:`1` 或 `2`。 -- 响应超时:`100~30000 ms`。 -- 失败重试:`0~5` 次。 -- 轮询周期:`50~10000 ms`。 - -项目已用 `COM3 / 9600 / 8E1 / 站号 1` 做过安全读写验证,但实际使用时必须以现场 PLC 的真实配置为准,不能只因为示例参数可用就直接套用。 - -点击确定后,软件会先建立异步连接,再读取工程中 HMI、报警、梯形图和自由监控实际引用到的 M/D 地址。状态栏可能依次显示: - -- PLC 正在连接。 -- PLC 已连接,正在首次读取。 -- PLC 已连接,首次读取完成。 -- PLC 通信故障或 PLC 已断开。 - -> **截图占位:PLC 通信配置窗口** -> 建议显示端口、站号、9600、8、偶校验、1 停止位、超时、重试和轮询周期等字段 - -### 10.3 进入真机运行 - -连接成功后不要立即认为已经可以运行。必须等状态栏明确显示“PLC 已连接,首次读取完成”,再点击“真机运行”。 - -真机运行规则如下: - -- 进入真机前必须完成本次连接的首次 M/D 读取。 -- 真机运行使用 PLC 最近一次成功读回的缓存。 -- HMI 按钮和数值输入会向真实 PLC 发起单点写入。 -- 自由监控可以读写真实 PLC 的 M/D,但每次写入都要等待轮询确认。 -- 真机运行不显示 PC 本地梯形图的伪运行轨迹,也不执行 PC 内的离线逻辑。 -- 离线运行和真机运行不能直接互切。需要先点击“返回编辑态”,再切换到另一种运行模式。 - -真机联调时,建议先用 STOP 状态验证安全读写,确认接线、地址和现场负载后,再进行 RUN 联动。未经确认不要直接操作会影响设备动作的 M 地址。 - -### 10.4 断开 PLC 和通信故障处理 - -- 断开 PLC:选择“运行 → 断开 PLC”。如果当前处于真机运行,软件会先返回编辑态再断开连接。 -- 物理断线、超时、协议错误或串口失效时,软件会停止正常轮询,并保留最后一次有效缓存值。 -- 真机运行中发生通信故障,软件会立即退出真机运行,回到编辑态;通信恢复后也不会自动重新进入真机运行。 -- 重新连接后必须重新完成一次完整首次读取,再点击“真机运行”。 - -## 11. 常见问题 - -### 11.1 点击“离线运行”没有进入 - -通常是工程还没有通过运行检查。请依次检查: - -- HMI 的按钮、指示灯、数值显示、数值输入和进度条是否已经绑定 M/D。 -- 页面跳转是否选择了现有页面。 -- 启用的控制逻辑是否有输出。 -- CTU/CTD、TON、MOVE、ADD/SUB 是否完成配置。 -- 梯形图是否存在“只有条件、没有输出”的未完成网络。 - -错误原因会出现在状态栏、底部输出区域或弹出的提示框中。 - -### 11.2 “真机运行”按钮不能点击或进入失败 - -请检查: - -- PLC 是否已经连接。 -- 是否等待到“首次读取完成”。只显示“已连接,正在首读”还不够。 -- 当前是否仍处于离线运行态。离线和真机不能直接切换,先返回编辑态。 -- PLC 站号、串口参数和 PC 端口是否与现场一致。 - -### 11.3 HMI 控件不能拖动或属性不能修改 - -这通常表示当前处于离线或真机运行态。点击运行监控中的“返回编辑态”,回到主编程器后再修改。 - -### 11.4 PLC 已连接但没有数据 - -优先检查以下项目: - -- USB 转 RS-485 转换器是否被其他软件占用。 -- PLC 是否使用 COM2 的 Modbus RTU 从站模式。 -- A/B 线是否接反。 -- 站号、波特率、数据位、校验位、停止位是否完全一致。 -- PLC 是否在修改串口参数后完成重启。 -- 工程中是否使用了错误的 M/D 地址。软件使用从 `0` 开始的原始地址。 - -### 11.5 HMI 按钮点了但设备没有动作 - -先确认软件的写入状态和轮询读回值,再确认 PLC 内部程序是否把该 M 位作为动作条件。M 位本身只是软元件,软件不会直接驱动 PLC 输出,也不会替现场 PLC 生成梯形图程序。 - -### 11.6 报警列表没有显示 - -检查报警定义是否已经在“报警配置”中新增,并确认地址条件在运行时确实成立。报警列表在没有活动报警时会自动隐藏;报警恢复后对应记录也会消失。 - -### 11.7 工程文件无法打开 - -当前版本使用严格的 JSON `1.0` 格式。请优先使用软件的“保存工程/工程另存为”生成文件,不要把早期草稿格式、旧字段或手工拼接的 JSON 直接混用。文件内容不完整、格式版本不支持、地址越界或页面/控件越界时,加载会失败。 - -## 12. 常用范围速查 - -| 项目 | 范围 | -| --- | --- | -| M 地址 | `M0~M4000` | -| D 地址 | `D0~D4000` | -| D 数值、比较值、报警阈值 | `-32768~32767` | -| 页面宽度 | `320~1600` | -| 页面高度 | `200~800` | -| HMI 控件文字输入 | 最多 12 个字符 | -| 报警标题 | 最多 12 个字符 | -| 报警文本 | 最多 20 个字符 | -| 梯形图条件区 | 最多 10 列 | -| TON 预设时间 | `1 ms~86400000 ms` | -| 自由监控地址 | 最多 64 个去重地址 | -| PLC 站号 | `1~247` | -| PLC 响应超时 | `100~30000 ms` | -| PLC 失败重试 | `0~5` 次 | -| PLC 轮询周期 | `50~10000 ms` | - -## 13. 推荐的完整使用流程 - -下面是一条比较稳妥的第一版使用流程,适合做项目演示或第一次配置设备: - -1. 新建工程,输入工程名称并立即另存为 JSON 文件。 -2. 在工程树中把默认页面重命名为“主操作页面”,按需要新建“参数页面”或“报警页面”。 -3. 设置初始页面和页面尺寸。 -4. 在 HMI 中添加按钮、指示灯、数值显示、数值输入和报警列表,逐个配置文本与 M/D 地址。 -5. 在“报警配置”中新增 M/D 报警定义。 -6. 在“控制逻辑”中新建逻辑和网络,添加触点、并联支路和输出,配置每个节点属性。 -7. 添加 M/D 注释,方便后续排查。 -8. 保存工程。 -9. 点击“离线运行”,用 HMI 和自由监控改变虚拟 M/D,观察 HMI、报警和梯形图轨迹。 -10. 点击“返回编辑态”,保存工程并准备现场联机。 -11. 确认 PLC 接线和 Modbus 参数,打开“PLC 配置”并等待首次读取完成。 -12. 在安全条件下先验证少量 M/D 读写,确认值能读回后再进入“真机运行”。 -13. 真机联调结束后点击“返回编辑态”,需要断开时选择“断开 PLC”。 - -## 14. 安全提醒 - -- 真机操作前确认设备急停、负载和现场安全条件。 -- 第一次写 PLC 前先读取原值,测试结束后恢复并再次读回确认。 -- 未确认接线、站号和地址前,不要在 RUN 状态下操作会改变设备动作的 M 位。 -- 不要把离线仿真结果当成 PLC 内部程序结果;真机模式只反映 PLC 实际读回值。 -- 软件不下载 PLC 程序。需要修改 PLC 内部程序时,请使用信捷官方工具,并遵守现场控制流程。