基于NI,TestStand的混合编程技术探究

2022-03-19 09:10:00 | 浏览次数:

【摘要】随着通用自动测试系统平台的发展,开发者需要统筹管理越来越多的板卡、分立仪器和应用程序,这时多语言混合编程的问题是无法避免的。本文在研究讨论传统多语言混合编程的解决方案的基础上,介绍了NI TestStand架构及工作原理,提出了使用NI TestStand在解决测试领域多语言混合编程方面所具有的优势,并举实例简要说明了如何采用NI TestStand重新构架已有测试系统。

【关键词】通用自动测试系统平台;NI TestStand;多语言混合编程;动态链接库

1.引言

目前,通用测试技术由于快速可靠、机动灵活、高效低费,已经成为国际上航空航天及武器装备测试的主流技术途径,通用自动测试系统平台是自动测试系统发展的方向。在测试数据获取方面,通用测试系统平台前端会使用多种类型传感器,通过矩阵开关与后级数据采集系统相连;在数据采集系统中会相应使用多种类型的信号调理电路及数据采集板卡;同时,所有的测试系统都需要使用多种类型的高精度分立仪器测试产品的性能或为测试对象提供电源、激励等信号;在某些测试中,会使用各种总线与被测对象或分立仪器完成通讯功能;为完善测试功能,某些测试方法需要使用嵌入式技术等等;获得测试数据后要对数据进行存储、分析、输出等管理。

以上所叙述的诸多应用是无法只使用一种或两种开发语言就能完成的。例如最为广泛使用的开发语言是VC++,但在数据采集卡操作、分立仪器控制、界面美化、开发工作强度等方面其性能远不如基于标准C的LabWindows/CVI,但是LabWindows/CVI无法调用使用VC++编写的动态链接库。又如NI公司出品的、可以由上位机直接操作的FPGA板卡只能使用LabVIEW开发。再如C/C++、LabVIEW等传统编写虚拟仪器所使用的语言,其数据处理能力都十分有限,这时如果调用MATLAB中的函数处理采集到的数据就会使得整个测试系统具有较广的适用范围。因此,在通用自动测试系统平台的开发中,多语言混合编程是无法回避的问题。

2.传统多语言混合编程解决方案

目前使用最广泛的Windows操作系统为多语言混合编程提供了多种解决方案。普遍适用的有动态链接库技术,COM组件技术。

动态链接库DLL(Dynamic Link Library)是一种基于Windows的程序模块,它提供了一种方法,使进程可以调用不属于其可执行代码的函数。当一个函数被导出时,它被加入到动态链接库所包含的一个表中。此表包含了所有导出函数的位置,可以用来查找和调用这些函数,而调用DLL的应用程序本身并不包含这些函数的执行代码[1]。

COM组件技术不依赖特定的语言。COM标准采用的是二进制代码级的标准,COM对象把OOP语言中的对象封装起来,并提供一致的接口,使得它可以被各种不同的语言所使用,COM的语言无关性实际上为跨语言合作开发提供了统一标准,差不多每种语言在实现时都提供了对COM的支持,如Visual C/C++、Visual Basic、Visual C++、Delphi、C++ Builder等都支持COM组件的开发和使用。

这两种技术虽然功能强大,但也都有自己的技术缺陷。DLL的主要缺点有:

(1)若多DLL文件中函数名称相同将引起软件冲突;

(2)各编译器对C++函数的名称修饰可能不兼容;

(3)DLL与可执行文件存在依赖关系。虽然DLL技术的缺点就是COM组件技术的优点[2],但COM组件的开发要求测试系统开发人员具有较高的计算机软硬件运行原理的理论基础,同时需要再学习新的开发工具。因此,良好的通用自动测试系统平台中多语言混合编程的解决方案应兼具DLL技术的易用性和COM组件技术的灵活性,同时要考虑是否适用于测试领域,要做到综合而不庞杂。

3.NI TestStand架构及特点

3.1 NI TestStand架构

在测试领域,NI公司出品的TestStand软件为自动测试系统软件的多语言混合编程提供了专用解决方案。

NI TestStand是一种随时可运行的测试管理软件,用于测试序列的开发、管理和执行。模块化的TestStand架构主要由以下组件组成:TestStand引擎、序列编辑器、操作界面和组件适配器,如图1所示。

