虚拟仪器系统I/O接口软件——VISA(1)

VISA是虚拟仪器系统的I/O接口软件,为虚拟仪器系统的统一性和扩展性奠定了基础。本章介绍了VISA的概念和特点,论述了VISA的结构模型,重点分析了VISA资源与资源类的定义与描述,并结合实例,详细讨论了各资源的属性、事件与操作规范与软件实现。在本章结束,还讨论了VISA的实际设计思路与方法。

3.1 VISA的概念与特点

3.1.1 VISA的由来

随着虚拟仪器系统的出现与发展,I/O接口软件作为虚拟仪器系统软件结构中承上启下的一层,其模型化与标准化越来越重要。I/O接口软件驻留于虚拟仪器系统的系统管理器——计算机系统中,是实现计算机系统与仪器之间命令与数据传输的桥梁和纽带。许多仪器生产厂家在推出硬件接口电路的同时,也纷纷推出了不同结构的I/O接口软件,有的只针对某类仪器(如NI公司用于控制GPIB仪器的NI-488及用于控制VXI仪器的NI-VXI),有的在向统一化的方向靠拢(如HP公司的SICL—标准仪器控制语言),这些都是在仪器生产厂家内部通用的、优秀的I/O接口软件。

一般的I/O接口软件的结构都采用了自顶向下的设计模型:首先列出该I/O接口软件需要控制的所有仪器类型,然后列出了各类仪器的所有控制功能,最后将各类仪器控制功能中相同的操作功能尽可能地以统一的形式进行合并,并将统一的功能函数称为核心功能函数(如将GPIB仪器的读/写与RS232串行仪器的读/写统一为一个核心功能函数)。所有统一形式的核心函数与其它无法合并的、与仪器类型相关的操作功能函数一起构成了自顶向下的I/O接口软件,实现不同类型的仪器的互操作性与兼容性。然而,这种构成方法只适用于消息基器件的互操作性(如消息读、消息写、软件触发、状态获取、异步事件处理等功能),对于如中断处理、内存映射、接口配置、硬件触发等属于器件特有的操作,根本无法得到统一的核心函数,消息基器件与寄存器基器件无法在自顶向下的I/O接口软件中得到统一。核心函数集在整个I/O接口软件中只有一个小子集,特定操作函数集是一个大子集。自顶向下结构的I/O接口软件实质上是建立在仪器类型层的叠加,并没有真正实现接口软件的统一性。同时应该说,自顶向下的设计方法为真正统一的I/O接口软件的设计与实现提供了经验借鉴与尝试。VPP联盟在考察了多个I/O接口软件之后,提出了一种自底向上的I/O接口软件模型,也就是VISA。

3.1.2 VISA模型结构

VISA是虚拟仪器软件结构(Virtual Instrument Software Architecture)的缩写,实质是一个I/O接口软件及其规范的总称。一般情况下,将这个I/O接口软件称为VISA。

如上所说,VISA的构成是采用了自底向上的结构。与自顶向下的方法不同的是,VISA的实现首先定义了管理所有资源的资源(在这儿,资源的概念相当于面向对象程序设计中的对象,具体的定义与描述见下节),这个资源称为VISA资源管理器,它用于管理、控制与分配VISA资源的操作功能。各种操作功能主要包括:

1、 资源寻址;

2、 资源创建与删除;

3、 资源属性的读取与修改;

4、 操作激活;

5、 事件报告;

6、 并行与存取控制;

7、 缺省值设置。

第二步是在资源管理器基础上,列出了各种仪器各自的操作功能,并实现操作功能的合并。在这个基础上实现的资源实质可以包括不同格式的操作,如读资源包括了消息基器件的读,也包括了寄存器基器件的读;既可以包括同步读操作,又可以包括异步读操作。每一个资源内部,实质是各种操作的集合。这种资源在VISA中即为仪器控制资源,包含各种仪器操作的资源称为通用资源,而将无法合并的功能,称为特定仪器资源。

第三步,需要定义与创建一个用API实现的资源,为用户提供单一的控制所有VISA仪器控制资源的方法,在VISA中称为仪器控制资源组织器。

与自顶向下的构成方式相比,VISA的构成模型是从仪器操作本身开始的,它实现的统一是深入到操作功能中去而不是停留于仪器类型之上。在VISA的结构中,仪器类型的区别体现到统一格式的资源中的操作的选取,对于VISA使用者来说,形式上与用法上是单一的。在理论层次上,自顶向下的方法属于归纳范畴,而自底向上的方法则属于演绎范畴。因此,自顶向下是对过去所有仪器类型的总结,而不可能提供扩展接口,而自底向上的结构是从共性到个性的推广,它的兼容性不仅仅是过去、现在,还可以包括将来。正由于这种自底向上的设计方法,VISA为虚拟仪器系统软件结构提供了一个共同的、统一的基础,来自于不同供应厂家的不同的仪器软件,可以运行于同一平台之上了。

VISA的结构模型如图3.1所示。

图3.1 VISA结构模型概图

VISA结构模型自下往上,构成一个金字塔结构,最底层为资源管理器,其上为I/O级资源、仪器级资源与用户自定义资源集。其中,用户自定义资源集的定义,在VISA规范中并没有规定,它是VISA的可变层,实现了VISA的可扩展性与灵活性,而在金字塔顶的用户层应用,是用户利用VISA资源实现的应用程序,其本身并不属于VISA资源。

3.1.3 VISA的特点

基于自底向上结构模型的VISA创造了一个统一形式的I/O控制函数集,它是所有现存的I/O接口软件的功能超集,在形式上与其它I/O接口软件十分相似。一方面,对于初学者或是简单任务的设计者来说,VISA提供了简单易用的控制函数集,在应用形式上相当简单。另一方面,对于复杂系统的组建者来说,VISA提供了非常强大的仪器控制功能与资源管理功能,能提供仪器间的互操作性与兼容性。它是易用性、可扩展性、互操作性、兼容性的完全统一体。

与其它现存的I/O接口软件相比,VISA具有以下几个特点:

1、 VISA的I/O控制功能适用于各种仪器类型,VISA包含了VXI仪器、GPIB仪器、RS232串行接口仪器等各类仪器的控制操作,也包含了消息基器件、寄存器基器件、存贮器件等仪器的操作,其形式上是统一的。

2、 VISA的I/O控制功能适用于各种仪器硬件接口类型,以VXI仪器系统为例,无论采用嵌入式计算机结构、GPIB接口外挂式结构、MXI接口外挂式结构,还是采用IEEE1394接口外挂式结构,对于VXI仪器的操作函数是一样的。同样,无论VXI仪器在系统中的逻辑地址是多少,仪器操作函数也是一样的。

