示例5: 学习循环工具,同时进行多个工件的计数和检测
示例4完成之后,我们会发现如果放置多个相同的螺母,“斑点分析”工具可以检测出每个螺母的中心位置并标注相应的索引号,只是测量结果只有索引号为0的那个螺母。
示例5我们将讲解如何使用“循环”工具测量每个螺母的中心圆孔半径,并将每个螺母的测量结果显示在它的圆心位置上。
在示例4的基础上操作执行。
运行效果
5.1:确定循环次数 | 添加“循环1”工具
在“斑点分析1”工具后面添加工具。点击工具箱“流程控制”,选择“循环”工具,双击并设置参数值,调整参数“起始值”设置为0,“终止值”设置为“斑点分析1”工具的输出斑点个数,以确定循环的执行次数,命名为:循环1,如图所示:
使用“循环”工具,可以对每个螺母半径进行检测;
循环工具应该加到流程中的什么位置?
我们知道只要循环,就需要有一个数值来决定循环的次数,这个数值很直观的会想到应该是“斑点分析1”工具所输出的识别数目,所以循环是依赖于“斑点分析1”工具所输出的结果,应该加到“斑点分析1”之后。
循环工具内部需要做什么事情?
如果每一次循环,工具所需的值都需要根据“斑点分析1”的每个结果改变而改变,我们就需要放到循环里来进行,那么“定位坐标1”会变吗?“定位坐标1”是根据每个“斑点分析1”输出的中心位置而变化的,所以它肯定是要放在循环内部的,而“找圆1”又依赖于“定位坐标1”,所以“找圆1”也需要放在“循环1”中,同理,“计算器1”也是依赖于“找圆1”和“定位坐标1”,所以也需要放在“循环1”中,“显示字符1”也是一样的。
5.2:根据每个斑点定位位置改变定位坐标 | “定位坐标1”工具移入“循环1”内部并修改参数
选择“定位坐标1”工具,右键单击,剪切并粘贴在“循环1”工具内部,调整设置参数,原点的设置需要将{斑点分析1.Point[0]}手动改变为{斑点分析1.Point[#循环1]},这个语法表示“定位坐标1”的原点每次会根据“斑点分析1”输出的定位点而改变,如图所示:
这里首次出现了“#循环工具名”这样的语法,“#循环1”可以理解为“循环1”工具内部的第几次循环,是一个根据循环次数而变化的变量,用户需要手动将一个结果数组的固定索引改为以“#循环工具名”为索引值的可变索引;
“定位坐标1”工具是以每次“斑点分析1”输出的定位点作为原点,所以“定位坐标”工具参数“原点”内容:“{斑点分析1.Point[0]}”改为:“{斑点分析1.Point[#循环1]}”;
5.3:在每个斑点上找圆 | “找圆1”工具移入“循环1”内部
选择“找圆1”工具,右键单击,剪切并粘贴在“定位坐标1”工具后面,工具参数设置不需要改变,以循环执行找圆流程,如图所示:
在“循环1”中的“找圆1”的定位坐标选择中,不要用“{定位坐标1.Coordination[#循环1]}”而是要选择“{定位坐标1.Coordination[0]}”,这是由于“定位坐标1”的输出结果Coordination[0]不是数组类型的,它会在每次次循环中根据{斑点分析1.Point[#循环1]}而改变,不需要再用“#循环1”来确定;
在不考虑复杂循环的情况下,我们可以这样简单理解,在循环内部,只有与循环次数相关的工具才需要使用“#循环工具名称”作为索引,比如本例“循环1”内部的工具,其循环次数为“斑点分析1”的输出结果,“定位坐标1”在使用“斑点分析1”的结果时,需要使用“#循环1”作为索引来表示每次结果的改变,而其他工具的输出结果都不需要用“#循环1”,仍然使用[0]作为结果数据。另外要看一下工具输出的结果数据是否为数组类型,不是数组类型的数据绝对不能用“#循环工具名”作为索引。
5.4:计算每个圆的半径 | “计算器1”工具移入“循环1”内部
选择“计算器1”工具,右键单击,剪切并粘贴在“找圆1”工具后面,工具参数设置不需要改变,以循环执行计算器流程,如图所示:
5.5:测量半径信息调整到每个圆心位置显示 | “显示字符1”工具移入“循环1”内部并修改参数
选择“显示字符1”工具,右键单击,剪切并粘贴在“计算器1”工具后面,双击“显示字符1”工具,调整设置参数, 修改“显示字符1”工具的设置,首先删除之前的设置,然后新建两个显示字符格式,一个窗口左上角显示计数值,另一个在每个螺母的圆心位置显示圆半径的测量结果,如图所示:
“显示字符1”工具的“X、Y”内容,在工具的Data列表下查找添加,分别为:“{找圆1.Circle.Centre.x[0]}”、“{找圆1.Circle.Centre.y[0]}”。
5.7:运行工程文件
点击运行,查看循环执行的结果。
拓展学习
1、修改“显示字符1”工具的半径测量结果显示位置,将X变为 “{斑点分析1.Point.X[#循环1]}”,Y变为“{斑点分析1.Point.Y[#循环1]}”,查看运行效果,并思考“#循环工具名称”的使用。