在TestStand架构中,TestStand引擎处于核心地位。TestStand引擎是一组动态链接库,其出口为创建、编辑、运行、调试测试序列提供了大量的ActiveX应用程序接口(API)。事实上,TestStand的序列编辑和用户界面的控制就使用了TestStand API。这就意味着任何支持ActiveX自动化服务器的编程环境,都可以调用TestStand API。TestStand引擎还可以处理顺序、循环、限制校验、数据配置、用户处理等诸如此类的测试任务。引擎在执行速度上进行了优化并采用了更为灵活的设计。

TestStand的序列编辑器和操作界面均为ActiveX客户端,利用TestStand API来完成诸如创建、编辑、执行和调试测试程序序列的操作。

TestStand适配器模块的功能就是连接引擎和外部测试程序开发环境,当调用外部代码时,TestStand使用适配器模块测定代码模块的类型、调用协议、参数列表和如何传递参数。通过模块适配器,TestStand与所有主流测试编程环境兼容,如LabVIEW、LabWindows/CVI、Measurement Studio组件和微软Visual Basic和Visual C++等。它还能调用任何编译过的动态链接库(DLLs)、ActiveX自动化服务器和可执行文件,甚至传统开发语言如HTBasic、ATLAS、HP_VEE等[3]。

在TestStand适配器模块中拥有三种权限等级的变量:局部变量(Local Variable,在同一序列文件中保存、传递数据)、全局变量(Global Variable,在同一工程下的不同序列文件间保存、传递数据)和工作站变量(Station Global Variable,在同一工作主机下不同工程间保存、传递数据)。它们是在不同语言间传递数据的中介。以局部变量为例,TestStand的工作方式如图2所示。在TestStand引擎下可以挂接多个序列,每个序列由多个步骤组成,而单个序列中使用不同语言的不同步骤间数据交换的中介就是在序列编辑器中某一提前定义好的TestStand局部变量。

多语言不同测试步骤间传递数据的原理

3.2 NI TestStand的特点及一般开发方式

TestStand继承、整合了传统解决方案的特点:(1)适应性强,TestStand与各种开发平台能够实现无缝连接;(2)测试系统软件的可扩展和可维护性强,软件架构一旦建立,将各测试步骤的接口进行定义,后期维护人员可以参照标准进行扩展或维护;(3)可实现快速二次开发,测试程序的架构一旦建立,对其进行二次开发时,只需更改相关测试步骤、生成新的动态链接库、挂接到原有程序上,无需重新编译打包。

在此基础上,相对于传统解决方案在测试领域进行了扩展,它具有以下四点突出优势:

(1)TestStand很好的融合了ActiveX技术(ActiveX技术是基于COM组件技术的)和DLL技术,并且它不仅入门简单、操作简易、开放性好,这使得测试人员在需要混合编程时上手更快从而更能专注于测试本身。

(2)TestStand这一软件的设计思路决定了它最擅长的是测试流程管理,所以在很好解决多语言混合编程的基础上不会使得测试系统过于庞杂难以管理。

(3)继承性好,在开发大型综合测试系统时,原本不属于TestStand架构的专项测试系统中的测试方法只需经过简单修改即可移植到新系统中。

(4)在生产线上,TestStand的并行测试能力可运行批测试(即测量一种PCB)或异步测试(即同时对一种被测器件测量不同的功能)。线程优先功能使处理能力得到优化,并且可同时执行多种过程。

在实际应用中,一个测试项目首先被分割为若干个测试步骤。然后可以采用两种方式开发测试代码:一种方式是每个步骤都采用恰当的开发平台和语言编写,而后生成动态链接库形式的模块组件;除此之外,TestStand的适配器模块可以打开指定的应用程序开发环境(ADE),在其中为代码模块创建新的源代码,然后在该开发环境中指示新创建的代码,即通过TestStand的模板按步骤生成测试所需的代码。前一种方法是目前普遍使用的方法,适用于多人合作开发同一测试系统软件,这样每人都可以适用自己擅长的语言编写相应步骤,然后生成各自的动态链接库挂接在主程序上编辑成一个测试序列文件,通过事先设计好的接口和全局变量完成数据交换;后一种方法适用于掌握多语言编程技术的人员实现快速开发。无论使用哪种方式编辑测试步骤,最终进行测试时,只需运行一个序列文件,TestStand引擎就会按流程通过每个步骤的所涉及的接口适配器调用相应外部代码来完成测试任务。值得一提的是,TestStand的代码生成模板和测试步骤模板都是可编辑的,这大大增加了测试程序编写的灵活性。

