微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于HP-VISA库的VXI总线测试应用编程

基于HP-VISA库的VXI总线测试应用编程

时间:03-30 来源:互联网 点击:
一、引言
  VXI总线是一种基于模块化概念的标准仪器控制总线技术体系。经过十年来的发展,目前已在自动测试、虚拟仪器及其它相关专业领域内得到了广泛应用。随着这一概念及技术的高速发展,在大型应用系统的设计中,往往会碰到不同厂商仪器模块,不同接口类型等之间的兼容性与互操作性问题。为此,VXI即插即用联盟为VXI模块专门制定了统一的软、硬件标准,并于1996年底开发了一套VISA(VirtualInstrumentSoftwareArchitecture)库。它为用户提供了一套独立且易用的低层I/O库及相应的函数接口,使用户可以方便地开发与仪器、接口类型无关的测试应用。目前,VXI库可以支持的操作系统包括:WIN、WIN95/NT、SUN、HP-UX等。支持的语言及开发环境有:C/C++(VC、BC)、VB、Labview、Labwindows/CVI、HPVEE等。同时,作为一种通用的I/O标准,VISA与仪器、接口类型无关的特性,也为开发人员提供了方便,并大大缩短了开发周期。
  本文将结合HPVISA1.0中的有关内容,以Win95平台上的VC语言为例详细讨论VXI总线测试应用编程中的有关细节。
二、基于VISA库的编程细节
  1.相关的头文件及库文件
  在应用源程序的开头应包含对VISA库头文件Visa*h的引用,一般该文件在../Vxipnp/Win95/include子目录下。Visa*h头文件中主要是对VISA库函数的原型声明及相关常量、错误码的定义。它还自动包含了另一个头文件Visatype*h,该文件中包括了VISA库中用到的数据类型的定义。
  另外,在工程文件中还需加入VISA静态库Visa32.lib。该文件在../Vxipnp/Win95/lib/Msc子目录下。
  2.会话的建立与关闭
  会话(session)即与设备进行通讯的通道。在基于VISA库编程中,与任何一个设备(包括仪器、PC机甚至打印机等)通讯之前,都必须首先与之建立一个会话。通讯结束后,应关闭这一会话。
  最先建立的应是由资源管理器之间的会话,它管理所有的资源,并成为其后打开的所有会话的“文”会话。这由以下函数调用完成:
   ViOpenDefaultRM(sesn);
  sesn是一个ViSession类型的变量指针,所指的值为资源管理会话句柄。
  接下来,为每一个需要与之通信的设备建立一个会话:ViOpen(sesn,rsrc-name,accessmode,timeout,Vi);rsrcname为设备地址,Vi指向设备会话句柄。
  设备地址为标识某一设备的字串,通常由VISA接口类型标识及设备的逻辑地址两部分组成。具体内容可参见下表:


