王笑怡,张 雷,张海涛
(1.中国电子科技集团公司第四十七研究所,沈阳110000;2.中国人民解放军95979 部队,山东新泰271207)
目前,在科研院校及企业的科研生产中大量使用程控仪器,但对仪器的使用普遍是各自独立的工作,仪器间的协同工作完全依赖人工干预,没有形成统一体,对仪器的应用开发仍处于初级阶段[1]。在当前发展生产力、提升劳动效率的趋势下,全球企业和科研单位掀起了自动化测试的浪潮[2],对程控仪器的进一步编程开发势在必行。
在工控测试系统中使用到的程控仪器通常具有GPIB、LAN、USB、串口等硬件接口[3],支持用于仪器编程的标准I/O 函数库,即VISA 库[4]。计算机通过软件编程调用VISA 库函数与程控仪器进行通信,从而实现自动测量、数据存储、汇总、分析等[5-6]。
VB 是一种应用广泛的可视化编程语言,具有高效、快速、界面设计功能强大等特点[7],以其为开发平台,可以快速地创建应用程序,缩短开发周期。在VB 开发环境下使用VISA 库对程控仪器编程,通常使用自定义函数编程、ActiveX 控件和ActiveX EXE三种设计方法。
在此以一个应用实例为背景,阐述这三种设计方法的实现过程。本实例是在VB 中调用VISA 库中的函数,对连接在USB 端口的KEYSIGHT 34470A数字多用表(以下简称程控仪器)进行编程控制,实现连接程控仪器、设置VDC 测量功能、读取测量结果等功能。整体控制流程如图1 所示,在“连接”按钮的Click 事件中实现连接程控仪器并设置为VDC测量功能,在Timer1 控件的Timer 事件中读取测量结果。
图1 程序控制事件流程图
自定义函数编程是将程控仪器的操作指令直接嵌入在程序函数中,通过调用函数实现对程控仪器的控制。主要实现方法是在自定义函数中调用VISA 库函数,完成对程控仪器的控制,步骤如下:
1) 创建工程,添加窗体并按图2 放置控件;
图2 自定义函数编程方法窗体设计
2) 向工程中添加 VISA 模块(VISA 函数库);
3) 在窗体模块中添加如下的自定义函数:
4) 在窗体模块中“连接”按钮的Click 事件中,调用Connect 函数连接程控仪器,调用SetFunction 函数设置程控仪器为VDC 测量功能;在定时器Timer事件中调用GetValue 函数读取测量结果并显示。
上述编程方法的实际工作界面与运行结果如图3 所示。采用自定义函数编程方法,由于程控仪器的操作指令直接嵌入在程序函数中,代码量较少,函数与客户端处于同一个进程,使用同一个执行线程,访问速度快捷[8]。但是,这种方法编写的程序,不易移植或不能被其他程序调用,同时受VB 的进程/线程管理机制的限制,如果客户端同时管理多个程控仪器时,处理不及时可能会出现线程阻塞现象,导致数据丢失。
图3 基于自定义函数编程方法运行效果
利用VB,可以通过ActiveX 技术,把自有业务封装后,再和一般的部件组合起来,编译成.OCX 文件提供给其他应用程序使用。在提供对象时必须遵循ActiveX 的规范。其他应用程序使用 ActiveX 控件的方法,与使用标准内装的控件完全一样。在程序中加入ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。
通过创建自定义ActiveX 控件,将与程控仪器相关的业务(如调用VISA 库函数实现对程控仪器的控制)封装在控件内部,控件通过属性、方法和事件实现对外接口。使用时将创建的ActiveX 控件加入到窗体中,在窗体模块中通过设置属性、调用方法和响应事件实现对程控仪器的控制。具体的实现方法如下:
1) 创建ActiveX 控件工程,按图4 所示,控件界面窗体中放置Label 控件(用于简单显示);
图4 控件界面窗体
2) 向工程中添加VISA 模块;
3) 用“ActiveX 控件接口向导”为控件添加VISA Address 属性、Connect 方法、SetFunction 方法、Get Value 方法和Complete 事件。在Connect 方法和Set Function 方法函数中添加自定义函数编程方法中给出的代码,在GetValue 方法函数返回前,使用Raise Event 语句引发Complete 事件。
GetValue 方法函数修改后代码如下:
4) 添加工程,在新工程中添加窗体,按图5 放置ActiveX 控件(控件名为uctKS34470A1)及其他控件;
图5 ActiveX 控件编程方法窗体设计
5) 在窗体模块中“连接”按钮的Click 事件中,设置ActiveX 控件VISAAddress 属性,调用Connect方法连接程控仪器,调用SetFunction 方法设置程控仪器为VDC 测量功能;在定时器Timer 事件中调用Get Value 方法读取测量结果,在Complete 事件中显示。
基于此编程方法的运行效果如图6 所示。采用ActiveX 控件方法,按照ActiveX 规则将可复用的软件封装在一个控件中,因此其他遵循ActiveX 规则的开发工具,像Visual Basic 和Microsoft Visual C++之类以及像Microsoft Office 之类的最终用户产品均可以使用这些文件[8],这是该方法的便利之处。然而在设计ActiveX 控件时,需要对属性值和控件初始状态进行维护,因此需额外增加一定的程序代码;同时ActiveX 控件仍然与客户端使用同一进程和执行线程,同样有线程阻塞的风险。
图6 基于ActiveX 控件编程方法运行效果
ActiveX EXE 编程方法也是基于ActiveX 技术,只是将业务和部件编译成.EXE 文件在后台运行,为其他应用程序提供服务。它的具体实现方法为:
1) 创建ActiveX EXE 工程,工程描述为“KEYSI GHT 34470A Digit Multimeter Component”;
2) 向工程中添加VISA 模块;
3) 用类生成器使用工具添加VISAAddress 属性、Connect 方法、SetFunction 方法、GetValue 方法和Complete 事件。相应的代码同ActiveX 控件编程方法中一致;
4) 编译并运行;
5) 新建工程,添加窗体,在窗体中按图7 放置控件;
图7 ActiveX EXE 编程方法窗体设计
6) 在“引用”窗口将ActiveX EXE 部件引入工程中,如图8 所示;
图8 引用ActiveX EXE 部件
7) 在窗体模块的声明部分定义类变量:
Private WithEvents cKS34470A1 As clsKS34470A
并在窗体Load 事件中创建类:
Set cKS34470A1 = New clsKS34470A
8) 在窗体模块中“连接”按钮的Click 事件中,设置类的VISAAddress 属性,调用Connect 方法连接程控仪器,调用SetFunction 方法设置仪器为VDC测量功能;在定时器Timer 事件中调用GetValue 方法读取测量结果,在Complete 事件中显示。
基于此编程方法的运行效果如图9 所示。ActiveX EXE 编程方法具有与Active 控件编程相同的优点,除此外,ActiveX EXE 还可以在远程计算机上运行,为多个应用程序提供服务。ActiveX EXE 同样需要一定量的代码维护类的创建和终止。另外,ActiveX EXE 使用自身的进程,与客户端进程是分开的,不会出现阻塞现象,但ActiveX EXE 与客户端是进程间通信,访问速度没有进程间通信快速。
图9 基于ActiveX EXE 编程方法运行效果
通过以上分析,对三种编程方法进行汇总对比,其各自优缺点的最终对比情况归纳为表1。
表1 三种编程方法优缺点对比
三种编程方法均能实现控制要求,各有特点,设计时应根据需求适当选用。
实例中所述的三种设计方法皆是基于VB 的程控仪器编程的,对其各自的代码量、可移植、线程阻塞和进程使用几个方面进行了对比分析,其结论可为程序开发者选择合适的设计方法提供参考依据。采用这些编程方法研制的多种自动化测试系统,实现了在计算机控制下协同工作的设计要求,自动化程度显著提高,在实际应用中运行稳定,切实提高了企业生产效率。