4.使用NI TestStand软件解决混合编程实例

以某图像式直线运动物体运动参数测试系统为例,其系统构成如图3所示。当激光光幕投射到运动物体上时,粘贴在运动物体上的原向反射片将返回其中一部分激光,这反映在高速相机采集到的图像上是一个光斑。最后在计算机中使用MATLAB处理采集到的图像从而分析出运动物体的运动参数。

该测试系统软件开始运行首先执行硬件自检,读取相机和数采卡的运行状态。自检通过后对相机、数采卡、软件界面初始化并打开MATLAB后将其最小化。此时可以在系统校准后配置数据采集参数并采集数据,也可以导入原始图像进行数据处理。当所有操作都完成后,释放掉所用资源并退出。原软件主体采用LabWindows/CVI开发,数据采集部分因接口问题需要使用VC++编写,数据处理使用MATLAB所提供的函数。在原有架构中,主程序通过调用VC++编译生成的可执行文件完成数据采集和即时回读数据并显示,通过ActiveX控件技术调用MATLAB中函数完成数据的处理。

这样的架构虽然能够完成测试任务,却存在三个问题:(1)主程序与数据采集程序完全是两个独立的程序,这样一方面VC++编写的程序界面十分不美观,更重要的是数据的交换十分不方便——这是编写软件时比较忌讳的;(2)通过ActiveX控件技术调用MATLAB函数,这种方法需要MATLAB运行环境,这也就是开机初始化时需要打开MATLAB并将其最小化的原因;(3)纵观整个程序,仅主程序就有几千行,程序结构不清晰,即程序易读性差、可扩展性差,使得该软件的修改或二次开发都十分困难。

使用NI TestStand软件即可解决以上问题。基于TestStand的该测试系统架构如图4所示。

主程序使用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运行环境,降低了资源开销,增加了程序的灵活性[4]。

经过上述操作后将多个分立的程序组装成一个大系统。在用户界面和一般测试步骤的编辑方面发挥LabWindows/CVI界面美观、编辑简易等优势,在数据的采集、处理方面使用VC++辅助开发,运用NI TestStand来传递变量、指针使得各语言所开发的功能无缝连接起来,数据处理方面发挥MATLAB在计算、分析上的优势。从整体来看,各个步骤采用分部开发、统一挂接的方式,结构清晰、定位迅速。在局部修改或者二次开发时,只需要修改相应部分,重新生成动态链接库、挂接到主程序上。事实上,由于各个部分彼此独立,只需做少许修改即可移植到类似的测试系统中,避免直接复制修改代码所导致的代码风格混乱、函数或参数冲突。

5.总结

目前,测试系统无论硬件还是软件,其发展趋势都是综合化、模块化。即尽可能在一个测试系统中包含更多的测试项目,并且每个测试系统都细化为多种模块,通过模块间的组合实现不同的功能,在功能需要调整时能够快速完成配置,稳定高效的完成测试任务。NI TestStand顺应了时代潮流。

本文着重讨论了在编写通用自动测试系统平台时面临的多语言混合编程问题的解决方案。提出了NI TestStand在解决测试系统混合编程方面所具有的优势。并举例说明了如何采用NI TestStand重新构架已有测试系统。该例虽然称不上“通用”的“平台”,却已经可以说明NI TestStand架构的优越性,管中窥豹,可见一斑。因此,在通用自动测试系统平台中应用NI TestStand是可行的,先进的和有意义的!

参考文献

[1]郭雅萌.LabWindows/CVI与PCI数据采集卡通信技术研究[J].电子测量技术,2007,30(5):78-79.

[2]刘晓刚.COM技术在毕业设计中的应用[J].武汉科技学院学报,2005,18(11):118-119.

[3]谢立鹏.应答器测试关键技术与测试管理系统的研究[D].北京:北京交通大学,2008.

[4]宋广东.基于COM组件的VB与MATLAB混合编程实现振动信号处理[J].山东科学,2010,23(1):33-34.

作者简介:刘辉(1986—),河北衡水人,中北大学硕士研究生。

推荐访问: 探究 编程技术 混合 NI TestStand