3、 VISA的I/O控制功能适用于单处理器系统结构,也适用于多处理器结构或分布式网络结构。

4、 VISA的I/O控制功能适用于多种网络机制,无论虚拟仪器系统网络构成为VXI多机箱扩展网络还是以太网,仪器操作是一致的。

5、 VISA的I/O软件库的源代码是唯一的,其与操作系统及编程语言无关,只是提供了不同形式的API文件作为系统的引出。

由于VISA结构考虑到了多种仪器类型与网络机制的兼容性,因此以VISA I/O接口软件为基础的虚拟仪器系统,不仅可以与过去已有的仪器系统(如GPIB仪器系统及串行接口仪器系统)结合,也完全可以将仪器系统从过去的集中式结构过渡到分布式结构。VISA的兼容性与互操作性,保证了新一代仪器完全可以加入到虚拟仪器系统中去,同时也保证了仪器系统的投资者不会因为新仪器的出现而将过去的系统抛弃,从而可以不使投资浪费。系统集成时,不必再选择某家特殊的软件和硬件产品,可以根据自己的需要,在所有的VPP产品中作出最佳选择,系统的兼容性与强健性大大增强了,系统的标准化与统一性也找到了最基础的保障。

3.1.4 VISA应用实例

下面通过分别调用非VISA的I/O接口软件与VISA函数,对GPIB器件与VXI消息基器件进行简单的读/写操作(主要完成向器件发送查询器件标识符命令,并从器件读回响应值操作过程),进行VISA与其它I/O接口软件的异同点比较。所有例子中采用的编程语言均为C语言。

例3.1 用非VISA的I/O接口软件(NI公司的NI-488)实现对GPIB器件的读/写操作:

程序说明:

1、 声明区:声明程序中所有变量的数据类型,用C语言数据类型声明。

2、 开启区:进行GPIB器件初始化,确定GPIB器件地址,并为每个器件返回一个对应的器件句柄。在初始化过程中,器件句柄作为器件的标志以输出参数形式被返回,在其它的I/O功能函数中,器件句柄则作为函数的输入参数,以标志特定的GPIB器件。

3、 器件I/O区:在本例程中,器件I/O主要完成命令发送,并从GPIB器件中读回响应数据。主要完成向器件发送查询器件标识符命令,用标准命令符“*IDN?”,并从器件读回响应值,即器件的标识符。在NI-488函数集中,分别用ibwrt函数与ibrd函数进行器件写操作与读操作。

4、 关闭区:GPIB的I/O软件将本身的数据结构存于内存中,当系统关闭时,所有仪器全部自动关闭,无需对I/O软件本身作关闭操作。也就是说,GPIB的I/O软件(如NI-488)无关闭机制。

例3.1 用NI-488实现对GPIB仪器的读/写操作

例3.2 用非VISA的I/O接口软件(NI公司的NI-VXI)实现对VXI消息基器件的读/写操作:

例3.2 用NI-VXI实现对GPIB器件的读/写操作程序说明:

1、 声明区:声明程序中所有变量的数据类型,用C语言数据类型声明。

2、 开启区:进行VXI消息基器件初始化,确定VXI消息基器件的逻辑地址。在对VXI器件操作中,逻辑地址取代了GPIB器件操作中的器件句柄,作为器件操作的标志,在初始化操作中返回唯一的值。

3、 器件I/O区:在本例程中,主要完成对命令发送,并从VXI消息基器件读回响应数据。同样完成向器件发送查询器件标识符命令,用标准命令符“*IDN?”,并从器件读回响应值,即器件的标识符。由初始化得到的器件逻辑地址在器件I/O操作中作为函数的输入参数被使用。程序通过对逻辑地址的处理,完成对器件的一对一操作。在VXI消息基器件的操作中,分别用WSwrt函数与WSrd函数进行器件的写操作与读操作,其中这两个函数中的mode参数均表示数据传输方式,retCount参数表示实际传送的字节数。

4、 关闭区:对于VXI器件,存在着一个关闭机制,要求在结束器件操作的时候,同时关闭I/O接口软件。

例3.3 用VISA I/O接口软件实现对GPIB器件与VXI消息基器件的读/写操作:

例3.3 用VISA实现对GPIB器件与VXI消息基器件的读/写操作

程序说明:

1、 声明区:声明程序中所有变量的数据类型。与以上两例不同的是,在这儿声明的数据类型均为VISA数据类型,其是与编程语言无关的。而VISA数据类型与编程语言数据类型的对应说明,均包含在特定文件中。如VISA数据类型的C语言形式的包含头文件为本章附录文件visatype.h和visa.h。由于程序中没有涉及到具体某种语言的数据类型,故程序本身具有良好的兼容性与可移植性,各种编程语言调用VISA的数据类型与操作函数的参数调用格式相差甚少。

2、 开启区:进行消息基器件初始化,建立资源管理器及器件与VISA的通信关系。对所有器件进行初始化均调用viOpenDefaultRM()与viOpen()函数。在此例中,对于GPIB器件的初始化与对于VXI器件的初始化的函数调用形式是一致的,只是输入参数中器件描述符的值区别。在调用viOpen()函数时,器件硬件接口形式(计算机结构形式)是无需特别说明的,该初始化过程完全适用于各种器件硬件接口类型。初始化过程中返回的vi参数,类似于器件句柄,可作为器件操作的标志与数据传递的中介。

3、 器件I/O区:在本例程中,主要完成对器件发送命令,并从器件读回响应数据。对于GPIB的读/写操作与对于VXI消息基器件的读/写操作,调用的VISA函数是一样的。其中vi是操作函数的输入参数。

4、 关闭区:在器件操作结束时,调用viClose()函数,关闭器件及资源管理器与VISA的关联。

通过以上三个例程的分析,可以发现两个事实:

第一、VISA函数的调用与其它接口软件函数的调用形式上并无太多不同,学习功能强大的VISA软件并不比一般的I/O接口软件任务重。而且VISA的函数参数意义明确,结构一致,在理解与应用仪器程序时,效率较高。

第二、VISA用户只需学习了VISA函数应用格式,就可以对多种仪器实现统一控制,不必再象以前学会了用NI-488对GPIB器件操作之后,还得学会NI-VXI对VXI器件进行操作。与其它的I/O接口软件相比,VISA体现的多种结构与类型的统一性,使不同仪器软件可以运行在同一平台上,为虚拟仪器系统软件结构提供了坚实的基础。

