基于VC++ 6.0的GPIB仪器控制实现方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于VC++ 6.0的GPIB仪器控制实现方法
(2008-12-08 18:16:33)
标签:
分类:射频
gpib
labview
通信
it
引言
基于GPIB(Gerneral Purpose Interface Bus)的自动测试系统是计算机技术和自动测试技术相结合的产物,目前仍广泛地应用于众多领域。

GPIB标准接口总线是命令级兼容的外总线,主要用来连接各种仪器,组建由微机控制的自动测试系统。

各种仪器只要配备了这种接口,就可以按要求灵活组建自动测试系统[1]。

控制GPIB仪器的过程就是给仪器发送指令,然后从仪器接收数据的过程[2]。

在VC++ 6.0编程环境下,可以利用Agilent VISA transition library (VTL)直接对仪器的参数设置进行控制,程序直观、可读性较强。

由于不同的仪器回传的波形长度不同,且仪器回传的波形数据是ASCII码或二进制码,需通过算法进行波形数据解析,将其转换为十进制数组。

LABVIEW8.0作为一个图形化编程软件,为实现仪器编程
和数据采集系统提供便捷途径,其仪器I/O助手可以自动对波形长度和波形数据进行解析。

在VC++6.0环境下将Agilent VTL与LabVIEW 结合使用,即利用Agilent VTL直接对仪器的参数进行设置,利用LabVIEW生成的动态链接库(DLL)来读取仪器波形,这样可以节省时间,以便将更多的精力投入到优化测试算法、提高测试准确性上。

1 GPIB仪器控制的硬件平台
GPIB仪器控制的硬件平台由计算机、GPIB电缆、USB-GPIB控制器、GPIB仪器组成,如图1所示。

其中,USB-GPIB控制器是一个USB与GPIB的接口转换控制器。

使用USB-GPIB控制器时,不需要打开计算机主机箱,避免了计算机的内部噪声,且支持即插即用,使用起来较GPIB卡方便。

同时,无需GPIB电缆即可直接将USB-GPIB控制器与仪器相连。

图1 GPIB仪器控制的硬件平台
2 GPIB仪器控制的软件平台
GPIB仪器控制的软件平台为VC++ 6.0,其底层将Agilent VTL与LabVIEW生成的DLL相结合。

软件平台如图2 所示。

图2 GPIB仪器控制的软件平台
2.1 调用Agilent VTL
Agilent I/O Library中包含VISA transition library(VTL),只要安装I/O library就可通过VC++对仪器进行控制。

VISA(虚拟
仪器软件架构,Virtual Instrument System Architecture)是VXIplug&play系统联盟的35家最大的仪器仪表公司所统一采用的标准。

GPIB、VXI、RS-232、LAN等接口均支持VISA。

使用VISA编写仪器控制程序的好处在于,不需要了解底层的实际接口的类型是什么,无论对于GPIB还是其他接口,只需要掌握VISA I/O这一套函数库,程序在运行时VISA就会根据实际接口类型自动调用相应的接口驱动程序例程,完成与仪器间的通信操作[3]。

利用VISA接口库提供的丰富的函数指令来建立计算机与仪器之间的控制指令、测试参数的互传,主要用到下述几个VISA函数[4-5]:(1)viOpenDefaultRM(session),用于初始化并定位VISA系统。

其中,session表示一个VISA库函数中专用的与仪器之间进行通讯的ViSession数据类型对象,在调用VISA库时,这是第一条必须使用的语句,表明VISA库函数已经启动。

(2)viOpen(*session,rsrcName,accessMode,timeout,*vi),用于建立计算机与仪器之间联系的会话。

本函数紧跟在viOpenDefaultRM(session)函数后,作为第二条命令使用,共有五个参数。

*session表示指向第一条语句中ViSession 数据类型对象的指针;rsrcName表示要控制的仪器的参数值,包括其总线结构样式、地址,使VISA库能定位此设备;accesssMode表示VISA系统对仪器的访问模式,有完全访问、命令只发不收、只收不发等几种方式,一般情况下,都直接取默认值为VINULL,表示对设备完全访问;timeout表示超时时间,表明当多少时间延迟后,仪
器无反应,则认为此次命令发送失败,单位为ms,一般取默认值
VI_NULL,表示不设超时控制;*vi是一个指针,指向与被控仪器相关的ViSession对象,访问它可随时获得设备任何时刻的被程控状态,一般预先定义一个vi与当前设备相关的ViSession对象,写为&vi。

(3)viPrintf(vi,writef rm),用于发送仪器控制指令,设置其初始参数值或指示其进行某项操作,使仪器动作或查询仪器状态。

其中,vi表示与当前控制设备相关的ViSession对象;writef rm,是字符串参数,表示对仪器发送命令的实际内容,是符合SCPI (Standard Commands for Programmable Instruments,可编程仪器标准)的。

SCPI是为开发计算机和测试系统间的通用接口语言,是IEEE488.2标准硬件部分的顶层规范,是一个独立于硬件的纯粹软件标准。

SCPI语句以ASCII文本的方式存在,因此可以加入到任何计算机测试编程语言之中,也可以通过任何仪器接口被发送,如GPIB、RS-232、LAN等。

