张 喆,郑 宾
(中北大学 电子测试技术国家重点实验室,太原 030051)
在测试数据获取方面,通用测试系统平台前端会使用多种类型传感器,通过矩阵开关与后级数据采集系统相连;在数据采集系统中会相应使用多种类型的信号调理电路及数据采集板卡;同时,所有的测试系统都需要使用多种类型的高精度分立仪器测试产品的性能或为测试对象提供电源、激励等信号;在某些测试中,会使用各种总线与被测对象或分立仪器完成通讯功能;为完善测试功能,某些测试方法需要使用嵌入式技术等等。获得测试数据后要对数据进行存储、分析、输出等管理。
以上所叙述的诸多应用是无法只使用一种或两种开发语言就能完成的。例如最为广泛使用的开发语言是VC++,但在数据采集卡操作、分立仪器控制、界面美化、开发工作强度等方面其性能远不如基于标准C的LabWindows/CVI,但是LabWindows/CVI无法调用使用VC++编写的动态链接库。又如NI公司出品的、可以由上位机直接操作的FPGA板卡只能使用LabVIEW开发。再如C/C++、LabVIEW等传统编写虚拟仪器所使用的语言,其数据处理能力都十分有限,这时如果调用MATLAB中的函数处理采集到的数据就会使得整个测试系统具有较广的适用范围。因此,在通用自动测试系统平台的开发中,多语言混合编程是无法回避的问题。
目前使用最广泛的Windows操作系统为多语言混合编程提供了多种解决方案。普遍适用的有动态链接库技术,COM组件技术。
动态链接库DLL(Dynamic Link Library)是一种基于Windows的程序模块,它提供了一种方法,使进程可以调用不属于其可执行代码的函数。当一个函数被导出时,它被加入到动态链接库所包含的一个表中[1]。此表包含了所有导出函数的位置,可以用来查找和调用这些函数,而调用DLL的应用程序本身并不包含这些函数的执行代码[2]。
COM组件技术不依赖特定的语言。COM标准采用的是二进制代码级的标准,COM对象把OOP语言中的对象封装起来,并提供一致的接口,使得它可以被各种不同的语言所使用,COM的语言无关性实际上为跨语言合作开发提供了统一标准,差不多每种语言在实现时都提供了对 COM的支持,如 Visual C/C++、Visual Basic、Visual C++、Delphi、C++ Builder 等都支持 COM 组件的开发和使用[3]。
这两种技术虽然功能强大,但也都有自己的技术缺陷。DLL的主要缺点有:(1)若多DLL文件中函数名称相同将引起软件冲突;(2) 各编译器对C++函数的名称修饰可能不兼容;(3)DLL与可执行文件存在依赖关系。虽然DLL技术的缺点就是COM组件技术的优点[4],但COM组件的开发要求测试系统开发人员具有较高的计算机软硬件运行原理的理论基础,同时需要再学习新的开发工具。因此,良好的通用自动测试系统平台中多语言混合编程的解决方案应兼具DLL技术的易用性和COM组件技术的灵活性,同时要考虑是否适用于测试领域,要做到综合而不庞杂。
通过对传统多语言很合编程解决方案和国外先进自动测试系统的研究,可以看到一类测试系统管理软件能够很好地融合DLL技术及COM组件技术,同时解决了大型测试系统的程序模块化管理的问题。这其中又以美国罗马之星中所使用的NI TestStand应用最为广泛。
NI TestStand是NI公司发布的一款测试管理软件。它为测试开发和执行提供了一个核心的框架省去了通常的测试执行的开发任务[5]。
通常的测试执行的开发任务。强模块化的TestStand架构主要由以下组件组成:TestStand引擎、序列编辑器、操作界面和组件适配器,如图1所示。
图1 NI TestStand架构
在TestStand架构中,TestStand适配器模块的功能就是连接引擎和外部测试程序开发环境,当调用外部代码时,TestStand使用适配器模块测定代码模块的类型、调用协议、参数列表和如何传递参数。通过模块适配器,TestStand与所有主流测试编程环境兼容,如LabVIEW、LabWindows/CVI、Measurement Studio组件和微软Visual Basic和Visual C++等。它还能调用任何编译过的动态链接库(DLLs)、ActiveX自动化服务器和可执行文件,甚至传统开发语言如HTBasic、ATLAS、HP_VEE 等[6]。
在TestStand适配器模块中拥有3种权限等级的变量:局部变量(Local Variable,在同一序列文件中保存、传递数据)、全局变量(Global Variable,在同一工程下的不同序列文件间保存、传递数据)和工作站变量(Station Global Variable,在同一工作主机下不同工程间保存、传递数据)。它们是在不同语言间传递数据的中介。以局部变量为例,TestStand的工作方式如图2所示。在TestStand引擎下可以挂接多个序列,每个序列由多个步骤组成,而单个序列中使用不同语言的不同步骤间数据交换的中介就是在序列编辑器中某一提前定义好的TestStand局部变量。
图2 TestStand在同一序列多语言不同测试步骤间传递数据的原理
TestStand继承、整合了传统解决方案的特点:(1) 适应性强,TestStand与各种开发平台能够实现无缝连接;(2) 测试系统软件的可扩展和可维护性强,软件架构一旦建立,将各测试步骤的接口进行定义,后期维护人员可以参照标准进行扩展或维护;(3) 可实现快速二次开发,测试程序的架构一旦建立,对其进行二次开发时,只需更改相关测试步骤、生成新的动态链接库、挂接到原有程序上,无需重新编译打包。
在此基础上,相对于传统解决方案,NI TestStand在测试领域进行了扩展,它具有以下4点突出优势:
(1) TestStand很好的融合了ActiveX技术(ActiveX技术是基于COM组件技术的)和DLL技术,并且它不仅入门简单、操作简易、开放性好,这使得测试人员在需要混合编程时上手更快从而更能专注于测试本身。
(2) TestStand这一软件的设计思路决定了它最擅长的是测试流程管理,所以在很好解决多语言混合编程的基础上不会使得测试系统过于庞杂难以管理。
(3)继承性好,在开发大型综合测试系统时,原本不属于TestStand架构的专项测试系统中的测试方法只需经过简单修改即可移植到新系统中。
(4) 在生产线上,TestStand的并行测试能力可运行批测试(即测量一种PCB)或异步测试(即同时对一种被测器件测量不同的功能)。线程优先功能使处理能力得到优化,并且可同时执行多种过程。
在实际应用中,一个测试项目首先被分割为若干个测试步骤。然后可以采用两种方式开发测试代码:一种方式是每个步骤都采用恰当的开发平台和语言编写,而后生成动态链接库形式的模块组件;除此之外,TestStand的适配器模块可以打开指定的应用程序开发环境(ADE),在其中为代码模块创建新的源代码,然后在该开发环境中指示新创建的代码,即通过TestStand的模板按步骤生成测试所需的代码。前一种方法是目前普遍使用的方法,适用于多人合作开发同一测试系统软件,这样每人都可以适用自己擅长的语言编写相应步骤,然后生成各自的动态链接库挂接在主程序上编辑成一个测试序列文件,通过事先设计好的接口和全局变量完成数据交换;后一种方法适用于掌握多语言编程技术的人员实现快速开发。无论使用哪种方式编辑测试步骤,最终进行测试时,只需运行一个序列文件,TestStand引擎就会按流程通过每个步骤的所涉及的接口适配器调用相应外部代码来完成测试任务。值得一提的是,TestStand的代码生成模板和测试步骤模板都是可编辑的,这大大增加了测试程序编写的灵活性。
以某图像式直线运动物体运动参数测试系统为例,其系统构成如图3所示。当激光光幕投射到运动物体上时,粘贴在运动物体上的原向反射片将返回其中一部分激光,这反映在高速相机采集到的图像上是一个光斑。最后在计算机中使用MATLAB处理采集到的图像从而分析出运动物体的运动参数。
图3 某图像式运动物体运动参数测试系统构成图
该测试系统软件开始运行首先执行硬件自检,读取相机和数采卡的运行状态。自检通过后对相机、数采卡、软件界面初始化并打开MATLAB后将其最小化。此时可以在系统校准后配置数据采集参数并采集数据,也可以导入原始图像进行数据处理。当所有操作都完成后,释放掉所用资源并退出。原软件主体采用LabWindows/CVI开发,数据采集部分因接口问题需要使用VC++编写,数据处理使用MATLAB所提供的函数。在原有架构中,主程序通过调用VC++编译生成的可执行文件完成数据采集和即时回显数据,若想对数据进行高级处理,需要先将数据存储在硬盘上,然后CVI编写的主程序下通过ActiveX控件技术调用MATLAB中函数完成处理。
这样的架构虽然能够完成测试任务,却存在3个问题:(1)主程序与数据采集程序完全是两个独立的程序,这样一方面VC++编写的程序界面十分不美观,更重要的是数据的交换十分不方便——这是编写软件时比较忌讳的;(2)通过ActiveX控件技术调用MATLAB函数,这种方法需要MATLAB运行环境,这也就是开机初始化时需要打开MATLAB并将其最小化的原因;(3)纵观整个程序,仅主程序就有几千行,程序结构不清晰,即程序易读性差、可扩展性差,使得该软件的修改或二次开发都十分困难。
使用NI TestStand软件即可解决以上问题。基于TestStand的该测试系统架构如图4所示。
图4 基于TestStand的图像式运动物体运动参数测试系统架构
主程序使用LabWindows/CVI编写,数据采集程序使用VC++编写。具体步骤为:首先考察整理出整个测试系统中作为不同函数间数据交换的变量,并在TestStand下创建相应的局部变量或全局变量。然后将已有的函数按功能分割成多个分立程序,确保这些程序能够独立完成某一功能,如相机配置、相机初始化等,再将能够实现功能的主要函数导出到动态链接库中。最后将各个分立的测试 步骤挂接到一个序列里,并将各函数接口中的变量与之前在TestStand中创建的变量对应起来。
主程序调用MATLAB函数的方法不再调用可执行文件,变更为LabWindows/CVI通过TestStand的C/C++接口适配器调用在MATLAB环境下生成的COM组件。具体方法为:使用MATLAB的Deployment Tool构建Generic COM Component类型的工程,然后在该工程中添加新类(Class),再将含有图像处理算法的M文件加入该类中,随后在MATLAB命令框中输入面mbuild_-setup,根据提示选择VC编译器,注意该命令中间“_”为空格,最后在Deployment Tool的Action中选择Add MCR后生成多个文件,其中DLL文件可由TestStand调用,可执行文件用于在未安装MATLAB的环境中注册该COM组件。该方法不需要MATLAB运行环境,降低了资源开销,增加了程序的灵活性[7]。
经过上述操作后将多个分立的程序组装成一个大系统。在用户界面和一般测试步骤的编辑方面发挥LabWindows/CVI界面美观、编辑简易等优势,在数据的采集、处理方面使用VC++辅助开发,运用NI TestStand来传递变量、指针使得各语言所开发的功能无缝连接起来,数据处理方面发挥MATLAB在计算、分析上的优势。从整体来看,各个步骤采用分部开发、统一挂接的方式,结构清晰、定位迅速。在局部修改或者二次开发时,只需要修改相应部分,重新生成动态链接库、挂接到主程序上。事实上,由于各个部分彼此独立,只需做少许修改即可移植到类似的测试系统中,避免直接复制修改代码所导致的代码风格混乱、函数或参数冲突。
以上所举实例例虽称不上“通用”的“平台”,却已经可以说明使用NI TestStand架构在解决测试领域多语言混合编程问题中的的优越性,管中窥豹,可见一斑。因此,在通用自动测试系统平台中应用NI TestStand是可行的,先进的和有意义的!从另一方面讲,使用TestStand能够在测试领域解决混合编程问题的同时兼顾改进测试系统整体软件架构。
目前,测试系统无论硬件还是软件,其发展趋势都是综合化、模块化。即尽可能在一个测试系统中包含更多的测试项目,并且每个测试系统都细化为多种模块,通过模块间的组合实现不同的功能,在功能需要调整时能够快速完成配置,稳定高效的完成测试任务。与此同时要降低开发总体成本,缩短开发、升级时间[8]。从这几点需求来看,测试管理软件的出现顺应了时代潮流,有必要引入国内,应用于通用自动测试系统中。
这种解决方案不足的是测试管理软件价格都比较昂贵并且成熟的产品均非我国自主研发。因此,希望有能力的科研单位早日研发出属于我国自主知识产权的测试管理软件,使我国国防事业迈上一个新的台阶!
[1]耿娟.DLL在LabWindows/CVI的虚拟仪器中的应用[J].微计算机及信息,2006,22(22):115-116.
[2]郭雅萌.LabWindows/CVI与PCI数据采集卡通信技术研究[J].电子测量技术,2007,30(5):78-79.
[3]郭雅萌.基于COM组件的通用故障诊断专家系统开发[J].微计算机信息,2006,22(2):190-191.
[4]刘晓刚.COM技术在毕业设计中的应用[J].武汉科技学院学报,2005,18(11):118-119.
[5]王学奇.开放性测试软件体系结构研究[J].微计算机信息,2005,21(10):145-146.
[6]谢立鹏.应答器测试关键技术与测试管理系统的研究[D].北京:北京交通大学,2008.
[7]宋广东.基于COM组件的VB与MATLAB混合编程实现振动信号处理[J].山东科学,2010,23(1):33-34.
[8]王石记.新一代综合自动测试标准体系研究[J].计算机测量与控制,2011,19(4):33-34:749-775.