3.2 VISA资源描述

3.2.1 VISA资源类与资源

自底向上的VISA模型内部是由面向对象程序(OOP)软件模块构成的。在VISA中,最基本的软件模块是定义在资源类上的资源。

VISA的资源类概念类似于面向对象程序设计方法中类的概念。类是一个实例外观和行为的描述。类通过构造函数来建立新的实例,因为不管怎样,先得建立一个实例才能使用它、操作它。当向类提出要建立一个实例的要求时,它会通过一个特定的构造函数创建并初始化一个新的实例。然而,类并不对销毁一个实例负责,这就要求实例要自己负责,它们通过调用一个方法来申请自我的销毁。类的声明定义了类的实例结构以及一组可以由该实例执行的有效操作。VISA资源类是一种抽象化的器件特点功能描述,是对资源精确描述的专用术语。

VISA的资源概念类似于面向对象程序设计方法中对象的概念。对象实例不仅包含数据实体,而且是一个服务提供者。做为一个数据实体,一个对象很象一个记录,由一些相同或不同类型的域构成。这些域的整体被称为一个对象的状态。改变这些域的值,逻辑上讲就是改变一个对象的状态。作为服务提供者,或者说是一个过程实体,一个对象是一些在其域上进行操作的方法或子程序的集合。从这个角度看来,它有点象一个子例程库。方法定义了对象的行为,激活一个对象方法的实际结果就是让对象做一个动作。这两种互相补充的角色使对象这种概念变得非常强大。使用对象,可以使抽象非常方便:一个对象的内部可以看成一个“黑匣子”,只能通过精心设计的由方法组成的接口来访问。对象的可见部分成为它的协议。

VISA中资源与OOP对象一样,也由三个要素组成:属性集、事件集与操作集。以读资源为例,其属性集包括结束字符串、超时值及协议等,事件集包括用户退出事件,操作集包括各种端口读取操作。

3.2.2 VISA资源描述格式

VISA资源是独立于编程语言与操作系统的,在VISA本身的资源定义与描述中并不包含任何操作系统或编程语言相关的限制。VISA源代码是唯一的,只为不同的操作系统编程语言提供了不同的API接口。VISA资源类共分为五大类:VISA资源模板、VISA资源管理器、VISA仪器控制资源、VISA仪器控制组织器、VISA特定接口仪器控制资源。在每一类中定义与描述的VISA资源都遵循同样的格式。VISA资源描述格式

如表3.1所示。

VISA资源描述格式是一种抽象定义,与具体编程语言无关,资源内所有元件的定义也均与编程语言无关。VISA通过提供不同的API接口,适用于不同的操作系统与编程环境。在不同的编程语言环境之中调用VISA,均需在应用程序头部引入说明文件。在C语言环境下,VISA资源说明文件为visatype.h和visa.h文件(详见本章附录)。唯一的VISA源程序通过不同的引入接口与文件说明,实现了不同环境下的适用性。VISA资源描述格式不仅适用于现在VISA包含的所有资源,也为VISA将来资源扩充定义了一个标准格式。现定义的VISA资源类型定义如表3.2所示。

X.1 资源概述

X.2 资源属性表及属性描述

X.3 资源事件集

X.4 资源操作集

   所含每个操作包括:

X.4.Y   名字(含形参名)

X.4.Y.1 目标

X.4.Y.2 参数表

X.4.Y.3 返回状态值

X.4.Y.4 描述

X.4.Y.5 相关操作项

X.4.Y.6 实现要求

表3.1  VISA资源描述格式

资源    缩写名  标准名

VISA资源管理器资源  VRM VI_RSRC_VISA_RM

VISA仪器控制组织器资源  VICO    VI_RSRC_VISA_IC_ORG

写资源  WR  VI_RSRC_WR

读资源  RD  VI_RSRC_RD

格式化I/O资源   FIO VI_RSRC_FMT_IO

触发资源    TRIG    VI_RSRC_TRIG

清除资源    CLR VI_RSRC_CLR

状态/服务请求资源   SRQ VI_RSRC_SRQ

高级存取资源    HILA    VI_RSRC_HL_ACC

低级存取资源    LOLA    VI_RSRC_LL_ACC

器件特定命令资源    DEVC    VI_RSRC_DEV_CMD

CPU接口资源 CPUI    VI_RSRC_CPU_INTF

GPIB总线接口控制资源    GBIC    VI_RSRC_GPIB_INTF

VXI总线器件配置资源 VXDC    VI_RSRC_VXI_DEV_CONF

VXI总线接口控制资源 VXIC    VI_RSRC_VXI_INTF

VXI总线零槽资源 VXS0    VI_RSRC_VXI_SLOT_0

VXI总线系统中断资源 VXSI    VI_RSRC_SYS_INTR

VXI总线信号处理器资源   VXSP    VI_RSRC_SIG_PROCESSOR

VXI总线信号资源 VXS VI_RSRC_VXI_SIG

VXI总线中断资源 VXIN    VI_RSRC_VXI_INTR

VXI总线扩展器接口资源   VXEI    VI_RSRC_VXI_EXTDR

异步串行总线接口控制资源    ASIC    VI_RSRC_ASRL_INTF

表3.2  VISA资源类型定义

下面对VISA资源描述格式中各部分进行逐一分析:

1、 资源概述:简要说明资源所要实现的功能,一般不针对特定仪器类型或接口进行描述,只提供一个通用概念。

2、 资源属性表及属性描述:资源属性表列出了资源所有属性,并在以后的属性描述中作较详细的说明。资源属性表如表3.3所示。

属性符号名  存取特性    数据类型    取值范围 读/写特性   私有/公有特性      

表3.3 VISA资源属性表

l   属性符号名:用于标识属性。

l   存取特性:包括读/写特性与私有/公有特性。读/写特性可选择R/W(可读可写)与RO(只读);私有/公有特性可选择Local(对话通道私有)与Global(资源内所有对话通道公有)。

l   数据类型:VISA数据类型是独立于编程语言定义的,在具体编程中调用VISA函数进行实际操作时,VISA数据类型与具体数据类型将一一映射。VISA定义了两类数据类型:基本数据类型与复杂数据类型。分别见表3.4和表3.5。

l   取值范围:定义了该属性数据的取值范围。

基本数据类型    数据类型描述    基本数据类型    数据类型描述

ViChar  字符类型    ViInt32 32位整型

ViPChar 字符指针类型    ViPInt32    32位整型指针类型

