基于VISA标准的仪器驱动器设计

 

一、VISA仪器编程的简介

基于NI-VISA/VISA32(Virtual Instrument Software Architecture)的仪器编程,支持RS232、USB、GPIB及LAN通信的SCPI仪器编程

  1. RS232

支持常见的RS232串口编程,一般地址为“ASRL1::INSTR”

  1. USB

支持常见的USB接口编程,一般地址类似为“USB0::0x2A8D::0x0101::MY57501899::INSTR”

  1. GPIB

支持常见的USB接口编程

一般地址类似为“GPIB0::0x2A8D::0x0101::MY57501899::INSTR”

  1. LAN

      支持常见的USB接口编程,一般地址类似为“TCPIP0::34465A-01899::inst0::INSTR”或“TCPIP0::192.168.0.26::INSTR”

 

二、相关概念介绍

  1. SCPI指令

Standard Commands for Programmable Instruments的缩写,即程控仪器(可编程仪器)标准命令集。SCPI 是一种建立在现有标准IEEE488.1 和 IEEE 488.2 基础上,并遵循了IEEE754 标准中浮点运算规则、ISO646 信息交换7 位编码符号(相当于ASCll编程)等多种标准的标准化仪器编程语言。它采用一套树状分层结构的命令集,提出了一个具有普遍性的通用仪器模型,采用面向信号的测量;它的助记符产生规则简单、明确,且易于记忆。

  1. VISA编程接口

NI-VISA(Virtual Instrument Software Architec-ture,以下简称为“VISA”)是美国国家仪器NI(NationalInstrument)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。VISA总线I/O软件是一个综合软件包,不受平台、总线和环境的限制,可用来对USB、GPIB、串口、VXI、PXI和以太网系统进行配置、编程和调试。VISA是虚拟仪器系统I/ O接口软件。基于自底向上结构模型的VISA创造了一个统一形式的I/ O控制函数集。一方面,对初学者或是简单任务的设计者来说,VISA提供了简单易用的控制函数集,在应用形式上相当简单;另一方面,对复杂系统的组建者来说,VISA提供了非常强大的仪器控制功能与资源管理。

  1. SCPI与VISA区别

SCPI是程控仪器标准命令,它是对器件的消息进行了标准化,也就是,只要做仪器器件,你就得用SCPI,相当于汇编语言命令(不一定恰当),VISA提供一些可以直接操作硬件的函数,它是以DLL或Lib形式提供,在编程时必须包括visa.h和visa32.h,你直接使用的是VISA库中的函数,SCPI命令又是通过VISA函数Viprintf函数发送出去的,书上讲的太抽象了,不理解。

三、VISA仪器编程驱动模型

基于VISA标准的仪器驱动器设计_第1张图片

 

 

四、VISA编程举例

如何在VS2010中使用visa库

1、首先在计算机上安装NI提供的驱动库,然后在计算机上找到相应的库文件和头文件。

文件目录:C:\Program Files (x86)\IVI Foundation\VISA\WinNT

其中lib文件在: lib\msc\visa32.lib 和ivi.lib

头文件在: include

 

2、添加库到工程

直接将库文件和对应的头文件复制到了工程目录下,然后在工程中添加了对lib库的引用,vs2010中引用visa库操作如下:

A、 菜单 项目—> 属性—>配置属性–>链接器—->输入—附加依赖项, 加入库名,如: visa32.lib;

或是在cpp源文件中用代码#pragma comment(lib,”visa32.lib”)代替. 此时再编译会提示错误:fatal error LNK1104: 无法打开文件“my_API.lib” , 原因应该是编译器不知道去哪里找我们的这个库,下面就来解决。

 

B、 然后给项目添加库文件路径,添加附加库路径:

“项目—>属性—>配置属性—>连接器–>常规–>附加库目录” 点右边的向下箭头,这里添加 我们的库所在的路径. F:\my_program\meiyong\PPPP_Decode_ETIM;或 ../../PPPP_Decode_ETIM, 而且经试验测试是以项目文件.vcxproj 所在目录为当前目录,当前以当前目录这个方式设置更好了.这样就好了。

3、在工程中使用visa库

下面的代码中是在VS2010中通过调用visa库发送*IDN?来查询仪器的ID

#include "visa/include/visa.h"

#include "visa/include/ivi.h"

 

#pragma comment(lib,"visa32.lib")

#pragma comment(lib,"ivi.lib")

 

/*----------------------------------------------------------------------------*/

/* 宏定义声明                                                                 */

/*----------------------------------------------------------------------------*/

#define MAX_SCPI_LENGTH                 255                         // 最大的SCPI命令

#define DEFAULT_TIMEOUT                 5000                    // 超时:5000ms   

 

int main(void)

{

    ViStatus nReturnStatus = 0;                         // 保存返回数值

    ViSession rmSession = 0,pnInstrHandle;

    ViUInt32 retCnt = 0;

    ViByte wrtBuf[MAX_SCPI_LENGTH];                     // 写缓冲区

    ViByte rdBuf[MAX_SCPI_LENGTH];                      // 读缓冲区

    int Return_Count;

 

    nReturnStatus = viOpenDefaultRM (&rmSession);

    nReturnStatus = viOpen (rmSession, "TCPIP0::172.141.114.6::5001::SOCKET", VI_NULL, VI_NULL, &pnInstrHandle);

 

    /*- Configure VISA Formatted I/O ----------------------------------------*/

    nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_TMO_VALUE, DEFAULT_TIMEOUT);        // 设置超时

    nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_SUPPRESS_END_EN, VI_FALSE);        // 不发送终止符

    nReturnStatus = viSetAttribute (pnInstrHandle, VI_ATTR_SEND_END_EN, VI_FALSE);        // 不接收终止符

 

    nReturnStatus = viQueryf (pnInstrHandle, "*IDN?\n", "%s", rdBuf);

    viClose (pnInstrHandle);

    viClose (rmSession);    

 

    return 0;

}

五、VISA编程接口的测试,以串口RS232举例,其他接口类似。

1、硬件连接 将一台PC模拟成RS232标准设备,另一台PC使用VISA库封装进行通信访问

 

基于VISA标准的仪器驱动器设计_第2张图片

 

 

 

 

生成的软件如下(源码上传的github和SVN),测试界面

 

基于VISA标准的仪器驱动器设计_第3张图片

 

RS232标准设备接收到的指令如下:

 

基于VISA标准的仪器驱动器设计_第4张图片

参考链接

https://en.wikipedia.org/wiki/Virtual_instrument_software_architecture

https://blog.csdn.net/rl529014/article/details/79586993

https://blog.csdn.net/u013472106/article/details/52924033?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

http://www.ni.com/tutorial/4713/en/

你可能感兴趣的:(WIN)