整件逻辑检测:所有相机工位都跑完后再做一次判断¶
一件产品往往要好几个相机工位、好几个检测方案才拍完:正面一个方案、背面一个方案,或者上料位和下料位各一台相机。有些判断要把不同工位的结果放在一起才做得了 —— 正面认出来的型号和背面的是不是同一个、两个工位读到的 SN 是不是一致。
整件逻辑检测就是干这个的:一件产品所有相机工位、所有检测方案都跑完以后,拿全部自定义变量做一次"变量预处理 + 结果判定",判定结果固定计入总结果 —— 它判不通过,这件产品就是不通过,没有开关可以关掉"计入"。
和方案内逻辑检测怎么分工¶
| 逻辑检测(方案内) | 整件逻辑检测 | |
|---|---|---|
| 放在哪 | 某个检测方案里的一个检测项 | 工程级,调试端任务树最底部(排在所有相机工位之后) |
| 能用哪些变量 | 只能用本方案的自定义变量(串口变量、SN 不限) | 工程里全部自定义变量,哪个工位、哪个方案都行 |
| 什么时候跑 | 跟着本方案,按运行顺序 | 所有方案都跑完以后,每件只跑一次 |
| 能做什么比较 | 日期比较、距离比较、变量比较 | 只有变量比较(启用 / 预处理指令 / 判定指令) |
| 结果去哪 | 本方案的判定 | 一票否决总结果 |
规矩很简单:只看本方案的,用方案内逻辑检测;要跨相机工位或跨方案比的,一律用整件逻辑检测。 方案内逻辑检测一旦用了别的方案的变量,运行时会直接报错,不会再等。
前置条件¶
- 要参与判断的检测项已经建好、能正常出结果。
- 先给它们设好自定义变量:在调试端树里右键该检测项 →"设为自定义变量",起一个名字。能设自定义变量的检测项有:字符识别、码检测、条码字符对、可变区域、卡尺工具、圆孔测量。串口收发数据产生的变量、SN 也能直接用。
新建与设置¶
- 用超级管理员登录,进调试端。
- 左侧"标签相机工位集合"的树里,在空白处(或某个相机工位上)右键 →"新建整件逻辑",新的一条追加在树的最底部、所有相机工位之后,按
整件逻辑_1、整件逻辑_2的顺序起名。 - 双击这一条(或右键 →"设置整件逻辑"),打开设置窗口,填好三个参数,点"确定"。
- 点"保存工程"。整件逻辑存在工程文件里,老工程打开时就是一条都没有,不会提示什么。
右键这一条还有"重命名整件逻辑"(名字在工程里不能重复)、"启用整件逻辑"/"禁用整件逻辑"、"删除整件逻辑"(会二次确认)。禁用的会和禁用的相机工位一样置灰。条目背景按上一次结果:红 = 不通过,其余白;鼠标停上去会显示没跑的原因或指令错误。

