ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CogResultsAnalysisTool实战详解:视觉结果分析与流程控制

CogResultsAnalysisTool实战详解:视觉结果分析与流程控制 对做视觉项目的人来讲CogResultsAnalysisTool是个绕不开的“细节工具”。很多新手第一次打开它看到Inputs、Outputs、Rules三块区域会以为这是个复杂的脚本框架或者干脆把它当成一个“写代码的地方”放着不管而真正调过几个项目之后才会发现这个工具在流程控制、结果统计、动态切换配方、多相机防错这类场景里简直是承上启下的关键节点。它的定位简单说就一句话一个专门用来“分析其他工具运行结果”的工具。它不采集图像、不做检测、不定位它只干一件事——把前面工具的输出结果读进来按你设定的规则算一算再把结果发给后面工具或者存成变量供整个流程使用。你可以把它理解为产线上的“质检班长”自己不干活但谁干得好不好、下一步该让谁上场、这批数据怎么汇总都由它说了算。这篇文章我会从零开始把CogResultsAnalysisTool的使用方式、脚本语法、典型应用场景和踩坑经验一次讲透。无论你是刚接触VisionPro的新手还是已经被项目里各种逻辑判断绕晕的集成工程师这篇文章都能给你一些可以直接抄走的方案。文章里的示例都是我在实际项目里验证过的写法包括参数配置、脚本代码、排错思路照着做基本能跑通。1. 先搞清楚CogResultsAnalysisTool是个什么样的工具1.1 从工具名字拆解它的定位VisionPro里的工具大致分两类一类是直接跟图像打交道的“眼睛”类工具比如CogPMAlignTool定位、CogBlobTool斑点分析、CogIDTool读码另一类是纯逻辑处理工具最典型的就是CogResultsAnalysisTool和CogFixtureTool。CogResultsAnalysisTool从名字拆开看Results是结果Analysis是分析Tool是工具连起来就是“结果分析工具”。它拿到的是其他工具执行完的真值数据FixturedPositionX、Score、Area、DecodedData这类而不是图像本身。它本身也没有图像输入端子你拖到流程里会发现它的输入输出都只是数值、字符串、布尔量。我见过不少刚接触的人把这个工具当成“万能脚本器”试图在里面写复杂的图像处理逻辑这是理解偏了。它不是用来处理图像的它是用来做流程决策的。打个比方一条检测工位上PMAlign工具负责告诉系统“产品在哪个位置”Blob工具负责告诉系统“缺陷面积有多大”CogResultsAnalysisTool则负责把这两个信息拿过来判断“位置对不对、缺陷超不超标最终给OK/NG结论”。它做的是“裁判”的工作不是“球员”的工作。1.2 它解决的核心痛点多工具协作时的判断与分流在实际产线项目里没有任何一个工位是靠单个工具完成的。一个典型的视觉检测流程至少是图像采集、图像预处理、定位、测量/检测、结果判定、数据通信。越复杂的项目工具之间的依赖关系越乱判断逻辑越多。如果把这些判断逻辑全部写在上位机C#或VB程序里每次产品换型都得改代码、重新编译产线上根本等不起如果全部靠连线将工具输出直接连到下游工具输入一个路径分支多了之后流程会变成一团乱麻。CogResultsAnalysisTool的核心作用就是把这些判断逻辑从程序代码里“抽出来”放到视觉流程里可视化配置。操作人员在现场就能调整判断阈值、切换检测配方、查看统计数据完全不用碰代码。它的典型应用场景包括动态切换产品型号读码器识别到当前产品是A型号还是B型号ResultsAnalysisTool根据这个信息动态改写下游工具的参数或启用/禁用某个工具多相机防错协同两三个相机分别拍不同部位各自给出OK/NG后汇总到这个工具里做“与/或”联合判定任何一个NG整体就NG结果统计与追溯把每次检测的关键数值累加、求均值、算合格率方便现场实时查看当前班次的良率生产流程控制根据检测结果决定触发哪个输出信号、往PLC发什么数据、是否保存当前图像。这四个场景几乎是视觉项目里最常遇到的。把这一个工具用熟了等于给你的视觉流程装了一个“决策大脑”而不是让每个工具各自为战。1.3 界面三块区域Inputs、Outputs、RulesCogResultsAnalysisTool的配置界面非常简洁核心就三块区域Inputs输入在这里声明你要读入哪些外部数据可以是其他工具的输出结果也可以是整个Job的全局变量。声明之后这些值才能在Rules里被引用Outputs输出在这里声明你需要对外输出的变量这些变量供下游工具、脚本、通信模块使用Rules规则这里写具体的逻辑表达式和赋值语句也就是这个工具真正“干活”的地方。把这三块理解成“入口—处理—出口”脑子里就有画面了。Inputs是数据源Rules是加工厂Outputs是成品仓库。数据从Inputs进来在Rules里按你设定的逻辑加工最后从Outputs输出到下游。注意千万不要把Inputs和Outputs当成“多余的变量声明”这一步省了后续写规则时你会发现根本找不到数据引用。正确的习惯是先规划好这个工位需要哪些输入、哪些输出再动手写Rules。2. 动手配置一个完整的CogResultsAnalysisTool流程2.1 环境准备与工具添加本文的示例基于VisionPro 9.0及以上版本版本差异不影响核心功能。在开始之前你需要电脑已安装VisionPro完整版或包含CogResultsAnalysisTool授权的版本一个能运行的视觉流程Job里面至少有一个能出结果的工具比如CogPMAlignTool或CogBlobTool准备一个简单的测试图像或者直接用VisionPro自带的示例图像。配置启动步骤很简单打开VisionPro的QuickBuild或VS环境加载你的项目在工具流中添加CogResultsAnalysisTool位置一般放在所有检测工具之后、最终判定输出之前双击打开工具界面进入CogResultsAnalysisTool的配置面板。2.2 配置Inputs输入数据假设我们有一个最简单的场景用CogPMAlignTool做定位用CogBlobTool检测缺陷面积最终要判断这个产品是否合格。判定标准是定位分数大于0.8缺陷面积小于100像素。我们需要从两个来源读数据所以先把它们声明成Inputs在Inputs区域点击“Add Input”在弹出的数据绑定对话框中选择“Tool Output”然后选择CogPMAlignTool选择输出参数为“Score”匹配分数命名输入变量为“PMAlignScore”用同样的方式添加CogBlobTool的“Area”输出命名输入变量为“BlobArea”。到这里数据源已经接进来了。Inputs区域会显示两行记录每一行包含变量名、数据类型、绑定的工具和参数路径。数据类型的常见选项包括Double、Int、String、Bool等VisionPro会自动根据绑定的输出结果推断类型但建议你核对一下避免变量类型不匹配导致后面规则写不了。2.3 编写Rules规则从表达式到最终判定Inputs配置好了接下来是核心环节——Rules区域写规则。CogResultsAnalysisTool的规则语法非常接近VB Script支持变量赋值、条件判断、算术运算、字符串处理等。我们先把两个输入拿来做判定在Rules区域写入Dim bPass As Boolean bPass (PMAlignScore 0.8) And (BlobArea 100)这一句把两个条件的“与”运算结果赋值给布尔变量bPass视觉上非常直观。然后把这结果输出到Outputs区域。在Outputs区域添加一个输出变量命名为“FinalPass”数据类型选Boolean然后回到Rules区域写一行FinalPass bPass整个工具的任务就完成了。流程跑起来后只要PMAlign定位分数不达标或者Blob缺陷面积超标FinalPass就会返回False下游工具、PLC通信、图像保存模块都可以基于这个布尔值做各自的动作。2.4 配置Outputs输出与下游联动下游工具想要使用这个判定结果可以直接把CogResultsAnalysisTool的输出变量绑定到自己的输入。比如后面接一个CogScriptTool里面读取FinalPass决定是否将图像存盘或者接一个CogImageConvertTool根据FinalPass决定是否转换并输出图像。具体操作为在目标工具的输入端子界面选择绑定到CogResultsAnalysisTool的“FinalPass”输出这样下游工具每次运行都会自动获取最新的判定结果。提示如果只有“判定”这一个需求你也可以不连下游工具直接通过VisionPro的通信模块如CogResultsAnalysisTool本身支持的结果记录功能输出结果。但实际项目中这个工具往往是流程链路的“中间站”所以把它放在检测工具和后续执行模块之间是最常见的排布方式。3. CogResultsAnalysisTool规则语法从入门到进阶3.1 数据类型、变量声明与命名规范CogResultsAnalysisTool的脚本语法基于VB Script但也支持一定程度的类型声明。写规则时最基础的一点就是理解变量怎么存活、怎么赋值、怎么转换。支持的基本类型有类型说明示例Dim x As Integer32位整数Dim count As IntegerDim x As Double双精度浮点数Dim score As DoubleDim s As String字符串Dim msg As StringDim b As Boolean布尔值Dim bPass As Boolean在Rules区域里变量可以先用Dim声明也可以直接使用Inputs和Outputs里定义好的变量。所有声明和赋值代码按顺序执行规则从上往下跑最后一行运行完这个工具本次的运行就结束了。命名规范上我强烈建议变量名不要用中文不要用空格不要以数字开头尽量用有意义的英文组合。比如PMAlignScore、BlobArea、FinalPass、IsOK一看就知道是什么。不要图省事写a、b、c这类单字母写惯了无所谓但项目交接或者现场调试的时候单字母变量会把人逼疯。3.2 从输出结果中提取关键数值的取数路径在Inputs区域绑定数据时你会看到一长串属性路径比如CogPMAlignTool1.Outputs.Item(0).Score CogBlobTool1.Outputs.Item(0).Area CogIDTool1.Outputs.Item(0).DecodedData CogFixtureTool1.Outputs.FixturedPositionX这些路径不需要你手写在绑定界面里通过图形化选择就能生成。但你需要理解路径的含义.Item(0)表示第一个结果对象比如PMAlign设置了多个搜索模式时就会有多个ItemScore、Area、DecodedData是具体的属性名VisionPro的工具结果对象都公开了这些属性供外部访问。实际项目中还会经常遇到取图像坐标、角度、卡尺测量尺寸等场景。比如CogPMAlignTool的定位结果中最常用的几个属性是FixturedPositionX/FixturedPositionY标准坐标系下的位置FixturedPositionRot标准坐标系下的角度Score匹配分数范围一般在0到1之间TrainedPositionX/TrainedPositionY训练时的原始位置。理解这些属性的含义比你多写几百行脚本都有用。因为大部分情况下我们用CogResultsAnalysisTool做逻辑判断都是在跟这些数值打交道。3.3 多条件组合判断与字符串处理真实项目里很少只有一个判断条件。比如同时要检测位置、角度、缺陷面积、读码结果那么Rules区域就会变成多行组合判断。示例假设我们有定位分数Score、位置偏差OffsetX、缺陷面积Area、读码结果CodeString判定规则是分数大于0.8、偏移小于0.5毫米、面积小于100、读码必须包含特定前缀“ABC”。Dim bScoreOK As Boolean Dim bOffsetOK As Boolean Dim bAreaOK As Boolean Dim bCodeOK As Boolean bScoreOK (Score 0.8) bOffsetOK (Abs(OffsetX) 0.5) bAreaOK (Area 100) bCodeOK (Left(CodeString, 3) ABC) Dim bFinalOK As Boolean bFinalOK bScoreOK And bOffsetOK And bAreaOK And bCodeOK这里的Abs()是取绝对值函数Left()是取字符串左边指定数量字符的函数。这些函数在VB Script里都是内置的直接用就好。字符串处理在结果分析工具里非常实用尤其是需要拼接日志、生成追溯码、格式化输出给PLC的时候。常用的字符串函数还有函数作用示例Mid(string, start, length)截取子串Mid(ABCDEF, 2, 3) 结果 BCDLen(string)返回字符串长度Len(ABCD) 结果 4InStr(string, substring)查找子串位置找不到返回0InStr(ABCD, BC) 结果 2CStr(value)转换为字符串CStr(12.5) 结果 12.5CInt(value)转换为整型CInt(12.5) 结果 13四舍五入CDbl(value)转换为浮点数CDbl(12.5) 结果 12.5比如你要生成一条包含所有关键数值的生产记录就可以这样写Dim logMsg As String logMsg Time CStr(Now) , Score CStr(Score) , Area CStr(Area) , Result CStr(bFinalOK)是字符串连接符Now返回当前时间。这样一行代码就能拼出一条完整的日志后续发给上位机或者写入本地文件都方便。3.4 进阶多条件分支与配方动态切换CogResultsAnalysisTool的Rules区域是顺序执行的所以分支逻辑可以直接用VB Script的If Else End If来实现。这一节举两个真实项目里很典型的进阶玩法。玩法一多产品型号的检测流程切换一条流水线上混流生产两种型号的产品A和B。A产品的定位用CogPMAlignTool的Model AB产品的定位用CogPMAlignTool的Model B。你不需要在流程里放两套工具链只需要一套工具链加一个ResultsAnalysisTool做切换。假设CogIDTool已经读出了产品码产品码第一位是1表示A型号是2表示B型号代码可以这么写Dim productType As String productType Left(DecodedCode, 1) If productType 1 Then 使用Model A的定位结果判定标准用A的阈值 Dim bPassA As Boolean bPassA (PMA_Score 0.85) And (PMA_Area 100) FinalPass bPassA ElseIf productType 2 Then 使用Model B的定位结果判定标准用B的阈值 Dim bPassB As Boolean bPassB (PMB_Score 0.75) And (PMB_Area 80) FinalPass bPassB Else FinalPass False End If这里需要注意VisionPro的工具输出绑定不能像写代码一样动态切换路径所以在Inputs区域里要把两种模型下需要的数值都绑定进来PMA_Score、PMA_Area、PMB_Score、PMB_Area然后在Rules逻辑中决定用哪一组。玩法二不合格品的二次复测流程有些项目要求第一次检测NG后自动旋转一个角度重新拍一张图再测一次两次都NG才最终判定NG。这种流程一般在VisionPro里用循环工具链或CogJobManager实现但ResultsAnalysisTool负责记录“这是第几次测量”和“最终是否放行”。Dim currentCount As Integer currentCount 0 If bFirstMeasureNG Then currentCount currentCount 1 第一次NG触发旋转复测 TriggerRetest True Else TriggerRetest False End If这个场景的关键是跨工具、跨周期保存状态。CogResultsAnalysisTool本身不保存历史状态所以“上次是否NG”需要通过Inputs区域绑定一个全局存储变量比如Job的共享变量来实现。如果用到这个功能建议配合ScriptTool或全局变量表一起使用把状态数据持久化。4. 实战场景三个典型的CogResultsAnalysisTool应用方案4.1 多相机防错三个相机联合判定一票否决多相机防错在汽车零部件、消费电子装配线上非常常见。比如一个产品需要同时检查正面、反面、侧面三个部位三个相机分别拍照各自跑一套检测逻辑最后在CogResultsAnalysisTool里做联合判定。假设三个相机的检测工具分别输出三个布尔结果FrontPass、BackPass、SidePass。那么Rules区域只需要一行核心判断FinalPass FrontPass And BackPass And SidePass任何一个相机检测NG最终结果就是NG。如果想细化NG类型可以用多几个布尔输出FinalPass FrontPass And BackPass And SidePass FrontFail Not FrontPass BackFail Not BackPass SideFail Not SidePass这样下游PLC就能精确知道是哪个部位出了问题现场调试人员不必再去翻每个相机的日志。我在一个实际项目中就是用这种方式把每个工位的NG类型细分成了十几类故障定位效率成倍提升。4.2 结果统计自动计算当前班次合格率生产现场经常需要实时看良率但PLC端写统计逻辑对程序员要求比较高。有了CogResultsAnalysisTool统计逻辑可以直接在视觉流程里完成。把每次的判定结果True/False输入进来配合全局变量做累计Dim totalCount As Integer Dim passCount As Integer Dim yieldRate As Double totalCount TotalCounter 1 If FinalPass Then passCount PassCounter 1 End If 更新全局计数器 TotalCounter totalCount PassCounter passCount 输出当前良率 If totalCount 0 Then YieldRate passCount / totalCount * 100 Else YieldRate 0 End If这里的关键是TotalCounter和PassCounter必须是全局变量否则每次工具运行都会从0开始统计就失去了意义。在VisionPro中可以通过Job的全局变量表或Shared变量实现跨周期保存。这个方案适合做日采集、班组统计实际操作中我会在流程开始时初始化这两个变量为零然后每个周期累加一次。提醒如果统计量非常大且要求高并发访问不建议在ResultsAnalysisTool里做因为这会占用视觉系统处理时间。一两个简单累加没问题复杂的数据库操作尽量丢给上位机。4.3 字符串拼接生成序列号追溯信息很多项目要求把检测数据跟产品序列号绑定起来形成完整追溯链。CogIDTool读到的序列号是字符串检测结果是数值ResultsAnalysisTool可以很方便地把它们拼成一条完整记录。假设输入有SerialNumber字符串、Score浮点数、Area浮点数输出有TraceabilityInfo字符串。那么规则就是TraceabilityInfo SN SerialNumber ;Score CStr(Score) ;Area CStr(Area)生成的字符串直接发给PLC或上位机数据库。如果需要按固定长度补零可以用字符串函数处理Dim snPadded As String snPadded Right(00000000 SerialNumber, 8)这行代码把序列号补成8位不足8位前面补0。这种小技巧在对接ERP/MES系统时特别常用因为不同系统对序列号格式要求往往非常严格。5. 常见问题排查与避坑经验5.1 规则不生效先检查输入输出绑定我发现很多“工具没反应”的案例根因并不是规则写错而是Inputs或Outputs没有正确绑定。绑定的数据路径错了、绑的是旧版本工具的旧输出、或者绑定的是整个工具而不是具体的属性都会导致变量拿到错误的值。脚本调试第一步一定是在Outputs区域右键选择“View Output Data”查看当前工具的实际输出值。如果输出值是0或空字符串说明问题出在输入端如果输入值正确但输出不对才是逻辑问题。5.2 数据获取不到值分清Item索引和属性名绑定数据时工具结果里经常会看到Item(0)这个层级。比如CogPMAlignTool的匹配结果可能有多个匹配对象Item(0)表示第一个匹配结果Item(1)表示第二个。如果只做单目标定位Item(0)没问题但如果给了多个匹配你绑定Item(0)只代表“最像的那个”不一定是你想要的。还有一点属性名区分大小写吗在VisionPro的绑定表达式里属性名一般是区分大小写的比如Score写成score就找不到。我自己的习惯是全部照着工具的自带属性提示来选择绝不手写属性名这样可以避开很多低级错误。5.3 数值精度问题避免浮点比较的坑因为浮点数的存储特性直接比较两个Double值是否相等经常会出问题。比如你算了一个数值等于刚好49.9999999但阈值设的是50按真实值它是合格的但浮点比较结果可能不符合预期。实际项目中我会尽量避免浮点数的严格相等判断而是用范围判断Dim bAreaInRange As Boolean bAreaInRange (Area 49.5) And (Area 50.5)或者干脆用数值取舍CDbl(FormatNumber(Area, 2))先把数值格式化为两位小数再比较。5.4 常见问题速查表现象原因处理方式输出一直是False输入绑定错误拿到的是旧值或空值查看Output Data确认输入值是否合理输入数据没更新工具执行顺序问题上游工具没跑在工具流中确认上游工具已运行或已设置自动运行脚本报错“变量未定义”变量名拼写不一致或用错了大小写检查Inputs/Outputs中定义的变量名数值结果偏大/偏小单位换算问题像素/毫米绑定输入时确认是否经过了标定Calibration字符串拼接后出现空白部分输出值为空字符先用CStr转换再判断空值情况运行速度变慢规则中写大量循环或复杂计算简化规则把重计算放到上层系统5.5 我踩过的坑几个实操心得心得一先建Inputs再写Rules顺序不要颠倒。有些人喜欢先在Rules里把逻辑写好再回头去建Inputs结果变量名对不上来回改好几遍。正确做法是先规划好需要的所有输入输出一次配好然后专心写Rules。心得二每个输出变量都取一个明确的名字并加注释。在Rules区域VB Script是支持单引号注释的 最终判定结果True合格False不合格 FinalPass bPass团队协作时别人接手项目看到注释会很感激你。我自己维护的旧项目中看到那些没有注释的规则脚本每次改都胆战心惊。心得三善用“View Output Data”和“Display Runtime Result”。VisionPro提供运行时结果查看窗口断点式排查问题非常高效。工具跑完一帧图像后可以看到所有输出变量当前值哪一步不对一目了然。这个功能比翻日志强一百倍。6. CogResultsAnalysisTool应用之后的场景扩展这个工具用熟了之后你会发现它能做的事情远不止“判断合格不合格”。我个人体会最深的几个扩展方向供大家参考扩展一作为流程的“调度中心”。在复杂的多工位视觉检测系统中CogResultsAnalysisTool完全可以承担整个工位流程的状态机角色。用几个整数变量记录当前状态通过If Else分支切换检测模式、触发复位、发送异常报警。状态机上、下电逻辑在视觉系统里其实非常实用但它时常被忽略大家更倾向去上位机做。扩展二作为上位机与视觉现场之间的“翻译官”。很多PLC通信协议里需要把视觉判定结果按位映射成某个整型数值比如Bit0表示是否存在、Bit1表示尺寸是否合格、Bit2表示读码是否成功等。你完全可以在CogResultsAnalysisTool里写一个整数拼装逻辑把多个布尔结果打包成一个数字再发给PLC省去上位机二次解析工作。Dim msgCode As Integer msgCode 0 If Not bExistThen msgCode msgCode 1 End If If Not bSizeOK Then msgCode msgCode 2 End If If Not bCodeOK Then msgCode msgCode 4 End If这样的“二进制位映射”方式在许多项目中被验证高效稳定PLC工程师看到这样的输出会非常开心。扩展三结合CogScriptTool做更复杂的字符串处理。CogResultsAnalysisTool的字符串函数够用但真要处理复杂格式比如JSON、XML拼接它并不擅长。我总是把两个工具配合使用ResultsAnalysisTool负责收集和整理数据ScriptTool负责生成复杂通信报文。放在项目中两者各司其职稳定性非常高。如果你正卡在“多工具逻辑判断”这块希望这篇文章能给你一个明确的思路。工具本身并不复杂复杂的是应用场景里的各种边界条件。但只要你把Inputs、Rules、Outputs这条链路吃透再配合现场调试时的耐心排查绝大多数逻辑问题都能迎刃而解。这个工具真正跑顺之后你会发现自己对视觉流程的理解又会深一层。
返回列表