跳到主要内容

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,通过 @ 加入 qxqgqxqp,发送下面的任务:

目标:把当前“包装工作站”页面内的模拟周期迁移为一个 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 的结果

  1. Resources → Scripts 中打开 packaging-station.qg
  2. Flow 中确认能看到正常完成、超时和复位三条清楚的路径;再切回 Source,确认两种视图仍是同一程序。
  3. Resources → Objects 中选择包装工作站 Object,记录它的 Object ID,并确认 Provider 指向该 .qg
  4. 打开 Page,确认按钮调用的是这个 Object,而不是继续在页面中用计时器直接增加计数。
  5. 打开 Problems。当前文档的实时错误应已解决;完整 Build 诊断会在下一步生成。

如果页面仍同时维护另一份状态和计数,让 AI 删除重复状态,只保留等待请求期间需要的界面状态,例如按钮禁用或“执行中”提示。

第 3 步:用 Debug 验证正常分支

  1. 在 QG Source 的正常完成语句上添加断点,例如计数增加或状态恢复为 Ready 的位置。
  2. 在 Build 菜单选择 Build Debug。Build 使用已保存文件,并把结果部署到当前运行目标。
  3. 点击 Debug,等待状态进入 Debugging。
  4. 打开 Page 的 Preview。Preview 会复用当前 Debug 实例;它不会重新 Build 或启动另一份 App。
  5. 使用默认 3000 ms 启动一个周期。
  6. 命中断点后,确认 QG Source/Flow 定位到预期语句,再点击 Continue

预期结果:约 1.5 秒后周期成功,计数增加 1,状态回到 Ready,故障信息为空。

注意

Preview 中的 Object 调用会作用于当前绑定的运行目标。本课是软件模拟;以后连接真实设备时,不能把 Preview 当成无副作用的设计画布。

第 4 步:故意验证一次超时

  1. 在 QG 的 Timeout 分支设置断点。
  2. 保持 Debugging,在页面把本次 timeout 改为 500 ms 并启动周期。
  3. 命中断点后检查状态和错误信息,然后点击 Continue
  4. 在页面调用 ResetFault,确认状态回到 Ready,累计计数没有增加也没有被清空。
  5. 把页面默认 timeout 恢复为 3000 ms 并保存。

这一步验证的是故障处理,不是制造一个“永不出错”的演示。若 500 ms 仍走成功分支,检查页面是否真的把参数传给 QG,以及超时判断是否使用了同一单位。

第 5 步:形成可交付基线

  1. 点击 Stop 并等待 Stopped。
  2. 确认所有文件已保存,默认 timeout 已恢复为 3000 ms
  3. 再执行一次 Build Debug
  4. 重新 Debug,至少复测一个正常周期和一次 ResetFault。
  5. 在版本面板查看本课改动,确认没有设备、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