钟建林,齐玉东,辛旭光,何 友
(海军航空工程学院,山东 烟台 264001)
开关系统是ATS(自动测试系统)中信号传输与分配的中枢,测试程序通过开关对测试资源与UUT(被测设备)之间的信号通道或激励通道进行控制,实现测试过程的自动化和程序化。为了降低开发、维护和升级的成本,大型装备自动测试系统在测试软件中采取仪器可互换技术。一方面可以利用现有的物理资源,减少采购费用;另一方面,当测试资源升级、更换时,测试程序无需更改,大大减少了开发和维护费用。大型装备自动测试系统通常包含多个开关资源,这些开关资源可能来自不同的厂商,总线形式不一,软件控制接口各异,需要对这些开关资源的软件接口进行统一,实现测试程序TPS与具体开关资源的无关,进而实现开关类仪器的可互换。
基于ini配置文件的自动测试系统实现了仪器可互换,其软件体系结构如图1。其中资源需求描述是一个ini文件,描述了仪器所属类的类名、逻辑仪器名、物理仪器名、资源描述符、物理驱动程序名等,物理仪器在该文件中进行“软注册”。系统在启动时根据仪器类名搜索与测试主机相连的该类物理仪器,并使该类物理仪器处于待机状态,随时等待程控指令。测试程序通过逻辑仪器名对物理仪器进行控制,因而测试程序中不会出现物理仪器有关的信息,实现了测试程序与具体物理仪器无关[1]。
测试项目定义文件以ini文件的格式定义了当前UUT的测试项目信息,一个TPS(测试程序集)对应一个测试项目定义文件。每个测试项目具有标准格式的信息,如测试项目代号、(子)测试项目名称、测试项目级别、对应测试函数名、函数调用参数、是否加电测试等。测试程序主框架根据测试项目定义文件实现对TPS测试项目的属性识别和有效管理。
测试数据模板是一个Excel表格,测试程序主框架根据该表数据与相应测试项目的测试数据进行比较,判断测试是否通过,并通过测试项目列表格式化显示测试结果。
测试主框架内核包括测试引擎、测试数据管理等与软件平台有关的函数,其中测试引擎主要包括测试程序主框架的函数,实现对类驱动的动态调用,完成TPS的仪器无关性及系统集成[2]。
图1 自动测试系统软件结构
仪器可互换技术最初由IVI联盟提出,其核心是将仪器驱动程序分为上下两层,即上层的仪器类驱动程序和下层的仪器物理驱动程序。图1中,TPS与类驱动动态链接库DLL之间通过隐含连接方式调用DLL中定义的导出变量和导出函数。而类驱动与物理驱动动态库采用显式链接方式。底层代码由仪器供货商提供,直接与仪器会话,并被物理驱动程序所调用。物理驱动导出函数与类驱动导出函数是一一对应的,它们的函数名以及参数的数量、定义均相同,但函数名的前缀不同(函数名前缀在资源需求描述文件中定义)[3-4]。测试程序只与类驱动打交道,不包含物理驱动中的函数和变量名,使得测试程序与具体仪器无关,当需要更换仪器资源时,只需要在资源需求描述ini文件中进行注册,并将类驱动与相应的物理驱动重新链接即可,实现了仪器的可互换。
NI公司的LabWindows/CVI以ANSI C为核心,它的集成化开发平台、交互式编程方法、丰富的面板功能以及访问ini文件、多线程、创建库文件、DDE动态数据交换等高级编程手段使其自身功能强大,应用方便,成为工程技术开发人员建立ATS首选的软件开发工具[5]。在某大型ATS项目开发中,除了矩阵开关之外,使用了单刀单掷开关SPST、单刀双掷开关SPDT、单刀四掷开关SP4T、单刀六掷开关SP6T共4类、5个PXI开关模块,它们同属于Switch开关类仪器,实际型号分别是NI PXI 2568,NI PXI 2566,NI PXI 2594,CETC PXI AV6943,其中 NI PXI 2566模块两个,其他模块各一个。这些开关模块包含的开关个数不相同,不同的开关模块提供的软件接口也不相同。
在熟悉仪器类的共有功能和现有或将来可能要用到的仪器特有功能的基础上,对类驱动进行统一规划、构造类公共函数和类特有函数是类驱动函数设计的第一步。其中类公共函数是仪器共有的函数,如初始化、复位、自检、关闭等操作,而类特有函数是该类仪器特有的函数。开关类特有函数一般有连接、断开和状态查询3种。
在开关类驱动函数的设计中,应注意参数数量和类型尽可能统一、合理、简单。在尽量覆盖下层物理驱动参数的基础上,有所归纳和提炼,便于测试程序编写人员对函数的理解和TPS调用。具体到开关驱动,尤其要清楚每个驱动函数对开关操作后的状态,即确保开关状态的可控和可观,使程序对信号通道和激励通道实现有效且准确的控制。
类驱动的公共函数包括 Init(),Reset(),Selftest(),Close()。通常,仪器供应商都提供了相应的底层驱动程序,因此这些类公共函数的实现比较简单,直接根据逻辑仪器名加载相应的物理驱动程序即可。但是要注意Init(),Reset()函数执行后仪器的状态,例如,NI 2594(SP4T)初始化后 ch0通道接通,ch1,ch2,ch3 通道断开;AV6943(SP6T)初始化后全部通道处于断开状态;2566(SPDT)初始化后全部NO(常开端)断开,NC(常闭端)闭合;2568(SPST)初始化后全部开关断开。测试程序的编写人员必须掌握这些情况。
在类驱动的设计中,将重点放在类特有函数上。对TPS而言,在该系统中用到的开关功能包括连接、断开和状态查询,因此分别设立Connect,Disconnect,Getstate 3种类特有函数,其定义分别为:
其中,LogiSess是逻辑仪器句柄,Channel是指定的开关,Pol是该开关的某一通道号,PolConnected返回接通的通道号。规定开关Channel和通道Pol均从整数0开始编号。对于不同类型的开关,其参数含义如表1。其中,X表示0~N的某一整数,Y表示0~M的某一整数。SPDT的连接或断开指的是连接或断开NO端,其查询函数返回1则表明NO处于接通状态,其NC端的控制状态可以完全由NO的控制和状态确定。
表1 开关函数的参数范围
在下层的物理驱动中,则必须根据类驱动的参数对仪器厂商提供的底层驱动进行适当的封装,通常包括参数的重新定义、类型转换、统一约定等。例如,仪器供货商为PXI AV6943模块提供的底层连接函数为:AV6943_switchStatus(Handle hHandle,ViUInt32 unSwitchNum,ViUInt32 unStatus,ViString strErrMsg)。hHandle为仪器句柄,unSwitchNum为开关号,unStatus参数范围为 0~6(0:全部断开;1~6:选通一路),由于仪器句柄、通道参数类型与相应的类驱动函数均不同,这要在物理驱动函数中进行类型转换。另外,类驱动中通道Pol从0开始编号,必须将unStatus参数的0~5定义为6个选通通道,而全部断开可定义为6,从而保持与类驱动参数定义的一致性。
以下是AV6943开关连接函数的实现代码:
基于IVI的仪器类驱动器对物理仪器功能进行了合理的归纳和提炼,为TPS提供统一、易用的软件接口。物理驱动程序对底层驱动程序进行适当的封装,CVI测试引擎实现类驱动与物理仪器之间的动态链接。当增加或更换新的开关模块时,测试程序无需更改,只需在程序中添加新模块对应的物理驱动程序并编译链接即可,其相应的类驱动程序也无需改动,实现了TPS的硬件无关性和仪器的可互换[6]。
[1]刘金宁,孟 晨,崔少辉.基于配置文件的虚拟仪器测试软件设计与实现[J].电力自动化设备,2005(1):50-53.
[2]钟建林,何 友,任献彬.基于LabWindows/CVI的ATS软件框架[J].电子技术应用,2008(4):70-72.
[3]牛双诚,任献彬.仪器可互换技术研究[J].测控技术,2003(2):1-3.
[4]王国华,孟晓风,赵瑞贤.一种基于开放式系统的仪器互换性实现[J].中国测试技术,2006,32(4):11-14.
[5]宋宇峰.LabWindows/CVI逐步深入与开发实例[M].北京:机械工业出版社,2003.
[6]任献彬,许爱强.TPS重用性及互操作性设计技术[J].电子测量技术,2003(2):13-14.