接口类型设备地址示例
VXIVXIO::24
GPIB-VXIGPIB-VXI::128
GPIBGPIBO::7::0
ASRLASRL::INSTR

  在与设备通讯结束后,应调用ViClose(Vi)函数关闭会话。这样可以释放会话所占用的数据结构资源。
  最后,应关闭资源管理会话。
  3.资源
  如前所述,资源管理会话负责管理所有的资源。可以通过它来查询指定资源及与其相关的会话。
  ViFindRsrc函数:对某一接口查询指定的设备资源,并返回匹配项。
  ViFindNext函数:与ViFindRsrc配对使用,用于对有多个匹配项的列表。
  4.I/O命令
  一旦与设备的会话建立之后,就可以利用VISA库中的I/O函数与设备进行通讯,VISA库中提供了两类I/O方式。
  ①格式化I/O
  提供了一种类似于ANSI-C语言Stdio中格式化输入输出方式的操作能力。包括:
  ViPrintf函数:将格式化的数据写入设备。
  ViVprintf函数:与ViPrintf函数功能类似。
  ViScanf函数:从设备中读出数据并按照给定的格式转换。
  ViQueryf函数:向设备写入一个格式化后的数据串,并接受及转换响应数据。
  其它ViVscanf及ViVQueryf函数分别与ViScanf及ViQueryf函数功能类似。
  数据的格式是由一个格式字串确定的,具体格式与ANSI-C语言相同。
  ②无格式I/O
  无格式I/O直接发送或接收原始数据,不经过格式转换过程。它所执行的是一种低层的I/O操作,因此在对同一个会话的I/O中,不能混用格式化I/O与无格式I/O两种方式。
  ViRead函数:从设备读出数据并存放于缓冲区;
  ViWrite函数:将缓冲区中数据写入设备。
  这两个函数执行的是同步操作方式,另外:
  ViReadAsync函数:功能与ViRead相似,只是以异步方式读数据,即在读操作结束之前就可以返回。函数返回一个jobId用以标识尚未完成的操作。可以利用ViTerminate函数强制结束它,或直到操作完成。
  ViWriteAsync函数与此类似。
  5.属性
  属性(Attribute)是与会话或资源相关的,可以通过查询或设备属性的值来获取或改变会话、资源的状态(某些属性是只读的,另有一些属性则是可读写的)。属性可分为以下几类:
  ①资源属性
  包括与资源的制造商及VISA库版本有关的信息,以及资源管理会话的状态。
  ②一般仪器属性
  与会话相关的,主要用于确定诸如超时设置、缓冲区是否清除、接口类型等信息。
  ③特定接口类型相关的属性
  包括与VXI、GPIB、ASRL、GPIB-VXI等接口类型相关仪器的状态信息。
  ④事件属性
  这是一些只读的属性,可以查询如当前允许的事件、触发线设置等信息。
  6.事件及句柄
  事件指需要应用程序进行处理的一些情况,一般有三类:服务请求(SRQs)、中断及硬件触发器(Trigger)。事件只有在被设置为允许状态后才能被接收和处理。
  这可以通过两种方式完成:
  ①首先装载一个事件句柄(ViInstallHandler函数),设置事件为允许状态(ViEnableEvent)。这样,当指定的事件发生后,就可以转到事件句柄回调函数中进行处理(通常是提供一些提示信息)。
  ②用ViEnableEvent函数设置事件为允许,然后在程序中适当的地方调用ViWaitOnEvent函数以等待事件的发生,这将暂停程序的执行过程直到事件发生并被处理或超时。(这两种方法在同一个会话中也不能并用)。
  另外,在事件响应完之后,设置为允许的事件应在适当的地方重新调为禁止,并卸载事件句柄(ViUNInstallHandler函数和ViDisableEvent函数)。
  7.出错处理
  在程序中考虑对出错的处理是一种好的编程风格。VISA库对此也提供了支持。一般可以在每一个VISA库函数的调用后通过检查返回值(与VI-Success常量比较)来判别是否有错误发生。同样,这里也需要定义相应的错误句柄回调函数,完成对错误的处理(如显示提示信息、关闭会话、退出应用等)。
  8.锁机制
  在VISA库编程中,可以同时对同一个设备保持多个会话,同样,多个应用也可以通过不同的会话对同一个设备或资源访问。在某些情况下,这将带来问题(与数据库中的并发操作以及完整性概念相似)。这样,可能某一应用在访问资源时就希望能限制其它应用对这一资源的访问。这时,就需要用到加/解锁函数调用。
  ViLock函数:对资源加锁,可以有两种类型的锁:排他锁与共享锁。
  ViUnLock函数:解锁。
  9.对VXI设备编程
  VISA库中对VXI仪器模块的应用开发提供了丰富的函数,并可以支持VXI、GPIB及GPIB-VXI三种接口类型。
  VXI仪器模块可分类为两种:消息基设备和寄存器基设备。前者拥有自己的处理器,因而可以直接解释并执行SCPI命令,在VISA库函数调用中,这只需把SCPI命令字串作为相应的调用参数即可。同时,VISA库中还提供了直接对其寄存器操作的函数。后者则没有自己的处理器,因而不能解释SCPI命令。
  VISA库中为VXI仪器模块提供了两级内存操作函数接口:
  ①高级内存函数
  它屏蔽了低层的内存映射及寄存器访问机制,向用户提供了简单易用的函数调用接口,从而可以方便地访问VXI接口上指定的内存空间。
  ViInxx函数:读入指定内存空间的值
  ViOutxx函数:向指定内存空间输出值
  ViMoveInxx函数:对指定内存处成块数据的读入
  ViMoveOutxx函数:向内存输出成块数据
  xx分别对应8、16或32位数据,相应为8、16、32。
  ②低级内存函数
  高级内存函数简单易用,但其缺陷在于速度上的损失(内部的地址映射及寄存器访问带来的影响),因而在某些对速度有较高要求的场合,还需使用VISA库中的低层内存函数。
  ViMapAddress函数:完成内存空间的映射
  ViPeekxx函数:读入寄存器内容
  ViPokexx函数:向寄存器中写入
  ViUnMapAddress函数:释放内存映射
  xx同样代表8、16或32位后缀。
  10.应用示例
  前面几小节中分别讨论了基于HP-VISA库的VXI总线测试应用开发中的一些细节,下面,通过给出一个具体的程序实例进一步说明:
  //示例程序example.c源代码清单
  #include<visa.h>    //包含VISA库头文件
  #include<stdio.h>
  voidmainO
  {
  ViSessiondefaultRm,Vi;  //定义保存会话句柄的变量
  doubleres;
  doublelist=(1,0.001);
  ViOpenDefaultRM(defaultRM);//打开缺省资源管理器会话
  //打开仪器会话(接口类型为VXIO,逻辑地址24)
  ViOpen(defaultRM,“VXIO∶∶22∶∶INSTR”,VI-NULL,VI-NULL,Vi);
  //设置对会话的独占锁
  ViLock(Vi,VI-EXCLUSIVE-LOCK,2000,VI-NULL,VI-NULL);
  /*下面一段代码为格式化I/O函数演示*/
  ViPrintf(Vi,“*RST\n”);//利用格式化I/O函数,初始化仪器
  ViPrintf(Vi,“CALC∶DBM∶REF50\n”);//利用格式化I/O函数向仪器发送命令,
  VIPrintf(Vi,“MEAS∶VOLT∶AC?%,2f\n”,list);//本例为进行直流电压测量
  ViScanf(Vi,“%lf”,res);//利用格式化I/O函数读出测量结果
  printf(“MeasurementResults:%lf\n”,res);
  /*下面一段代码为无格式I/O函数演示
    ViWrite(Vi,(ViBuf)“RST\n”,5,actual);//设备初始化
    ViWrite(Vi,(ViBuf)“CALC∶DBM∶REF50\n”,16,actual);//直流电压测量
    ViWrite(Vi,(ViBuf)“MEAS∶VOLT∶AC?1,0.001\n”23,actual);
    ViWrite(Vi,(ViBuf)strres,20,actual); //读出测量结果
    strres[actual]=0;  //用空字符结束串
    printf(“MeasurementResults:%s\n”,strres);
  */
  //利用属性设置函数激活触发线
  ViSetAttribute(Vi,VI-ATTR-TRIG-ID,VI-TRIG-TTLO);
  ViInstallHandler(Vi,VI-EVENT-TRIG,myHdlr,(ViAddr)10);//装载事件句柄
  ViEnableEvent(vi,VI-EVENT-TRIG,VI-HNDLR,VI-NULL);//设置事件为允许
  ViAssertTrigger(Vi,VI-TRIG-PROT-SYNC);//引发触发线
  ViDisableEvent(Vi,VI-EVENT-TRIG,VI-HNDLR);//处理完成,设置事件禁止
  ViUninstallHandler(Vi,VI-EVENT-TRIG,myHdlr,(ViAddr)10);//卸载事件句柄
  ViUnlock(Vi);//解锁
  ViClose(Vi);//关闭设备会话
  ViClose(DefaultRM);//关闭资源管理器会话
  }
  //触发器事件句柄函数
  ViStatus-VI-FUNCHmyHdlr(ViSessionVi,ViEventTypeeventType,VIEventctx,ViAddreserHdlr)
  {
  ViInt16trigId;
  if(eventType!-VI-EVENT-TRIG){  //检查事件类型
  returnVI-SUCCESS; }  //其它事件被忽略
  printf(“TriggerEventOccurred!\n.OriginalDeviceSession=%ld\n”,Vi”);
  //通过属性读取函数,获取被引发的触发器
  ViGetAttribute(ctx,VI-ATTR-RECV-TRIG-ID,trigId);
  printf(“Triggerthatfired:”);
  switch(trigId){  caseVI-TRIG-TTLO:
           printf(“TTLO”);
           break;
           default
           printf(“<otherOx%x>”,trigId);
           break;
  }
  printf(“\n”);
  returnVI-SUCCESS;
  }
三、小结
  VISA标准及库的开发为用户提供了简捷易用的函数接口,有效地提高了应用开发效率,并能保证一致性与良好的可移植性。而功能还处于不断的完善和发展中,是一种有别于已有I/O软件标准的大有前途的I/O软件标准构架。

参考文献

1 HPVISAUser’sGuide
2 VISA-虚拟仪器软件构架的结构及应用。《国外电子测量技术》1997.NO.1

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top