ViByte  字节类型    ViInt64 64位整型

ViPByte 字节指针类型    ViPInt64    64位整型指针类型

ViString    字符串类型  ViUInt8 8位无符号整型

ViPString   字符串指针类型  ViPUInt8    8位无符号整型指针类型

ViBoolean   布尔类型    ViUInt16    16位无符号整型

ViPBoolean  布尔指针类型    ViPUInt16   16位无符号整型指针类型

ViInt8  8位整型 ViUInt32    32位无符号整型

ViPInt8 8位整型指针类型 ViPUInt32   32位无符号整型指针类型

ViInt16 16位整型    ViUInt64    64位无符号整型

ViPInt16    16位整型指针类型    ViPUInt64   64位无符号整型指针类型

ViReal32    32位实型    ViReal64    64位实型

ViPReal32   32位实型指针类型    ViPReal64   64位实型指针类型

表3.4 VISA基本数据类型

复杂数据类型    数据类型描述    复杂数据类型    数据类型描述

ViRsrc  资源标识类型    ViHndlr 操作句柄类型

ViPRsrc ViRsrc指针类型  ViPHndlr    ViHndlr指针类型

ViStatus    返回状态值类型  ViVAList    参数列类型

ViPStatus   ViStatus指针类型    ViJobId 操作请求类型

ViBuf   数据块类型  ViPJobId    ViJobId指针类型

ViPBuf  ViBuf指针类型   ViJobStatus 操作请求状态类型

ViAddr  逻辑地址类型    ViPJobStatus    ViJobStatus指针类型

ViPAddr ViAddr指针类型  ViSpaceInfo 内存映射类型

ViSession   资源对话通道类型    ViPhysAddr  物理地址类型

ViPSession  ViSession指针类型   ViSigMask   信号过滤类型

ViVersion   资源版本类型    ViIntrMask  中断屏蔽类型

ViPVersion  ViVersion指针类型   ViBusAddress    总线地址类型

ViObject    资源对象类型    ViBusSize   地址长度类型

ViPObject   ViObject指针类型    ViAttr  资源属性类型

ViRsrcList  资源标识列类型  ViAttrState 资源属性值类型

ViClass 资源类类型  ViLock  资源进程/线程管理类型

ViEvent 资源事件类型    ViPLock ViLock指针类型

ViPEvent    ViEvent指针类型 ViEventType 资源事件类型类型

ViAccessMode    控制存取机制类型    ViPEventType    ViEventType 指针类型

表3.5 VISA复杂数据类型

3、 资源事件集:VISA定义了一种运行机制,用于在一定条件下通知应用程序一个行为的发生,这些条件与发生被称为VISA事件。VISA事件模型如图3.2所示。

VISA事件模型由三部分组成。1)事件捕捉与通知:资源感知到事件发生,并与对话通道相联系;2)事件请求与处理:告知应用程序事件已发生,VISA定义了事件处理机制;3)事件响应:根据协议对事件进行响应。

图3.2 VISA事件模型

根据VISA事件引发的原因,事件类型可分为以下几种:

l   由硬件请求产生:如GPIB器件SRQ信号有效。

l   由硬件响应产生:如VXI总线中的SYSFAIL线有效。

l   由于资源行为的起始与结束所产生:如应用程序想知道系统服务是处于在线状态还是离线状态。

l   由于资源转换到不正常操作,必须终止正常操作所产生的事件。

l   在应用程序正常运行过程中的错误散转情况。

在VISA中,定义了两种事件处理机制。一种是事件排队方式(Queuing),它主要分两步进行:首先允许特定事件的处理机制,然后在一定时刻点去查询事件是否已经发生(调用VISA中的viWaitOnEvent()函数,事件类型见VI_EVENT_类参数),在事件发生之后,必须关闭特定事件的处理机制,以防止资源溢出。例3.4所示为用事件排队方式处理VISA事件。

例3.4 排队方式处理VISA事件

另一种事件处理方式为回调方式(Callback),也即中断方式。它首先安装回调句柄,然后在程序中允许事件处理机制,并应编写相应的中断子程序。利用回调方式进行处理的事件类型主要有以下几种:

l   VI_EVENT_SERVICE_REQ:该事件表示VXI器件服务请求

l   VI_EVENT_TRIG:该事件表示从VXI器件接收到硬件触发信号

l   VI_EVENT_VXI_SIGP:该事件表示从VXI器件接收到总线信号或总线中断信号

例3.5、例3.6与例3.7分别是利用回调方式对各种类型事件进行处理的实例,其中

例3.5是对HP公司推出的VXI数字万用表模块进行服务请求事件的处理,而例3.6与

例3.7是对浙江大学数字所自主开发的VXI数字输入/输出模块进行触发事件与总线中断事件处理。事实上,这几种事件处理示例可直接推广应用到其它的消息基器件与寄存器基器件中。

例3.5 利用回调方式对VXI模块进行服务请求事件处理:

例3.5 回调方式进行服务请求事件处理

在这种模式中,主程序安装的事件句柄类型为VI_EVENT_SERVICE_REQ,并须将服务请求使能。当服务请求事件发生时,安装的事件句柄被激活,系统进入中断子程序。中断子程序首先对事件类型进行判断,然后进行具体事件处理。在主程序退回时,必须关闭事件允许机制,并将安装的事件句柄进行卸载。

例3.6 利用回调方式对VXI模块进行触发事件处理:

例3.6 回调方式进行触发事件处理

在这种模式中,主程序安装的事件句柄类型为VI_EVENT_TRIG,并须将服务请求使能。本主程序利用设置仪器属性的方式进行触发总线的选择与有效,并利用软件进行同步触发信号线TTL0。当触发事件发生时,安装的事件句柄被激活,系统进入中断子程序。中断子程序首先对事件类型进行判断,然后进行具体事件处理。需要注意的是,在中断子程序中获取事件的句柄不再是仪器句柄vi,而是ViEvent类型的事件句柄ctx。在主程序退回时,必须将安装的事件句柄进行卸载。

例3.7 利用回调方式对VXI模块进行总线中断事件处理:

例3.7 回调方式进行总线中断事件处理

在这种模式中,主程序安装的事件句柄类型为VI_EVENT_VXI_SIGP,并须将服务请求使能。本主程序直接对器件内部控制寄存器进行写操作,允许中断产生并强制中断产生。当触发事件发生时,安装的事件句柄被激活,系统进入中断子程序。中断子程序首先对事件类型进行判断,然后进行具体事件处理。同样,在中断子程序中获取事件的句柄不再是仪器句柄vi,而是ViEvent类型的事件句柄ctx。在主程序退回时,必须将安装的事件句柄进行卸载。

