C#使用NI VISA实现程控仪器的自动化控制

news/2024/10/31 5:34:37/

转自https://www.cnblogs.com/hitfredrick/p/6402998.html

1.概述

生产测试当中,测试仪器不可或缺,如果是小规模生产,手动测试可以对付;但是要想到达大批量生产的目的,为了简化测试,节约时间,就需要进行自动化测试。出于这样的需求,对仪器的自动化程控就有了需求。

下图是一个相对普遍的测试框架

整个控制过程中最为关键的部分就是上位机同测试仪器之间的通信,首先测试环境搭建完毕之后,能通信是关键的第一步,第二步就是用“仪器的语言”告诉仪器我们需要它们做什么。简而言之,就是这俩步。

下面先介绍几个相关的知识点。

2.常见的控制接口

常见的控制接口主要有:GPIB、串口(RS-232)、USB、LAN或以太网。

串行接口通信速度较慢,现代测试系统已经很少使用。

虽然现代仪表控制接口丰富, 但是,对于仪表生产厂商和用户而言,使用最为广泛 的是GPIB接口。

常用的USB接口版本为USB 2.0,其支持三种传输速率:低速1.5Mbps , 全速12Mbps 和 高速480Mbps , 传输速度根据外接设备自动调整,无需设置。直连最大的电缆长度5M, 最多连接设备127台。

以太网是当今现有LAN采用的最通用的通信协议标准 , 可在互联设备间实现 10Mbps-10Gbps 数据通信。

本人在实际中用到的主要是LAN和USB方式,所以提及较多的主要是这俩种。

关于控制接口更加详细的介绍,请到相关网站进行查阅。

3.SCPI(可编程仪器标准语言)

SCPI (Standard Command for Programmable Instrumentation)程控仪器标准命令是1990由九家仪器公司联合推出,其建立在IEEE488.2的基础,面向测试功能或测试信号,倡导仪器控制的一致性。

主要特点为:

  1. 程控命令面向测试流程,而不是描述仪器操作;兼容的编程环境使用同样的命令和参数来控制具有相同功能的仪器。
  2. 在与通信物理连接层硬件无关的高层次上定义程控消息。
    SCPI基于IEEE488.2形成,但并不局限于GPIB接口,它也可用于RS232C,LAN,USB总线。
  3. 与编程手段和程序语言无关,SCPI用户测试程序模块易于移植。
     

SCPI有公共的命令,即对所有的仪器都是可行的;也有特定的命令,即不同的仪器命令不同。但所有的命令都符合SCPI标准。

对于SCPI的更详细的介绍,请查阅相关资料,这里不再赘述。

4.VISA(虚拟仪器软件架构)

 

VISA是一个驱动程序软件架构,开发这一架构的目的在于统一与GPIB、串口、以太网/LAN、IEEE 1394和USB仪器的通信,并简化仪器的控制应用。通过VISA API,开发人员可以使用GPIB、串口、以太网/LAN、IEEE 1394和USB仪器。

VISA具备如下优势:

  • 接口独立性--VISA提供了一个单一的API以相同的方法与仪器进行通信,而不考虑其接口类型。例如,VISA命令,发送一个ASCII字符串到一个基于消息的仪器,对于GPIB、串口、以太网/LAN、IEEE 1394和USB接口是完全相同的。
  • 一种面向对象的架构,可以方便地适应未来开发的仪器接口。
  • 功能全面的仪器编程特性,通过一个非常紧凑的命令集实现。

对于VISA更详细的介绍,请查阅相关资料。

