diff --git a/AGENTS.md b/AGENTS.md index 7a46b72..13b5599 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,6 +26,7 @@ - 原始需求:`docs/0_综合平台编程器_修改.md` - 数量边界最终规则:`docs/用户使用/数量边界确认方案.md` - 应用配置文件:`docs/用户使用/应用配置说明.md` +- 用户运行程序导出:`docs/用户使用/用户运行程序导出说明.md` - 数据监控与离线初始值:`docs/用户使用/数据监控与离线初始值说明.md` - 工程 JSON 格式:`docs/工程格式说明.md` - 开发阶段顺序:`docs/开发顺序.md`(阶段参考,当前状态以 handoff 为准) diff --git a/docs/ai/handoff.md b/docs/ai/handoff.md index efd3960..6e56927 100644 --- a/docs/ai/handoff.md +++ b/docs/ai/handoff.md @@ -1,6 +1,6 @@ # 当前开发交接 -> 更新日期:2026-08-25。本文件只保留当前工作区状态、最近验证和下一步,不记录历史开发流水账;稳定架构和业务细节分别以 `docs/architecture.md` 及对应专题文档为准。 +> 更新日期:2026-08-26。本文件只保留当前工作区状态、最近验证和下一步,不记录历史开发流水账;稳定架构和业务细节分别以 `docs/architecture.md` 及对应专题文档为准。 ## 当前状态 @@ -13,7 +13,7 @@ - 应用外部配置业务已经完成,固定读取可执行文件目录下的 `config/application.ini` - 配置支持 6 个体验型数量上限、2 个新建 HMI 页面默认尺寸和 6 个 PLC 串口默认参数 - 配置启动时只读取一次,不热更新,不覆盖已有文件,不回写 PLC 配置窗口中的临时修改 -- 当前没有代码阻塞,命令语输入功能已接入,Release 功能测试和 Release 主程序构建均已通过 +- 当前没有代码阻塞,命令语输入和用户运行程序导出功能已接入,Release 功能测试和 Release 主程序构建均已通过 ## 工作区状态 @@ -34,8 +34,14 @@ - 双击已有节点时命令输入框会回填当前指令和 M/D 地址;补全弹窗改为左对齐的“指令 / 操作数 / 说明”三列表格,并扩大宽高,输入框在视口边缘自动避让 - 命令补全增加 `LD=`、`LD<>`、`LD<`、`LD<=`、`LD>`、`LD>=` D 值比较指令,格式为比较指令 + D 地址 + 有符号常量 - `MOV/ADD/SUB` 命令输入保留指令对话框允许的常量操作数;补全过滤只按第一段指令名匹配,输入空格后的 M/D 操作数时仍保留指令提示 +- 双击命令输入只打开空输入框,不再自动弹出补全列表;用户开始输入指令名后才显示补全,并移除未实现的 `TON/CTU` 提示项 - 梯形图删除支持框选网络批量删除;混合选中时忽略断路占位,不再弹出“已经是断路”的误导提示 - 梯形图画布统一支持从网络内部或外部开始鼠标拖拽框选,Ctrl 继续追加选择 +- 新增“文件 -> 导出用户运行程序”:导出前执行运行校验,将当前工程写入临时 JSON,调用 Qt 资源打包流程生成带内嵌工程的专用 exe,并复制 Qt DLL 与平台插件到用户选择的目标目录 +- 修复运行版资源参数被 qmake 工程路径覆盖的问题;每次导出使用独立构建目录,打包脚本校验 `runtime-project.json` 资源已生成,主窗口通过异步 `QProcess` 和阶段进度显示导出过程 +- 导出入口改为选择目标父目录并输入文件夹名称,最终生成“文件夹/同名 exe + 运行库”的完整目录,覆盖已有目录前需要确认 +- 用户运行版启动后隐藏编程器编辑器,直接进入离线仿真;运行监控顶部提供离线/真机切换、PLC 配置、断开和退出程序操作 +- 修复用户运行版未完成 PLC 首次读取时切换真机导致运行监控窗口隐藏、应用无可见窗口而退出的问题;现在保持离线运行并在运行监控窗口提示先配置 PLC 并完成首次读取 ## 本轮变更结论 @@ -64,8 +70,12 @@ - 2026-08-25 执行 `run_qt_tests.ps1 -Configuration Release -Suite All`,12 个 Release 功能测试目标和性能测试全部通过 - 2026-08-25 执行 `run_qt_tests.ps1 -Configuration Release -Suite Functional`,包含命令输入测试的 12 个功能测试目标全部通过 - 2026-08-25 重新执行 qmake 和 `mingw32-make -j2`,Release 主程序 `build/release/release/integrated_platform.exe` 链接通过 +- 2026-08-26 修复用户运行版未配置 PLC 切换真机的窗口生命周期问题,Release 主程序 qmake 和 `mingw32-make -j2` 编译通过,`git diff --check` 通过 +- 2026-08-26 使用 `json/motor_forward_reverse.json` 重新生成 `build/package/motor_forward_reverse_fixed`,运行版启动后进程保持运行,确认补丁已编入用户运行版入口 +- 2026-08-25 修复用户运行程序导出资源错配:使用合法 `1.0` 工程夹具验证 qrc 指向 JSON、运行版 exe 启动不再出现 `illegal value`;Release 主程序构建、All 测试及普通/运行版打包均通过 - 2026-08-25 新增数据监控停靠面板和离线初始值生命周期;Release Functional 测试、主程序 qmake/`mingw32-make -j2` 和新增快照回归通过 - 2026-08-25 修复命令输入失焦、零长度连线黑点、删除后 Gap 复用和连续横线插入;Release Functional 测试及主程序构建通过 +- 2026-08-25 修复双击空网格时补全列表提前弹出;现在仅在用户开始输入后显示补全,并移除未实现的 TON/CTU 提示;Release Functional 测试和主程序构建通过 - 2026-08-25 修复已有节点双击无法进入命令输入;新增条件/输出节点替换回归测试,Release Functional 测试、主程序构建和 `git diff --check` 通过 - 2026-08-25 修复梯形图整网删除误报断路、网络内部无法启动框选;新增批量网络删除原子性测试,Release Functional 测试、主程序构建和 `git diff --check` 通过 - 2026-08-25 新增 Float32 编解码、HMI 双字读写、D3999/D4000 边界、HMI 重叠、自由监控步长/重叠/读写和 Float32 轮询元数据测试;All 套件全部通过 @@ -81,7 +91,7 @@ ## 待完成 -1. 代码功能无待完成项;提交前按逻辑完整改动提交当前配置、真机本地推算、Float32 和命令输入功能、测试及文档 +1. 代码功能无待完成项;提交前按逻辑完整改动提交当前配置、真机本地推算、Float32、命令输入和用户运行程序导出功能、测试及文档 2. 现场使用真实 PLC 做一次 Float32 真机验收:读取 D10/D11 原值,写入一个有限 Float32,确认一次双寄存器请求,轮询读回显示正确,恢复原值并再次读回确认 3. 现场同时确认 HMI 写入仍正常、本地轨迹随每轮 PLC 缓存刷新、PLC 源 M/D 不被本地梯形图输出改变 diff --git a/docs/architecture.md b/docs/architecture.md index eddc83b..7afe828 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -104,6 +104,10 @@ ApplicationSettings(启动后只读) 字段、范围和用户操作方式见 `docs/用户使用/应用配置说明.md`。 +## 用户运行程序导出 + +编程器通过“导出用户运行程序”把当前工程先原子写入临时 JSON,再交给发布脚本生成 Qt 资源并编译到专用 exe。导出的 exe 检测到内嵌 `:/runtime-project.json` 后直接加载工程、隐藏编辑器并进入离线运行;运行监控顶部提供离线/真机切换、PLC 配置、断开和退出程序入口。默认 `integrated_platform.exe` 没有该资源时仍按编程器入口启动。 + ## 结构化梯形图 网络条件保存为规范化表达式树: diff --git a/docs/用户使用/用户运行程序导出说明.md b/docs/用户使用/用户运行程序导出说明.md new file mode 100644 index 0000000..0c22875 --- /dev/null +++ b/docs/用户使用/用户运行程序导出说明.md @@ -0,0 +1,38 @@ +# 用户运行程序导出说明 + +编程器中的“文件 -> 导出用户运行程序”会把当前工程构建成一个专用的 Windows 运行程序。导出的程序不包含工程编辑器,用户双击 exe 后直接进入该工程的运行监控界面。 + +## 导出流程 + +1. 先在编程器中完成 HMI 页面、控制逻辑、报警和 M/D 地址绑定 +2. 确认工程可以进入运行态,不能保留未配置的运行节点 +3. 选择“文件 -> 导出用户运行程序” +4. 先选择目标父目录,再输入导出文件夹名称,例如 `电机正反转` +5. 等待导出进度完成,程序会在父目录下生成同名文件夹,里面包含 exe、Qt 运行库和平台插件 + +最终目录示例: + +```text +目标父目录/ +└── 电机正反转/ + ├── 电机正反转.exe + ├── Qt5Core.dll + ├── Qt5Gui.dll + ├── ... + ├── platforms/ + └── styles/ +``` + +导出期间编程器仍然可以响应界面,但同一时间只能执行一个导出任务;关闭编程器会等导出结束。 + +工程 JSON 会在构建时嵌入 exe,用户不需要接触 JSON,也不需要安装编程器。 + +## 用户操作 + +打开导出的 exe 后直接进入离线仿真。运行界面顶部可以切换“离线仿真”和“真机运行”。真机运行前点击“PLC 配置”,设置串口、站号、波特率、数据位、校验位和停止位,连接成功并完成首次读取后再切换到真机运行。 + +“退出程序”只退出用户运行程序,不会进入工程编辑器。 + +## 构建前提 + +编程器导出功能调用项目中的 `scripts/package_qt_app.ps1`,因此开发机需要安装约定的 Qt 5.15.2 MinGW 环境和 PowerShell 7。若运行的是不带项目脚本的已安装编程器,需要把项目脚本和 Qt 构建环境一并部署,或使用同目录的发布工具完成导出。