4、 资源操作集:包括了一系列VISA资源操作。而每个操作又分别包括以下各项:

l   名字(含形参名):用于操作函数原型的简单描述。

l   目标:简要描述相应的操作功能。

l   参数表:列出了操作中所有参数的相关信息,包括参数名、输入/输出方向、参数数据类型及参数描述。操作参数表如表3.6所示。

参数名  输入/输出方向   数据类型    描述

表3.6资源操作参数表

l   返回状态值:VISA资源操作返回状态值类型是唯一的,即为ViStatus。操作返回状态值包括完成代码与错误代码两类。

l   描述:对每个函数的功能及其中关键参数的含义等作较详细的描述。

l   相关操作项:可参考的其它相关操作。

l   实现要求:操作实现时应满足的一些条件与备注要求。

3.3 VISA资源定义

3.3.1 VISA资源模板

VISA资源模板相当于面向对象程序(OOP)中的基类,VISA其它资源类全部是它的子类。VISA资源模板上本身没有定义资源,它定义的是公共属性、事件与操作,所有VISA资源全部继承了资源模板的属性、事件与操作。在其它VISA资源定义中,实际上是定义了资源特有的属性、事件与操作,VISA资源真正拥有的属性、事件与操作包括资源模板定义的公共部分与资源特有的私有部分。

VISA资源模板中主要定义了以下几个共性功能:

l   资源定位与查寻

l   资源创建与删除

l   资源属性读取与修改

l   资源存取模式与权限控制

l   基本通讯服务(包括操作激活与事件报告)

VISA资源模板的定义也包括相应的属性、事件与操作,各自的描述格式与定义方式与其它VISA资源描述是一致的,这主要是为了其他资源可以方便地从基类继承所有属性、事件与操作。

资源模板定义的属性如表3.7所示:

属性符号名  存取特性    数据类型    取值范围

    读写特性    公私特性       

VI_ATTR_RSRC_CLASS  只读    公有    ViClass 无

VI_ATTR_RSRC_NAME   只读    公有    ViString    无

VI_ATTR_RSRC_VERSION    只读    公有    ViVersion   无

VI_ATTR_RSRC_LOCK_STATE 只读    公有

    ViUInt16    VI_NO_LOCKVI_NON_EXCLUSIVE_LOCKVI_EXCLUSIVE_LOCK

VI_ATTR_MAX_QUEUE_LENGTH    可读可写    私有    ViUInt32    无

VI_ATTR_QUEUE_TRIP_POINT    可读可写    私有    ViUInt32    无

VI_ATTR_USER_DATA   可读可写    私有    ViAddr  无

表3.7 VISA资源模板属性表

VISA资源模板属性描述:

属性名          描述

VI_ATTR_RSRC_CLASS  资源所属类的标识符

VI_ATTR_RSRC_NAME   资源名标识符

VI_ATTR_RSRC_VERSION    资源版本标识符

VI_ATTR_RSRC_LOCK_STATE 资源存取锁定模式(取值为表3.7中所列三种)

VI_ATTR_MAX_QUEUE_LENGTH    任一时间特定对话通道最大排队的事件长度

VI_ATTR_QUEUE_TRIP_POINT    排队事件的触发点

VI_ATTR_USER_DATA   资源特定对话通道所用的私有数据

资源模板定义的事件如下所示:

事件    说明

VI_EVENT_ALERT  通知应用程序对话通道或资源退出、复位或关闭

VI_EVENT_RSRC_ACTIVE    通知应用程序资源已激活

VI_EVENT_RSRC_INACTIVE  通知应用程序资源未被激活

VI_EVENT_RSRC_LOCK_CHANGED  通知应用程序存取锁定状态已更新

VI_EVENT_QUEUE_FULL 通知应用程序等待操作事件队列已满

VI_EVENT_QUEUE_TRIP 通知应用程序事件等待操作触发点已到

VI_EVENT_RSRC_AVAILABLE 通知应用程序特定资源已有效

资源模板定义的操作如下:

viFindRsrc(vi,expr,accessLink)

viOpen(sesn,rsrcname,accessMode,timeout,vi)

viClose(vi)

viTerminate(vi,target,degree,jobId,immediate,flagFlushData)

viAttachRsrc(vi,rsrcName,refName)

viDetachRsrc(vi,refName)

viSetAttribute(vi,attribute,attrState)

viSetRsrcAttribute(vi,rsrcName,attribute,attrState)

viGetAttribute(vi,attribute,attrState)

viGetRsrcAttribute(vi,attribute,attrState)

viLock(vi,lockType,shareType,timeout,lockId)

viLockRsrc(vi,rsrcName,lockType,shareType,timeout,lockId)

viUnlock(vi,lockId)

viUnlockRsrc(vi,rsrcName,lockId)

viEnableEvent(vi,eventType,mechanism,context)

viDisableEvent(vi,eventType,mechanism)

viQueryEventMech(vi,eventType,mechanism)

viInstallHandler(vi,eventType,handler,userHandle)

viUnInstallHandler(vi,eventType,handler,userHandle)

viQueryHandlers(vi,eventType,handlers,userHandle)

viAcknowledgeEvent(vi,eventType,context)

viWaitOnEvent(vi,eventType,timeout,outContext)

viWaitOnMultipleEvent(vi,eventTypeList,timeout,outContext,outEventType)

viDiscardEvents(vi,eventType,mechanism)

viGetEventInfo(vi,eventType,context,rsrcName,info)

viRaiseEvent(vi,eventType,context,target)

viEventHandler(vi,eventType,context,userHandle)

下面将分别对各个操作作一详细描述。

1、 viFindRsrc(vi,expr,accessLink)

1) 目标:查询VISA系统,进行资源定位

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   资源对话通道标识符

expr    输入    ViString    用于资源名匹配的表达式

accessLink  输出    ViRsrcList  资源所在位置列表

3) 返回状态值:

完成代码:

VI_SUCCESS  资源查寻到

错误代码:

VI_ERROR_INV_SESSION    vi(句柄)不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EXPR   查找表达式不规范

VI_ERROR_RSRC_NFOUND    查找表达式无法与资源名匹配

4) 描述:该操作用于查询资源名与表达式相匹配的资源,并确定资源位置。

5) 相关项:参见viAttachRsrc()、viOpen()。

6) 实现要求:输出参数accessLink应含所有相匹配的资源个数。

2、 viOpen(sesn,rsrcName,accessMode,timeout,vi)

1) 目标:打开特定资源的对话通道

2) 参数表:

参数名  输入/输出方向   数据类型    描述

sesn    输入    ViSession   VISA资源管理器

rsrcName    输入    ViRsrc  资源名

accessMode  输入    ViAccessMode    资源存取锁定模式

timeout 输入    ViUInt32    操作超时值

vi  输出    ViPSession  对话通道标识符(句柄)

3) 返回状态值:

完成代码:

VI_SUCCESS  对话通道打开完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_RSRC_NAME  资源名语法错误

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_ACC_MODE   不合法的存取模式

VI_ERROR_NSUP_ACC_MODE  存取模式不被支持

VI_ERROR_RSRC_NFOUND    系统中未能找到该资源

VI_ERROR_TMO    操作超时

4) 描述:该操作用于开启特定资源的一个对话通道,它返回的对话通道标识符可作为以后操作的软件句柄。参数中的accessMode应在几种存取模式中选取(VI_NO_LOCK、VI_EXCLUSIVE_LOCK、VI_NON_EXCLUSIVE_LOCK)。

5) 相关项:参见viClose()。

6) 实现要求:sesn参数一般用缺省VISA资源管理器viDefaultRM代入,因此在调用viOpen()函数之前一般已先调用了viOpenDefaultRM()函数用于打开缺省的资源管理器。

3、 viClose(vi)

1) 目标:关闭特定的对话通道

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

3) 返回状态值:

完成代码:

VI_SUCCESS  对话通道关闭完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_CLOSE_FAILED   无法释放与该对话通道相关联的内存数据结构

4) 描述:该操作用于关闭与资源相关联的对话通道,并释放内存数据。

5) 相关项:参见viOpen()。

6) 实现要求:当一个对话通道在执行viClose()操作时,不仅应关闭该通道,并应释放所有通道的数据。

4、 viAttachRsrc(vi,rsrcName,refName)

1) 目标:通过对话通道,建立两资源之间的关联

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

rsrcName    输入    ViRsrc  相关联的资源名

refName 输入/输出   ViPRsrc 相关联的资源别名

3) 返回状态值:

完成代码:

VI_SUCCESS  资源关联完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_RSRC_NAME  资源名语法错误

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_DUPLICATE  refName参数中的资源已存在

_REF_NAME  

VI_ERROR_ATTACH_REFUSED 资源无法被关联

4) 描述:该操作用于关联两个资源,用vi标识的对话通道可以存取相关联资源的所有属性与操作。

5) 相关项:参见viDetachRsrc()、viGetRsrcSession()。

6) 实现要求:资源间应通过关联方式实现对话。

5、 viDetachRsrc(vi,refName)

1) 目标:取消资源之间的关联

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

refName 输入/输出   ViPRsrc 相关联的资源别名

3) 返回状态值:

完成代码:

VI_SUCCESS  取消资源关联完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_RSRC_NFOUND    资源未能找到

VI_ERROR_INV_RSRC_NAME  资源名语法错误

4) 描述:该操作用于取消资源之间关联,一旦关联取消,相关联资源的所有属性与操作不能再被存取。

5) 相关项:参见viAttachRsrc()。

6) 实现要求:资源无法拒绝取消关联的请求。

6、 viTerminate(vi,target,degree,jobId,immediate,flagFlushData)

1) 目标:请求VISA资源终止一个或所有对话通道的正常运行

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

target  输入    ViBoolean   请求目标(资源或通道)

degree  输入    ViUInt16    请求类型,正常类型有VI_ABORT、VI_RESET、VI_FAIL、

VI_KILL

jobId   输入    ViJobId 操作标识符

immediate   输入    ViBoolean   请求是否立即有效

flagFlushData   输入    ViBoolean   资源是否放弃应用数据

3) 返回状态值:

完成代码:

VI_SUCCESS  请求服务完成

VI_SUCCESS_STATE_UNKNOWN    请求服务完成,但资源可能处于不一致状态

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_DEGREE 请求类型不合法

VI_ERROR_INV_JOB_ID 操作类型或标识符不合法

4) 描述:该操作用于请求资源去终止一个或所有对话通道的正常运行,请求类型可分为VI_ABORT(退出)、VI_RESET(复位)、VI_FAIL(失败)及VI_KILL(停止所有资源操作)四种。

5) 相关项:参见VI_EVENT_ALERT事件描述。

6) 实现要求:当VISA资源激活viTerminate()操作时,资源不能进行其它操作。

7、 viGetAttribute(vi,attribute,attrState)

        viGetRsrcAttribute(vi,rsrcName,attribute,attrState)

1) 目标:获取资源属性状态值

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

rsrcName    输入    ViRsrc  资源名

attribute   输入    ViAttr  资源属性

attrState   输出    ViPAttrState    资源属性状态值

3) 返回状态值:

完成代码:

VI_SUCCESS  获取属性完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_RSRC_NAME  资源名语法错误

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_NSUP_ATTR  资源属性未定义

4) 描述:viGetAttribute()取回当前资源属性状态值,而viGetRsrcAttribute()取回其它资源的公有属性状态值。

5) 相关项:参见viSetAttribute()、viSetrsrcAttribute()、viLock()、viUnLock()。

6) 实现要求:无论资源锁定状态如何,viGetRsrcAttribute()操作都可以取回资源公有属性状态值。

8、 viSetAttribute(vi,attribute,attrState)

    viSetRsrcAttribute(vi,rsrcName,attribute,attrState)

1) 目标:设置资源属性状态值

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

rsrcName    输入    ViRsrc  资源名

attribute   输入    ViAttr  资源属性

attrState   输入    ViAttrState 资源属性状态值

3) 返回状态值:

完成代码:

VI_SUCCESS  属性设置完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_RSRC_NAME  资源名语法错误

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_NSUP_ATTR  资源属性未定义

VI_ERROR_NSUP_ATTR_STATE    资源属性状态值不支持

VI_ERROR_NSUP_ATTR  资源属性为只读状态

_READONLY  

4) 描述:viSetAttribute()设置当前资源属性状态值,而viSetRsrcAttribute()设置其它资源的公有属性状态值。

5) 相关项:参见viGetAttribute()、viGetrsrcAttribute()、viLock()、viUnLock()。

6) 实现要求:当资源处于锁定状态时,无法进行属性状态值设置。

9、 viLock(vi,lockType,shareType,timeout,lockId)

        viLockRsrc(vi,rsrcName,lockType,shareType,timeout,lockId)

1) 目标:设置资源存取模式

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

rsrcName    输入    ViRsrc  资源名

lockType    输入    ViUInt16    锁定类型(独占或非独占)

shareType   输入    ViUInt16    锁定共享类型

timeout 输入    ViUInt32    操作超时值

lockId  输入/输出   ViPLock 当锁定设置成功后,资源返回的唯一锁定标识符

3) 返回状态值:

完成代码:

VI_SUCCESS  锁定模式设置完成

VI_SUCCESS_SHARE_LOCK   锁定模式设置完成,并被多个对话通道共享

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_RSRC_NAME  资源名语法错误

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_LOCK_TYPE  锁定模式不当

VI_ERROR_INV_LOCK_ID    锁定标识符不当

VI_ERROR_NSHARABLE  lockID不能用于非共享模式

VI_ERROR_LOCK_CHANGE    由于对话通道已被锁定,不能从非独占锁定状   

_FAILED 态改变到独占状态

4) 描述:该操作用于设置资源锁定模式,必须区分锁定类型与共享类型。共享类型的设置只对于独占锁定状态有关,所有非独占性锁定状态均为共享。

5) 相关项:参见viUnLock()、viUnLockRsrc()。

6) 实现要求:当锁定模式为非独占型时,shareType参数可忽略。

10、    viUnLock(vi,lockId)

        viUnLockRsrc(vi,rsrcName,lockId)

1) 目标:取消资源存取模式

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

rsrcName    输入    ViRsrc  资源名

lockId  输入    ViLock  锁定标识符

3) 返回状态值:

完成代码:

VI_SUCCESS  取消锁定模式完成

VI_WARN_NON_EXCLUSIVE   调用成功,但资源仍被非独占型锁定

_LOCK

VI_WARN_EXCLUSIVE_LOCK  调用成功,但资源仍被独占型锁定

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_INV_LOCK_ID    锁定标识符不当

VI_ERROR_LOCK_NOWNER    锁定并非来自于特定通道vi

4) 描述:该操作用于取消以前设置的资源锁定模式。

5) 相关项:参见viLock()、viLockRsrc()。

6) 实现要求:注意不同的参数输入对应于不同的返回状态。

11、    viEnableEvent(vi,eventType,mechanism,context)

1) 目标:允许特定事件通知

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

mechanism   输入    ViUInt16    事件处理机制

context 输入    ViEvent 事件信息

3) 返回状态值:

完成代码:

VI_SUCCESS  事件通知允许

VI_SUCCESS_EVENT_EN 至少一种事件处理机制被允许

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_MECH   事件处理机制不合法

VI_ERROR_HNDLR_NINSTALLED   特定事件句柄未被安装

4) 描述:该操作允许特定事件的通知,应用程序可采用事件排队或回调(中断)方式处理该事件。

5) 相关项:参见viEventHandler()、viInstallHandler()、viUnInstallHandler()。

6) 实现要求:若事件句柄未被安装,则在回调(中断)方式中返回错误值。

12、    viDisableEvent(vi,eventType,mechanism)

1) 目标:不允许特定事件通知

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

mechanism   输入    ViUInt16    事件处理机制

3) 返回状态值:

完成代码:

VI_SUCCESS  事件通知不允许

VI_SUCCESS_EVENT_DIS    至少一种事件处理机制不被允许错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_MECH   事件处理机制不合法

4) 描述:该操作取消特定事件的服务通知。

5) 相关项:参见viEventHandler()、viInstallHandler()、viUnInstallHandler()。

6) 实现要求:若一个对话通道上的事件处理机制不允许,事件登录还将保留。

13、    viQueryEventMech(vi,eventType,mechanism)

1) 目标:查询事件处理机制

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

mechanism   输出    ViUInt16    事件处理机制

3) 返回状态值:

完成代码:

VI_SUCCESS  事件查询完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

4) 描述:该操作查询特定事件处理机制,所有事件处理机制返回值以“位或”操作值形式给出。

5) 相关项:参见viEventHandler()、viInstallHandler()、viUnInstallHandler()。

6) 实现要求:无。

14、    viInstallHandler(vi,eventType,handler,userHandle)

1) 目标:安装事件回调句柄

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

handler 输入    ViHndlr 应用程序中的事件句柄

userHandle  输入    ViAddr  事件句柄值

3) 返回状态值:

完成代码:

VI_SUCCESS  安装事件句柄完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

4) 描述:该操作允许应用程序去安装事件处理句柄,句柄由输入参数handler唯一确定,事件类型包括资源事件(VI_RSRC_EVENT)、系统事件(VI_SYS_EVENT)、异常事件(VI_EXCEPTION),当事件类型参数设为所有事件(VI_ALL_EVENTS)时,以上三种类型事件句柄均被设置。

5) 相关项:参见viEventHandler()、viUnInstallHandler()。

6) 实现要求:无。

15、    viUninstallHandler(vi,eventType,handler,userHandle)

1) 目标:卸载事件回调句柄

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

handler 输入    ViHndlr 应用程序中的事件句柄

userhandle  输入    ViAddr  事件句柄值

3) 返回状态值:

完成代码:

VI_SUCCESS  卸载事件句柄完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_HNDLR_REF  句柄参数与所有已安装的句柄不匹配

4) 描述:该操作允许应用程序去卸载事件处理句柄,句柄由输入参数handler唯一确定,事件类型包括资源事件(VI_RSRC_EVENT)、系统事件(VI_SYS_EVENT)、异常事件(VI_EXCEPTION),当事件类型参数设为所有事件(VI_ALL_EVENTS)时,以上三种类型事件句柄均被卸载。

4) 相关项:参见viEventHandler()、viEnableEvent()。

5) 实现要求:卸装的句柄一定要先安装。

16、    viQueryHandlers(vi,eventType,handlers,userHandle)

1) 目标:查询事件已安装句柄

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

handlers    输出    ViPHndlr    应用程序中的事件句柄

userHandle  输出    ViAddr  事件句柄值

3) 返回状态值:

完成代码:

VI_SUCCESS  查询事件句柄完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

4) 描述:该操作查询一种事件类型的所有已安装的事件句柄。

5) 相关项:参见viInstallHandler()、viUnInstallHandler()。

6) 实现要求:无。

17、    viAcknowledgeEvent(vi,eventType,context)

1) 目标:对事件通知作响应

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

context 输入    ViEvent 事件信息

3) 返回状态值:

完成代码:

VI_SUCCESS  事件响应完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_CONTEXT    事件信息不合法

