VM是海康机器人自主研发的机器视觉软件,将一系列的图像算法、逻辑工具和通讯协议等封装成图形化模块,致力于帮助客户提供快速搭建视觉应用、解决视觉难题,能够满足视觉定位、尺寸测量、缺陷检测以及信息识别等机器视觉应用。
转自:机器视觉技术交流社区

目录

  • 1 引言
  • 2 全局变量介绍
  • 3 全局脚本接口和示例
  • 4 全局脚本引用和调试
  • 5 案例演示
  • 6 总结

1 引言

全局是指一切从系统整体及其全过程出发的思想。这种全局概念同样应用在VM中,在VM的快捷工具条中有一组全局工具,比如相机管理、控制器管理、全局变量、通信管理、全局触发、全局脚本等等,这里主要介绍全局变量和全局脚本。
全局变量,有过编程基础的朋友们相信也不陌生,是一种可以被局部获取或设置的变量。在VM中,全局变量可以被模块的运行参数订阅(获取全局变量的值),也可以绑定模块的结果(设置全局变量的值)。另外,还有一些其它比较经典的应用,如接收通讯数据,流程之间数据交换,计数等等。
全局脚本,支持调用算法平台SDK的C#版本(VM3.x)。在VM中,全局脚本可以控制流程的运行,快捷工具条上的单次执行按钮(方案中的所有流程执行一次)和连续执行按钮(方案中的所有流程连续执行)被点击之后都会进入全局脚本函数中。全局脚本常见应用有:指定流程执行一次、多流程控制执行、模块参数配置、模块运行结果获取、全局变量设置、全局通信等等。

2 全局变量介绍

全局变量是在所有的函数外部定义的变量,是可以被本方案中所有流程调用或修改的变量,可自定义变量名称、类型和当前值,它在整个工程文件内都有效。单击图标可进行全局变量的配置。如图中所示,添加了一个变量,名称命名为var0,注释可不写,类型为float。

相关功能如下:

  • 添加变量:点击+添加变量后可新增全局变量。

  • 导入/导出:可以固定格式文件导入或导出全局变量信息。

  • 搜索:当全局变量较多时,可快速搜索。

  • 置顶/上移/下移:可对变量的位置进行上下调整。

  • 保存变量:可将当前设置的全局变量进行保存。

  • 输入来源:即设置全局变量的值,可通过对对应类型的模块结果数据进行绑定,只可以绑定一个,如下图所示。

  • 目标输出:即获取全局变量的值,可通过对对应类型的模块运行参数数据进行绑定,可绑定多个,可以如下图所示。也可以双击某个模块打开参数配置,进而订阅全局变量。

  • 初始化:开启的作用,则是接收通讯发送过来的固定格式的字符串,实现对全局变量的值的设置。如变量var0,当通讯发过来SetGlobalValue:var0=99,可以将该变量值设为99。

3 全局脚本接口和示例

单击图标则可以全局脚本代码界面,菜单栏的功能分别为导入C#代码、导出C#代码、打开(导入)示例代码、打开工程目录、打开引用的程序集、保存代码,菜单栏下方则是C#编辑区,C#编程区中Init()函数为初始化函数,Porcess()为处理函数。

  1. 全局脚本接口
    全局脚本中可以使用的设置和获取接口如下所示包含全局变量、脚本连续运行事件间隔、通讯接口等等。其它的接口函数调用可以查看《VisionMaster算法平台SDK开发指南V3.x.chm》,路径:VisionMaster4.2.0\Development\V3.x\Documentations。
功能 函数方法 参数说明
获取全局变量int型 GetGlobalVariableIntValue(string paramName, ref int paramValue) 输入:变量名paramName;输出:变量值paramValue
获取全局变量float型 GetGlobalVariableFloatValue(string paramName, ref float paramValue) 输入:变量名paramName;输出:变量值paramValue
获取全局变量string型 GetGlobalVariableStringValue (string paramName, ref string paramValue) 输入:变量名paramName;输出:变量值paramValue
设置全局变量int型 SetGlobalVariableIntValue (string paramName, int paramValue) 输入:变量名 paramName,变量值paramValue
设置全局变量float型 SetGlobalVariableFloatValue (string paramName, float paramValue) 输入:变量名 paramName,变量值paramValue
设置全局变量string型 SetGlobalVariableStrignValue (string paramName, string paramValue) 输入:变量名 paramName,变量值paramValue
获取连续运行时间间隔 GetScriptContinusExecuteInterval ()
设置连续运行时间间隔 SetScriptContinusExecuteInterval (uint nMilliSecond) 输入:时间间隔nMilliSecond,单位ms
初始化全局通信 StartGlobalCommunicate ()
注册通信接收事件 RegesiterReceiveCommunicateDataEvent()
通信数据接收事件 UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo) 输入:通讯信息dataInfo
通信发送数据 SendCommDeviceData(string data,int deviceID) 输入:待发送数据data,设备deviceID
  1. 全局脚本中示例
    在vm中的全局脚本示例中,保存了常见应用的示例代码,根据所需选择任意一个就是导入到当前方案中,随之可进行参考或修改代码。

