VisionPro 脚本(一文读懂VisionPro脚本原理与使用方法) |
您所在的位置:网站首页 › labview调用visionpro › VisionPro 脚本(一文读懂VisionPro脚本原理与使用方法) |
一、脚本简介
1.1 VisionPro项目组成简介在介绍脚本之前先简单介绍一下VisionPro开发环境(QuickBuild)的项目结构,Job是QuickBuild工程的基本组成单位,一个QucikBuild工程至少含有一个Job,工程中所有的Job是并行结构,各个Job之间不会相互影响。每个Job中默认包含一个toolGroup,用户可以在默认的toolGroup中添加项目所需的工具和工具块。工具块(toolBlock)与工具组(toolGroup)都是工具的**“容器”**,通过使用工具块与工具组可以将完成某一功能的工具进行封装,实现项目模块化,同时亦可将某一特定功能的工具块或工具组导出实现重复使用,类似于编程语言中“函数”功能。工具块中亦可以包含工具块与工具组,两者之间的包含关系没有明确层次关系。 VisionPro通过”多态”技术实现脚本功能,VisionPro 的每一Job、toolGroup、toolBlock对象都含有一个接口对象,用户通过重写接口方法实现自定义拓展功能。以toolGroup为例, ICogToolGroupScript接口中定义了子类中必须实现的函数,当toolGruoup执行到某一节点(工具准备运行、工具运行完成等)时会调用相应的接口函数实现用户指定的功能。如果你对接口、多态理解不够深入,你只需要明白脚本就是**“填空题”**,VisionPro在适当的位置给你留下空白,在这个空白区域你可以在满足条件的情况下“自由发挥”,实现你想要实现的功能。2.1 toolGroup脚本类以ToolGroup脚本为例展开,toolGroup 脚本是继承于CogToolGroupBaseScript,实现了ICogToolGroupScript接口,该接口有四个方法,详细介绍如下: 1 public class CogToolGroupBaseScript : ICogToolGroupScript 2 { 3 // 4 public virtual bool GroupRun(ref string message,ref Cognex.VisionPro.CogToolResultConstants result) 5 { 6 return true; 7 } 8 9 public virtual void ModifyCurrentRunRecord(ICogRecord currentRecord) 10 {} 11 public virtual void ModifyLastRunRecord(ICogRecord lastRecord) 12 {} 13 public virtual void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) 14 { 15 toolGroup = host; 16 } 17 protected Cognex.VisionPro.ToolGroup.CogToolGroup toolGroup=null; 18 } Initialize() 顾名思义,该方法用于对toolGroup工具进行初始化,当退出脚本编辑工具时脚本会进行编译并进行初始化,此时该方法会被调用。此外,在对该group通过*.vpp文件进行加载时也会被立即调用。所以,所有的“一次性”的初始化工作都应该写在该方法中。 GroupRun()方法运行该Group中的工具,如果该方法返回值为true,所有的属于当前Group的视觉工具都将运行,如果返回值为false,用户可以自定义工具的执行顺序,返回值为false为常见情况。 ModifyCurrentRunRecord() 方法用于修改CurrentRecord,在toolGroup的CurrentRecord被创建后调用。 ModifyLastRunRecord() 方法用于修改LastRunRecord,在toolGroup的LastRunRecord被创建后调用,例如:在最终生成图像中添加标签、该表颜色、用不同几何图像标记目标区域。 成员变量toolGroup为CogToolGroup类型,该类的runTool方法用于运行指定视觉工具;Tools 属性为当前Group的工具集合,一般用于获取当前工具组中某一工具的引用;DefineScriptTerminal、GetScriptTerminalData、SetScriptTerminalData 方法用于定义、获取、设置输入输出终端。 1 //对于当前Group存在的视觉工具的程序集与命名空间会自动添加,如果用户想要使用当前Group不存在的工具或者添加自定义程序集可以手动添加 2 //详细的操作步骤会在后续实例中进行介绍 3 using System; 4 using Cognex.VisionPro; 5 using Cognex.VisionPro3D; 6 using Cognex.VisionPro.ToolGroup; 7 8 public class UserScript : CogToolGroupBaseScript 9 { 10 //默认情况下遍历group中所有的工具并运行,用户可以根据实际情况自定义运行逻辑与顺序 11 public override bool GroupRun(ref string message, ref CogToolResultConstants result) 12 for (Int32 toolIdx = 0; toolIdx < toolGroup.Tools.Count; toolIdx++) 13 toolGroup.RunTool(toolGroup.Tools[toolIdx], ref message, ref result); 14 return false;//默认情况下为false表示用户可以控制工具的运行顺序,返回值为true则运行当前Group中所有工具。 15 } 16 public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) 17 { 18 //在此处添加用户代码实现自定义修改CurrentRunRecord的功能 19 } 20 public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) 21 { 22 //在此处添加用户代码用于所有工具运行完成后根据用户需求创建Record或者在既有Record中添加标记等 23 } 24 public override void Initialize(CogToolGroup host) 25 { 26 //调用父类初始化函数,初始化toolGroup对象 27 base.Initialize(host); 28 } 29 }2.2 toolBlcok脚本类与toolGroup脚本类似,toolBlock的脚本父类CogToolBlockAdvancedScriptBase,该类实现的接口与toolGroup相同,都是ICogToolGroupScript,不同之处在于toolBlock与两个脚本基类,CogToolBlockSimpleScript 与 CogToolBlockAdvancedScript 分别用于“简单脚”与“复杂”脚本,两者之间的区别在于复杂脚本能够实现:①动态定义toolBlock的输入输出终端,② 能够访问当前工具块所包含工具的所有属性与方法 ,为保证与toolGroup脚本使用的统一性,推荐直接使用复杂脚本。存在即合理,简单脚本具有使用的便利性,在访问工具块的输入输出终端时,两者的具体访问方式如下: 既然与toolGroup实现了相同的接口,toolBlock脚本基类的方法与toolGroup必然相同,功能基本无异,不再赘述。2.3Job脚本类Job脚本用于控制与图像获取相关的设备属性与参数,基类为CogJobBaseScript,实现ICogJobScript接口。 1 public class CogJobBaseScript : ICogJobScript 2 { 3 public virtual void Initialize(CogJob jobParam) 4 { 5 job = jobParam; 6 } 7 public virtual void AcqFifoConstruction(ICogAcqFifo fifo) 8 {} 9 public virtual void PreAcquisition() 10 {} 11 public virtual void PostAcquisition(ICogImage image) 12 {} 13 public virtual bool PostAcquisitionRef(ref ICogImage image) 14 { 15 PostAcquisition(image); 16 return true; 17 } 18 public virtual bool PostAcquisitionRefInfo(ref ICogImage image, ICogAcqInfo info) 19 { 20 return PostAcquisitionRef(ref image); 21 } 22 protected CogJob job = null; 23 } 24 } Initialize() 初始化方法,获取当前job引用以及用户需要的初始化数据。 PreAcquisition() 在FIFO的StartAcquire()方法调用之前被调用,即在进行图像采集之前调用,如在图像采集之前设置曝光、增益、对比度等图像参数。 PostAcquisition() 在图像采集完成之后被调用。 PostAcquisitionRef() 该方法与 PostAcquisition 类似,不同之处在于 image 是以引用的方式传递,如果这个方法返回 Ture , VisionPro 将处理这个 image,如果这个方法返回 False ,这个 image 将不会被立即进行处理 ,而是采集下一幅图像,这可以使你能够在处理所取的多个 image 之前将它们联合在一起.(如果 PostAcquisition 和 PostAcquisitionRef 都被重写,PostAcquisition 将被忽略)。例如你需要同一个相机采集多张不同曝光的图像进行合成,并不是每次采集后都立即进行处理,而是采集到固定数量或者满足某一条件时进行处理。 PostAcquisitionRefInfo() 与PostAcquisiitonRef相似,多了一个参数,用户可以通过ICogAcqInfo获取图像的时间戳,重写该方法后 PostAcquisition 、PostAcquisitionRef、 PostAcquisitionRef会被忽略。 三、脚本使用案例3.1 job本实用实例-----自动调节曝光时间setp1.新建Job,双击进入job中。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |