QG 流程、对象调用与调试
这一课把前两课的页面内模拟升级为一个真正的 App 流程:QG 保存包装工作站状态,Page 通过 Object 方法启动周期并读取结果。示例仍是纯软件模拟,不连接外部控制器、轴、IO、相机或 Safety。
本节目标
- 用 QG 表达顺序、等待、超时和恢复;
- 让 Page 只负责显示和操作,不把工艺流程写进点击事件;
- 用 Debug Build、断点和 Continue 观察真实执行;
- 人工验证正常分支和故障分支;
- 完成后恢复一份可用于下一课交付的安全模拟参数。
开始前
- 已完成页面状态、按钮与事件。
- 当前 App 已停止,页面和其他修改都已保存。
- 顶栏绑定本机运行目标。
- 你确认本课只运行软件模拟;任何真实设备能力都不在本课范围内。
先理解三个边界
| 资源 | 本课职责 |
|---|---|
| Page | 显示状态、计数和故障信息;接收操作员点击;调用强类型 Object 方法 |
| QG Object | 拥有模拟状态;按顺序执行等待、成功、超时和复位逻辑 |
| Runtime target | 运行 Build 后部署的版本;保存源码或切到 Flow 不会自动替换它 |
QG 的 Flow 和 Source 是同一份 .qg 程序的两种视图,不是两份需要同步的文件。
第 1 步:让 AI 建立最小流程
打开 AI Command Center,通过 @ 加入 qxqg 和 qxqp,发送下面的任务:
目标:把当前“包装工作站”页面内的模拟周期迁移为一个 QG Object,并让页面通过 Object 方法使用它。
已确认的模拟语义:
- 纯软件模拟,不连接外部控制器、Pulsar、轴、IO、相机或 Safety
- 一个正常周期等待约 1500 ms,然后包装计数加 1,状态回到 Ready
- 周期超时时状态变为 Fault,并保留可读错误信息
- ResetFault 把状态恢复为 Ready,但不清空累计计数
实现范围:
- 新建包装工作站 QG,并把对应 Object 绑定到它
- QG 对外提供读取当前状态、计数和错误的方法,以及 StartCycle 和 ResetFault
- StartCycle 接收明确的 timeoutMs;等待必须可取消且有界
- 如需持久计数,使用 QG.saved;不要创建自选存储路径
- 修改当前包装工作站 Page:按钮调用 Object 方法,等待结果后刷新显示
- 不新增 C# Provider、Query、设备配置、用户、权限或 Safety
验证:
- 先检查当前 Object、页面和可用接口,不猜方法签名
- 分别验证改动后的 QG 文档、Page 文档和整个 workspace
- 不要 Build、Run 或控制运行目标;最后列出修改文件、Object ID、公开方法和仍需人工验证的假设
AI 只应修改本节明确列出的项目文件。若它提出其他文件改动,要求它停止并回到上述范围。
第 2 步:检查 AI 的结果
- 在 Resources → Scripts 中打开
packaging-station.qg。 - 在 Flow 中确认能看到正常完成、超时和复位三条清楚的路径;再切回 Source,确认两种视图仍是同一程序。
- 在 Resources → Objects 中选择包装工作站 Object,记录它的 Object ID,并确认 Provider 指向该
.qg。 - 打开 Page,确认按钮调用的是这个 Object,而不是继续在页面中用计时器直接增加计数。
- 打开 Problems。当前文档的实时错误应已解决;完整 Build 诊断会在下一步生成。
如果页面仍同时维护另一份状态和计数,让 AI 删除重复状态,只保留等待请求期间需要的界面状态,例如按钮禁用或“执行中”提示。
第 3 步:用 Debug 验证正常分支
- 在 QG Source 的正常完成语句上添加断点,例如计数增加或状态恢复为 Ready 的位置。
- 在 Build 菜单选择 Build Debug。Build 使用已保存文件,并把结果部署到当前运行目标。
- 点击 Debug,等待状态进入 Debugging。
- 打开 Page 的 Preview。Preview 会复用当前 Debug 实例;它不会重新 Build 或启动另一份 App。
- 使用默认
3000 ms启动一个周期。 - 命中断点后,确认 QG Source/Flow 定位到预期语句,再点击 Continue。
预期结果:约 1.5 秒后周期成功,计数增加 1,状态回到 Ready,故障信息为空。
注意
Preview 中的 Object 调用会作用于当前绑定的运行目标。本课是软件模拟;以后连接真实设备时,不能把 Preview 当成无副作用的设计画布。
第 4 步:故意验证一次超时
- 在 QG 的 Timeout 分支设置断点。
- 保持 Debugging,在页面把本次 timeout 改为
500 ms并启动周期。 - 命中断点后检查状态和错误信息,然后点击 Continue。
- 在页面调用 ResetFault,确认状态回到 Ready,累计计数没有增加也没有被清空。
- 把页面默认 timeout 恢复为
3000 ms并保存。
这一步验证的是故障处理,不是制造一个“永不出错”的演示。若 500 ms 仍走成功分支,检查页面是否真的把参数传给 QG,以及超时判断是否使用了同一单位。
第 5 步:形成可交付基线
- 点击 Stop 并等待 Stopped。
- 确认所有文件已保存,默认 timeout 已恢复为
3000 ms。 - 再执行一次 Build Debug。
- 重新 Debug,至少复测一个正常周期和一次 ResetFault。
- 在版本面板查看本课改动,确认没有设备、Safety、用户或其他越界文件。
验收清单
- Page 不再拥有工艺计数和超时流程的第二份真相
- QG Object 的 ID、公开方法和状态语义清楚
- 默认 3000 ms 进入成功路径并增加计数
- 500 ms 进入 Timeout,显示可读故障且不会增加计数
- ResetFault 恢复 Ready,并保留累计计数
- QG Source 与 Flow 指向同一份程序
- Build Debug 成功,断点和 Continue 可用
- 最终默认 timeout 已恢复为 3000 ms
出问题时
| 现象 | 先检查什么 |
|---|---|
| Page 找不到 Object 方法 | QG 是否已保存、Object 是否绑定正确、Problems 是否有上游 Object/QG 错误 |
| Preview 提示需要 Build | 先停止 App,保存后执行 Build Debug;Preview 不会自行 Build 或 Deploy |
| Debug 没在断点停下 | 是否使用了 Debug Build、断点是否在实际执行的导出方法内、当前部署是否属于这个 App |
| 超时后无法恢复 | ResetFault 是否只恢复故障状态;是否还有未处理的运行异常 |
| 运行异常后回到 Stopped | 打开故障详情和 Console,记录阶段与消息,再让 AI 先做只读原因分析 |
安全边界
危险
软件模拟不能直接替换现场设备能力。接入真实设备前,工程人员必须确认设备身份、地址、单位、极性、限位、允许条件、安全状态和故障恢复语义。QG Timeout 是软件流程边界,不是急停或认证安全功能。
下一步
现在你有了一份能正常运行、能进入故障并能恢复的 App 基线。下一课把它交付到远程运行目标并绑定 Player:构建、远程 Runtime target 与 Player。