4 全局脚本引用和调试

  1. 添加引用
    在全局脚本界面,打开引用的程序集,根据需求进行程序集动态库的添加,仅支持C#程序集添加,到需要的第三方程序集路径下找到想要添加的.dll,点击打开即可添加,添加完成后在全局脚本中调用即可。

  2. 调试步骤
    在全局脚本界面,打开工程目录后就会自动跳转全局脚本所在的文件夹,选择.sln文件使用VS打开,设置断点并且重新生成,然后点击【调试】中的【附加到进程】,再选择GlobalScript.exe附加,最后在VM中运行方案的单次执行来查看是否能进入断点。小小提示:断点调试时,每次修改代码都需要重新编译,VS每次重新编译后,只有第一次运行会进入函数Init()。

5 案例演示

需求:结合全局变量和全局脚本,完成通讯设置全局变量的值。此处则是通讯发送物理坐标,修改全局变量的值。
第一步,在VM通讯管理设置号通讯设备。

第二步,在全局变量中设置中对应的变量。

第三步,打开全局脚本中的示例-全局通信,适当修改代码。在全局脚本中根据输入的字符串进行分割设置对应的全局变量。

效果如下所示,实现通讯输入的点位信息赋值到全局变量中,那么其它模块将可以订阅全局变量的值。

完整代码如下所示:

using System;
using VM.GlobalScript.Methods;
using System.Windows.Forms;
using iMVS_6000PlatformSDKCS;
using System.Runtime.InteropServices;/******************************* 示例说明: 接收全局通信模块数据示例*     前提: 全局通信模块中开启有通信设备* 控制逻辑: 1.接收来自全局通信模块接收到的数据*           2.如果接收到数据字符0,则执行流程1一次* ***************************************/
public class UserGlobalScript : UserGlobalMethods, IScriptMethods
{/// <summary>/// 初始化函数/// </summary>/// <returns>成功:返回0</returns>public int Init(){//二次开发SDK初始化InitSDK();//设置与全局通信模块的通信端口StartGlobalCommunicate();//注册通信数据接收事件RegesiterReceiveCommunicateDataEvent();return 0;}/// <summary>/// 运行函数/// 单次执行:该函数执行一次/// 连续执行:以一定时间间隔重复执行该函数/// </summary>/// <returns>成功:返回0</returns>public int Process(){MessageBox.Show("进入Process");//m_operateHandle 二次开发SDK操作句柄if (m_operateHandle == IntPtr.Zero){ return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }//默认执行全部流程,如果自定义流程执行逻辑,请移除DefaultExecuteProcess方法int nRet = DefaultExecuteProcess();return nRet;}/// <summary>/// 通信数据接收函数/// </summary>public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo){if (dataInfo == null || dataInfo.DeviceData == null){ return; }//接收到的数据转成字符串string str = System.Text.Encoding.Default.GetString(dataInfo.DeviceData);MessageBox.Show(str);string[] strlist = str.Split(',');SetGlobalVariableFloatValue("X", Convert.ToSingle(strlist[1]));SetGlobalVariableFloatValue("Y", Convert.ToSingle(strlist[2]));SetGlobalVariableFloatValue("R", Convert.ToSingle(strlist[3]));//这里的deviceIndex和全局通信模块中的一致if (dataInfo.DeviceID == 1){//解析收到的数据if (strlist[0] == "C"){//执行流程1 一次ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle, 10000, null);}}}/// <summary>/// SDK回调函数/// </summary>public override void ResultDataCallBack(IntPtr outputPlatformInfo, IntPtr puser){base.ResultDataCallBack(outputPlatformInfo, puser);ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo = (ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO)Marshal.PtrToStructure(outputPlatformInfo, typeof(ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO));switch (struInfo.nInfoType){//获取模块结果数据case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_MODULE_RESULT:{ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P resultInfo = (ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P));break;}///获取流程运行状态case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_STATE:{ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS stWorkStatus = (ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS));break;}default:break;}}
}

6 总结

在推崇图形化交互的VM视觉平台里,尽量避免用户再去过多的编辑代码。全局变量则在VM中起到了很好的桥梁作用,然而全局脚本中所实现的示例代码功能,则是依靠VM自身的已有的功能也能实现,比如示例代码模块参数设置,用户则是直接双击模块就可以打开模块的参数配置窗口;示例代码中的全局通信接收数据,用户也可以用快捷工具条中的通讯管理实现(自带了接收事件进行协议解析)等,这些其实都可以不用代码实现,仅仅在相应窗口中进行配置即可。另外,根据经验,有以下两点需要注意:

  1. 无法进入到断点位置。建议调试过程中,打开工程目录后关闭脚本模块编辑界面,只使用vs修改代码或重新生成,然后附加进程。
  2. 除了使用断点查看变量值,还可以使用MessageBox.Show(string paramValue)函数来查看相关变量。

