8、仪器驱动器设计 8.1 虚拟仪器软件结构VISA 8.2 VPP仪器驱动程序 8.3 基于lVl规范的互换型驱动器 8.5 LabVIEW仪器驱动程序
8.1 虚拟仪器软件结构VISA VISA的基本概念 1、什么是VISA VISA是虚拟仪器软件结构(Virtual Instrument Software Architectuere)的简称,是由VXI plug & play系统联盟所统一制定的I/O接口软件标准及其相关规范的总称。一般称这个I/O函数库为VISA库(用于仪器编程的标准I/O函数库)。VISA函数库驻留于计算机系统中,是计算机与仪器之间的标准软件通信接口,用以实现对仪器的控制。
VISA的结构模型图 VISA采用这种金字塔型的结构模型,为各种虚拟仪器系统软件提供了一个形式统一的I/O操作函数库,VISA将不同厂商的仪器软件统一于同一平台。
尽管VISA的API函数却比其它具有类似功能的I/O库少得多,因此,VISA很容易被初学者掌握。 VISA的内部结构是一个先进的面向对象的结构,这一结构使得VISA与在它之前的I/O控制软件相比,接口无关性有很大提高。VISA的可扩展性使它远远超出了一般I/O控制软件的范畴,而且由于VISA内部结构的灵活性,使得VISA在功能和灵活性上也超过了其它I/O控制库。 尽管VISA的API函数却比其它具有类似功能的I/O库少得多,因此,VISA很容易被初学者掌握。 另外,VISA高度的可访问性和可配置性又使得熟练的用户可以利用VISA的许多独有特性,使得VISA的应用范围大大超过了传统的I/O软件。VISA不仅为将来的仪器编程提供了许多新特性,而且兼容过去已有的仪器软件。 总之,VISA具有与仪器硬件接口无关的特性,是理想的仪器I/O软件。
3、VISA的特点 1)VISA的I/O控制功能适用于各种仪器类型 2)VISA的I/O控制功能适用于各种仪器硬件接口方式 3)VISA的I/O控制功能适用于多种计算机平台 4)VISA能适应未来发展的需要 4、VISA的发展现状 VISA规范是VPP规范的核心内容,其中《VPP4.3 :VISA库》规定了VISA库的函数名、参数定义及返回代码等。《VPP4.3.2 :文本语言的VISA实现规范》和《VPP4.3.3 :图形语言的VISA实现规范》分别对文本语言(C/C++和Visual Basic)和图形语言(LabVIEW)实现VISA时的VISA数据类型与各种语言特定数据类型的对应关系、返回代码、常量等进行了定义。
VISA的组成原理 1、VISA的内部结构 VISA的内部结构简化图
1)资源管理器 VISA资源管理器是用于管理所有资源的一种系统资源(控制设备资源),执行管理、控制和分配VISA资源的操作。 2)资源 VISA的资源类概念类似于面向对象程序设计方法中类的概念,它是一个实例的外观和行为的描述,是一种抽象化的设备特点的功能描述,是对资源精确描述的专用术语。 3) 会话(连接)。 会话(Sessions)是指与任何已存在资源的连接,包括默认资源管理器的连接。
2、VISA资源描述 1)资源描述格式
2)资源类型定义
3)VISA的资源结构
4)VISA机制 需要用到VISA的3种机制:属性机制、锁定机制和事件机制。以写资源为例,3种机制的作用如图
(1)属性机制 属性机制用来控制资源的各种属性,这些属性分为两种:只读属性和可读可写属性。 (2)锁定机制 锁定机制可以设置通道对资源的访问模式。应用程序能同时对资源开辟多个通道,并能通过不同的通道对资源进行访问。 (3)事件处理机制 VISA中还定义了一种常见的机制提醒应用程序注意某种特殊情况,这些特殊情况成为事件。有了事件就可以使VISA的资源和它的应用程序之间传递消息。应用程序有两种不同的方式获得事件通知,它们分别是:队列机制和回调机制。
VISA编程及应用实例 1、VISA编程概要 在VISA编程过程中,面向仪器的所有操作都必须首先进行打开VISA资源通信通道(Session)的操作。用户可以打开两种类型的通信通道:资源管理器通信通道(Resource Manager Session)和器件通信通道(Device Session)。 2、应用实例 本节通过分别调用非VISA的I/O接口软件库与VISA库函数,对GPIB器件与VXI消息基器件进行简单的读/写操作(向器件发送查询器件标识符命令,并从器件读回响应值),从而进行VISA与其他I/O接口软件的异同点比较。
【实例1】用非VISA与其他I/O接口软件库(NI公司的NI-488)实现GPIB仪器的读/写操作
【实例2】用非VISA的I/O接口软件库(NI公司的NI-VXI)实现对VXI消息基仪器的读/写操作。
【实例3】用VISA的I/O接口软件库实现对GPIB仪器与VXI消息的读/写操作
【实例4】对于用户来说,只需了解VISA函数的格式与参数就可以编写仪器的驱动程序,而不必关心VISA库与仪器如何沟通的细节。对VISA函数的调用一般可以分为声明、开启、器件I/O和关闭4部分,下面以一段简单的C语言程序为例进行说明。该程序是由计算机向一台GPIB器件发出“*IDN?”的IEEE-488.2公用命令,并从该器件回读其响应字符串。
VISA在LabVIEW中的实现 1.VISA子模板简介 VISA功能模块位于Instrument I/O →VISA→VISA Advanced 子模板中如图。
2.VISA 总线系统软件设计 VISA子模板中各个函数的端口图和功能如表
VISA高级选项子模板中部分函数及子函数的简单介绍
3 .VISA属性节点 LabVIEW提供了VISA属性节点(位于VISA Advanced 子模板),在程序中通过属性节点可读取设置VISA资源的属性值。VISA属性节点如图 将VISA属性节点放到流程图上以后,可设置VISA属性。设置属性有两种方法: (1)把VISA会话通道连接到属性节点的reference输入端子,VISA就会变成与这个会话相关联的类。
(2)在属性节点弹出选单,选择Select Class→VISA→I/O Session 选项,如图8-7所示,在此选项的下列选单包含各种不同的VISA类,选择VISA类后进行属性设置。
4. 实例 【例8-1】VISA锁定机制的运用 VISA锁定机制允许优先通过独立的操作访问资源。 前面板及流程图程序设计
【例8-2】 VISA属性应用实例:串口写和读。 VISA属性应用.vi框图程序如图所示。该VI打开一个与串口COM1的会话通道,通过属性节点对串口初始化为19200波特,8位数据位,1位停止位,无奇偶校验位。而后将一个字符串写入write buffer 端口,经10s延时后,通过VISA的另一个属性端子Bytes at Port返回从串口设备读取的字节数,这些字节在VISA Read 模块的read buffer端口获取。通信结束由VISA Close模块关闭与串口的会话连接。
VISA属性应用.VI框图程序
8.2 VPP仪器驱动程序 仪器驱动器概述 1、仪器驱动器的由来 1)问题的提出 2)标准仪器命令集的控制方式 3)仪器驱动器的控制方式 总之,在虚拟仪器系统中,驱动程序起着非常重要的作用,它将仪器硬件和计算机有机地组合成为一个仪器系统,完整地实现虚拟仪器内部的数据采集、分析处理、显示输出的全部功能。随着仪器硬件,计算机和软件的复杂性越来越高,驱动程序的重要性与价值已经越来越被人们所重视。
2、关于驱动器的基本概念 仪器驱动程序是完成对某一特定仪器的控制与通信的软件程序集合。它负责处理与某一专门仪器通信和控制的具体过程,将底层的复杂的硬件操作隐蔽起来,通过封装复杂的仪器编程细节,为了使用户使用仪器提供了简单的函数调用接口。 仪器驱动程序是连接上层应用软件与底层输入/输出软件的纽带和桥梁。 每个仪器模块均由自己的驱动程序,并且仪器厂商将其原码以动态链接库(DLL)的形式提供给用户。
3、VPP仪器驱动器的特点 (1)仪器驱动程序一般由仪器供应厂家提供 (2)所有仪器驱动程序必须提供程序源代码,而不是只提供可调用的函数 (3)仪器驱动程序结构的模块化与层次化 (4)仪器驱动程序设计与实现的一致性 (5)仪器驱动程序的兼容性与开放性
VPP仪器驱动器的结构模型 1、仪器驱动器外部接口模型 外部接口模型分为以下5个部分,如图
(1)函数体。它是仪器驱动程序的主体,为仪器驱动程序的实际源代码。 (2)交互式开发接口。它提供了一个图形化的功能面板,用户可以在这个图形接口上实施各种控制,改变每一功能调用的参数值。 (3)编程开发者接口。它是应用程序调用驱动程序的软件接口,通过此接口可方便地调用仪器驱动程序中所定义的所有功能函数。 (4)VISA I/O接口。它通过本接口调用VISA这一标准的I/O接口程序库,提供了仪器驱动器与仪器硬件的通信能力。 (5)子程序接口。它使得仪器驱动器在运行时能调用其它所需要的软件模块(如数据库、FFT等),而提供的软件接口。
2、仪器驱动程序内部设计模型 仪器驱动器的第二个模型是内部设计模型
仪器驱动程序函数体由两大部分组成:第一部分是一组部件函数,它们是一些控制仪器特定功能的软件模块;第二部分是一组应用函数,它们使用一些部件函数共同实现完整的测试和测量操作。 1)部件函数 (1)初始化函数 (2)配置函数 (3)激活/状态函数 (4)数据函数 (5)实用函数 (6)关闭函数
2)应用函数 应用函数是以源代码形式提供的一种面向测试任务的高级编程函数。通常情况下,应用函数通过设置、启动、从仪器读取测量数据等动作来完成一次完整的测试操作。 根据测试任务的不同,将虚拟仪器粗分为3种类型:即测量仪器、源仪器及开关仪器。它们分别完成测量任务、源激励任务及开关选通任务。在VPP系统仪器驱动程序规范中,将配置函数、动作/状态函数及数据函数统称为功能类别函数,对应以上的3种仪器类型,分别定义了3种功能类别函数的结构,即测量类函数、源类函数及开关类函数。
仪器驱动程序函数简介 1、通用函数 (1)初始化函数建立驱动程序与仪器的通信联系。VPP规范对参数返回的状态值作了规定
(2)复位函数将仪器置为默认状态 (3)自检函数对仪器进行自检。 (4)错误查询函数。完成仪器错误的查询。 (5)错误消息函数将错误代码转换为错误消息。 (6)版本查询函数对仪器驱动程序的版本与固有版本进行查询。 (7)关闭函数终止软件与仪器的通信联系,并释放系统资源。
2、特定函数 1)测量类功能类别函数。 2)源类功能类别函数。 3)开关类功能类别函数。
仪器驱动程序功能面板 1、功能面板的结构 功能面板文件最小树结构
2、功能面板的部件函数 功能面板树结构
在功能面板中,每一个层次的部件都必须包括各自的帮助文档,帮助文档可分为如下5部分: (1)功能面板帮助文档对应于仪器节点,描述了整个仪器的功能及功能面板所含的类节点与函数节点概念。 (2)功能类帮助文档对应于类节点,描述了类的功能与类所含的函数节点概述。 (3)功能函数帮助文档对应于函数节点,描述了功能函数的功能。 (4)控件帮助文档对应于函数的输入、输出函数,分别描述各自的意义、默认值与注意点。 (5)控件帮助文档对应于函数的返回状态值,包括了正确返回值与各种错误返回值代码的含义。
8.3 基于lVl规范的互换型驱动器 8.3.1 IVI概述 1、IVI的基本概念 VPP仪器驱动器与特定仪器密切相关 ,更换不同厂家或同一厂家不同型号的仪器时,不仅要更换仪器驱动器而且要修改测试程序,针对VPP规范的缺点,为了进一步提高仪器驱动程序的规范化和标准化,充分实现仪器的互换性和互操作性,制定了IVI规范。
2、IVI驱动器的特点 1)优点 和VPP驱动器相比,IVI仪器驱动器的优点主要有: (1)仪器级可互换。 (2)采用了基于状态存储机制的程序结构。 (3)仪器仿真。 (4)具有多线程安全性。 (5)具有范围检查、状态储存及其他的调试和开发功能。
2)缺点 对于面向仪器互换的虚拟仪器设计目标,目前IVI模型的主要缺点体现在以下方面: (1)只适合同类仪器的互换,不能实现不同类仪器或某些多类功能的综合性仪器之间的互换。 (2)IVI类驱动器只能统一某类仪器中大部分仪器功能,其他功能只能通过专用驱动器来实现。 (3)可用标准较少。目前只完成了示波器、万用表、函数发生器、多路形状等部分仪器的类驱动器的标准化。 (4)标准开放程度低。IVI模型只适合于通用仪器,如万用表等,而对某些专用仪器(如数据采集卡)不适用。
8.3.2 IVI驱动器的类型 1、IVI驱动器的类型 IVI驱动器的类型
IVI驱动器类型具体介绍如下: 1)IVI仪器驱动器 2)IVI特定驱动器 3)IVI类兼容特定驱动器 4)IVI定制特定驱动器 5)IVI类驱动器
2、IVI驱动器的功能 1)IVI固有功能(Inherend Capabilities) 2)基本类功能(Bass Slass Capabilities) 3)VI类扩展功能(Class Extension Capabilities) 4)仪器专用功能(Instrument Specific Capabilities)
3、IVI驱动程序的体系结构 基于IVI规范的驱动程序体系结构
通过类驱动程序间接调用方式,是IVI驱动器的特色。多用表类的IVI驱动器的结构如下图所示。
4、IVI驱动器的结构框架 IVI仪器驱动器的结构框架如下图所示 IVI仪器驱动器的结构框架
8.3.3 IVI函数库 IVI函数库包括以下内容: ①仪器通信资源管理,包括资源的创建、锁定、解锁和释放; ②仪器通信管理; ③添加仪器属性; ④添加仪器属性的回调函数; ⑤设置、获取和检查仪器的属性; ⑥属性的状态缓存和状态检测; ⑦范围表管理,包括创建、查找、更改和强制取值; ⑧错误报告和错误获取; ⑨内存分配和配置信息的设置和获取; ⑩通信资源的内存分配和释放。
仪器驱动器的初始化信息 IVI函数库功能强大,应用复杂。下面将介绍其中的主要功能和使用方法。 1、仪器通信资源管理 名称 属性定义常量 默认值 含义 RangeCheck IVI_ATTR_RANGE_CHECK VI_TRUE 范围检测 QueryInstrStatue IVI_ATTR_QUERY_INSTR_STATUS 状态检测 Cache IVI_ATTR_CACHE V-_TRUE 状态缓存 Simulate IVI_ATTR_SIMULATE VI_FALSE 仪器仿真 RecordCoercions IVI_ATTR_RECORD_COERCIONS 强制赋值记录 DriverSetup IVI_ATTR_DRIVER_SETUP 驱动器启动
2、属性的创建和删除 参数flags设置含义 值 标志名 含义 0x0001 IVI_VAL_NOT_SUPPORTED 驱动器不支持该属性 IVI_VAL_NOT_READABLE 仪器驱动器和使用者对该属性不可读 0x0004 IVI_VAL_NOT_WRITABLE 仪器驱动器和使用者对该属性不可写 0x0008 IVI_VAL_NOT_USER_READABLE 使用者对该属性不可写 0x0010 IVI_VAL_NOT_USER_WRITABLE 使用者对该属性不可读 0x0020 IVI_VAL_NEVER_CACHE 禁止使用缓冲区内的值 0x0040 IVI_VAL_ALWAYS_CACHE 使用缓存器内的值 0x0080 IVI_VAL_NO_DEFERRED_UPDATE 不推迟属性的更新 0x0100 IVI_VAL_DONT_RETURN_DEFETTED_VALUE 不返回推迟更新属性的值 0x0200 IVI_VAL_FLUSH_ON_WRITE 更新属性值后是否向I/O回调函数发送IVI_MSG_FLUSH消息 0x0400 IVI_VAL_MULTI_CHANNEL 是否每个通道都具有单独的属性 0x0800 IVI_VAL_COERCEABLE_ONLY_BY_INSTR 是否只由仪器给出属性强制赋值 0x1000 IVI_VAL_WAIT_FOR_OPC_BEFORE_READS 在调用读回调函数前是否调用操作完毕回调函数 0x2000 IVI_VAL_WAIT_FOR_OPC_AFTER_WRITES 在调用写回调函数后是否调用操作完毕回调函数 0x4000 IVI_VAL_USE_CALLBACK_FOR_SIMULATION 在仿真模式下是否使用回调函数 0x8000 IVI_VAL_DONT_CHECK_STATUS 是否检查状态
3、获取、设置和检查属性及属性的回调函数 回调函数包括: ①读回调函数; ②写回调函数; ③范围检查回调函数; ④强制赋值回调函数; ⑤比较缓存值回调函数; ⑥范围表回调函数; 4、属性的范围表
下面结合实例说明在LabWindows/CVI环境下开发IVI驱动程序的基本步骤。 1、开发的基本步骤 下面结合实例说明在LabWindows/CVI环境下开发IVI驱动程序的基本步骤。 1)用IVI提供的Create IVI Instrument Driver工具,生成符合IVI规范的程序框架,创建基本的仪器驱动程序文件(包括源文件、头文件和函数面板文件)。 2)分析驱动程序的组成文件和源代码,根据自己开发的仪器功能,删除不用的扩展代码,添加自己的函数和代码。 3、对独立属性实现属性回调函数。 4、明确属性的无效值,IVI引擎是用一套相对直观的机制来保持状态存储的完整性。 5、编写应用程序对IVI驱动程序的各函数进行测试,以保证正确性。
2、开发实例 下面是IVI.INI文件的一个例子,它分为虚拟仪器、仪器驱动器、硬件设置三部分。如果要将Fluke-45DMM换成HP34401DMM,只要将IVI.INI中相关内容换成HP34401的信息即可。 [IviLogicalNames] DMM1=”Vistr→F145” [ClassDriver→IviDmm] Description=”IVI Digital Multimeter类驱动程序” Simulation VInstr=”VIstr→NISimDmm” [VIstr→F45] Description=”Fluke45 Digital Multimeter” Driver=”Driver→F45”
Hardware=”Hardware→F45” RangeCheck=True Simulate=True UseSpecificSimulation=True Trace=True InterchangeCheck=True QueryStatus=True ChannelNames=”ch1” Defaultsetup=”” [Driver→F45] Description=”Fluke45 Digital Multimeter Instrument Driver” ModulePath=”c:\cvi50\instr\F145_32.dll” Prefix=”FL145” Interface=”GPIB” [Hardware→F145] Description=”” ResourceDesc=”GPIB::2::INSTR” IdString=”FLUKE, 4, 4940191, 1.6D1.0.” DefaultDriver=” Driver→F145”
8.4 VPP仪器驱动程序设计 8.4.1 VPP仪器驱动程序设计概要 1、设计的基本要求 VPP驱动程序的设计要求如下: (1)仪器驱动程序都提供程序源代码,使用户可以根据自己的需要理解、修改与优化仪器驱动程序。 (2)仪器驱动程序的结构一定要模块化,能够提供多级功能访问,以便用户能使用各个驱动器的子功能集。 (3)仪器驱动程序的设计和实现形式必须一致,以使用户在了解某一驱动程序的设计方法后,就能使用其他的驱动程序。
2、设计方法概述 VPP仪器驱动程序的设计应按照一定步骤进行。下面介绍设计的一般方法 (1)应确定需要研制的仪器模块的类型,确定其属于VXI仪器还是串行接口仪器,是属于消息基器件、寄存器基器件还是存储器基器件 。 (2)应确定仪器模块的应用目标及功能指标。 (3)在基本清楚了设计目标之后,应选择虚拟仪器系统的系统框架,确定模块设计的软、硬件环境。 (4)应选择一个可作参考的现有的VPP仪器驱动程序,尽量在现有的仪器驱动程序基础上进行设计,不必从头开始进行重复性劳动。
(5)在对应参考模块的研究基础上,确定仪器驱动程序应包括的功能函数,也即仪器驱动程序的内部设计模型。 (6)在实际源程序的编写中,还需加入各种异常处理。 (7)在图形化平台上运行与调试仪器驱动程序。 (8)编写仪器驱动程序相关文档,包括Windows格式的帮助文件、知识库文件以及Visual Basic函数原型文件等,并应提供自动安装程序。
3、设计内容 在前面关于仪器驱动器的介绍中可知,仪器驱动程序包括以下几个部分:操作接口提供了一个虚拟仪器面板,用户通过对该面板的控制完成对仪器的操作;编程接口能将虚拟仪器面板的操作转换成相应的仪器代码,以实现对仪器驱动器的功能调用;I/O接口提供了仪器驱动器与仪器通信能力;功能库描述了仪器驱动器所能完成的测试功能;子程序接口使得仪器驱动器在运行时能调用它所需要的软件模块。 1)仪器驱动器的开发工具。 2)仪器驱动器的设计模型。 (1)外部设计模型图。 (2)内部设计模型图。 3)仪器驱动程序开发和编辑的工具。
4、设计步骤 典型LabVIEW仪器驱动器的设计步骤大致可以分为以下三步:一是设计仪器驱动器的结构层次;二是设计仪器驱动器的功能体;三是按外部设计模型设计接口程序。 1)仪器驱动器结构层次的设计。 2)仪器驱动器功能体程序设计。 3)仪器驱动器功能体接口程序设计。
8.4.2 VPP仪器驱动程序的设计实例 1.设计要求及步骤 对仪器驱动器的基本要求是: (1)模块化和层次化; (2)源代码; (3)广泛的可访问性。 开发用于WIN框架的LabWindows/CVI仪器驱动器必须遵循的步骤如下: (1)熟悉仪器和获得实际操作经验 (2)研究仪器手册中的编程命令及GPIB库 (3)生成仪器驱动程序
2.设计实例 本设计基于LabWindows/CVI开发平台,以HP34410数字多用表为例简要说明其仪器驱动程序设计,设计步骤如下: ① 创建FP文件,编辑函数面板和类节点名称; ② 编辑函数面板控件与变量定义; ③ 生成代码; ④ 编写帮助文档; ⑤ 编译。
1)仪器HP34410数字多用表驱动程序设计 打开指定设备回话函HP34410A_OpenInstrumentDirectly()的程序流程图如图所示 函数HP34401A_ OpenInstrumentDirectly()程序流程图
查找和打开设备回话函数HP34401A_OpenInstrumentFormAddress()的程序流程图如下图所示。
驱动程序HP34401A.c源代码例程如下: #include <userint.h> #include "ATEhp34401a.h" #include <formatio.h> #include <ansi_c.h> #define ON 1 #define OFF 0 char HP34401AChanState=OFF; /*函数声明*/ ViStatus HP34401AWrite(ViSession instr,char *TempChar,ViUInt32 Count,ViPUInt32 ReturnCount); ViStatus HP34401ARead(ViSession instr,char *TempChar,ViUInt32 Count,ViPUInt32 ReturnCount); /*****1. 为指定仪器打开一个会话(需提供指定仪器的GPIB卡号和GPIB初始地址)********/ // defaultRM为输入参数,代表资源管理器会话; // PrimaryAddress为仪器初始地址;GPIBBoardNum 为仪器的GPIB卡号 // InstrumentHandle为输出参数,代表返回的仪器句柄 ViStatus_VI_FUNC HP34410A_OpenInstrumentDirectly(ViSession defaultRM,int PrimaryAddress, ViPSession InstrumentHandle,char *GPIBBoardNum) { ViStatus ReturnVal=-1; int i; ViChar InstrDescriptor[260];
ViSession TempInstr; char TempChar[50]; *InstrumentHandle=VI_NULL; Fmt(TempChar,"%s<%s%s%d%s",GPIBBoardNum,"::",PrimaryAddress,"::INSTR"); //把仪器的GPIB板号、GPIB初始地址等参数转换成字符串,存放在变量TempChar ReturnVal=viOpen(defaultRM,TempChar,VI_NULL,VI_NULL,&TempInstr); //打开指定GPIB板上,指定初始地址的仪器会话,TempInstr为返回的会话 if(ReturnVal!=VI_SUCCESS) return ReturnVal; *InstrumentHandle=TempInstr; HP34401AChanState=ON;//打开通信通道 ReturnVal=HP34401A_Init(*InstrumentHandle); if (ReturnVal!=VI_SUCCESS) { viClose(*InstrumentHandle); ReturnVal=-1; }
VI_SUCCESS)//成功打开相匹配设备中第一个设备的回话 { if(viGetAttriute(TempInstr,VI_ATTR_GPIB_PRIMARY_ADDR, &TempPrimaryAddress)==VI_SUCCESS)//检测指定会话的属性状态(初始地址),并成功找到 if (TempPrimaryAddress==PrimaryAddress) { *InstrumentHandle=TempInstr; HP34401AChanState=ON; ReturnVal=HP34401A_Init(*InstrumentHandle); ReturnVal=0; } } if (ReturnVal!=0)//打开第一个设备会话没有成功 { for (i=2;i<=TheInstrMached;i++)//继续查找,直到查完所有相匹配的设备 { if (viFindNext(FindList,InstrDescriptor)==VI_SUCCESS)//查找下一个设备 { if(viOpen(defaultRM,InstrDescriptor,VI_NULL,VI_NULL,&TempInstr)==VI_SUCCESS) { if(viGetAttriute(TempInstr,VI_ATTR_GPIB_PRIMARY_ADDR,&TempPrimaryAddress)==
2)仪器HP34410数字多用表应用程序设计 程序流程图如下图所示 应用程序流程图
#include < HP34401A.h> int main(int argc,char*argv[]) 主程序源代码如下: #include < HP34401A.h> int main(int argc,char*argv[]) { ViSession defaultRM,viHP33401a; unsigned long retcnt=0; float Result; HP34410A_OpenInstrumentDirectly(defaultRM,15, &viHP33401a ,0); //打开GPIB板号为0,GPIB初始地址为15的仪器回话 HP34401A_Reset(viHP33401a); //复位 HP34401A_Init(viHP33401a); //初始化仪器 HP34401A_Mode (viHP33401a,0,10,0.001); //选择测量直流电压功能,测量量程范围为10V,测量分辩率为精确到0.001 HP34401AWrite(viHP33401a , “TRIG:COUN 5”,11,& retcnt); //触发次数5次 HP34401AWrite(viHP33401a , “TRIG:SOUR IMM”,13,& retcnt); //选择内部触发 HP34401A_ReadData(viHP33401a,&Result); //读取测量结果存放在变量Result中 Printf(“%f”,Result); //打印输出变量Result HP34401A_Close(viHP33401a); //关闭仪器会话 }
8.5 LabVIEW仪器驱动程序 8.5.1 仪器驱动程序的获得与安装 仪器驱动程序可以从仪器驱动程序光盘上安装获得,也可以直接从NI(国家仪器公司)的网站(网址:http:/www.ni.ident)下载,或使用下图所示的方法自动连接到该网址下载所需驱动程序。
仪器驱动程序应当安装到LabVIEW/instr 仪器驱动程序应当安装到LabVIEW/instr.lib的相应子目录中。例如,LabVIEW内置的仪器驱动程序HP34401A被安装在LabVIEW/instr.lib/hp34401a。在这个子目录中可以找到构成驱动程序的选单文件和VI库。安装驱动程序后即可在Functions→Instrument I/O的模板找到仪器驱动程序模板,如下图所示。
8.5.2 验证仪器驱动软件 在LabVIEW安装了仪器驱动程序后,用户就可编写自己的仪器应用程序了。 从HP34401A MultiMeter子模板→Application Examples选择HP 34401A Getting Started.vi模块,如下图所示, HP34401A仪器驱动程序模板
前面板图如下图所示。 HP 34401A Getting Started.vi前面板
框图程序如下图所示。 框图程序
在框图程序中使用了仪器初始化、应用实例和关闭子程序模块。各子程序功能如下。 (1)HP 34401A Initialize子程序:该子程序用于与仪器建立通信并产生一个VISA session标识字串。 (2)HP 34401A Application Example子程序:该程序完成仪器设置、触发、测量等功能。 (3)HP 34401A Close VI子程序:该程序关闭VISA session进程。