参数说明¶
| 参数 | 含义 | 调参建议 |
|---|---|---|
| "启用" | 勾上才参与判断;不勾 = 不跑、不否决 | 临时不用就去掉勾,不必删 |
| "变量预处理指令" | 多行,先执行一遍,用来从原始变量里算出中间量 | 例如 front = str(正面型号).strip(),把正面认出来的型号去掉空格后存成 front |
| "结果判定指令" | 一行表达式,结果为真判通过,为假判不通过 | 不能留空,留空开跑前就会拦下 |
| 变量表(变量 / 来源 / 当前值) | 只读,列出工程里全部自定义变量:来源写成 相机工位->检测方案->检测项,串口变量、SN 写"运行期变量(串口/SN)" |
点"刷新"重新取当前值。来源显示"(已失效)"说明那个检测项已经删了 |
| "变量处理结果" | 只读,上一次跑完后预处理之后所有变量的值 | 调试时照着它确认变量名和取值对不对 |
| "结果" | 上一次的判定:通过 / 不通过 / 未运行,下面跟着原因或错误文案 |
写法和逻辑检测"变量比较"一样:变量名就是设自定义变量时起的名字,能用加减比较、字符串截取、len() 这类常用写法。名字不在自定义变量里的(预处理里自己赋的中间量、内建函数)不会被当成问题。
设置窗口里没有"运行"按钮 —— 整件逻辑只在下面两种情况下跑。
在调试端怎么跑¶
整件逻辑只在调试模式点工具栏"整体运行"时跑:
- "整体运行"在调试模式下就是运行整件:启用的相机工位、启用的检测方案,按任务树的顺序,装了调试图的都跑一遍,全部跑完再跑整件逻辑。
- 有方案没装调试图时,装了图的照跑,整件逻辑不跑,条目上提示"工作站 X 方案 Y 没装调试图, 整件逻辑未运行";跑完后运行时间旁边也会用橙色点名"未运行(没装调试图):工作站 X 方案 Y 没装调试图"(工程里没有整件逻辑时也会提示)。要跑整件逻辑,先给每个启用的方案都装好调试图(点"单次触发"拍一张,或点"打开调试图"选一张)。
- 一个装了图的方案都没有时,和以前一样报"调试模式输入图片为空!"。
- 某个方案跑出错时,后面的方案和整件逻辑都不跑,报那个方案的错;整件逻辑条目清掉上一次的结果,提示"方案 Y 出错, 整件逻辑未运行"。
- 跑完后树里的整件逻辑条目不通过变红,鼠标停上去能看到没跑的原因或指令错误;双击打开设置窗口能看到"变量处理结果"和判定。
只想调一个方案时,在任务树上右键该方案 →"只运行此方案":不是当前方案会先切过去、切换完成后再跑;只跑这一个方案,不跑整件逻辑。"单模板运行"同样不跑整件逻辑。编辑模式下"整体运行"的行为没有变。
运行页的行为¶
- 开始运行前会校验整件逻辑的配置,有问题不起跑,报"整件逻辑检测配置有误, 请先修正: …",问题见下面的提示表。
- 每件产品等所有检测方案都跑完以后跑一次整件逻辑。标了"最终输出"的通讯输出、汇总结果、存图、人工复判、写 MES、结束这些指令都会先等它跑完,所以 PLC 拿到的总结果、存图的 OK/NG 目录、MES 上传的结果、运行页的结果标签,都已经算上了整件逻辑。
- 整件逻辑是一票否决:任一条启用的整件逻辑判不通过,总结果就是不通过;和系统设置里总结果按"与"还是"或"汇总无关。它判通过时总结果不变。
- 不通过时,"不良信息汇总"和 MES 的缺陷描述里会多一段
整件逻辑->名字:加原因(没有原因写"判定为假");汇总结果串在各方案结果之后多一段整件逻辑->名字:通过;/不通过;/未知;(人工复判、写 MES 那两行还是在最后)。 - 中途输出看不到整件逻辑:没勾"最终输出"的通讯输出不等所有方案跑完,整件逻辑这时还没跑。
- 通讯输出里可以引用整件逻辑的结果:变量下拉里会列出
整件逻辑->名字(只列启用的),选上后存成&整件逻辑->名字,值是通过 / 不通过。只能用在"最终输出"或它之后的输出里;用在中途输出会报变量找不到并停机。 - 指令运行时出错(比如预处理里除以零、判定里写错了变量名),这件产品判不通过,运行页按异常停机并报出指令错误。
命令行 run_cli info 会列出整件逻辑(piece_logic)和配置问题(piece_logic_problems,与开跑前校验同一份)。run_cli detect 是一张图跑一个方案,不跑整件逻辑;run_cli run(无头运行)和运行页一样会跑。
常见提示与处理¶
| 提示 | 原因 | 处理 |
|---|---|---|
| "整件逻辑 X 的结果判定指令为空"(开跑前) | 判定指令没填 | 填上判定指令,或禁用这一条 |
| "整件逻辑 X 的指令有语法错误"(开跑前) | 预处理或判定指令写得不合语法 | 对照"变量处理结果"改指令 |
| "整件逻辑 X 用的变量 V 不存在(检测项可能已删除或被禁用过,请重新设为自定义变量)"(开跑前) | 指令用到的变量不在变量表里。在调试端禁用或删除检测项 / 方案 / 相机工位时,软件会把它们的自定义变量一并去掉,重新启用后也不会自动回来 | 启用检测项后重新右键"设为自定义变量"(名字照旧),或改掉指令。预处理里自己赋值的中间量、内建函数(如 len)、SN 和串口收发变量不算 |
| "整件逻辑 X 用的变量 V 所在的 工位->方案->检测项 已禁用"(开跑前) | (变量仍在变量表里时)指令用到的检测项、它的方案或相机工位被禁用了,永远不会有结果 | 启用它,或改掉指令 |
| "整件逻辑 X 用的变量 V 已失效(检测项已删)"(开跑前) | (变量仍在变量表里时)变量指向的检测项已经删了 | 重新给新的检测项设自定义变量,或改掉指令 |
| "通讯输出 O 引用了不存在或已禁用的整件逻辑 X"(开跑前) | 通讯输出里的 &整件逻辑->X 指向的整件逻辑被禁用或删掉了(重命名会自动同步,不会出这条) |
启用它,或去通讯输出里改掉引用 |
| "变量预处理指令错误:…"(运行中停机) | 预处理指令执行出错 | 看错误文案,改预处理指令 |
| "结果判定指令出错:…"(运行中停机) | 判定表达式执行出错,常见是变量名写错 | 对照变量表里的变量名逐个核对 |
| "获取变量值错误:…"(运行中停机) | 某个变量取值时出错 | 检查对应检测项 |
| 条目提示"… 没装调试图, 整件逻辑未运行",运行时间旁橙色"未运行(没装调试图):…"(调试端) | "整体运行"时有方案没装调试图 | 给每个启用的方案都装好调试图再点"整体运行" |
| 条目提示"方案 Y 出错, 整件逻辑未运行"(调试端) | "整体运行"时那个方案跑出错 | 先按弹出的报错修好那个方案 |
通讯输出报变量 整件逻辑->名字 找不到 |
引用它的输出没勾"最终输出"(被禁用的情况开跑前就会拦下) | 改到最终输出里引用 |