海康VisionMaster-全局变量与全局脚本相关推荐

  1. 海康VisionMaster与西门子PLC1200进行S7通信

    通信是连通算法平台和外部设备的重要渠道,在海康VisionMaster算法平台中既支持外部数据的读入也支持数据的写出,当通信构建起来以后既可以把软件处理结果发送给外界,又可以通过外界发送字符来触发相机 ...

  2. 学习海康VisionMaster之模板匹配

    一:必须下定决心,学习一个新的图像处理算法 学习了7,8年的HALCON了,很好用,就是贵,用不起,遇到成本瓶颈了. 现在做个项目不容易啊,有机会学习海康的VisionMaster,还不错,哈哈~~ ...

  3. 海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

    描述 环境:VM4.0.0 + VS2015及以上 问题:有的用户在使用VisionMaster软件在开发视觉项目时,可能同时也使用HALCON,OpenCV等视觉算法库做一些图像的处理,并且希望能将 ...

  4. 海康VisionMaster绘制图形到显示窗口

    颜色枚举 /// <summary>/// 颜色枚举/// </summary>public enum ColorConstants{Red = 16711680,Green ...

  5. 基于海康visionMaster上层钢板二维码识别and钢板长度测量并中心坐标输出;不同.sol程序文件间内容的拷贝

    --即将之前的两个功能((1)上层钢板二维码识别 和 (2)上层钢板长度测量并输出长度中心坐标)结合到一起. 关键词:海康visionMaster,不同.sol程序文件间内容的拷贝,流程导入,流程导出 ...

  6. 如何在LabVIEW中进行海康机器视觉算法平台VisionMaster二次开发

    目录 1.导言 庞大的NI LabVIEW软件平台 LabVIEW 平台的特点 海康机器人的视觉算法平台VisionMaster特点 如何在LabVIEW中进行海康视觉算法平台二次开发 2.方法与步骤 ...

  7. 1 海康视觉平台VisionMaster 上手系列: 开篇

    先交代一下背景.本人搞机器视觉多年.最熟悉的是halcon,其次是visionpro,再是opencv. 今年(2022年)才真正开始使用VisionMaster.(以下用VM简称 VisionMas ...

  8. 10 海康视觉平台VisionMaster 上手系列:硬件知识介绍

    硬件知识,不属于VisionMaster应用.属于机器视觉应用. 机器视觉硬件: 1,相机. 2,镜头. 3,光源及控制器. 4,主机.(含采集卡) 相机我们一般就看这些参数:(图示是海康相机) 快门 ...

  9. 海康visionMaster4.1二维码识别/检测之脚本文件的调试

    关键词:脚本文件调试:海康visionMaster4.1:二维码识别 介绍脚本文件调试之前,先说一个"二维码识别"模块的有趣的点. Tips:"二维码识别"模块 ...

最新文章

  1. 服务器系统选择什么,服务器选择什么系统
  2. Kettle使用_6 配置资源库
  3. 英语写作-Introduction
  4. python导入math函数取一随机数返回其平方根_Python数字
  5. struts入门的ognl
  6. 在Linux下配置打印机
  7. 【超图+CESIUM】【基础API使用示例】28、超图|CESIUM -【坐标转换】世界坐标转经纬度
  8. VMware 虚拟机的使用
  9. 羊哥推荐的Java后端开发书籍
  10. java vo的使用_使用VO传递参数的设计 | 学步园
  11. 炫酷的动态粒子背景效果(vue专属)
  12. ios 关于开源框架GPUImage的简单说明
  13. android 4.4 art模式,安卓4.4的ART模式怎么打开 安卓4.4开启art模式方法图解
  14. RuntimeError: iter() is only supported inside of tf.function or when eager execution is enabled.
  15. NYNU_ACM 实验室招新月赛题解
  16. 临沂中考计算机试题,2017临沂中考信息技术题库带答案
  17. 今日金融词汇---量化宽松
  18. Nginx Windows详细安装部署教程
  19. SQL Server自动产生一年多少周及月
  20. 程序员爱写脚本是种病

热门文章

  1. java算法集训结果填空题练习1
  2. 【转载】一些动态规划的题目
  3. 计算机房承重载荷,机房楼面承重荷载检测收费标准
  4. redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reac
  5. 淘宝商家如何在评论中提炼客户痛点?
  6. 【机房合作】机房收费系统合作版总结
  7. oracle 建立表空间 和 用户随记
  8. 禁用弹出窗口阻止程序
  9. 2017GDCPC题解(未完)
  10. ButterKnife(黄油刀) 使用方法总结