| @@ -1,6 +1,6 @@ | |||||
| # 当前开发交接 | # 当前开发交接 | ||||
| > 更新日期:2026-08-26。本文件只保留当前工作区、本轮验证和下一步。 | |||||
| > 更新日期:2026-08-27。本文件只保留当前工作区、本轮验证和下一步。 | |||||
| ## 当前状态 | ## 当前状态 | ||||
| @@ -10,6 +10,20 @@ | |||||
| - 本轮没有实现 Int64、无符号数、二/八/十六进制、ASCII、POU 变量监控、信捷原版寄存器网格或自定义监控偏移 | - 本轮没有实现 Int64、无符号数、二/八/十六进制、ASCII、POU 变量监控、信捷原版寄存器网格或自定义监控偏移 | ||||
| - TouchWin 没有原生 Double64 数值控件;本项目的 `Double (Float64)` HMI 是基于 PLC 连续四个 D 的增强能力 | - TouchWin 没有原生 Double64 数值控件;本项目的 `Double (Float64)` HMI 是基于 PLC 连续四个 D 的增强能力 | ||||
| ## 梯形图竖线连续录入 | |||||
| - 工具栏“竖线”和 `F12` 成功连接当前行与下一行后,会保持原列位置并自动选择下一视觉行;连续操作可以逐段向下建立竖线 | |||||
| - 推进时保留网格、输出槽或列边界的原选择形态,目标行超出可视区域时画布自动滚动 | |||||
| - 当前段已经存在时只向下推进,不重复保存连接、不把工程标记为修改,也不生成空撤销记录;状态栏会提示该段原本已经存在 | |||||
| - 到达最后一个现有行后明确停止,不自动创建空行;鼠标拖动画竖线的原有批量行为不变 | |||||
| ## 梯形图鼠标画线预览 | |||||
| - 鼠标画线/删线拖动时由 `LogicEditorWidget` 前景层绘制临时横线或竖线预览,移动过程中不修改工程模型 | |||||
| - 合法预览使用蓝色(画线)或橙色(删线),偏离同一行/同一列时使用红色提示;释放时才调用范围编辑服务一次性提交 | |||||
| - 非法释放会丢弃当前整次预览,之前已保存的线路不受影响;合法释放只产生一条撤销记录 | |||||
| - 横线范围目标已经是相同状态时直接成功返回,不标记工程修改,也不生成空历史 | |||||
| ## 类型与地址规则 | ## 类型与地址规则 | ||||
| | 类型 | 占用字数 | 起始地址 | 输入规则 | | | 类型 | 占用字数 | 起始地址 | 输入规则 | | ||||
| @@ -48,13 +62,15 @@ | |||||
| - 新增回归覆盖 Int32 最小/最大值和负数、Float32 `20.0` 字序、Double `1.0` 字序、Double 偶数地址、NaN/Inf、JSON 往返、HMI 复制粘贴、多字冲突和 16 位梯形图写入保护 | - 新增回归覆盖 Int32 最小/最大值和负数、Float32 `20.0` 字序、Double `1.0` 字序、Double 偶数地址、NaN/Inf、JSON 往返、HMI 复制粘贴、多字冲突和 16 位梯形图写入保护 | ||||
| - 监控回归覆盖四类型批量步长、完整轮询地址、离线初始值捕获、停止仿真恢复、64 行与 256 实际地址上限的候选拒绝 | - 监控回归覆盖四类型批量步长、完整轮询地址、离线初始值捕获、停止仿真恢复、64 行与 256 实际地址上限的候选拒绝 | ||||
| - PLC 回归覆盖 Int16 单字路径、Int32/Double 一次多字回调、Double `D118~D121` 不跨 120 字边界、无法合法拆分的重叠范围拒绝和地址集合原子切换 | - PLC 回归覆盖 Int16 单字路径、Int32/Double 一次多字回调、Double `D118~D121` 不跨 120 字边界、无法合法拆分的重叠范围拒绝和地址集合原子切换 | ||||
| - 梯形图回归新增 F12 同列连续下移、目标自动滚动、末行停止、逐段撤销,以及重复竖线不产生脏状态和空历史 | |||||
| - 梯形图画线回归覆盖拖动预览、非法释放整次取消、合法释放一次提交和一次撤销恢复 | |||||
| - Qt Release 主程序已重新构建到 `build/release/release/integrated_platform.exe`,离屏启动 3 秒正常保持事件循环 | - Qt Release 主程序已重新构建到 `build/release/release/integrated_platform.exe`,离屏启动 3 秒正常保持事件循环 | ||||
| - `git diff --check` 通过;工作区只有 `runtime_mode_service_tests.cpp` 的 CRLF/LF 转换提示,没有空白错误 | |||||
| - 当前 Windows 没有枚举到串口设备,无法使用 `COM3 / 9600 / 8E1 / 站号 1` 做真实 PLC 多寄存器写入,因此本轮没有伪造真机结果 | |||||
| - `git diff --check` 通过,没有空白错误 | |||||
| - 本轮竖线改动只涉及编辑服务和画布交互,不访问 PLC,因此没有重复真机测试 | |||||
| ## 工作区与下一步 | ## 工作区与下一步 | ||||
| - 当前改动尚未提交 Git | - 当前改动尚未提交 Git | ||||
| - 开始本轮前已有的 `docs/工程格式说明.md`、`docs/用户使用/数量边界确认方案.md` 和旧交接修改均已保留并增量合并,没有回退来源不明的改动 | |||||
| - 设备可用后在 PLC STOP 状态先读取一组连续 D 原值,分别验证 Int32、Float32、Double 的一次多寄存器写入与读回,再恢复全部原值并读回确认 | - 设备可用后在 PLC STOP 状态先读取一组连续 D 原值,分别验证 Int32、Float32、Double 的一次多寄存器写入与读回,再恢复全部原值并读回确认 | ||||
| - 人工打开控制逻辑页面,分别从网格、列边界和第 10 列位置连续按 F12,检查选中框、滚动和状态栏提示 | |||||
| - 人工打开 HMI 页面和数据监控,检查四类型下拉框、Double 偶数地址提示、长数值显示和不同系统缩放下的输入框布局 | - 人工打开 HMI 页面和数据监控,检查四类型下拉框、Double 偶数地址提示、长数值显示和不同系统缩放下的输入框布局 | ||||
| @@ -120,7 +120,7 @@ ApplicationSettings(启动后只读) | |||||
| 梯形图复制使用服务层值对象 `LogicClipboardFragment`,不保存源模型指针。`GridObjects` 模式按相对行列保存明确选中的 `Wire / Node`、输出和竖线,未选位置不写入片段,也不把 `Gap` 当成待覆盖内容;`WholeRows` 模式只由左侧行号选择产生,保存完整 10 格、输出、注释和选中行内部的竖线。`LogicEditorService::pasteClipboard()` 先校验全部目标行列、对象类型、冲突和数量上限,再统一分配新 ID 并提交一次历史记录;任一目标非法时恢复模型和工程修改状态。当前光标行与明确整行选择是两份独立 UI 状态,不能互相回退。 | 梯形图复制使用服务层值对象 `LogicClipboardFragment`,不保存源模型指针。`GridObjects` 模式按相对行列保存明确选中的 `Wire / Node`、输出和竖线,未选位置不写入片段,也不把 `Gap` 当成待覆盖内容;`WholeRows` 模式只由左侧行号选择产生,保存完整 10 格、输出、注释和选中行内部的竖线。`LogicEditorService::pasteClipboard()` 先校验全部目标行列、对象类型、冲突和数量上限,再统一分配新 ID 并提交一次历史记录;任一目标非法时恢复模型和工程修改状态。当前光标行与明确整行选择是两份独立 UI 状态,不能互相回退。 | ||||
| 单格编程通过 `LogicEditCursor -> LogicEditResult` 服务契约完成。服务在同一事务中写入触点、横线或输出并返回下一光标:条件区逐格右移,第 10 格后进入输出槽,输出后越过当前竖线连通分组;末尾输出会连同下一空行一起提交和撤销。空行直接写输出时,输出事务把 10 个条件格全部补为 `Wire`;已有条件时只补最右有效内容到输出槽之间的尾部 `Gap`,不会跨过中间的明确断点。画布内嵌指令、工具栏动作和 QAction 快捷键只消费该结果,不在 UI 重复计算推进规则。 | |||||
| 单格编程通过 `LogicEditCursor -> LogicEditResult` 服务契约完成。服务在同一事务中写入触点、横线或输出并返回下一光标:条件区逐格右移,第 10 格后进入输出槽,输出后越过当前竖线连通分组;末尾输出会连同下一空行一起提交和撤销。工具栏竖线操作通过独立结果返回下一视觉行,F12 每成功连接一对相邻行后保持列边界不变并向下推进,末行停止且不自动创建新行;已经存在的连接只推进位置,不产生脏状态或空撤销记录。鼠标画线/删线拖动由 `LogicEditorWidget` 在前景层绘制临时预览,移动过程中不修改工程,释放时才调用范围编辑服务一次性提交;非法释放直接丢弃整次预览,合法释放只产生一条撤销记录。空行直接写输出时,输出事务把 10 个条件格全部补为 `Wire`;已有条件时只补最右有效内容到输出槽之间的尾部 `Gap`,不会跨过中间的明确断点。画布内嵌指令、工具栏动作和 QAction 快捷键只消费服务结果,不在 UI 重复计算推进规则。 | |||||
| 网络不是额外的表达式对象,而是横向导通格、条件节点、输出槽以及竖线连通分量共同决定的电气关系。执行器按列传播电源,在每个列边界先合并竖线连通分量,再计算各行网格和输出;删除竖线会自然拆分网络。节点配置使用 `std::variant` 的独立类型,当前条件包括 M 常开/常闭、M 上升沿/下降沿和 D 比较,输出包括普通/置位/复位 M 线圈、MOVE、ADD 和 SUB。 | 网络不是额外的表达式对象,而是横向导通格、条件节点、输出槽以及竖线连通分量共同决定的电气关系。执行器按列传播电源,在每个列边界先合并竖线连通分量,再计算各行网格和输出;删除竖线会自然拆分网络。节点配置使用 `std::variant` 的独立类型,当前条件包括 M 常开/常闭、M 上升沿/下降沿和 D 比较,输出包括普通/置位/复位 M 线圈、MOVE、ADD 和 SUB。 | ||||
| @@ -13,6 +13,8 @@ | |||||
| - 选择“鼠标画线”后,在同一行横向拖动,把经过的空白格设为横线;条件节点不会被横线覆盖 | - 选择“鼠标画线”后,在同一行横向拖动,把经过的空白格设为横线;条件节点不会被横线覆盖 | ||||
| - 在同一列边界上下拖动,在经过的相邻行之间建立竖线;长竖线由多段相邻连接组成 | - 在同一列边界上下拖动,在经过的相邻行之间建立竖线;长竖线由多段相邻连接组成 | ||||
| - 选择“鼠标删线”后执行相同手势,横向手势恢复空白格,竖向手势删除连接段 | - 选择“鼠标删线”后执行相同手势,横向手势恢复空白格,竖向手势删除连接段 | ||||
| - 鼠标画线或删线时,拖动过程会在画布前景显示临时预览;合法路径显示对应颜色,偏离同一行或同一列时显示错误色 | |||||
| - 预览只存在于当前手势,鼠标释放后才一次性提交;非法释放会丢弃整次预览,不会留下部分修改 | |||||
| - 工具栏“横线”按钮作用于当前条件光标;控制逻辑还没有行时,会一次完成“创建首行 + 写入第 1 格” | - 工具栏“横线”按钮作用于当前条件光标;控制逻辑还没有行时,会一次完成“创建首行 + 写入第 1 格” | ||||
| - 每次成功插入横线或触点后,光标自动右移一格;第 10 格完成后进入输出槽 | - 每次成功插入横线或触点后,光标自动右移一格;第 10 格完成后进入输出槽 | ||||
| - 每次完整拖动只产生一条撤销记录 | - 每次完整拖动只产生一条撤销记录 | ||||
| @@ -7,8 +7,12 @@ | |||||
| - 同一行左右拖动:按网格吸附,将经过的 `Gap` 变为 `Wire`;已有条件节点不会被覆盖 | - 同一行左右拖动:按网格吸附,将经过的 `Gap` 变为 `Wire`;已有条件节点不会被覆盖 | ||||
| - 从同一列边界上下拖动:在经过的相邻行之间创建 `VerticalConnection`;拖过多行会生成多个相邻连接段 | - 从同一列边界上下拖动:在经过的相邻行之间创建 `VerticalConnection`;拖过多行会生成多个相邻连接段 | ||||
| - 工具栏“横线”按钮使用当前条件光标并在成功后右移;空逻辑会原子创建首行并写入第 1 格 | - 工具栏“横线”按钮使用当前条件光标并在成功后右移;空逻辑会原子创建首行并写入第 1 格 | ||||
| - 工具栏“竖线”按钮或 `F12` 在当前行和下一行之间建立连接,成功后保持同一列并自动下移;连续操作可以逐段画到最后一个现有行 | |||||
| - 当前段已经存在时 `F12` 仍会继续下移,但不会重复保存连接、标记工程修改或生成空撤销记录;到达末行后停止,不自动新增行 | |||||
| - 已有行但没有明确光标时仍会提示先选择,避免误改其他网络 | - 已有行但没有明确光标时仍会提示先选择,避免误改其他网络 | ||||
| - 画线可以从第 0 列左边界到第 10 列右边界,边界竖线和横线分别独立保存 | - 画线可以从第 0 列左边界到第 10 列右边界,边界竖线和横线分别独立保存 | ||||
| - 鼠标拖动过程中会显示临时预览线:合法路径使用蓝色(画线)或橙色(删线),偏离同一行/同一列时使用红色提示;预览不会修改工程 | |||||
| - 鼠标释放后才一次性提交整段范围;释放位置非法时整次预览丢弃,释放成功时只生成一条撤销记录 | |||||
| - 一次完整拖动只生成一条撤销记录,撤销会恢复整次手势 | - 一次完整拖动只生成一条撤销记录,撤销会恢复整次手势 | ||||
| ## 鼠标删线 | ## 鼠标删线 | ||||