4) 描述:该操作响应已经报告的事件发生,事件发生由信息结构唯一确定。

5) 相关项:参见viEventHandler()、viInstallHandler()。

6) 实现要求:资源将在接收到所有通知后才对事件作出响应。

18、    viWaitOnEvent(vi,eventType,timeout,outContext)

    viWaitOnMultipleEvents(vi,eventTypeList,timeout,outContext,

outEventType)

1) 目标:等待特定事件的发生

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViPEventType    事件标识符

eventTypeList   输入    ViPUInt16   事件标识符列表

timeout 输入    ViUInt32    操作超时值

outContext  输出    ViPEvent    事件信息

outEventType    输出    ViEventType 返回事件类型

3) 返回状态值:

完成代码:

VI_SUCCESS  事件等待完成

VI_SUCCESS_QUEUE_EMPTY  事件等待完成,事件队列空

VI_WARN_QUEUE_TRIP  事件等待完成。队列中有多个事件

VI_WARN_QUEUE_FULL  事件等待完成。队列已满

VI_WARN_QUEUE_OVERFLOW  事件等待完成。队列溢出且有事件丢失

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_CONTEXT    事件信息不合法

VI_ERROR_TMO    操作超时

VI_ERROR_QUEUE_TRIP 队列中事件过多

VI_ERROR_QUEUE_FULL 队列满

VI_ERROR_QUEUE_OVERFLOW 队列事件溢出

4) 描述:viWaitOnEvent()等待一个事件,viWaitOnMultipleEvents()等待多个事件。

5) 相关项:参见viEnableEvent()。

6) 实现要求:当超时值为VI_INFINITE时,则会无限制等待下去。

19、    viDiscardEvents(vi,eventType,mechanism)

1) 目标:刷新一个对话通道上的事件发生

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

mechanism   输入    ViUInt16    事件处理机制

3) 返回状态值:

完成代码:

VI_SUCCESS  事件刷新完成

VI_SUCCESS_QUEUE_EMPTY  事件刷新完成,事件队列空

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_MECH   事件处理机制不当

4) 描述:该操作刷新队列中所有事件发生与事件登录,所有未被处理事件的信息也将被丢掉。

5) 相关项:参见viEnableEvent()。

6) 实现要求:该操作会引起事件丢失。

20、    viGetEventInfo(vi,eventType,context,rsrcName,info)

1) 目标:获取前一个事件发生的信息

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

context 输入/输出   ViEvent 事件信息

rsrcName    输出    ViString    资源名

info    输出    ViAddr  异常事件信息

3) 返回状态值:

完成代码:

VI_SUCCESS  命令传递完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

4) 描述:该操作用于取回事件处理信息,返回信息包括一个事件信息数据结构。

5) 相关项:参见viRaiseEvent()。

6) 实现要求:无。

21、    viRaiseEvent(vi,eventType,context,target)

1) 目标:通知资源或对话通道事件已发生

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

context 输入    ViEvent 事件信息

target  输入    ViBoolean   请求目标(资源或通道)

3) 返回状态值:

完成代码:

VI_SUCCESS  通知事件发生完成

错误代码:

VI_ERROR_INV_SESSION    vi不能标识正当对话通道

VI_ERROR_RSRC_LOCKED    存取锁定模式不支持特定操作

VI_ERROR_INV_TARGET 请求目标不当

VI_ERROR_INV_EVENT  特定事件不存在或不被支持

VI_ERROR_INV_CONTEXT    事件信息不当

VI_ERROR_QUEUE_FULL 事件队列满

VI_ERROR_NENABLED   当前无法感知事件

4) 描述:该操作用于通知资源或通道事件已发生,可以生成除了异常事件之外的所有类型事件。

5) 相关项:参见viEnableEvent()、viWaitOnEvent。

6) 实现要求:该操作可用于模拟一个事件。

22、    viEventHandler(vi,eventType,context,userHandle)

1) 目标:事件服务过程原型

2) 参数表:

参数名  输入/输出方向   数据类型    描述

vi  输入    ViSession   对话通道标识符(句柄)

eventType   输入    ViEventType 事件标识符

context 输入    ViEvent 事件信息

userHandle  输入    ViAddr  事件句柄值

3) 返回状态值:

完成代码:

VI_SUCCESS  事件处理完成

错误代码:

VI_ERROR_ABORT  终止操作引发异常

VI_ERROR_RESET  终止所有操作,复位至缺省状态

VI_ERROR_FAIL   终止对话通道所有操作

VI_ERROR_KILL   终止对话通道所有操作,并自动关闭通道

4) 描述:该操作在通道接收到一个事件并处理该事件时被调用。

5) 相关项:无。

6) 实现要求:在多个句柄情况下,只有所有句柄运行都终止时,正常运行才终止。

 
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,可以用来开发图形用户界面(GUI)应用程序。Visa库是一种用于与仪器通信的底层库,为开发者提供了与仪器进行通信的接口。TCP/IP是一种广泛应用于网络通信的协议。 在Qt中,我们可以使用Visa库与数字仪器仪表进行TCP/IP通信。首先,我们需要在项目中包含Visa库的头文件,并链接Visa库。然后,我们可以使用Visa的相关函数来建立与数字仪器仪表的连接。 首先,我们需要创建一个Visa实例。我们可以通过Visa的函数来获取可用的Visa资源,如Visa设备列表。然后,我们可以根据Visa资源的地址来打开与数字仪器仪表的连接。 一旦成功建立连接,我们可以使用Visa库提供的函数来发送和接收数据。我们可以使用Visa的写入函数来发送指令或查询到数字仪器仪表。并使用Visa的读取函数来接收仪器的响应或数据。通过这种方式,我们可以实现与数字仪器仪表的通信。 使用Qt的网络模块,我们可以使用TCP/IP协议来与数字仪器仪表进行网络通信。我们可以创建一个QTcpSocket实例,然后使用其函数来建立与数字仪器仪表的连接。通过设置主机地址和端口号,我们可以实现与数字仪器仪表的连接。 一旦成功建立连接,我们可以使用QTcpSocket的函数来发送和接收数据。我们可以使用write函数来发送指令或查询到数字仪器仪表。并使用read函数来接收仪器的响应或数据。 综上所述,Qt可以使用Visa库与数字仪器仪表进行TCP/IP通信。通过Visa库,我们可以使用Visa的API函数来建立和管理与数字仪器仪表的连接,通过QTcpSocket,我们可以使用TCP/IP协议进行网络通信。这样,我们就可以实现控制和监测数字仪器仪表的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值