基于Python语言的自动化测试系统的设计与实现
黄建军+李宥谋+刘婧+周欢
摘 要: 通过分析现代工业生产对自动化测试系统的要求,提出一种基于面向对象的编程语言Python构建的自动化测试系统。利用Python语言的高效、灵活和简洁等特点,结合Pyvisa,Pyivi和Web.py等扩展模块提供的强大功能,以及 IVI 和 VISA技术的后台支持,可以快速组建满足用户测试需求且高效的测试系统;其次利用NumPy,Matplotlib和PyQt4扩展模块能够准确地完成对测试数据的各种运算处理以及相关的图形界面显示等操作。结果表明,该系统具有高效性、通用性和扩展性,使用Python开发虚拟仪器与测试系统,代码简洁、层次清晰、周期性短,具有广泛的应用前景。
关键词: 测试系统; Python; Pyvisa; Pyivi; 可互换性
中图分类号: TN911?34; TP393 文献标识码: A 文章编号: 1004?373X(2017)04?0039?05
Design and implementation of automatic testing system based on Python
HUANG Jianjun, LI Youmou, LIU Jing, ZHOU Huan
(School of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710061, China)
Abstract: A kind of automatic testing system based on the object?oriented programming language Python is proposed by analyzing the requirement of the auto testing system for modern industrial production. With the background support of VISA and IVI technology, the efficient testing system satisfying the testing demands of users can be built quickly in combination with the efficient, flexible and concise characteristics of Python language, and the powerful functions of Pyvisa, Pyivi and Web.py extensional modules. Besides, the system can complete each operational processing of testing data and relevant GUI display accurately by means of NumPy, Matplotlib and PyQt4 modules. The result indicates that the system has high efficiency, universality and expansibility. The application of Python for developing the virtual instrument and testing system has the characteristics of concise code, clear hierarchy and short cycle. It has a broad application prospect.
Keywords: testing system; Python; Pyvisa; Pyivi; interchangeability
目前,多数虚拟仪器和测控平台的开发都使用LabVIEW图形化编程语言,LabVIEW在界面开发部分占据优势,但是LabVIEW调用Matlab的接口方法比较复杂,将二者很好的结合也有一定的难度,这使得LabVIEW在数据处理方面显现出不足。其次,后期系统扩展对LabVIEW代码进行修改的工作量较大,这对大型的测试系统来说很不利。基于LabVIEW的上述不足,本文提出使用Python脚本语言来编写可互换仪器测试系统。Python拥有丰富的扩展模块以及第三方的支持包,PyQt可以快速开发满足用户需求的GUI界面,NumPy相当于Matlab的Python版本,继承了Matlab的强大数据处理能力。Pyvisa 和Pyivi 是Python对NI?VISA和NI?IVI的封装工具包,对测试系统实现仪器接口的无关性和同类仪器的可互换性提供了很好的支持。Python面向对象结构化的编程可以把程序代码组织成逻辑块重复使用,这一特性也恰恰弥补了LabVIEW在编写测试系统中后期修改程序复杂这一缺陷。
1 系统组成
1.1 系统的硬件结构
测试系统由多个测试子系统组成,系统硬件连接如圖1所示,每个子系统都是一个相对独立的测试单元,由一台控制计算机、一台路由器和由该计算机控制的若干台设备仪器组成。控制计算机和LAN型接口的设备通过路由器连接到同一个局域网中,其他诸如USB,GPIB,RS 232等接口设备通过相应的接口总线与控制计算机相连,这样不同接口类型的设备仪器就直接或间接地接入到控制计算机,并由控制计算机来发现、配置和控制。各个测试子系统通过路由器和数据备份与存储服务器相连,组成整个测试系统的局域网。测试控制管理系统主机通过控制计算机的并口向各个测试子系统发送控制指令,使各个测试子系统在测试的某些阶段能够统一动作[1]。
1.2 系统的软件组成
该系统由以下5个主要模块构成,如图2所示。
仪器发现与驱动管理模块,负责对接入到控制计算机上的硬件设备仪器进行发现以及管理本地安装的IVI驱动,其次对仪器和具体IVI驱动进行相关信息的查询。
仪器测试模块分为VISA和IVI两个测试模块。VISA测试部分负责对驱动不满足IVI标准规范的仪器设备进行控制;IVI测试部分用于对驱动满足IVI标准规范的仪器进行控制。两部分相结合,使系统完成对不同驱动标准的仪器的通用功能的实现。
虚拟仪器模块,集成了某类仪器的通用功能,负责对实体仪器的操作和对测试数据的结果进行处理和显示。测试系统中,虚拟仪器模块可根据需要进行扩充,根据测试对象的不同选调对应的虚拟仪器模块。
数据存储管理模块,负责测试系统在某一项测试中所有测试信息的存储,包括测试项目名称、项目测试人员、测试环境、测试时间,测试地点和测试结果数据。该模块和数据备份与存储服务器采用C/S模式,其中S端(服务器端)运行在数据备份与存储服务器上,C端(客户端)嵌入到虚拟仪器模块中,在测试结束时由测试系统启动与服务器端连接交互并完成数据存储与更新功能。
测试数据显示界面(Web)模块,提供测试界面的本地浏览器访问和远程浏览器访问模式,浏览器完成所有测试数据的实时显示。
2 Python扩展模块的说明
2.1 Pyvisa底层驱动库
Pyvisa 是对已有VISA 库进行的 Python 格式化封装的一个共享库,以 NI?VISA作为其包装的后台支撑,可以支持串口,GPIB,GPIB?VXI,VXI,TCP/IP,以及 USB 接口仪器。Python对VISA库的封装分为顶层(high?level)、中间层(middle?level)和底层(low?level)三层结构,顶层针对VISA资源管理器和资源的操作集合进行面向对象的Python化封装,资源管理器类中实现了对接入测试系统的资源进行自动检测。用户可以使用资源管理器类来打开实例化的资源派生类对象,资源类和派生类用Python 的行为方式访问底层资源的属性和方法;中间层采用Python的绑定方法(Bound Method)对VISA库函数的操作集合进行Python形式的封装,这一层的作用是将VISA共享库的操作函数用Python脚本来实现,这样用户就可以很方便地利用Python脚本调用这些函数,实现对相关仪器的控制;底层定义了每个函数的参数类型和返回值类型,所有函数都是针对VISA库采用静态方法进行定义封装,Pyvisa的具体封装结构如图3所示。
2.2 Pyivi应用程序接口API
Pyivi支持IVI?COM和IVI?C两种类型的驱动,是对测试主机上的所有IVI驱动进行的一层 Python形式的包装,能够满足符合IVI标准规范的仪器互换特性以及IVI引擎所提供的一些功能。Pyivi对两种类型的特定IVI驱动分别使用ctypes和comtypes进行分装,两种形式对IVI标准规范下的仪器的类驱动都进行了封装,应用程序通过调用IVI类驱动实现仪器的互换性。Pyivi通过ctypes类与IVI?C类型驱动进行通信,通过comtypes类与IVI?COM类型驱动进行通信。Pyivi使用工厂模式对两种类型驱动接口进行设计,首先将接口设计为一个抽象工厂类,定义仪器的共有属性。应用程序通过Pyivi调用IVI类驱动时,工厂类会根据应用程序传入的参数来选择IVI?C或者IVI?COM类型的IVI特定驱动进行底层驱动函数的调用。
Pyivi的接口设计如图4所示,图4中仪器类指Pyivi模块所支持的仪器类别,包括示波器类、频谱分析仪类和信号发生器类[2]。
3 系统模块功能实现
3.1 仪器发现与驱动管理模块的设计
程序导入Pyvisa,Pyivi模块,调用Pyvisa模块的资源管理器函数来扫描测试系统各接口上的仪器设备,调用Pyivi模块来查看管理测试主机的驱动,查询确定驱动的具体信息以便后续测试部分的需求,具体实现代码如下:
import pyvisa as visa
import pyivi
rm=visa.ResourceManager()
#打开本地的默认资源管理器,并以引用rm的形式返回
rm_list=rm.list_resources([query=u?*::INSTR])
#列出rm中所扫描到的硬件接口设备
openinstr=rm.open_resource
(resource_name,[access_mode= ,open_timeout=0])
#打开rm中的某一个硬件设备,并将会话资源以openinstr引用的形式返回
instrinfo=openinstr.query(′*IDN?′)
#查询打开仪器的详细硬件信息,保存在instrinfo中
instrmanufacturer=openinstr.manufacturer_name
#查詢仪器的厂商信息
instrmodelname=openinstr.model_name
#查询该仪器的具体型号
ivisoftmods=pyivi.software_modules
#列出本地安装的所有IVI特定驱动
tktdsmod=ivisoftmods[′tktds1k2k′]
#访问指定的 tktds1k2k 驱动
supinstrtype=tktdsmod.specialized_instrument_type()
#查询该驱动所支持的仪器类型
drivertype=tktdsmod.flavours()
#查询该驱动所属类型(IVI?C 或者IVI?COM)
supmodnames=tktdsmod.supported_instrument_models()
#该驱动所支持的仪器型号
通过上述代码,可以确定测试仪器的具体硬件信息和测试主机上的驱动类型以及驱动所支持的仪器类型。
3.2 仪器测试模块设计
仪器测试模块,VISA测试部分负责完成普通的测试功能,适用于驱动不满足IVI标准规范的设备;IVI测试部分适用于驱动符合IVI标准规范的设备,它既可以完成VISA部分的通用功能的测试,同时还能够满足仪器设备互换性的要求。以获取泰克TDS2410B示波器波形数值为例进行简要的代码说明如下:
VISA测试部分:
instr=rm.open_resource("USB0::0x0699::0x0368::c010850::INSTR")
vals=instr.query_binary_values(′curv?′,datatype=′d′, is_big_
endian=True)
其中,rm为资源管理器的引用,利用open_resource()方法建立与设备的连接,“USB0::0x0699::0x0368::c010850::INSTR”参数为本测试中连接示波器的实际硬件地址,将打开的连接仪器以会话句柄instr的形式返回。VISA测试的波形获取采用query_binary_values()方法,参数含义分别为:获取波形的SCPI仪器指令、返回的波形数据类型为double型以及数据存储采用大端格式。
IVI测试部分代码如下:
iviscope=pyivi.ivi_instrument
("USB0::0x0699::0x0368::c010850::INSTR","TDS2410B",
simulate=False,flavour=′IVI?C′) //IVI实际测量
iviscope=pyivi.ivi_instrument
("dummy address","TDS2410B",simulate=True,flavour=
′IVI?C′) //IVI仿真测量
iviscpvals=iviscope.fetch_waveform()
调用Pyivi 模块的ivi_instrument()方法建立测试系统与IVI设备的连接,支持仿真和实际测量两种方式,第一个参数为实体仪器的硬件地址,若采取仿真模式则该参数应为字符串“dummy address”;第二个参数为实体仪器的具体型号,本測试中选择泰克的TDS2410B型示波器;第三个参数对仿真和实际测量两种方式进行选择,为False则代表实际测量,Ture则为仿真模式;第四个参数对IVI?C和IVI?COM两种类型驱动进行选择,由于多数的IVI型仪器厂商都会提供IVI?C类型驱动,为了实现设备的通用性,这里选择IVI?C型驱动。
建立好的仪器连接以会话引用iviscope返回,基于该引用实现对连接仪器的控制。获取波形数据直接调用仪器会话的fetch_waveform()方法。硬件地址和仪器型号两个参数本文可以通过仪器发现与驱动管理模块获得,Pyivi会根据传入的IVI仪器型号,自动在后台IVI驱动中查询匹配该仪器型号的特定的IVI驱动,完成IVI类驱动到IVI特定驱动再到具体仪器的映射,实现了仪器设备的可互换性。
3.3 虚拟仪器模块的开发
虚拟仪器模块的开发采用PyQt4和NumPy扩展模块,PyQt4负责界面的开发,NumPy负责对采集的数据进行满足需求的处理。整体虚拟仪器模块的开发采用界面层和逻辑控制层分开设计的方式,这样数据的采集与处理与最终的结果显示分开进行,利用QObject类中的connect()方法将界面按钮事件的信号和逻辑控制块对应的槽函数(事件处理函数)绑定即可。利用PyQt进行界面开发的步骤如下:
(1) 利用QtDesigner创建GUI;
(2) 根据需要添加各种部件,并在部件的属性编辑器中修改部件的相应属性,保存该ui文件;
(3) 通过Pyuic4工具将ui文件转换成Python脚本文件,命令为:Pyuic4?o xxx.py xxx.ui;
(4) 通过调用生成GUI的类来运行该程序;
(5) 对GUI的各个控件编辑对应的触发信号和槽函数,利用connect()进行绑定。
3.4 测试数据显示界面设计
测试数据显示界面采用Web.py扩展模块进行网络搭建,在测试主机上搭建HTTP服务器,测试系统软件采用B/S结构,这样既可以通过本地浏览器访问数据显示界面也可以通过远端主机访问测试主机请求显示界面[3],具体的网络服务器代码如下:
urls = (′/′,′index′,′/system_test′,′Test′)
#定义网页的索引响应函数
class index:
def GET(self):
return "欢迎登录测试平台!"
...
return test_datas()
def test_datas(): #统计测试数据
...
reutrn datas #返回测试数据
Class Test(object):
def GET(self):
return "测试数据显示界面!"
def data_handle(self, datas): #对测试数据进行处理
...
return test_result #返回数据的处理结果
def display(self, test_result): #显示测试结果
...
if __name__ == "__main__":
app = web.application(urls, global())
app.run()
4 系统测试
搭建测试系统所需软件环境,采用DSO?X 4052A 和Tektronix TDS2014B两台不同型号的示波器对测试系统的IVI测试部分、VISA测试部分、IVI仪器仿真功能和仪器的可互换性进行测试,其中,Tektronix TDS2014B为IVI型示波器,系统整体测试流程图如图5所示。
测试中,对接入测试系统中的Tektronix TDS2014B示波器进行实时波形获取,波形选择锯齿波,实体仪器和虚拟示波器软面板波形如图6所示。IVI互换性测试,将示波器换作DSO?X 4052A 型号,波形选择三角波,示波器软面板获取的实际波形如图7所示。
系统IVI仿真测试中,选取Tektronix TDS2014B示波器,在IVI测量部分选择仪器仿真,示波器软面板波形如图8所示。
5 结 论
本测试系统将各个测试子系统通过交换机连接到同一局域网中,测试子系统中控制主机与各个测试仪器设备也处于一个局域網中,系统对外兼容GPIB,LAN,RS 232和USB等接口类型的仪器,同时支持符合IVI标准的仪器的互换操作,做到同一应用程序可以对同类不同型号的仪器设备进行控制。系统具有很强的可扩充性,VISA支持的仪器类都可以在此系统上进行测试控制,用户只需要根据测试需求开发相应仪器设备类的软面板即可,无需更改系统软件架构。其次,测试系统与数据库结合,有助于大量测试数据长时间存储管理,给今后对测试设备的某项特性进行数据挖掘提供数据支持。
参考文献
[1] 田耕,阮林波,渠红光.基于VISA技术的自动测试软件研制[J].核电子学与探测技术,2009(6):1397?1400.
[2] 黄娟,李文臻.基于VISA及IVI技术的仪器仪表自动测试系统软件设计[J].电子质量,2012(5):12?15.
[3] 周锎,赵楠,李欣.一种基于Python脚本语言的自动化测试系统[J].南开大学学报(自然科学版),2014(5):65?70.
[4] 李宥谋,赵梦屹,王萌.基于IVI引擎技术的虚拟仪器互换管理系统[J].西安邮电大学学报,2015(2):93?97.
[5] 汪君鹏,李宥谋.基于Lua脚本技术的网络化测控系统设计[J].西安邮电大学学报,2013(1):90?94.
[6] 冀博,李宥谋,郭猛.网络设备自动发现技术的研究与实现[J].西安邮电学院学报,2012(6):33?36.
[7] 李辉,吴伟.一种基于MCS51的低成本LabVIEW实验教学系统[J].现代电子技术,2013,36(4):124?128.
摘 要: 通过分析现代工业生产对自动化测试系统的要求,提出一种基于面向对象的编程语言Python构建的自动化测试系统。利用Python语言的高效、灵活和简洁等特点,结合Pyvisa,Pyivi和Web.py等扩展模块提供的强大功能,以及 IVI 和 VISA技术的后台支持,可以快速组建满足用户测试需求且高效的测试系统;其次利用NumPy,Matplotlib和PyQt4扩展模块能够准确地完成对测试数据的各种运算处理以及相关的图形界面显示等操作。结果表明,该系统具有高效性、通用性和扩展性,使用Python开发虚拟仪器与测试系统,代码简洁、层次清晰、周期性短,具有广泛的应用前景。
关键词: 测试系统; Python; Pyvisa; Pyivi; 可互换性
中图分类号: TN911?34; TP393 文献标识码: A 文章编号: 1004?373X(2017)04?0039?05
Design and implementation of automatic testing system based on Python
HUANG Jianjun, LI Youmou, LIU Jing, ZHOU Huan
(School of Computer Science and Technology, Xian University of Posts and Telecommunications, Xian 710061, China)
Abstract: A kind of automatic testing system based on the object?oriented programming language Python is proposed by analyzing the requirement of the auto testing system for modern industrial production. With the background support of VISA and IVI technology, the efficient testing system satisfying the testing demands of users can be built quickly in combination with the efficient, flexible and concise characteristics of Python language, and the powerful functions of Pyvisa, Pyivi and Web.py extensional modules. Besides, the system can complete each operational processing of testing data and relevant GUI display accurately by means of NumPy, Matplotlib and PyQt4 modules. The result indicates that the system has high efficiency, universality and expansibility. The application of Python for developing the virtual instrument and testing system has the characteristics of concise code, clear hierarchy and short cycle. It has a broad application prospect.
Keywords: testing system; Python; Pyvisa; Pyivi; interchangeability
目前,多数虚拟仪器和测控平台的开发都使用LabVIEW图形化编程语言,LabVIEW在界面开发部分占据优势,但是LabVIEW调用Matlab的接口方法比较复杂,将二者很好的结合也有一定的难度,这使得LabVIEW在数据处理方面显现出不足。其次,后期系统扩展对LabVIEW代码进行修改的工作量较大,这对大型的测试系统来说很不利。基于LabVIEW的上述不足,本文提出使用Python脚本语言来编写可互换仪器测试系统。Python拥有丰富的扩展模块以及第三方的支持包,PyQt可以快速开发满足用户需求的GUI界面,NumPy相当于Matlab的Python版本,继承了Matlab的强大数据处理能力。Pyvisa 和Pyivi 是Python对NI?VISA和NI?IVI的封装工具包,对测试系统实现仪器接口的无关性和同类仪器的可互换性提供了很好的支持。Python面向对象结构化的编程可以把程序代码组织成逻辑块重复使用,这一特性也恰恰弥补了LabVIEW在编写测试系统中后期修改程序复杂这一缺陷。
1 系统组成
1.1 系统的硬件结构
测试系统由多个测试子系统组成,系统硬件连接如圖1所示,每个子系统都是一个相对独立的测试单元,由一台控制计算机、一台路由器和由该计算机控制的若干台设备仪器组成。控制计算机和LAN型接口的设备通过路由器连接到同一个局域网中,其他诸如USB,GPIB,RS 232等接口设备通过相应的接口总线与控制计算机相连,这样不同接口类型的设备仪器就直接或间接地接入到控制计算机,并由控制计算机来发现、配置和控制。各个测试子系统通过路由器和数据备份与存储服务器相连,组成整个测试系统的局域网。测试控制管理系统主机通过控制计算机的并口向各个测试子系统发送控制指令,使各个测试子系统在测试的某些阶段能够统一动作[1]。
1.2 系统的软件组成
该系统由以下5个主要模块构成,如图2所示。
仪器发现与驱动管理模块,负责对接入到控制计算机上的硬件设备仪器进行发现以及管理本地安装的IVI驱动,其次对仪器和具体IVI驱动进行相关信息的查询。
仪器测试模块分为VISA和IVI两个测试模块。VISA测试部分负责对驱动不满足IVI标准规范的仪器设备进行控制;IVI测试部分用于对驱动满足IVI标准规范的仪器进行控制。两部分相结合,使系统完成对不同驱动标准的仪器的通用功能的实现。
虚拟仪器模块,集成了某类仪器的通用功能,负责对实体仪器的操作和对测试数据的结果进行处理和显示。测试系统中,虚拟仪器模块可根据需要进行扩充,根据测试对象的不同选调对应的虚拟仪器模块。
数据存储管理模块,负责测试系统在某一项测试中所有测试信息的存储,包括测试项目名称、项目测试人员、测试环境、测试时间,测试地点和测试结果数据。该模块和数据备份与存储服务器采用C/S模式,其中S端(服务器端)运行在数据备份与存储服务器上,C端(客户端)嵌入到虚拟仪器模块中,在测试结束时由测试系统启动与服务器端连接交互并完成数据存储与更新功能。
测试数据显示界面(Web)模块,提供测试界面的本地浏览器访问和远程浏览器访问模式,浏览器完成所有测试数据的实时显示。
2 Python扩展模块的说明
2.1 Pyvisa底层驱动库
Pyvisa 是对已有VISA 库进行的 Python 格式化封装的一个共享库,以 NI?VISA作为其包装的后台支撑,可以支持串口,GPIB,GPIB?VXI,VXI,TCP/IP,以及 USB 接口仪器。Python对VISA库的封装分为顶层(high?level)、中间层(middle?level)和底层(low?level)三层结构,顶层针对VISA资源管理器和资源的操作集合进行面向对象的Python化封装,资源管理器类中实现了对接入测试系统的资源进行自动检测。用户可以使用资源管理器类来打开实例化的资源派生类对象,资源类和派生类用Python 的行为方式访问底层资源的属性和方法;中间层采用Python的绑定方法(Bound Method)对VISA库函数的操作集合进行Python形式的封装,这一层的作用是将VISA共享库的操作函数用Python脚本来实现,这样用户就可以很方便地利用Python脚本调用这些函数,实现对相关仪器的控制;底层定义了每个函数的参数类型和返回值类型,所有函数都是针对VISA库采用静态方法进行定义封装,Pyvisa的具体封装结构如图3所示。
2.2 Pyivi应用程序接口API
Pyivi支持IVI?COM和IVI?C两种类型的驱动,是对测试主机上的所有IVI驱动进行的一层 Python形式的包装,能够满足符合IVI标准规范的仪器互换特性以及IVI引擎所提供的一些功能。Pyivi对两种类型的特定IVI驱动分别使用ctypes和comtypes进行分装,两种形式对IVI标准规范下的仪器的类驱动都进行了封装,应用程序通过调用IVI类驱动实现仪器的互换性。Pyivi通过ctypes类与IVI?C类型驱动进行通信,通过comtypes类与IVI?COM类型驱动进行通信。Pyivi使用工厂模式对两种类型驱动接口进行设计,首先将接口设计为一个抽象工厂类,定义仪器的共有属性。应用程序通过Pyivi调用IVI类驱动时,工厂类会根据应用程序传入的参数来选择IVI?C或者IVI?COM类型的IVI特定驱动进行底层驱动函数的调用。
Pyivi的接口设计如图4所示,图4中仪器类指Pyivi模块所支持的仪器类别,包括示波器类、频谱分析仪类和信号发生器类[2]。
3 系统模块功能实现
3.1 仪器发现与驱动管理模块的设计
程序导入Pyvisa,Pyivi模块,调用Pyvisa模块的资源管理器函数来扫描测试系统各接口上的仪器设备,调用Pyivi模块来查看管理测试主机的驱动,查询确定驱动的具体信息以便后续测试部分的需求,具体实现代码如下:
import pyvisa as visa
import pyivi
rm=visa.ResourceManager()
#打开本地的默认资源管理器,并以引用rm的形式返回
rm_list=rm.list_resources([query=u?*::INSTR])
#列出rm中所扫描到的硬件接口设备
openinstr=rm.open_resource
(resource_name,[access_mode= ,open_timeout=0])
#打开rm中的某一个硬件设备,并将会话资源以openinstr引用的形式返回
instrinfo=openinstr.query(′*IDN?′)
#查询打开仪器的详细硬件信息,保存在instrinfo中
instrmanufacturer=openinstr.manufacturer_name
#查詢仪器的厂商信息
instrmodelname=openinstr.model_name
#查询该仪器的具体型号
ivisoftmods=pyivi.software_modules
#列出本地安装的所有IVI特定驱动
tktdsmod=ivisoftmods[′tktds1k2k′]
#访问指定的 tktds1k2k 驱动
supinstrtype=tktdsmod.specialized_instrument_type()
#查询该驱动所支持的仪器类型
drivertype=tktdsmod.flavours()
#查询该驱动所属类型(IVI?C 或者IVI?COM)
supmodnames=tktdsmod.supported_instrument_models()
#该驱动所支持的仪器型号
通过上述代码,可以确定测试仪器的具体硬件信息和测试主机上的驱动类型以及驱动所支持的仪器类型。
3.2 仪器测试模块设计
仪器测试模块,VISA测试部分负责完成普通的测试功能,适用于驱动不满足IVI标准规范的设备;IVI测试部分适用于驱动符合IVI标准规范的设备,它既可以完成VISA部分的通用功能的测试,同时还能够满足仪器设备互换性的要求。以获取泰克TDS2410B示波器波形数值为例进行简要的代码说明如下:
VISA测试部分:
instr=rm.open_resource("USB0::0x0699::0x0368::c010850::INSTR")
vals=instr.query_binary_values(′curv?′,datatype=′d′, is_big_
endian=True)
其中,rm为资源管理器的引用,利用open_resource()方法建立与设备的连接,“USB0::0x0699::0x0368::c010850::INSTR”参数为本测试中连接示波器的实际硬件地址,将打开的连接仪器以会话句柄instr的形式返回。VISA测试的波形获取采用query_binary_values()方法,参数含义分别为:获取波形的SCPI仪器指令、返回的波形数据类型为double型以及数据存储采用大端格式。
IVI测试部分代码如下:
iviscope=pyivi.ivi_instrument
("USB0::0x0699::0x0368::c010850::INSTR","TDS2410B",
simulate=False,flavour=′IVI?C′) //IVI实际测量
iviscope=pyivi.ivi_instrument
("dummy address","TDS2410B",simulate=True,flavour=
′IVI?C′) //IVI仿真测量
iviscpvals=iviscope.fetch_waveform()
调用Pyivi 模块的ivi_instrument()方法建立测试系统与IVI设备的连接,支持仿真和实际测量两种方式,第一个参数为实体仪器的硬件地址,若采取仿真模式则该参数应为字符串“dummy address”;第二个参数为实体仪器的具体型号,本測试中选择泰克的TDS2410B型示波器;第三个参数对仿真和实际测量两种方式进行选择,为False则代表实际测量,Ture则为仿真模式;第四个参数对IVI?C和IVI?COM两种类型驱动进行选择,由于多数的IVI型仪器厂商都会提供IVI?C类型驱动,为了实现设备的通用性,这里选择IVI?C型驱动。
建立好的仪器连接以会话引用iviscope返回,基于该引用实现对连接仪器的控制。获取波形数据直接调用仪器会话的fetch_waveform()方法。硬件地址和仪器型号两个参数本文可以通过仪器发现与驱动管理模块获得,Pyivi会根据传入的IVI仪器型号,自动在后台IVI驱动中查询匹配该仪器型号的特定的IVI驱动,完成IVI类驱动到IVI特定驱动再到具体仪器的映射,实现了仪器设备的可互换性。
3.3 虚拟仪器模块的开发
虚拟仪器模块的开发采用PyQt4和NumPy扩展模块,PyQt4负责界面的开发,NumPy负责对采集的数据进行满足需求的处理。整体虚拟仪器模块的开发采用界面层和逻辑控制层分开设计的方式,这样数据的采集与处理与最终的结果显示分开进行,利用QObject类中的connect()方法将界面按钮事件的信号和逻辑控制块对应的槽函数(事件处理函数)绑定即可。利用PyQt进行界面开发的步骤如下:
(1) 利用QtDesigner创建GUI;
(2) 根据需要添加各种部件,并在部件的属性编辑器中修改部件的相应属性,保存该ui文件;
(3) 通过Pyuic4工具将ui文件转换成Python脚本文件,命令为:Pyuic4?o xxx.py xxx.ui;
(4) 通过调用生成GUI的类来运行该程序;
(5) 对GUI的各个控件编辑对应的触发信号和槽函数,利用connect()进行绑定。
3.4 测试数据显示界面设计
测试数据显示界面采用Web.py扩展模块进行网络搭建,在测试主机上搭建HTTP服务器,测试系统软件采用B/S结构,这样既可以通过本地浏览器访问数据显示界面也可以通过远端主机访问测试主机请求显示界面[3],具体的网络服务器代码如下:
urls = (′/′,′index′,′/system_test′,′Test′)
#定义网页的索引响应函数
class index:
def GET(self):
return "欢迎登录测试平台!"
...
return test_datas()
def test_datas(): #统计测试数据
...
reutrn datas #返回测试数据
Class Test(object):
def GET(self):
return "测试数据显示界面!"
def data_handle(self, datas): #对测试数据进行处理
...
return test_result #返回数据的处理结果
def display(self, test_result): #显示测试结果
...
if __name__ == "__main__":
app = web.application(urls, global())
app.run()
4 系统测试
搭建测试系统所需软件环境,采用DSO?X 4052A 和Tektronix TDS2014B两台不同型号的示波器对测试系统的IVI测试部分、VISA测试部分、IVI仪器仿真功能和仪器的可互换性进行测试,其中,Tektronix TDS2014B为IVI型示波器,系统整体测试流程图如图5所示。
测试中,对接入测试系统中的Tektronix TDS2014B示波器进行实时波形获取,波形选择锯齿波,实体仪器和虚拟示波器软面板波形如图6所示。IVI互换性测试,将示波器换作DSO?X 4052A 型号,波形选择三角波,示波器软面板获取的实际波形如图7所示。
系统IVI仿真测试中,选取Tektronix TDS2014B示波器,在IVI测量部分选择仪器仿真,示波器软面板波形如图8所示。
5 结 论
本测试系统将各个测试子系统通过交换机连接到同一局域网中,测试子系统中控制主机与各个测试仪器设备也处于一个局域網中,系统对外兼容GPIB,LAN,RS 232和USB等接口类型的仪器,同时支持符合IVI标准的仪器的互换操作,做到同一应用程序可以对同类不同型号的仪器设备进行控制。系统具有很强的可扩充性,VISA支持的仪器类都可以在此系统上进行测试控制,用户只需要根据测试需求开发相应仪器设备类的软面板即可,无需更改系统软件架构。其次,测试系统与数据库结合,有助于大量测试数据长时间存储管理,给今后对测试设备的某项特性进行数据挖掘提供数据支持。
参考文献
[1] 田耕,阮林波,渠红光.基于VISA技术的自动测试软件研制[J].核电子学与探测技术,2009(6):1397?1400.
[2] 黄娟,李文臻.基于VISA及IVI技术的仪器仪表自动测试系统软件设计[J].电子质量,2012(5):12?15.
[3] 周锎,赵楠,李欣.一种基于Python脚本语言的自动化测试系统[J].南开大学学报(自然科学版),2014(5):65?70.
[4] 李宥谋,赵梦屹,王萌.基于IVI引擎技术的虚拟仪器互换管理系统[J].西安邮电大学学报,2015(2):93?97.
[5] 汪君鹏,李宥谋.基于Lua脚本技术的网络化测控系统设计[J].西安邮电大学学报,2013(1):90?94.
[6] 冀博,李宥谋,郭猛.网络设备自动发现技术的研究与实现[J].西安邮电学院学报,2012(6):33?36.
[7] 李辉,吴伟.一种基于MCS51的低成本LabVIEW实验教学系统[J].现代电子技术,2013,36(4):124?128.