5.仪器控制过程

  • 连接仪器:通过常用的控制接口将上位机和待控仪器连接。
  • 确定仪器资源的名称:也称之为仪器描述符,描述了VISA资源的准确名称与位置。确认仪器的资源名称,可以到NI相关网站下载NI硬件驱动,打开NI-VISA软件后可以识别出来。
    在设备和接口选项下面就可以找到仪器的资源名称,如果找不到(大多数情况是使用LAN接口的情况),可以手动添加,将仪器的IP地址(有可能需要端口号)输入,软件就可以识别仪器。
    更详细的介绍请查阅NI相关网站或者其他资料。
  • 编写控制程序:
    这里需要说明两点,不同的仪器使用方法并不相同。编写仪器控制程序有几种方式。
    1.使用仪器驱动。有的仪器厂商可能会自己基于VISA或者SCPI开发仪器的驱动,也就是往高层做了进一步封装,同时也是是对VISA和SCPI做了进一步封装,这样就进一步简化了开发流程。我们可以根据驱动说明或者仪器的编程说明使用仪器驱动软件架构。需要实现什么功能,调用相应的驱动API即可。还可以参考提供的样例。
    2.使用VISA。使用VISA同仪器获得通信的桥梁,然后将“仪器语言”通过VISA接口通知给仪器,仪器就会按我们的逻辑进行相关的操作。这里的仪器语言需要参考仪器对应的编程说明(可以到仪器相应的官网下载),主要是指SCPI通信指令集。下文会稍作详细的介绍该方法。
    3.实现自己的通信。这一点主要是针对LAN口通信的方式来说的,因为我目前只碰到过这一种情况。有的仪器并没有那么先进,去支持VXI-11协议,虽然也是TCPIP类的资源名称,但是这种情况下需要我们自己去实现TCP通信过程。并不难,我们只要实现一个TCP的客户端就可以。通过仪器提供的IP地址和PORT端口号,我们的客户端同仪器进行TCP连接,连接完成后给仪器发送“仪器语言”,同时也会接受到仪器的响应。

下面,详细说一下如何使用VISA同仪器进行通信。

方法一

平台:vs2013。

建立好工程后,现引入两个.NET的托管DLL,将NationalInstruments.Common与NationalInstruments.VisaNS引用添加到项目。这两个dll文件在C:\Program Files (x86)\National Instruments\MeasurementStudioVS20XX\DotNET\Assemblies\目录下面可以找到。
打开一个VISA会话。

 

