一VS二次开发1.导入VM引用1.需要先下载VM才能导入引用路径地址为VisionMaster\VisionMaster4.4.0\Development\V4.x\ComControls\AssemblyVisionMaster是安装目录4.4是版本号根据自己的版本号查找2.添加视图1.导入成功后工具箱里面会有vmProcedureConfigControl工具拖出来即可2.再添加一个vmRenderControl用于显示结果图像注意显示结果图像需要点击VM中流程标题左侧小扳手图标(配置)显示设置根据需要显示的图像和其他类型进行添加后方可显示3.代码部分//先加载方案文件.sol VmSolution.load(path);//path为.sol文件路径 //实例化流程有几个就实例化几个根据流程的名字更改 VmProcedure vm1 (VmProcedure)VmSolution.Instance[流程1]; //运行一次方案 VmSolution.Instance.SyncRun(); //运行时最好添加Invoke,防止出现线程问题 this.Invoke(new Action(() { vmRenderControl.ModuleSourcevm1; }));3.获取数据根据SDK开发文档获取对应控件的类例如1.获取控件的内容//获取对应的流程的对应控件 //获取快速匹配的坐标,其他内容接口根据SDK开发文档获取 //类名是SDK开发文档的对应工具下面带Tool的类获取结果为Tool类下面的属性后的内容 //例如快速匹配为IMVSFastFeatureMatchModuTool要获取的匹配点的属性为ModuResult匹配点为MatchPoint最后根据SDK设置对应的变量接受即可 IMVSFastFeatureMatchModuTool pma (IMVSFastFeatureMatchModuTool)VmSolution.Instance[流程1.快速匹配1]; ListPointFpmaLp pma.ModuResult.MatchPoint;2.获取脚本的输出//实例化脚本的类 ShellModuleTool script(ShellModuleTool)VmSolution.Instance[流程1.脚本1]; //根据输出的变量类型选择对应的获取方法和接受变量 ListRectBox scriptData script.ModuResult.GetOutputBoxArray(out0);4.设置加密狗检测功能//我是在软件启动时运行调用了VM的库所以会触发加密狗检测此处就写在了Program.cs的Application. SetCompatibleTextRenderingDefault (false);和Application. Run(new Main());的中间位置运行之前先判断是否插入了加密狗 try{ string currentDirectory AppDomain.CurrentDomain.BaseDirectory; string schemePath Path.Combine(currentDirectory, nullSol. so1); if(!File. Exists (schemePath)) { MessageBox.Show(默认方案文件:nul1So1.sol不存在!,文件缺失,MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //加载VM方案触发授权检查 VmSolution.Load(schemePath); } catch(TypeInitializationException) { MessageBox.Show(”未检测到加密狗请插入加密狗后重新启动程序。授权失败MessageBoxButtons. OK, MessageBoxIcon.Warning); return;// 直接退出不创建窗体 catch(Exception ex) { MessageBox. Show程序初始化失败请检查加密狗是否插入,错误,MessageBoxButtons.OK,MessageBoxIcon.Error); return; }5.设置停止与启动通过注册回调函数来实现IO触发然后设置相机的采集模式实现停止的效果(思路2可以通过设置图像源的参数达到类似的效果)回调函数private void VmSoltion_OnWorkStatusEvent(ImvsSdkDefine.IMVS_MODULE_WORK_STAUS workStatusInfo) { try { //0是空闲1是忙碌2是停止 //10000是流程120000是流程2以此列推 if(workStatusInfo.nWorkStatus0workStatusInfo.nProcessID10000) { VmProcedure vm1 (VmProcedure)VmSolution.Instance[流程1]; this.BeginInvoke(new Action((){ vmRenderControl.ModuleSourcevm1; })); } } catch{} }启动//可以在外部声明在内部实例化 GlobalCameraModuleTool globalCameraTool VmSolution.Instance[全局相机1] as GlobalCameraModuleTool; if (globalCameraTool null) { //处理获取失败的情况 return; } else { // 设置触发模式为开启 globalCameraTool.ModuParams.SetParamValue(TriggerMode, 1); // 设置触发源为LINE0 globalCameraTool.ModuParams.SetParamValue(TriggerSource, 0); //启动回调函数 VmSolution.OnWorkStatusEvent VmSolution_OnWorkStatusEvent; }停止// 设置触发模式为开启 globalCameraTool.ModuParams.SetParamValue(TriggerMode, 1); // 设置触发源为软件触发 globalCameraTool.ModuParams.SetParamValue(TriggerSource, 7);二VM内部开发1.脚本1.设置参数(设置目前测试只能设置运行参数基本参数无法设置)//设置参数 //示例设置Blob模块的低阈值为80,三个string分别为1.模块名称;2.设置的参数(具体内容需要根据SDK开发指南获取);3.设置的参数值 CurrentPorcess.GetModule(Blob分析1).SetValue(LowThreshold,80);2.获取参数//获取参数:必须要用object接受然后转为对应的变量类型 //示例获取Blob模块的低阈值,两个string分别为1.模块名称;2.获取的参数(具体内容需要根据SDK开发指南获取); object lowTCurrentProcess.GetModule(Blob分析1).GetValue(LowThreshold); float lowT1 Convert.ToSingle(lowT);2.变量类型1.矩形//矩形 RoiboxData roi new RoiboxData; roi.CenterX110; roi.CenterY120; roi.Width 60; roi.Height 20; roi.Angle 0; //矩形数组 //in0为数组长度 RoiboxData[] roiArray new RoiboxData[in0]; for(int i 0;iin0;i) { roiArray[i] new RoiboxData(); roiArray[i].CenterX110; roiArray[i].CenterY120; roiArray[i].Width 60; roiArray[i].Height 20; roiArray[i].Angle 0; }