与以往3.0接口相比,VM算法平台 V4.0版本确实降低了开发难度,但由于接口是全新封装,也带来了不少新的问题:
1.采用环境配置工具配置带有中文路径工程编译报错
若基于VM做二次开发,全新项目,可以直接在示例工程上进行修改,示例工程的环境配置是已经完成的状态,不容易出错。以C#示例工程为例,所在的位置如下:
我们提供了一个二次开发导入工具,在如下位置:
使用该工具,可以将公共依赖库和部分用到的模块库导入现有工程。但在工程路径含有中文时(在4.0维护版之后,导入工具已经支持中文路径),有时即使导入成功,编译时还会报错。此时,需要排查系统区域语言是否设置为中文,在开始->设置->时间和语言->区域,如下图:
2.启动程序报错,未经处理的异常,“xxx,类型B源自xxx.dll”
在编译过程没有错误之后,开始运行调试,有时会出现上述格式的错误提示。需要检查在程序运行目录里,是否有xxx.dll库。
3.二次开发时,ROI调整
使用VM做二次开发,一般过程是先用VM做视觉方案验证,在VM软件界面里,拉出一个可用的视觉方案。在二次开发时,一般只需要加载这个方案,并根据需要,通过程序触发相应的流程运行即可。各个模块之间的订阅关系在配置方案时就已经确定。
但在一些业务场景下,用户希望在使用时,能修改某些模块的ROI,此时有两种选择:
一、通过界面配置手工修改ROI,可以参考示例方案里圆查找参数绑定的方式
二、通过代码修改ROI,虽然修改ROI的功能未体现在模块工具类的ModuParams里。但在模块基类VmModule里有ModuleParam类型的Prams可以使用。
4.多图层模块参数配置
当一个模块有多个图层时,直接使用模块参数配置控件,暂时还有问题,只能展示一个图层,无法做到多个图层切换,会影响配置,如颜色抽取的配置,见下图:
如果需要在二次开发过程中,手工修改这类多图层模块的配置,需要使用VmMainViewConfigControl,直接打开整个方案,类似直接用VM的主界面进行配置。
5.模块参数配置在动态IO模块时失效
目前每个VM模块都会有一个工具类,比如圆查找的工具类:IMVSCircleFindModuTool,在工具类里,有自动生成的参数类和结果类。比如圆查找的参数类CircleFindParam ModuParams,通过这个参数对象,可以获取和设置圆查找的参数。如下图所示的部分都能在参数类里找到具体的属性:
参数类,就是根据生成该Tab页的XML定义文件自动生成的。但也有一部分模块,它的IO及参数是动态的。比如条件检测模块:
它的每一个条件都是运行时添加的,在模块启动时没有任何的参数,于是在条件检测的参数类里找不到对应的有效值范围上下限属性,从而在二次开发时,对其进行修改。
但在业务中又有修改的需求,对于这种动态IO,动态参数,需要使用GetDynamicParam方法来获取和设置:
6.模块参数配置在测量类,计算类模块时失效
VM模块的概念抽象如下:
目前的参数类,只覆盖参数配置的部分,还没有开放对输入输出的设置。但有些模块(测量类),它没有参数配置,用户可以修改的只有输入订阅。如下图点线测量:
只能通过参数配置控件,手工来修改订阅关系。类似下图的订阅选择:
如果只是向输入IO设置一个常量,在模块参数类的基类里,提供了一些SetInput的方法。如下图:
通过代码修改Roi中心点X的值。
如果确实需要通过代码来控制订阅关系修改的,可以通过技术支持,找到研发咨询。
7.模块参数配置与方案保存
二次开发过程中,一些需要建模的模块,在建模完成之后需要在模块配置控件里点确定,以便将模型下发,如:特征匹配。见下图:
当没有点击确定,又触发了整个方案保存,此时,特征匹配的模型不完整,再次打开方案有可能出现加载报错。
8.连续快速调用Run报异常
如果二次开发需要以非常快的频率调用流程的Run来触发流程运行,又不想直接使用流程的连续运行接口,想由业务应用来控制整个运行节奏。就需要在每次调用流程的Run方法之前判断流程是否已经空闲,否则调用时会抛出流程忙碌的异常。如下图所示:
9.应用进程强杀与模块不存在异常
当客户二次开发程序在某些情况下需要强行中止视觉相关进程,除了需要将客户自己开发的应用进程结束,也需要将VM相关的进程一并强杀。VM相关的进程如下图:
或者在强杀客户进程之前,先调用VmSolution.Instance.Dispose();否则会出现客户进程已强杀重启,而VM服务检测到与SDK间的心跳异常,将已加载的方案释放。当客户进程再次尝试获取流程或模块时,抛出0xE0000302 模块不存在的异常。