[c#] view plaincopyprint?

  1. private MessageBasedSession mbSession;  
  2. try{  
  3.     mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().  
  4.     Open(resourceString.Text);//资源文件名  
  5. }  
  6. catch(InvalidCastException){  
  7.     MessageBox.Show("Resource selected must be a message-based session");  
  8. }  
  9. catch(Exception exp){  
  10.     MessageBox.Show(exp.Message);  
  11. }  

查询数据,在创建了一个与我们的仪器通信的会话之后,我们可以开始发送数据至该仪器,并读回其响应。

[c#] view plaincopyprint?

  1. try{  
  2.     string responseString = mbSession.Query(stringToWrite.Text);  
  3. }  
  4. catch(Exception exp){  
  5.     MessageBox.Show(exp.Message);  
  6. }  

我们也可用Write函数只发送不读取数据。

最后将会话关闭

 

[c#] view plaincopyprint?

  1. mbSession.Dispose();  

需要说明一点,在用串口和USB口控制时,我用这种方法失败了,所以用了第二种方法。现在我还没试验过是否该方法对所有的串口和U口都不能用,如果你测试过了,可以相互交流一下。同样,这种方式不适用于使用Socket的仪器。

方法二

第二种方法使用visa接口。

控制流程同第一种方法差不多。首先,将Visa32.dll文件放在工程的debug目录下面,如果不这么做,程序会先搜索debug目录,然后搜索system32目录,寻找Visa32.dll文件。这里,不像上面一样,将dll文件引入项目,是因为该dll文件是.NET非托管的程序集,需要显式引入,负责引入的类文件参考Visa32.cs。(注:通过dumpbin -depents ***.exe或dll可以查看该文件是否属于托管,如果有mscoree.dll就是托管的,否则非托管)

在项目中建立Visa32.dll后就可以引用里面的函数。具体的使用方法请参考:NI-Visa help。

下面是部分代码

[c#] view plaincopyprint?

  1. public bool Init(){  
  2.             if (m_connect){  
  3.                 return m_connect;  
  4.             }  
  5.             viError = Visa32.viOpenDefaultRM(out m_viDefaultRM);  
  6.             if (viError != Visa32.VI_SUCCESS){  
  7.                 return false;  
  8.             }  
  9.             viError = Visa32.viOpen(m_viDefaultRM, resourceName, Visa32.VI_NO_LOCK, Visa32.VI_TMO_IMMEDIATE, out m_session);  
  10.             if (viError == Visa32.VI_SUCCESS){  
  11.                 m_connect = true;  
  12.                 //clears spectrum清除寄存器  
  13.                 Visa32.viClear(m_session);  
  14.                 viError = Visa32.viPrintf(m_session, "*CLS\n");  
  15.                 if (viError != Visa32.VI_SUCCESS){  
  16.                     m_connect = false;  
  17.                 }  
  18.                 System.Threading.Thread.Sleep(10);  
  19.             }else{  
  20.                 m_connect = false;  
  21.             }  
  22.             return m_connect;  
  23.         }  

这种方法对于不支持VXI-11协议的仪器也不适用,需要自己实现TCP通信。

对于仪器控制很多地方我还有弄清楚,暂时先把这段时间的收获记录一下,如果对这方面也有想法的话,可以随时交流。


http://www.ppmy.cn/news/455997.html

相关文章

python控制程控电源_六大步骤认识程控电源的界面操作

1 程控电源按键说明 2 1) 0~9:用于在输入框里面输入数据; 3 2) 小数点:用于在输入框中输入带小数的数据; 4 3) 10.0%↑键:当操作焦点位于调节滑块上时,可以用来将当前输出值增加额定值的10%&…

程控交换复习

交换系统的基本技术有:接口技术,互联接口,信令技术,控制技术。 构成通信网的三要素是:交换设备,传输设备,终端设备。 多处理机的工作方式有哪些,各自有什么特点: ①功…

matlab程控开关,基于单片机和FPGA设计的程控滤波器(MAX297+LTC1068)

以单片机和可编程逻辑器件(FPGA)为控制核心,设计了一个程控滤波器,实现了小信号程控放大、程控调整滤波器截止频率和幅频特性测试的功能。其中放大模块由可变增益放大器AD603实现,最大增益60dB,10dB步进可调,增益误差小于1%。程控滤波模块由MAX297低通滤波、TLC1068高通滤…

Python控制程控电源

文章目录 前言一、环境搭建二、使用步骤三、执行结果总结前言 本文章主要是记录汽车电子或嵌入式设备自动化测试中,部分场景需要控制被测设备的供电电源,以下就以常见的艾德克斯程控电源为例,分享如何通过Python来控制程控电源。 一、环境搭建 1.Python安装 安装python3.8…

CAPL控制程控电源

文章目录 前言一、环境搭建二、程控电源调试助手三、CAPL控制程控电源脚本四、执行结果前言 汽车电子测试过程中,除了实车测试,还有台架测试,在进行台架测试时,都需要通过电源来模拟汽车电瓶给ECU供电,如果要进一步进行比较高效的压力测试或自动化测试,就需要用到程控电…

Java Websocket 01: 原生模式 Websocket 基础通信

目录 Java Websocket 01: 原生模式 Websocket 基础通信Java Websocket 02: 原生模式通过 Websocket 传输文件 Websocket 原生模式 原生模式下 服务端通过 ServerEndpoint 实现其对应的 OnOpen, OnClose, OnMessage, OnError 方法客户端创建 WebSocketClient 实现对应的 onO…

500元左右的耳机什么好?500元高性价比降噪耳机推荐

随着现代生活的需要,在各种场合和环境都有了对蓝牙耳机的需求。因此选购蓝牙耳机也有了不一样的考虑,比如上班通勤降噪,学生党宿舍学习降噪等等,而且蓝牙耳机品牌众多很多小伙伴也不知道如何选购最有性价比的蓝牙耳机。这里就让我…

【代码实验】YOLO V7利用pycocotools进行评估时的一些问题

文章目录 一、无法使用pycocotools进行评估二、使用pycocotools计算的结果与YOLO自身的mAP差异较大的原因 一、无法使用pycocotools进行评估 yolov7有自己的计算mAP方式,但是在使用pycocotools进行test时,出现了pycocotools unable to run: Results do …