(4)viScanf(vi,readf rm,params),与viPrintf函数相对,表示接收所程控仪器回送的信息,并将其储存起来。

其中,vi表示与当前控制设备相关的ViSession对象;readf rm定义用于保存从仪器接收来的数据的类型,常用的有字符串型(表示为%t)、整型(表示为%d)等;params表示一个readf rm类型的变量,存储程控仪器发送的信息。

(5)viClose(vi),用于结束计算机与仪器之间联系的会话,所有为该会话分配的数据结构都被释放。

在程控过程,计算机需要不断地通过上述几个函数,将测试的相关参数发命令赋给仪器,并接收仪器回传的数据。

要在VC++6.0中编译VISA程序,需要在VC++6.0的库文件(Library Files)目录中加入visa32.lib,在包含文件(Include Files)目录中加入指定的目录。

2.2 调用LabVIEW生成的DLL
动态链接库(DLL)是基于Windows程序设计的一个重要组成部分,是一个位于应用程序外部的过程库,它可以从应用程序中调用,在运行时被动态链接,但并没有被绑定到EXE文件上。

DLL是可共享和重入的,它的代码执行速度很快[6]。

VC++调用LabVIEW生成的DLL的步骤如下:
第一,用LabVIEW仪器I/O助手编写读取波形数据程序。

在仪器I/O 助手里,对仪器的一次访问操作被划分为若干个预定义的步骤,可以在这些定义好的步骤的基础上进行合理的组织,以构建一次完整的仪器I/O会话。

预定义的步骤是:Select Instrument(选择仪器),用于选择要与之通信的目标仪器和定义基本的连接参数;Query and Parse(查询和解析),用于向仪器发送查询波形命令、读回仪器的响应结果,并利用Auto Parse功能自动解析波形数据。

在编写LabVIEW程序时一定要定义Connector(连接器),即定义参数形式和接口,使LabVIEW与VC++6.0能互相进行通信。

第二,在LabVIEW的Build Specifications中选择Shared Library (DLL),可对DLL的输出路径、函数接口等进行设置,生成*.dll,*.h,*.lib等文件。

第三,在VC++中调用DLL,需要在工程中添加上述*.h,*.lib文件以及LabVIEW中的cintools文件夹路径。

如果要在脱离LabVIEW的环境下调用该DLL,则需要保存cintools文件夹内容,并且安装与LabVIEW版本相匹配的LabVIEW Run-time Engine。

3.在频谱仪中的应用[7-8]
下面举例说明上述方法在Agilent E4403B频谱仪中的应用。


E4403B的内部50MHz参考信号作为频谱仪的输入源。

在VC++中,对频谱仪的中心频率、跨度、参考电平、衰减等参数进行控制,使被
测波形能在频谱仪上显示,部分控制代码如下:
ViSession defaultRM,vi;
viOpenDefaultRM(&defaultRM);
viOpen(defaultRM,“GPIB0::18::INSTR”,VI_NULL,VI_NULL,&vi);viPrintf(vi,“:CAL:SOUR:STAT ON\n”);//打开内部50MHz参
考信号
viPrintf(vi,“:FRE Q:CENT 50E6\n”);//将中心频率设置为50MHz viPrintf(vi,“:FREQ:SPAN 80E6\n”);//将跨度设置为80MHz viPrintf(vi,“:DISP:WIND:TRAC:Y:RLEV 0\n”);//将参考电
平设置为0dBm
viPrintf(vi,“:POW:ATT 10\n”);//将衰减设置为10dB
……
viClose(vi);
viClose(defaultRM);
在LabVIEW I/0仪器助手中向频谱仪发送查询示迹(Trace)1的波形命令“:TRAC:DATA? TRACE1”,利用Auto Parse功能自动解析波形数据,并生成DLL。

解析波形数据如图3所示。

因频谱仪测试窗口由401个水平像素点组成,所以得到的是波形长度为401的数据串。

Value窗口中给出了波形数据的预览,它是关于幅度电平与数据点之间的曲线。

根据开始频率、跨度与各个数据点间的关系,可以将上面的波形转化成幅度电平与频率的关系曲线,即频谱,其波形如图4所示。

图3 解析波形数据
图4 LabVIEW环境下的频谱波形
在VC++中的viClose语句前添加调用DLL的语句,将LabVIEW解析的幅度电平与频率数据串传递给VC++。

最终,VC++实现了频谱仪参数设置及波形读取的功能,其用户界面如图5所示。

图5 VC++环境下的测控界面
观察图4与图5所示的频谱波形,LabVIEW读取的波形数据与VC++调用的波形数据相同,说明LabVIEW与VC++之间数据传送正确,能够正常通信。

用户可根据测试需要,适当增减仪器参数设置控件。

4.结论
在VC++ 6.0环境下,将Agilent VTL与LabVIEW生成的DLL相结合共同对GPIB仪器进行控制,可以克服只调用Agilent VTL或只调用LabVIEW生成的DLL所存在的弊端,对于增加程序的可读性、优化设计、提高测试效率等有一定的益处。

相关文档
最新文档