VisionMaster软件---脚本梳理

张开发
2026/4/20 3:04:33 15 分钟阅读

分享文章

VisionMaster软件---脚本梳理
文章目录1.脚本1.1 脚本功能简介1.1.1 脚本编辑界面介绍1.1.2 脚本中方法的执行顺序1.2 脚本基础接口介绍1.2.1 脚本接口-数据输入输出支持类型介绍1.2.2 脚本接口-数据输入输出接口(int、float、string1.2.3 脚本接口-数据输入输出接口(byte、Imagedata1.2.4 420新增接口1.3 脚本接口-全局变量、模块控制接口1.4 脚本接口-通信发送数据接口2.全局脚本2.1 全局脚本功能简介2.1.1 全局脚本界面介绍2.1.2 全局脚本中方法执行顺序2.1.3 全局脚本中方法-Process()2.2 全局脚本接口-全局变量相关接口2.3 全局脚本接口-全局脚本连续运行时间获取/设置接口2.4 全局脚本接口-通信相关接口(通信接收事件2.5 全局脚本接口-通信相关接口(发送数据2.6 全局脚本接口-3.X二次开发SDK回调2.6.1 全局脚本接口-3.X二次开发SDK其他接口3.使用VS调试代码3.1 使用VS调试脚本或全局脚代码3.1.1 脚本调试3.1.2 全局脚本调试3.1.3 使用VS调试脚本或全局脚代码3.2 第三方库调用方法3.2.1 脚本和全局脚本调用第三方库3.2.2 脚本和全局脚本中直接引用C#库的方法3.3 脚本全局脚本问题排查方法3.3.1 try catchVS断点调试。3.3.2 try catchMessageBox弹窗3.3.3 try catchDebugView4.脚本/全局脚本案例4.1 脚本案例4.2 全局脚本案例4.2.1 模块参数配置4.2.2 模块输入参数4.2.3 通信接收4.3 顺序执行流程---功能实现演示4.3.1 添加流程和引用4.3.2 代码说明4.4 常用接口代码4.4.1 流程执行4.4.2 获取模块结果4.4.3 获取流程状态4.4.4 设置模块参数4.4.5 操作方案4.4.6 操作全局变量5.脚本和全局脚本使用注意事项6.补充资料1.脚本1.1 脚本功能简介1.在VM中脚本作为一个模块在VM流程中存在使用C#编程可在VS进行代码的编写、调试。2.支持int、flaot、string、Bytes和Image五种数据类型的输入输出。3.在脚本中可自行实现功能也可调用第三方库。除了对数据的处理外还可在脚本中对VM全局变量获取和设置、模块的运行参数设置也可在脚本中调用通信设备发送数据等。1.1.1 脚本编辑界面介绍1.1.2 脚本中方法的执行顺序1.2 脚本基础接口介绍1.2.1 脚本接口-数据输入输出支持类型介绍1.2.2 脚本接口-数据输入输出接口(int、float、string1.2.3 脚本接口-数据输入输出接口(byte、Imagedata1.2.4 420新增接口输出int、float、string数组优化之前接口需要使用循环的方式。1.3 脚本接口-全局变量、模块控制接口1.4 脚本接口-通信发送数据接口2.全局脚本2.1 全局脚本功能简介在VM中全局脚本作为VM的全局资源使用C#编程支持调用3.X版本的C#接口可用于多流程的逻辑控制。支持全局变量参数的获取与修改支持接收通信数据支持获取或修改模块参数支持获取流程或模块运行状态和结果等。2.1.1 全局脚本界面介绍预编译编译程序执行Init()函数执行运行Process()函数确定保存修改后的代码并退出脚本编辑界面。2.1.2 全局脚本中方法执行顺序方法功能及执行顺序描述public int Init(){}初始化函数会在加载方案或者编译时执行。可在此方法中实现初始化相关操作。public int Process(){}运行函数为主界面上运行控制按钮执行的函数单次执行则执行一次Process()函数连续运行则以一定时间间隔重复执行Process()函数2.1.3 全局脚本中方法-Process()2.2 全局脚本接口-全局变量相关接口在全局脚本中设置全局全量和获取全局变量的值接口都很简单不再赘述。2.3 全局脚本接口-全局脚本连续运行时间获取/设置接口用于设置连续运行时Process的运行时间间隔。直接调用即可使用。2.4 全局脚本接口-通信相关接口(通信接收事件用于接收通信设备收到的通信数据并自动进入回调函数。可以实现的功能如下1).全局脚本中接收到通信回调数据后对通信数据进行分析处理并控制实现执行指定的动作如右图示例接收到字符串等于“0”控制流程运行一次2).未其他功能的实现提供了灵活的方式。2.5 全局脚本接口-通信相关接口(发送数据具体使用可参考脚本使用通信发送数据接口。2.6 全局脚本接口-3.X二次开发SDK回调采用的是IMVS_PF_RegisterResultCallBack_P_CS()回调详细内容见3.X二次开发手册。回调的相关信息如下2.6.1 全局脚本接口-3.X二次开发SDK其他接口3.X版本SDK开发手册路径D:\software\VisionMaster4.0.0\Development\V3.x\DocumentationsVisionMaster4.3及其以上版本没有此文件。3.使用VS调试代码脚本和全局脚本支持使用VS调试VS支持VS2013及以上版本。下面讲述使用VS调试的详细步骤部分步骤区分脚本和全局脚本。3.1 使用VS调试脚本或全局脚代码步骤一使用VS2013以上的版本打开脚本或者全局脚本工程脚本在界面的“导出工程”导出脚本程序然后.sln文件右键使用VisualStudio打开。全局脚本点击工程目录按钮选择.sln文件右键使用VisualStudio打开步骤二使用VS2013以上的版本打开脚本或者全局脚本工程步骤三调试选项中左键点击附加到进程即可进行VS修改和调试3.1.1 脚本调试脚本在VS界面上方调试选项中左键点击附加到进程在可用进程选项中寻找ShellModuleManager.exe附加到程序中。由于方案中可能存在多个脚本模块因此需使用任务管理器确定脚本模块的PID找到对应的进程附加到程序中如下图所示为任务管理器命令行中模块序号以及其对应PID根据模块序号以及其PID找到对应的进程点击附加按钮如下图所示3.1.2 全局脚本调试全局脚本调试选项中左键点击附加到进程在可用进程选项中寻找GlobalScript.exe点击右下角附加按钮,如下图所示3.1.3 使用VS调试脚本或全局脚代码在打开的VS工程中设置断点。点击VM上方的单次运行并查看VS中是否运行进入断点如下图所示在VS中对脚本的代码进行修改和调试。1).点击停止调试在VS中修改代码后重新生成即可将修改后的代码同步到VM中。2).需要继续进行调试时需要在VS中重新选择附加到进程。不能直接点击启动。3.2 第三方库调用方法3.2.1 脚本和全局脚本调用第三方库1.调用非托管库C库示例调用非托管库跟C#调用非托管库一样脚本代码就是标准的C#程序。C#不能直接调用C库因此C/C动态库一律通过导出C接口的方式让C#调用。下面是C#调用时候声明的代码需要引用System.Runtime.InteropServices程序集。usingSystem.Runtime.InteropServices;classUserScript:ScriptMethods,IProcessMethods{[DllImport(ShellRTestAPI.dll,EntryPointfnShellRTestAPI_GetValue)]publicstaticexternintfnShellRTestAPI_GetValue();[DllImport(ShellRTestAPI.dll,EntryPointfnShellRTestAPI_Add)]publicstaticexternintfnShellRTestAPI_Add(intnValueFirst,intnValueSecond);publicvoidInit(){processCount0;}publicboolProcess(){intnTempfnShellRTestAPI_Add(111,888);SetIntValue(var1_Output,nTemp);returntrue;}}3.2.2 脚本和全局脚本中直接引用C#库的方法1.点击程序集按钮进入引用程序集界面如下图所示。2.点击下角添加按钮根据需求进行程序集动态添加仅支持C#程序集添加到需要的第三方程序集路径下找到想要添加的.dll点击打开即可添加添加完成后在脚本或者全局脚本中调用即可。3.3 脚本全局脚本问题排查方法在现场实际使用的过程中经常会反馈脚本模块状态为0的情况这一般是脚本中调用的函数执行异常导致。3.3.1 try catchVS断点调试。如下图可以在Exception e中看到详细的异常信息3.3.2 try catchMessageBox弹窗将错误信息通过弹窗显示3.3.3 try catchDebugView将错误信息打印至DebugView中4.脚本/全局脚本案例4.1 脚本案例4.2 全局脚本案例全局脚本应用案例1.VM430版本是兼容3.x版本的二次开发接口2.也兼容4.x版本的二次开发接口。示例代码存在路径为…\VisionMaster4.3.0\Applications\GlobalScript\Samples\CH4.2.1 模块参数配置usingSystem;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Collections;usingVM.GlobalScript.Methods;usingiMVS_6000PlatformSDKCS;usingVM.Core;usingVM.PlatformSDKCS;usingImageSourceModuleCs;usingIMVSFastFeatureMatchModuCs;usingSystem.Collections.Generic;/***************************************** * Example explanation:Example of multi process control operation * Logic Control:Single run, each flow execute once * Continuous run:continuous run, each flow execute continuous * 示例说明: 获取流程对象模块对象设置参数运行获取结果 * ***************************************/publicclassUserGlobalScript:UserGlobalMethods,IScriptMethods{/// summary/// Init/// /summary/// returnsSuccess:return 0/returnspublicintInit(){//SDK initreturnInitSDK();}/// summary/// execute function/// Single run:the function execute once/// Continuous run:Repeat the function at regular intervals/// 运行函数/// 单次执行:该函数执行一次/// 连续执行:以一定时间间隔重复执行该函数/// /summary/// returnsSuccess:return 0/returnspublicintProcess(){//m_operateHandle SDK handleif(m_operateHandleIntPtr.Zero){returnImvsSdkPFDefine.IMVS_EC_NULL_PTR;}//All processes are executed by default//If execute in your own define logic,please remove the function :DefaultExecuteProcess, Create your own logic function.//默认执行全部流程//如果自定义流程执行逻辑请移除DefaultExecuteProcess方法编写自定义流程执行逻辑代码intnRet0;IMVSFastFeatureMatchModuToolfastFeatureTool(IMVSFastFeatureMatchModuTool)VmSolution.Instance[流程1.快速匹配1];VmProcedurepro1(VmProcedure)VmSolution.Instance[流程1];if(fastFeatureTool!null){FastFeatureMatchParammatchParamfastFeatureTool.ModuParams;if(matchParam!null){//设置特征匹配模块运行参数-最大匹配个数matchParam.MaxMatchNum10;}}if(pro1!null){pro1.Run();//获取特征匹配模块的运行结果FastFeatureMatchResultmatchResultfastFeatureTool.ModuResult;if(matchResult!null){//获取匹配个数intmatchnummatchResult.MatchNum;//获取匹配点ListPointFmatchpointmatchResult.MatchPoint;}}//获取/设置流程1的局部变量数据varlocalModulepro1.LocalVariable;localModule.SetVarInt(var0,newint[]{1,2});int[]nArraylocalModule.GetVarInt(var0).pIntVal;returnnRet;}}①初始化了两个对象“fastFeatureTool”和“pro1”②初始化了参数对象设置了最大匹配个数参数③执行一次流程获取模块运行结果4.2.2 模块输入参数usingSystem;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Collections;usingVM.GlobalScript.Methods;usingiMVS_6000PlatformSDKCS;usingVM.Core;usingVM.PlatformSDKCS;usingImageSourceModuleCs;usingIMVSFastFeatureMatchModuCs;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Drawing.Imaging;/***************************************** * Example explanation:Example of multi process control operation * Logic Control:Single run, each flow execute once * Continuous run:continuous run, each flow execute continuous * 示例说明: 设置流程输入参数执行流程 * ***************************************/publicclassUserGlobalScript:UserGlobalMethods,IScriptMethods{/// summary/// Init/// /summary/// returnsSuccess:return 0/returnspublicintInit(){//SDK initreturnInitSDK();}/// summary/// execute function/// Single run:the function execute once/// Continuous run:Repeat the function at regular intervals/// 运行函数/// 单次执行:该函数执行一次/// 连续执行:以一定时间间隔重复执行该函数/// /summary/// returnsSuccess:return 0/returnspublicintProcess(){//m_operateHandle SDK handleif(m_operateHandleIntPtr.Zero){returnImvsSdkPFDefine.IMVS_EC_NULL_PTR;}//All processes are executed by default//If execute in your own define logic,please remove the function :DefaultExecuteProcess, Create your own logic function.//默认执行全部流程//如果自定义流程执行逻辑请移除DefaultExecuteProcess方法编写自定义流程执行逻辑代码intnRet0;VmProcedurepro1(VmProcedure)VmSolution.Instance[流程1];if(pro1!null){ProcedureParamproParampro1.ModuParams;if(proParam!null){//设置流程输入图像BitmapbitmapnewBitmap(D:\Program\VM_Temp\0257800-IMG_2.jpg);proParam.SetInputImage_V2(ImageData,newImageBaseData(bitmap));//设置流程输入intproParam.SetInputInt(intX,newint[]{10});//设置流程输入floatproParam.SetInputFloat(floatY,newfloat[]{2.345f});//设置流程输入stringproParam.SetInputString(stringZ,newInputStringData[]{newInputStringData(){strValueabc}});//流程执行pro1.Run();//释放disposebitmap.Dispose();}}returnnRet;}}该段代码主要实现了加载本地图片给流程的输入并且也赋值了三个数据类型的参数给流程输入。4.2.3 通信接收usingSystem;usingVM.GlobalScript.Methods;usingSystem.Windows.Forms;usingiMVS_6000PlatformSDKCS;usingSystem.Runtime.InteropServices;usingVM.Core;usingVM.PlatformSDKCS;usingVMControls.Interface;usingSystem.Threading.Tasks;/***************************************** * Example explanation:Example of multi process control operation * Logic Control:Single run, each flow execute once * Continuous run:continuous run, each flow execute continuous * 示例说明: 通信接收 * ***************************************/publicclassUserGlobalScript:UserGlobalMethods,IScriptMethods{/// summary/// Init/// /summary/// returnsSuccess:return 0/returnspublicintInit(){//SDK initintretInitSDK();//设置与全局通信模块的通信端口StartGlobalCommunicate();//注册通信数据接收事件RegesiterReceiveCommunicateDataEvent();returnret;}/// summary/// 通信数据接收函数/// /summarypublicoverridevoidUserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfodataInfo){if(dataInfonull||dataInfo.DeviceDatanull){return;}//接收到的数据转成字符串stringstrSystem.Text.Encoding.Default.GetString(dataInfo.DeviceData);//这里的deviceIndex和全局通信模块中的一致if(dataInfo.DeviceID1){//解析收到的数据if(str0){//异步执行流程1 一次VmProcedurepro1(VmProcedure)VmSolution.Instance[流程1];if(pro1!null){pro1.Run(,false);}}elseif(str1){//保存方案Task.Run((){VmSolution.Save();});}elseif(str2){//加载方案Task.Run((){VmSolution.Load(D:\Program\VM_Temp\4.3\全局脚本\sdk.sol);});}}}/// summary/// execute function/// Single run:the function execute once/// Continuous run:Repeat the function at regular intervals/// 运行函数/// 单次执行:该函数执行一次/// 连续执行:以一定时间间隔重复执行该函数/// /summary/// returnsSuccess:return 0/returnspublicintProcess(){//m_operateHandle SDK handleif(m_operateHandleIntPtr.Zero){returnImvsSdkPFDefine.IMVS_EC_NULL_PTR;}//All processes are executed by default//If execute in your own define logic,please remove the function :DefaultExecuteProcess, Create your own logic function.//默认执行全部流程//如果自定义流程执行逻辑请移除DefaultExecuteProcess方法编写自定义流程执行逻辑代码intnRetDefaultExecuteProcess();returnnRet;}}该段代码主要实现了对对应通讯地址的数据解析成字符串并且根据对解析出来的结果的判断来实现执行流程保存方案和加载方案的操作。4.3 顺序执行流程—功能实现演示4.3.1 添加流程和引用4.3.2 代码说明4.4 常用接口代码4.4.1 流程执行4.4.2 获取模块结果4.4.3 获取流程状态4.4.4 设置模块参数4.4.5 操作方案4.4.6 操作全局变量5.脚本和全局脚本使用注意事项脚本使用注意事项1.脚本中不支持调用控制器管理里面的设备发送IO数据2.脚本模块尽量减少关于系统资源的操作因为可能会导致重编译时候资源泄漏导致的异常包括线程、串口端口、文件等3.尽量只做后台业务不涉及界面层4.尽量不在脚本中操作非托管资源如果要操作非托管资源则需要在process定义并且释放5.脚本中的异常可以通过messagebox.show弹框慎用流程运行到弹框会停止确定后继续来定位具体出错的位置然后通过try catch语法进行捕获并输出异常信息6.补充资料1.VisionMaster软件在线手册2.【V社区】机器视觉交流平台可进行提问和发表文章。3.【大话视觉】在CSDN平台推出的博客涉及VM应用、开发和案例等专栏。【VM应用帮助文档路径】:\VisionMaster4.4.0\Applications\Help【VM SDK开帮助文档路径】:\VisionMaster4.4.0\Development\V4.x\Documentations【自定义算法模块开发帮助文档路径】\VisionMaster4.4.0\Applications\Tools\AlgorithmXMLGenerator\doc【算子SDK开发帮助文档路径】VisionMaster4.4.0\MVDAlgorithmSDK\Documentations【VM服务管家】:为微信小程序可以直接用手机搜索小程序“VM服务管家”并进行使用。

更多文章