




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器视觉综合应用第九章第九章机器视觉综合应用C#脚本编程9.1机器视觉生产线综合案例9.2第九章
机器视觉综合应用C#脚本编程019.1C#脚本编程
➽C#编程简介1.C#概述C#是微软公司在2000年6月发布的一种新的编程语言,主要由安德斯·海尔斯伯格(AndersHejlsberg)主持开发,它是第一个面向组件的编程语言。C#语言是一种现代、面向对象的语言,它简化了C++语言在类、命名空间、方法重载和异常处理等方面的操作,它摒弃了C++的复杂性,更易使用,更少出错。它使用组件编程。C#语法和C++和JAVA语法非常相似。用C#编写的源代码被编译成符合CLI规范的中间语言(IL)。IL代码和资源(如位图和字符串)存储在程序集中,扩展名通常为.dll。程序集包含一个介绍程序集的类型、版本和区域性的清单。C#概述C#基础知识C#语言是Microsoft.NET框架中新一代的开发工具,是一种新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序,Microsoft.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。C#程序在.NET上运行,而.NET是名为公共语言运行时(CLR)的虚拟执行系统和一组统一的类库。CLR是Microsoft对公共语言基础结构(CLI)国际标准的商业实现。CLI是创建执行和开发环境的基础,语言和库可以在其中无缝地协同工作。通过CLR将MSIL转换为具体CPU的代码C#基础知识编译执行.NET程序MSIL+元数据机器代码代码被执行CLR第一次编译第二次编译.NET程序被编译两次。IL(中间语言,IntermediateLanguage)是C#、VB.NET等编程语言编译后的代码形式。Microsoft中间语言(MSIL)不是直接运行的,而是需要通过CLR(CommonLanguageRuntime)在运行时转换为机器代码。语言编译器.NET源代码C#基础知识client.execlient.execlientlib.dllclient.exemodule程序集程序集是.NET框架中的基本部署单元,它包含了一个或多个类型的定义以及它们之间的关联关系。程序集还包含了元数据、资源和其他相关信息。程序集的文件扩展名通常为.exe或.dll,具体取决于实现的是应用程序还是库。C#基础知识
“托管代码”。执行C#程序时,程序集将加载到CLR。CLR会直接执行实时(JIT)编译,将IL代码转换成本机指令。.NETFramework类库。.NET包含大量库,这些库支持多种不同的工作负载。它们已整理到命名空间中,这些命名空间提供各种实用功能,包括文件输入输出、字符串控制、Web应用程序框架和Windows窗体控件等。语言互操作性。C#编译器生成的IL代码符合公共类型规范(CTS)。通过C#生成的IL代码可以与通过.NET版本的C++或其他20多种与CTS兼容的任何语言所生成的代码进行交互。C#基础知识通用语言规范CLS
CommonLanguageSpecification规定所有.NET语言都应遵循的规则生成可与其他语言互操作的应用程序通用类型系统
(CommonTypeSystem,CTS)包含标准数据类型包含准则集CLS、CTS和MSIL紧密配合以实现语言互操作性C#基础知识C#示例程序C#中的关键组织结构概念包括程序、命名空间、类型、成员和程序集。程序声明类型,而类型则包含成员,并被整理到命名空间中。类型示例包括类、结构和接口。成员示例包括字段、方法、属性和事件。编译完的C#程序实际上会打包到程序集中。“Hello,World”程序的C#代码如下:usingSystem;
//导入命名空间。classHello //类定义{/*解释开始,和C语言解释用法相同解释结束*/staticvoidMain() //主程序,程序入口函数,
//必须在一个类中定义{ Console.WriteLine("Hello,World");}}9.1C#脚本编程
C#示例程序“Hello,World”程序的C#代码如下:usingSystem;
//导入命名空间。classHello //类定义{/*解释开始,和C语言解释用法相同解释结束*/staticvoidMain() //主程序,程序入口函数,必须在一个类中定义{ Console.WriteLine("Hello,World");}}命名空间提供了一种用于组织C#程序和库的分层方法。命名空间包含类型和其他命名空间。例如,System命名空间包含许多类型(如程序中引用的Console类)和其他许多命名空间(如IO)。借助引用给定命名空间的using指令,可以非限定的方式使用作为相应命名空间成员的类型。由于使用using指令,因此程序可以使用Console.WriteLine作为System.Console.WriteLine的简写。在每个Console前加上一个前缀“System.”,这个小原点表示Console是作为System的成员而存在的。9.1C#脚本编程
C#示例程序“Hello,World”程序的C#代码如下:usingSystem;
//导入命名空间。classHello //类定义{/*解释开始,和C语言解释用法相同解释结束*/staticvoidMain() //主程序,程序入口函数,必须在一个类中定义{ Console.WriteLine("Hello,World");}}C#程序中每个变量或函数都必须属于一个类,包括主函数Main()。不能如C或C++那样建立全局变量。C#语言程序总是从Main()方法开始执行,一个程序中不允许出现两个或两个以上的Main()方法。staticvoidMain()是类Hello中定义的主函数。“Hello,World”程序声明的Hello类只有一个成员,即Main方法。C#基础知识命名空间就像在文件系统中一个文件夹容纳多个文件一样,可以看作某些类的一个容器。通过把类放入命名空间可以把相关的类组织起来,并且可以避免命名冲突。使用命名空间:using类似#includeusingSystem语句意义是导入System名字空间。using语句用于导入预定义的变量和函数,这样在自己的程序中就可以自由地使用这些变量和函数。C#基础知识首先使用using语句,导入System命名空间。然后定义一个名为Hello的类。在Hello类中,定义了一个成员,即Main方法。在Main方法中,使用Console.WriteLine()方法输出"Hello,World"。由于导入了System命名空间,因此程序可以使用Console.WriteLine作为System.Console.WriteLine的简写。“System.”表示Console是System的成员。C#程序中每个变量或函数都必须属于一个类,包括主函数Main()。C#语言程序总是从唯一的Main()方法开始执行。“Hello,World”程序的C#代码如下:usingSystem;
//导入命名空间。classHello //类定义{/*解释开始,和C语言解释用法相同解释结束*/staticvoidMain() //主程序,程序入口函数,
//必须在一个类中定义{ Console.WriteLine("Hello,World");}}9.1C#脚本编程
类的概念C#语言是一种现代、面向对象的语言。面向对象程序设计方法提出了一个全新的概念:类,它的主要思想是将数据(数据成员)及处理这些数据的相应方法(函数成员)封装到类中,类的实例则称为对象。这就是我们常说的封装性。类可以认为是对结构的扩充,它和C中的结构最大的不同是:类中不但可以包括数据,还包括处理这些数据的函数。类是对数据和处理数据的方法(函数)的封装。类是对某一类具有相同特性和行为的事物的描述。usingSystem;classPerson//类的定义,class是保留字,表示定义一个类,Person是类名{privatestringname="张三";//类的数据成员声明privateintage=12; //private表示私有数据成员publicvoidDisplay() //类的方法(函数)声明,显示姓名和年龄{Console.WriteLine("姓名:{0},年龄:{1}",name,age);}publicvoidSetName(stringPersonName)//修改姓名的方法(函数){name=PersonName;}}定义一个描述个人情况的类PersonC#基础知识用户自定义一个数据类型,类型名为Person。用定义新数据类型Person类的方法把数据和处理数据的函数封装起来。Person类有两个私有数据成员name,age;Person类中有两个方法(函数)成员:Display(),显示姓名和年龄;SetName(stringPersonName),更改姓名;Person类仅是一个用户新定义的数据类型,由它可以生成Person类的实例,C#语言叫对象。usingSystem;//类的定义,class是保留字,//表示定义一个类,Person是类名classPerson{privatestringname="张三";//类的数据成员声明privateintage=12; //private表示私有数据成员//类的方法(函数)声明,显示姓名和年龄publicvoidDisplay() {Console.WriteLine("姓名:{0},年龄:{1}",name,age);}//修改姓名的方法(函数)publicvoidSetName(stringPersonName){name=PersonName;}}定义一个描述个人情况的类PersonC#基础知识usingSystem;//类的定义,class是保留字,//表示定义一个类,Person是类名classPerson{privatestringname="张三";//类的数据成员声明privateintage=12; //private表示私有数据成员//类的方法(函数)声明,显示姓名和年龄publicvoidDisplay() {Console.WriteLine("姓名:{0},年龄:{1}",name,age);}//修改姓名的方法(函数)publicvoidSetName(stringPersonName){name=PersonName;}}定义一个描述个人情况的类PersonclassProgram{staticvoidMain(string[]args){PersononePerson=newPerson();onePerson.Display();//输出:姓名:张三,年龄:12onePerson.SetName("Deng");onePerson.Display();//输出:姓名:Deng,年龄:12}}在程序中,可以用OnePerson.方法名或OnePerson.数据成员名访问对象的成员。例如:OnePerson.Display()
;onePerson.SetName(“Deng");1)用如下方法声明类的对象:PersonOnePerson=newPerson();2)也可以分两步创建Person类的对象:PersonOnePerson;OnePerson=newPerson();9.1C#脚本编程
➽C#脚本编程基础1.C#脚本类型主要包括以下三种类型:Job脚本:作业脚本可以对取像过程进行控制,可以设置取像参数、控制取像行为,例如:设置曝光、频闪、自动对焦等功能。ToolGroup脚本:在ToolGroup中添加脚本,可以控制ToolGroup的运行行为。定义输入输出终端,控制工具运行逻辑等。ToolBlock脚本:控制当前ToolBlock所包含工具的行为,执行逻辑以及拓展工具所不包含的计算等。9.1C#脚本编程
➽C#脚本编程基础2.ToolBlock的脚本ToolBlock的脚本父类CogToolBlockAdvancedScriptBase,该类提供了一组用于编写ToolBlock脚本的基本方法和属性。通过继承CogToolBlockAdvancedScriptBase类,可以扩展和定制ToolBlock的功能。两个脚本基类,CogToolBlockSimpleScript与CogToolBlockAdvancedScript分别用于“简单脚本”与“复杂”脚本,两者之间的区别在于复杂脚本能够实现:1)动态定义ToolBlock的输入输出终端。2)能够访问当前工具块所包含工具的所有属性与方法。ToolBlock脚本C#脚本编程简单脚本:主要包括一系列单个步骤,每个步骤都对应一个工具的操作。简单脚本的特点是代码量较小,逻辑相对简单,易于理解和编写。复杂脚本:包含多个步骤,其中每个步骤可能涉及到多个工具的操作。与简单脚本相比,复杂脚本的逻辑更为复杂,需要处理更多的情况和细节。复杂脚本能够实现:①动态定义toolBlock的输入输出终端,②能够访问当前工具块所包含工具的所有属性与方法。//使用简单脚本为输出赋值Outputs.Degrees=Inputs.Radians*180/Math.PI;//使用复杂脚本为输出赋值this.mToolBlock.Outputs["Degrees"].Value=((double)this.mToolBlock.Inputs["Radians"].Value)*180/Math.PI;9.1C#脚本编程
➽C#脚本编辑9.1C#脚本编程
➽C#脚本编辑1.添加命名空间如果在创建脚本之前将视觉工具都添加完毕,在创建脚本的时候,系统会自动添加全部所需的命名空间。如果后期又有新的视觉工具添加到程序中,需要自己添加命名空间。如下所示,添加以下命名空间。usingCognex.VisionPro;usingCognex.VisionPro.ToolBlock;usingCognex.VisionPro.PMAlign;分类名称命名空间无分类CogAcqFifoToolCognex.VisionPro.CogAcqFifoToolCogBlobToolCognex.VisionPro.BlobCogCaliperToolCognex.VisionPro.CaliperCogCNLSearchToolCognex.VisionPro.CNLSearchCogToolBlockCognex.VisionPro.ToolBlockCogPatInspectToolCognex.VisionPro.PatInspectCogPMAlignToolCognex.VisionPro.PMAlignID&VerificationCogIDToolCognex.VisionPro.IDCogOCRMaxToolCognex.VisionPro.OCRMaxCogOCVMaxToolCognex.VisionPro.OCVMax9.1C#脚本编程
➽C#脚本编辑1.添加命名空间如果在脚本编译时,遇到“未能找到类型或命名空间名称‘XXX’(是否缺少using指令或程序集引用?)”的错误时,可打开VisionPro帮助文档,输入对应工具类。查看需要引用的命名空间名称及需要导入的程序集(dll)。9.1C#脚本编程
➽C#脚本编辑1.添加命名空间若先创建C#高级脚本,后在ToolBlock中增加新工具,则需要手动添加参考程序集。找到需要导入的程序集,进行导入,并在脚本开头引入对应命名空间。9.1C#脚本编程
➽C#脚本编辑2.定义成员变量可以定义一些后续会用到的变量,可以随时添加、删除这些变量。在方法外面,定义全局变量,如康耐视自动生成的变量:privateCognex.VisionPro.ToolBlock.CogToolBlockmToolBlock;//定义工具变量以下常见的定义的工具变量如下:
privateCognex.VisionPro.Blob.CogBlobToolmCogBlob;privateCognex.VisionPro.Caliper.CogCaliperToolmCogCaliper;privateCognex.VisionPro.Caliper.CogFindCircleToolmCogFindCircle;privateCogGraphicCollectionlabels;privateCogGraphicLabelmyLabel;9.1C#脚本编程
➽C#脚本编辑3.定义GroupRun方法工具组运行时,调用此方法。如果此方法返回True,Visionpro将运行此ToolBlock中的所有工具;如果返回值设为False,将由用户来编写代码手动运行ToolBlock中的工具。为了能够在TooIBlock脚本中独立运行视觉工具,可以使用TooIBlock的Tools属性。可以通过两种方法来引用视觉工具,一是通过索引,二是通过工具名称。一般来讲,通过名称来引用视觉工具更为方便,因为可以为其定义有实际意义的名称,以便于理解和记忆。例如:CogBlobTool_cogBlob=(CogBlobTool)mToolBlock.Tools["CogBlobTool1"];//通过名称CogBlobTool_cogBlob=(CogBlobTool)mToolBlock.Tools[4];//通过索引9.1C#脚本编程
➽C#脚本编辑3.定义GroupRun方法publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//获取视觉工具箱中的工具,进行实例初始化CogBlobToolmCogBlob=mToolBlock.Tools["CogBlobTool1"]asCogBlobTool;CogCaliperToolmCogCaliper=mToolBlock.Tools["CogCaliperTool1"]asCogCaliperTool;CogFindCircleToolmCogFindCircle=mToolBlock.Tools["CogFindCircleTool1"]asCogFindCircleTool;mCogFindCircle.Run();//运行CogFindCircleTool1工具mCogBlob.Run();//运行"CogBlobTool1工具returntrue;}9.1C#脚本编程
➽C#脚本编辑4.CurrentRunRecord方法ModifyCurrentRunRecord()方法用于修改CurrentRecord,在ToolBlock的CurrentRecord被创建后调用。VisionPro工具记录是一种灵活的分层数据结构,所有VisioPro工具都使用工具记录来记录和报告有关其状态的信息。存储在工具记录中的信息可以包括输入、训练和输出图像,输入区域,工具结果和工具结果图形。CurrentRecords当前记录,LastRunRecords最近运行记录。9.1C#脚本编程
➽C#脚本编辑5.LastRunRecord方法ModifyLastRunRecord()方法用于修改LastRunRecord,在ToolBlock的LastRunRecord被创建后调用。用于脚本运行完毕最后的结果的处理。例如:在最终生成图像中添加标签、颜色等,用不同几何图像标记目标区域。ModifyLastRunRecord输出执行结果。可通过mToolBlock.AddGraphicToRunRecord方法把结果输出到界面上。函数AddGraphicToRunRecord有四个参数;第一个参数是:CogGraphicLabel类型;第二个参数是:lastRecord;一般是这个值;第三个参数是:标签要写入的图片,选择某个工具的输出图片;第四个参数是:一般为空字符串。9.1C#脚本编程
➽C#脚本编辑5.LastRunRecord方法publicoverridevoidModifyLastRunRecord(Cognex.VisionPro.ICogRecordlastRecord){//显示foreach(ICogGraphicgraphicinlabels){mToolBlock.AddGraphicToRunRecord(graphic,lastRecord,"CogFindCircleTool1.InputImage","script");}labels.Clear();CogGraphicLabellabel=newCogGraphicLabel();label.SetXYText(160,50,"齿数:"+mCogBlob.Results.GetBlobs().Count.ToString());label.Font=newFont("微软黑体",10);label.Color=Cognex.VisionPro.CogColorConstants.Blue;mToolBlock.AddGraphicToRunRecord(label,lastRecord,"CogFindCircleTool1.InputImage","script");}9.1C#脚本编程
➽C#脚本编辑6.初始化方法当关闭脚本编译器且编译脚本时调用。所有的“一次性”的初始化工作都应该写在该方法中。publicoverridevoidInitialize(Cognex.VisionPro.ToolGroup.CogToolGrouphost){//DONOTREMOVE-Callthebaseclassimplementationfirst-DONOTREMOVEbase.Initialize(host);//实例化。注:在使用类的非静态方法或属性时,必须将类实例化
this.mCogBlob=newCogBlobTool();this.mCogFindCircle=newCogFindCircleTool();this.labels=newCogGraphicCollection();//Storealocalcopyofthescripthostthis.mToolBlock=((Cognex.VisionPro.ToolBlock.CogToolBlock)(host));}9.1C#脚本编程
➽C#脚本编程实例项目一任务要求:需要测量零件宽度,测量中间两个小孔的圆心距离,对其圆心间的测量距离进行公差分析,做出合格与否的判断,在图形上显示相关数据。9.1C#脚本编程
➽C#脚本编程实例项目一任务分析:对于零件,首先要采集图像,然后对图像特征提取,建立特征坐标系。然后,通过卡尺工具(CogCaliperTool)测量中间宽度。采用CogFindCircleTool工具分别找到中间两个小孔的圆心。运行ToolBlock的C#高级脚本编程,求出两个小孔的圆心距离,输出到ToolBlock的终端输出端,并将距离在图像上显示。任务流程设计在V+程序中建立一个任务流程。主要包括触发信号、取像、视觉工件块和结果图像。9.1C#脚本编程
➽C#脚本编程实例项目一视觉任务(ToolBlock)流程设计视觉工件块ToolBlock中包含CogPMAlignTool、CogFixtureTool、CogCaliperTool、CogFindCircleTool等工具。选择视觉工具的输出终端“Outputs”,右键选择“addnewsystemtypes”然后,进入“>”,选择“addnewsystem.Double”,将输出的Double类型的变量命名为“Distance”。添加“addnewsystemtypes”>“addnewsystem.Boolean”,将添加的输出变量命名为“Dis_OK”。将“CogCaliperTool1”卡尺工具测量的结果“Results.Item[0].Width”链接到输出终端,并命名为“Width”9.1C#脚本编程
➽C#脚本编程实例项目一各工具运行成功后,然后进入“C#高级编程”设计界面。3.脚本编辑(1)添加命名空间如果所有的视觉工具都运行成功,此时进入脚本编辑器,那视觉工具组织树中的所有工具所需的命名空间都已存在,不需要另外添加。(2)定义成员变量定义GraphicLable的全局变量。privateCogGraphicLabelmLab;(3)调用GroupRun方法在GourpRun运行时,各工具遍历运行。获取对应工具运行后的结果。9.1C#脚本编程
➽C#脚本编程实例项目一3.脚本编辑publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//将两个CogFindCircleTool初始化
CogFindCircleToolcircle1=mToolBlock.Tools["CogFindCircleTool1"]asCogFindCircleTool;CogFindCircleToolcircle2=mToolBlock.Tools["CogFindCircleTool2"]asCogFindCircleTool;//求解两个圆心的距离
doublex1=circle1.Results.GetCircle().CenterX;doubley1=circle1.Results.GetCircle().CenterY;doublex2=circle2.Results.GetCircle().CenterX;doubley2=circle2.Results.GetCircle().CenterY;doubledis=Math.Sqrt(Math.Pow(x1-x2,2)+Math.Pow(y1-y2,2));9.1C#脚本编程
➽C#脚本编程实例项目一3.脚本编辑//在ToolBlock的终端输出距离(Distance)值
mToolBlock.Outputs["Distance"].Value=dis;//在ToolBlock的终端输出判断结果(Dis_OK)值
if((dis>218)&&(dis<220)){mToolBlock.Outputs["Dis_OK"].Value=true;}else{mToolBlock.Outputs["Dis_OK"].Value=false;}//创建输出的图形标签,包括图形标签的字体,颜色,放置的X,Y坐标位置及内容。mLab=newCogGraphicLabel();//实例化图形标签变量
mLab.Font=newFont("宋体",18);//设置字体及大小
mLab.Color=CogColorConstants.Green;//设置颜色
mLab.SetXYText(100,80,"圆孔距离:"+dis.ToString("0.00"));//设置放置位置及内容
returnfalse;}9.1C#脚本编程
➽C#脚本编程实例项目一3.脚本编辑(4)调用ModifyLastRunRecord方法在最终生成图像中添加图形标签。publicoverridevoidModifyLastRunRecord(Cognex.VisionPro.ICogRecordlastRecord){mToolBlock.AddGraphicToRunRecord(mLab,lastRecord,"CogFixtureTool1.OutputImage","script")}9.1C#脚本编程
➽C#脚本编程实例项目一4.HMI界面设计在V+界面设计器中,输出采集到的尺寸及分析结果。视觉工具块运行后,在“CogFixtureTool1.OutputImage”的最终生成图像中添加图形标签。视觉工具块(ToolBlock)的终端输出“Distance”、“Dis_OK”、“Width”可在V+程序中的HMI界面设计中输出。9.1C#脚本编程
➽C#脚本编程实例项目一9.1C#脚本编程
➽C#脚本编程实例项目二任务要求要求统计和显示各个颜色糖果的个数。9.1C#脚本编程
➽C#脚本编程实例项目二1.程序流程设计在V+程序中建立一个任务流程。主要包括触发信号、取像、视觉工件块和结果图像。2.视觉工具块流程设计在ToolBlock中,建有CogPMAlignTool、CogCompositeColorMatchTool等工具。选择视觉工具的输出终端“Outputs”,右键选择“addnewsystemtypes”然后,进入“>”,选择“addnewsystem.Int32”,将输出的整数类型(Int32)的变量命名为“Red_count”。依照同样方法,依次添加“Blue_count”、“Orange_count”、“Yellow_count”、“Green_count”。把CogPMAlignTool工具的“Results”进行添加输出。CogPMAlignTool工具运行输出的结果“Results_Count”添加到终端输出。9.1C#脚本编程
➽C#脚本编程实例项目二2.视觉工具块流程设计(2)特征提取工具在CogPMAlignTool工具运行之前,先用CogImageConvertTool工具把图像转换成灰度图像。在设置“运行参数”时,设置如图所示。查找概数设置为图像中的糖果最大数。训练区域为圆形,在“缩放”设置时,缩放因子应设置足够宽,能够把大大小小的圆形(或椭圆形)的糖果都包含在内。9.1C#脚本编程
➽C#脚本编程实例项目二2.视觉工具块流程设计(3)颜色匹配工具CogCompositeColorMatchTool可用于将运行时图像目标区域(ROI)中的颜色分布与一种或多种经过训练的颜色样本进行比较。对于每个受过训练的样本,输出的分数在0到1的范围内。该工具还会计算0到1范围内的置信度得分,该得分将训练样本的得分之间的差异进行比较。高置信度得分表示是最合适的匹配对象。如图所示,对于CogCompositeColorMatchTool工具,先设置目标区域。设置成“CogCircle”,区域的中心点即圆点坐标可以用脚本编程输入。9.1C#脚本编程
➽C#脚本编程实例项目二2.视觉工具块流程设计(3)颜色匹配工具设置目标区域后,然后点击“新增”,添加目标区域的颜色设置。设置区域颜色名称后,进行接受。然后,进行训练。如图所示。依次把图像中所有的颜色(Red、Blue、Orange、Green、Yellow)都训练完。9.1C#脚本编程
➽C#脚本编程实例项目二3.脚本编辑publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//定义统计颜色个数的整数变量,并且初始化
intRed_count=0;intBlue_count=0;intOrange_count=0;intYellow_count=0;intGreen_count=0;//获取PMAlign工具
CogPMAlignToolPma1=mToolBlock.Tools["CogPMAlignTool1"]asCogPMAlignTool;9.1C#脚本编程
➽C#脚本编程实例项目二3.脚本编辑
//获取CompositeColorMatch工具CogCompositeColorMatchToolmatch=mToolBlock.Tools["CogCompositeColorMatchTool1"]asCogCompositeColorMatchTool;//定义颜色匹配工具的区域图形,为圆形区域
CogCircleregion=match.RegionasCogCircle;//遍历运行CogPMAlign产生的每一个结果
foreach(CogPMAlignResultiteminPma1.Results){//将CogPMAlign结果的中心点坐标传给的颜色匹配工具的区域中心点
region.CenterX=item.GetPose().TranslationX;region.CenterY=item.GetPose().TranslationY;//运行颜色匹配工具
mToolBlock.RunTool(match,refmessage,refresult);9.1C#脚本编程
➽C#脚本编程实例项目二3.脚本编辑//输出颜色匹配工具输出的颜色
stringcolor=match.Result.ResultOfBestMatch.Color.Name;//统计各个颜色匹配的总数
switch(color){case"Red":Red_count++;break;case"Blue":Blue_count++;break;case"Orange":Orange_count++;break;case"Yellow":Yellow_count++;break;case"Green":Green_count++;break;default:break;}9.1C#脚本编程
➽C#脚本编程实例项目二3.脚本编辑//将遍历PMAlignTool工具的各个颜色统计结果传递给输出端相应的变量值。
mToolBlock.Outputs["Red_count"].Value=Red_count;mToolBlock.Outputs["Blue_count"].Value=Blue_count;mToolBlock.Outputs["Orange_count"].Value=Orange_count;mToolBlock.Outputs["Yellow_count"].Value=Yellow_count;mToolBlock.Outputs["Green_count"].Value=Green_count;}returnfalse;}9.1C#脚本编程
➽C#脚本编程实例项目二4.HMI界面设计9.1C#脚本编程
➽C#脚本编程实例项目二第九章
机器视觉综合应用机器视觉生成线综合案例029.2机器视觉生产线综合案例
➽任务要求综合案例涵盖机器视觉四大类应用:测量、识别、检测和引导。综合场景即前面所说的工业场景7,如图所示。在上料单元有三种不同类型的锂电池,在九宫格内任意位置放置,通过移动相机在上料区走九宫格拍照,经过视觉处理区分料号、识别锂电池上的字符和二维码、进行尺寸测量和分析,引导移动模组抓取工件。模组携带工件丢在流水线上,被传送到流水线上固定相机下停止。相机拍照引导模组抓取工件,移动到装配平台。装配平台上也有三种料盘(定位模块),分别对应三种锂电池。固定相机位于料盘上方拍照,经过视觉处理找到及区分料盘类别。引导移动模组移动到对应料盘,进行精准装配。9.2机器视觉生产线综合案例
➽任务实施1.硬件配置(1)添加相机该项目需要配置3台相机:移动相机、右侧面光源上方固定组装相机、传送带上方相机。1号相机为移动CCD,IP地址为0;2号相机为固定CCD,IP地址为0;3号相机为皮带CCD,IP地址为0。(2)添加光源该项目一共包含8个光源,分别使用两个光源控制器(分别命名为德创1、德创2)控制,端口号分别为COM1和COM2,波特率19200。(3)添加PLC“设备”→“PLC”→“三菱”,添加三菱PLC。设置三菱PLC参数为,IP地址:0;端口号:502;编码:ASCII;数据格式:CDAB;字符串颠倒。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(1)标定程序设计如图所示,将标定片放置在装配单元上预定的固定初始位置。首先,机械手吸取标定片,进行移动,将标定片放置在右侧面光源中间。机械手移开,触发固定相机(从相机2)拍照取像。
然后,机械手吸取标定片,放置到左侧面光源中间。按照做9点平移和2点旋转的路线,依次触发移动相机(主相机1)进行拍照取像。最后,机械手吸嘴标定片,放置在流水线上白色垫板上。移开后,触发皮带上固定相机(从相机3)拍照。
至此,三个相机的联合结束,经过分析出来,最终形成三个标定文件。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(1)标定程序设计1)等待触发。在“信号”工具组中的“PLC扫描”工具,扫描接受PLC中的D168地址发来的“标定”指令--1,“触发条件”设置变为1。也即如果收到PLC发送到D168地址的数据为1,就触发标定流程。2)解析指令字符串。触发之后用“通讯”工具组中的“读PLC”工具读取PLC中的地址D120开始长度为92的指令字符串。用“数据”工具组中的“字符串操作”工具将前面“读PLC”工具接受到的字符串值去掉空格和不可打印字符,并将经过“字符串操作”上述操作后的值输出,输出变量命名为“@Trim2”。将去空格后的字符串用逗号进行分割,索引3为相机号,将相机号输出为变量(“@Split1”)。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(1)标定程序设计3)分支和光源打开。选用“分支”工具,数据来源为前步骤“字符串操作”工具输出的“@Split1”,即相机号,根据相机号(1、2、3),分成3个分支,选择在相应位置的光源亮起。分支1:控制主相机1(移动相机)对应的光源开启,将左侧取料位对应光源(德创1的光源通道1、2、3)亮起。分支2:控制从相机2(右侧固定组装相机)放料区对应的光源(德创1的光源通道1、2、4)开启。分支3:控制从相机3(传送带上方相机)对应的光源(德创1的光源通道2,德创2的光源通道1)开启。“分支选择”工具无需配置,目的是将多条分支进行合并选择,否则后续工具无法同时链接多条流程。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(1)标定程序设计4)手眼标定。采用“引导”工具组(行业模块)中的“手眼标定”工具。图像来源:选择设备管理内已有的3个相机,即为编号分别为1(移动相机为主相机1)、2(固定抓料相机为从相机2)、3(皮带相机为从相机3)。手眼标定结束后,会自动生产主、从相机标定文件。3个标定文件自动被保存在硬盘指定的文件夹下,如为程序文件夹下的“/Config/Guide/Calibratoin/”文件夹下的“1295_主机位1.vpp”、“1295_从机位2.vpp”、“1295_从机位3.vpp”文件。5)光源关闭。用“光源设定”工具,将已经打开的各光源关闭。6)反馈信息。标定步骤完成后,需要发送信号给PLC。“分支”工具以“手眼标定”工具成功与否的Bool量作为分支依据。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(2)移动抓取位置标准位示教(训练吸嘴)程序流程设计和之前的标准位示教程序类似,采用“引导”工具组中的“标准位示教”工具。通过“写变量”工具,将“标准位示教”工具输出轴的X/Y/R和ToolBlock里Outputs导出的锂电池图像X/Y/R(注意:图像R变量应为角度转换后的值)值写到“变量管理”创建的相应的六个变量中。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(3)皮带相机抓取位置标准位示教(训练吸嘴)程序流程设计传送带上相机实现功能也为抓取,这部分也需要进行标准位示教。大部分与上面所述的移动相机抓取位置示教相同。这里只介绍不同部分。“PLC扫描工具”:地址为D168,这里“触发条件”设置变为30。“取像”工具:相机为皮带上相机。在“标准位示教工具”:在第二步骤“标定设置”选择“从机位3”的标定文件。皮带相机抓取的位置和移动相机抓取的位置不同。同样,“标准位示教”工具输出ImageX、ImageY、ImageR和轴坐标RobotX、RobotY、RobotR。将ImageR由弧度进行角度转换。这里另外建立6个Double类型变量:3TRX/3TRY/3TRR,3TIX/3TIY/3TIR。分别是训练相机3示教位时,轴X/Y/R(3TRX/3TRY/3TRR),图像X/Y/R(3TIX/3TIY/3TIR)。通过“写变量”工具,将“标准位示教”工具输出轴的X/Y/R(RobotX/Y/R)和ToolBlock里Outputs导出的锂电池图像X/Y/R值写到“变量管理”创建的相应的六个变量中。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(4)标准位示教(训练吸嘴)程序实操调试锂电池初始被放置在右面光源左上角,且电池凸起位于下方。标定时放于皮带上的白色垫块不再需要。机械手移动到锂电池初始位置,抓取锂电池后放置于左侧面光源上,机械手抬起,移动相机拍照,程序中可以查看锂电池中心点和旋转角度情况。机械手吸取锂电池到下一个抓取位置(皮带上相机)进行示教。机械手移开,相机拍照,程序中可以查看锂电池中心点和旋转角度情况。至此,训练吸嘴流程结束。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取和之前程序类似,步骤如下:1)触发程序。2)解析指令字符串。使用“读PLC”工具读取当前轴坐标X/Y/R。3)添加变量。在“变量管理”里增加两个Double类型变量,命名为TrigX和TrigY。用“写变量”工具分别写入经“格式转换”后的X和Y,即当前拍照位置的X和Y。4)取像。5)特征定位。采用“引导”工具组中的“特征定位”工具。此步骤可以由移动相机抓取位置标准位示教程序右侧进行导出,再在此右侧进行导入,抓取更准确。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取6)判断料号。“判断料号”为“ToolBlock”工具,用于判断锂电池型号。抓取定位之后,利用“Histogram”算法分别对锂电池的尾部和顶部进行灰度值平均值统计,将结果添加输出,用于后续的逻辑判断。将灰度直方图运算的均值链接到终端输出,并分别名为“Top”、“Tail”。7)测量及识别。测量及识别也为“ToolBlock”工具,用于检测锂电池的长度及识别锂电池上的二维码及字符信息。测量之前,先用棋盘格标定片进行标定。也可以用前面标定程序流程中已经标定过的vpp文件进行导入,在此导入的Toolblock工具块中,用其中的CheckerBorad标定。然后建立特征坐标系。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取基于标定后的特征坐标系,用CogCaliperTool卡尺工具,测量锂电池的长度。将长度链接到终端输出,命名为“Length”。用CogIDTool工具识别锂电池上的二维码(QR代码),将识别结果链接到终端输出,命名为ID_StringOCR_String。用CogOCRMaxTool工具识别锂电池上的字符信息,将识别的字符信息链接到终端输出,命名为OCR_String。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取8)脚本运算。脚本运算是“ToolBLock”工具,主要是应用ToolBlock的C#高级编程功能。9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取8)脚本运算。在“Inputs”端,通过“Addnewsystemtypes”后“Addnewsystem.Double”,添加若干Double类型的变量。Top、Tail:分别为前面“判断料号”视觉工具块输出的Top、Tail。ImageX、ImageY、ImageR分别为前面特征定位输出的图像的X、Y、R。TrigX、TrigY分别是系统变量TrigX、TrigY的值。Dis为“测量及识别”视觉工具块输出的“Length”。在“Outputs”端,通过“Addnewsystemtypes”后“Addnewsystem.string”,添加“Mode”(string)输出变量。通过“Addnewsystemtypes”后“Addnewsystem.Double”,添加若干Double类型的变量“ImageX_output”、“ImageY_output”、“ImageR_output”。通过“Addnewsystemtypes”后“Addnewsystem.Boolean”,添加“Dis_OK”(Boolean)输出变量。9.2机器视觉生产线综合案例
➽任务实施publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult){//RuneachtoolusingtheRunToolfunctionforeach(ICogTooltoolinmToolBlock.Tools)mToolBlock.RunTool(tool,refmessage,refresult);//将输入端的各个变量的值取出来赋值给自定义的相应的变量
doubleTop=(double)mToolBlock.Inputs["Top"].Value;doubleTail=(double)mToolBlock.Inputs["Tail"].Value;doubleImageX=(double)mToolBlock.Inputs["ImageX"].Value;doubleTrigX=(double)mToolBlock.Inputs["TrigX"].Value;doubleImageY=(double)mToolBlock.Inputs["ImageY"].Value;doubleTrigY=(double)mToolBlock.Inputs["TrigY"].Value;doubleImageR=(double)mToolBlock.Inputs["ImageR"].Value;//对应输出变量,定义各变量
stringModel="A";//=(string)mToolBlock.Outputs["Model"].Value;doubleImageX_output;doubleImageY_output;doubleImageR_output;boolDis_OK;9.2机器视觉生产线综合案例
➽脚本编辑
//进行锂电池的型号判断(A、B、C型号)
if(Top<50&&Tail<50){Model="A";}
if(Top<50&&Tail>50){Model="B";}
if(Top>50&&Tail<50){Model="C";}//对测量的锂电池长度进行分析,在公差范围,则输出true;否则输出false。
if(Dis<=34.3&&Dis>=33.7){Dis_OK=true;}else{Dis_OK=false;}9.2机器视觉生产线综合案例
➽脚本编辑
//进行有偏移量的图像坐标值的计算//*计算公式为:ImageX+TrigX-CalibX。//ImageX:“分支选择”内的数据项,也即“特征抓取”后输出的ImageX。//TrigX:前面步骤存到“变量管理”内的TrigX,当前拍照时的轴坐标X。//CalibX:标定时在中心位置拍照时的轴坐标,此为固定坐标,可在触摸屏上【参数设置】//上,“参数设置2”界面上的,“移动相机左拍照位置”可查询到。
ImageX_output=ImageX+TrigX-62.34;ImageY_output=ImageY+TrigY-(-194.63);//把特征定位输出的姿态值从弧度转换成角度
ImageR_output=ImageR/Math.PI*180;//把判断出的锂电池的型号值赋给输出端的Model变量值 mToolBlock.Outputs["Model"].Value=Model;9.2机器视觉生产线综合案例
➽脚本编辑
//把重新计算的图像的坐标和姿态值分别赋给输出端的相应的变量
mToolBlock.Outputs["ImageX_output"].Value=ImageX_output;mToolBlock.Outputs["ImageY_output"].Value=ImageY_output;mToolBlock.Outputs["ImageR_output"].Value=ImageR_output;//把分析的锂电池长度是否在公差范围内的判断值赋给输出端的Dis_OK变量值 mToolBlock.Outputs["Dis_OK"].Value=Dis_OK;returnfalse;}9.2机器视觉生产线综合案例
➽任务实施2.程序流程设计(5)移动相机引导抓取9)引导计算。“引导计算”工具模式是“引导抓取”。“特征数据”为当前图像坐标系下,偏移计算后的坐标X/Y,和角度转换后的R。“训练数据”为模板图像坐标系下,拿到移动抓取标准位示教程序中保存到变量里的3个图像坐标(1TIX/1TIY/1TIR),以及在模板机械手坐标下,3个机械轴坐标轴1TRX/1TRY/1TRR。通过“特征数据”和“训练数据”,计算输出轴的绝对抓取位置坐标AbsoluteX、AbsoluteY、AbsoluteR。9.2机器视觉生产线综合案例
➽任务实施1.程序流程设计(5)移动相机引导抓取10)写变量。将脚本计算的图像X/Y/R、“引导计算”工具输出的轴绝对抓取位置分别存入“变量管理”创建的六个变量(1Image_X/1Image_Y/1Image_R、1Robot_X/1Robot_Y/1Robot_R)中,以便后续组装的引导计算进行调用。将引导计算输出的绝对XYR转换为Real类型。将格式转换后的三个值发送给PLC,XYR地址分别为D170、D172、D174,引导轴进行抓取。以“特征抓取”ToolBlock工具输出的成功与否作为判断依据。成功则发送
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西中医药大学《建筑与装饰工程估价》2023-2024学年第二学期期末试卷
- 陕西学前师范学院《混凝土结构基本原理课程设计》2023-2024学年第二学期期末试卷
- 陕西工商职业学院《识别设计》2023-2024学年第二学期期末试卷
- 陕西旅游烹饪职业学院《英语写作1》2023-2024学年第二学期期末试卷
- 陕西理工大学《工程项目管理信息系统及软件应用》2023-2024学年第一学期期末试卷
- 陕西省咸阳市泾阳县2024-2025学年高三第四次月考(化学试题)试题含解析
- 陕西省安康市石泉县2024-2025学年四年级数学第二学期期末达标检测试题含解析
- 陕西省山阳县2025届初三第五次考试物理试题含解析
- 安全隐患排查(新)
- 陕西省汉中学市镇巴县市级名校2025届初三5月模拟(三模)物理试题文试题含解析
- 经典成语故事九色鹿
- 化疗相关味觉改变量表-(CiTAS)中文版
- 小学校本课程-13学无止境教学课件设计
- 钢管桩专项施工方案
- 四年级全册《劳动》课程知识点汇总精排
- 《化工原理》说课
- 第3课 中古时期的欧洲
- 古钱币优秀课件
- 关于诺如病毒致家长的一封信
- JGJT23-2011表B 泵送混凝土测区强度换算表
- 临汾市人民医院骨科重点专科汇报
评论
0/150
提交评论