胡铁乔,韩煜昕
(中国民航大学 天津市智能信号与图像处理重点实验室,天津 300300)
仪器控制指的是通过计算机上的软件来控制仪器工作[1],其实质是软件通过相应的连接总线给受控仪器发送指令,使受控仪器完成相应的操作。它需要受控仪器与计算机之间协同工作,同时可以利用计算机强大的数据处理、分析、显示和存储能力,扩展仪器的功能。
信号发生器是信号处理领域中常用而重要的仪器。本实验室主要研究方向为自适应信号处理、卫星导航及甚高频电台抗干扰。为验证算法的抗干扰能力,经常同时使用多个信号发生器发射干扰信号和有用信号。实验室的信号发生器都是很久以前采购的,其功能和现代信号发生器相比已经明显落后,操作复杂,显示界面单一。在实际应用中多台仪器综合应用会导致操作混乱、记录繁琐和效率低下等问题。但由于价格昂贵,完全将这些仍能满足科研要求的仪器淘汰非常可惜。为此,本文以HP8118A、HP83732A、HP8780A、HP8657B、R&S SMH 5台不同型号的传统信号发生器为受控仪器,基于LabVIEW开发了它们各自的控制程序,并在主控制程序中实现灵活的调用。程序操作简便快捷,在科研应用中运行稳定,大大提高了测试的效率和准确性,有很强的应用价值。
LabVIEW(laboratory virtual instrument engineering workbench)是NI公司推出的一种用图标代替文本行创建应用程序的图形化编程语言。Lab-VIEW提供了很多外观与传统仪器(如示波器、信号发生器)类似的控件,可用来方便地创建用户界面[2],内部集成了对不同总线(如GPIB、USB、PXI等)的支持。因此,相较于VB、VC和C等文本编程语言,LabVIEW使仪器控制程序的开发周期大大缩短。
LabVIEW编写的程序称为虚拟仪器VI(virtual instrument)。一个VI既可作为上层独立程序,也可作为其他程序(或子程序)的子程序[3]。正是基于VI这一特性,LabVIEW最佳地实现了模块化编程思想。因此,在设计控制程序时,将其分解为一系列简单的子任务模块,将某些模块封装成独立的VI,然后将这些模块组合在一起完成最终的控制程序。
一个完整的仪器控制系统包括计算机、受控仪器、仪器与计算机之间的通路(包括总线和硬件驱动程序)和上层仪器控制应用程序[4]。
GPIB总线协议是20世纪70年代末出现的并行接口协议,其数据传输速率达到1 Mb/s,能实现仪器之间和仪器与计算机之间的双向高速通信[5]。5台信号发生器都配有GPIB接口,所以采用GPIB总线进行仪器间互联。GPIB总线通过Contec公司的GPIB接口卡GP-IB(USB)FL与计算机连接。
仪器通过GPIB总线连接方式可以分为星型连接方式和线型连接方式2种。星型连接方式是以一台设备为中心,辐射连接至其他设备;线型连接方式是以一台设备串联着一台设备的方式,连接成一个测试回路。线型连接受传输距离的限制,并且根据仪器实际摆放位置,本文采用星型连接方式,以计算机为中心,通过GPIB接口卡和GPIB总线与5台仪器连接。系统中每个设备(包括接口卡),须有一个0~30之间的GPIB地址,不能重复。GPIB接口卡的出厂地址设置为0,HP8118A、HP83732A、HP8780A、HP8657B、R&S SMH 5台仪器的地址分别设置为 17,19,10,7,28。 本文设计的仪器控制系统硬件组成如图1所示。
图1 仪器控制系统硬件组成Fig.1 Hardware structure of instrument control system
控制程序实现计算机、GPIB接口卡与仪器的逻辑连接,完成控制命令的发送、测试结果的接收和仪器及总线状态的反馈[6]。
基于LabVIEW的GPIB控制程序包括GPIB接口卡驱动程序和主控程序。GPIB接口卡在Lab-VIEW环境下的驱动程序由Contec公司提供,包括GPIB接口卡的计算机驱动程序和在LabVIEW环境下的驱动程序。上层主控程序通过LabVIEW的GPIB函数库与GPIB接口卡驱动程序即可完成与仪器设备的信息交互,实现对仪器的控制,所以GPIB接口卡与GPIB协议对设计者来说是透明的,只需要考虑主控程序的设计。主控程序是与用户进行交互的控制程序,由它来搜集、分析用户的操作,确定系统应该调用的功能VI,组织指令并发送给受控仪器,同时显示仪器反馈的信息给用户。控制程序的架构和数据流向如图2所示。
图2 控制程序的架构和数据流向Fig.2 Architecture and data direction of control program
LabVIEW的GPIB函数库中使用最频繁的是GPIB Write和GPIB Read 2个函数,通过这2个函数就能实现仪器的参数设置、数据的读写以及仪器的自动控制。因为早期信号发生器的指令集各不相同,所以需要查阅仪器各自的编程手册,通过GPIB Write给仪器发送指令实现相应的功能。GPIB函数库中FindLstn函数用于检测开启的信号发生器的型号,以完成对不同仪器控制程序的调用。
基于LabVIEW的主控程序设计采用模块化的编程思想,将控制程序划分为不同的功能模块,有的功能模块封装成VI,由主控模块在高层管理并调度各个子模块协调工作。采用模块化编程,不仅容易调试程序,也方便程序维护和功能扩展及优化。控制程序结构如图3所示。
图3 控制程序结构Fig.3 Structure of control program
(1)主控模块
主控模块的作用是识别开启的仪器,并动态调用仪器的VI。为便于管理窗口,控制程序窗口采用多重窗体(MDI)结构,即主控模块的前面板是主窗体,5台仪器控制程序前面板为子窗体,子窗体位于主窗体中。MDI结构通过调用库函数节点(CLN),在LabVIEW中调用Windows应用程序编程接口API(application programming interface)的 SetParent函数和FindWindowA函数实现。5台仪器的前面板各自独立,是由主窗体管理的独立子窗体。
仪器识别模块通过FindLstn函数侦测开启仪器的地址并返回到主控模块,配合Set Menu Item Info函数节点,将主窗体菜单栏上未开启的设备选项设置为禁用状态,开启的设备选项设置为启用状态,供用户进行后续的操作。如图4所示,为控制程序前面板,开启了4台仪器,打开了其中3台仪器的控制面板。
图4 控制程序前面板Fig.4 Front panel of control program
在LabVIEW开发环境下,子VI的调用分为静态调用和动态调用。动态调用VI的优点是节省内存空间,只有在打开VI引用时VI的调用程序才会将其加载,能实现灵活的数据交换[2]。实际应用中,有时不会将所有的仪器都打开。若采用静态调用子VI方式,在打开程序时就将所有的仪器VI都加载入内存,会导致控制程序搜索不到仪器而造成程序运行错误,所以设计动态调用模块打开不同仪器控制程序。
(2)仪器模块
将5台信号发生器的控制程序封装成独立的VI供主控模块动态调用,可以方便程序维护,随时扩展各仪器的功能;仪器的控制界面独立,可避免对仪器的误操作;各仪器VI之间没有数据交换,使控制程序运行更加稳定。各仪器VI底层模块基本相同,由仪器初始化、参数控制、数据读取、错误处理和终止程序运行等模块组成。
仪器初始化模块通过给仪器发送命令<*IDN?>,对仪器返回的信息进行比对完成设备标识检查,确定程序保存仪器地址与仪器实际地址对应。参数控制模块主要完成对仪器输出信号参数的控制。数据读取模块作用是读回仪器当前输出信号的参数和状态并在前面板上进行显示,确保仪器工作正常。当任何模块或仪器本身运行错误时,错误处理模块会立即终止运行其他模块,切断程序与仪器之间的通信,然后终止控制程序运行,避免对计算机和仪器造成不可预料的后果。
此外,控制程序的用户界面编程采用循环事件结构。通过事件结构可有效减少计算机CPU的占用率,只有触发事件后,计算机才与仪器进行通信完成信息交互,避免了对仪器频繁写入指令。
本控制程序开发完成后,按照图1将仪器与计算机进行连接。计算机能够同时控制不同型号信号发生器通过天线准确发射有用信号与干扰。程序在长期的科研应用中运行稳定良好,有很强的实用性。
本文基于LabVIEW开发平台,根据实验室实际应用需求,开发了支持GPIB接口的控制程序,可以同时控制多台仪器。程序界面采用MDI结构,使控制界面更简洁,操作更灵活。通过计算机控制仪器的工作,替代传统的人工操作方式,提高了测试效率与准确性。使昂贵的传统仪器又重新应用到科研领域中,减少了科研经费的投入,对仪器互联控制与日后集成测试平台的开发有一定的借鉴意义。
[1]戴鹏飞,王胜开,王格芳,等.测试工程与LabVIEW应用[M].北京:电子工业出版社,2006.
[2]陈树学,刘萱.LabVIEW宝典[M].北京:电子工业出版社,2011.
[3]陈锡辉,张银鸿.LabVIEW 8.20程序设计从入门到精通[M].北京:清华大学出版社,2007.
[4]吴亮,高峰,李俊杰,等.基于LabVIEW的通用仪器控制软件设计[J].舰船科学技术,2009,31(10):73-75.
[5]张金,王伯雄,张力新.基于LabVIEW的GPIB总线独立仪器集成测试平台[J].仪表技术与传感器,2010(9):13-15.
[6]王学伟,张未未,赵勇.USB-GPIB控制器及VISA函数库的设计[J].电子测量与仪器学报,2008,22(3):87-93.
[7]杨乐平,李海涛,杨磊.LabVIEW程序设计与应用[M].2版.北京:电子工业出版社,2005.