仪器控制手册

概述

仪器控制,就是计算机通过介质(网线、GPIB线等)完成对设备的控制,包括状态控制以及数据查询等

前期准备

需要了解VISA协议、SCPI指令、硬件驱动

VISA协议及辅助工具

VISA协议

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

VISA是NI-VISA(Virtual Instrument Software Architecture 虚拟仪器软件架构)的简称,是美国国家仪器 NI(National1nstrLlrnent)公司开发的一种用来与各种仪器总线进行通信的高级应用编程接口。

控制流程如下:
在这里插入图片描述

辅助工具:NI-MAX

安装NI-VISA(第三方库)后,安装一个软件,可以用来查看计算机连接的可使用设备资源。
NI-MAX
辅助软件NI-MAX,其实这个就是一个远程操作仪器的工具。
辅助软件NI-MAX
在这里插入图片描述
然后选择面板上的“打开VISA测试面板”,会打开如下所示的面板:
在这里插入图片描述
切换到Input/Output:就可以通过命令来获取仪表信息了,如下所示:
在这里插入图片描述

SCPI指令

SCPI (Standard Command for Programmable Instrumentation)程控仪器标准命令。
SCPI有公共的命令,即对所有的仪器都是可行的;也有特定的命令,即不同的仪器命令不同。但所有的命令都符合SCPI标准。

仪器硬件驱动

有的仪器厂商可能会自己基于VISA或者SCPI开发仪器的驱动,也就是往高层做了进一步封装,同时也是是对VISA和SCPI做了进一步封装,这样就进一步简化了开发流程。我们可以根据驱动说明或者仪器的编程说明使用仪器驱动软件架构。需要实现什么功能,调用相应的驱动API即可。还可以参考提供的样例。

仪器控制方法

方法一:仪器硬件驱动

例如:控制接收机SA44B,使用厂商提供的硬件驱动,signal_hound_sdk_11_02_20,提供的saOpenDevice()函数。
一个函数就集成了VISA中的若干步骤,实现连接硬件设备。

步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中

步骤②:直接使用驱动提供的函数

    Public Function saOpen()
        Try
            Dim openstatus As saStatus
            Dim status As Boolean = True
            openstatus = saOpenDevice(Id)
            If openstatus <> saStatus.saNoError Then
                saCloseDevice(Id)
                openstatus = saOpenDevice(Id) '将打开的设备的标识符赋值给Id
            End If
            If openstatus <> saStatus.saNoError Then
                MessageBox.Show("接收机连接失败!")
                errStatus = saGetErrorString(openstatus)
                status = False
                Return status
                Exit Function
            Else
                Return status
            End If
        Catch ex As Exception
            Console.WriteLine(errStatus)
        End Try
    End Function

方法二:(适用LAN口通讯)用户自定义通讯

用户建立TCP/IP连接,通过Socket实现设备连接。
我们需要实现一个TCP的客户端,通过仪器提供的IP地址和PORT端口号,我们的客户端同仪器进行TCP连接,连接完成后给仪器发送“仪器语言”,同时也会接受到仪器的响应。

Imports System.Net
Imports System.Net.Sockets
Dim SockClient As Socket
Public Sub SwitchConnect(ByVal IP As String)
        Dim Address As IPAddress = IPAddress.Parse(IP)
        Dim Endpoint As New IPEndPoint(Address, CType(5555, Integer))
        Try '捕获异常
            SockClient.Connect(Endpoint) '发起连接。成功则返回值为0
        Catch ss As SocketException
            MessageBox.Show(ss.Message)
        Catch s As Exception
            MessageBox.Show(s.Message)
        End Try
    End Sub

方法三:基于VISA协议

步骤①:引用第三方库 NI-VISA库

首先:添加库引用
将 NationalInstruments.Common 与 NationalInstruments.VisaNS 引用添加到您的项目。

NationalInstruments.Common 命名空间包括各种为许多 NI 驱动程序所使用的常见方法和属性。
NationalInstruments.VisaNS命名空间包括面向 VISA .Net API 的方法和属性

然后:将 VisaNS 命名空间导入到您的应用
这样可以减少方法前缀的使用,更直接地访问对象

[C#]
using NationalInstruments.VisaNS;
[VB .Net]
Imports NationalInstruments.VisaNS

步骤②:确定仪器资源的名称

仪器资源名称,也称为仪器描述符,描述了VISA资源的准确名称和位置。
例如:

ASRL1::INSTR 描述了位于您的计算机的 COM 端口 1 的仪器
GPIB0::13::INSTR 描述了一个位于位置 13 的 GPIB 仪器

为了实现与一个使用 VISA 的仪器的通信,我们必须确定其地址和仪器描述符

步骤③:打开一个 VISA 会话

一个会话是自 VISA .Net API 到一项资源的一个连接或链接。

MessageBasedSession 类适用于通过发送和接收文本字符串形式的消息进行通信的仪器
RegisterBasedSession 类被用于与通过读写寄存器进行通信的仪器进行通信

本文面向的仪器是EMC领域的仪器,多为MessageBasedSession类

首先:声明一个新的 MessageBasedSession:
[注]声明为全局变量,因为任何一个VISA函数都需要访问该变量

[C#]
private MessageBasedSession mbSession;
[VB .Net]
Private mbSession As MessageBasedSession

然后:实例化一个MessageBasedSession对象
我们将使用静态方法(或者像在 Visual Basic 中那样称为共享方法)–ResourceManager 类的 GetLocalManager。该方法实例化一个新的 ResourceManager 对象。
这个新的 ResourceManager 对象包含一个名为 Open(打开)的函数,然后该函数实例化一个新的会话对象。最后,我们将新创建的会话对象映射到一个 MessageBasedSession

[C#]
mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text);
[VB .Net]
mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession)

其中,resourceString.Text 就是前述的仪器描述符

使用try catch来使代码更加健壮

[C#]
try
{mbSession = (MessageBasedSession)ResourceManager.GetLocalManager().Open(resourceString.Text);
}
catch(InvalidCastException)
{ MessageBox.Show("Resource selected must be a message-based session");
}
catch(Exception exp)
{ MessageBox.Show(exp.Message);
} 
[VB .Net]
Try
mbSession = CType(ResourceManager.GetLocalManager().Open(resourceString.Text), MessageBasedSession)
Catch exp As InvalidCastException
MessageBox.Show("Resource selected must be a message-based session")
Catch exp As Exception
MessageBox.Show(exp.Message)
End Try

步骤④:发送数据

在创建了一个与我们的仪器通信的会话之后,我们可以开始发送数据至该仪器,并读回其响应。
在于基于消息的仪器的通信中最为常用的三项操作为查询、写入和读取。

1.查询操作 : 将一个命令写入到一个仪器并读回其响应。
2.写入命令 : 仅发送一个命令至仪器。
3.读取命令 : 从仪器读取信息。

实例:查询操作

[C#]
try
{
string responseString = mbSession.Query(stringToWrite.Text);
}
catch(Exception exp)
{ MessageBox.Show(exp.Message);
} 
[VB .Net]
Try
Dim responseString As String = mbSession.Query(stringToWrite.Text)
Catch exp As Exception
MessageBox.Show(exp.Message
End Try

步骤⑤:关闭该 VISA 会话

为了关闭我们创建的与我们仪器通信的 VISA 会话,我们必须使用 MessageBasedSession 类的 Dispose(处置)方法。该方法释放为该会话分配的所有资源。

[C#]
mbSession.Dispose();
[VB .Net]
mbSession.Dispose(

总结:NI-VISA 是一个面向多种仪器控制的快速且方便的解决方案。VISA .Net API 提供了一个面向对象的接口,以实现与您的仪器的方便通信。

方法④ :使用visa接口(本方法博主并未使用过

步骤①:将Visa32.dll文件放在工程的debug目录下面

步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help

public bool Init(){
            if (m_connect){
                return m_connect;
            }
            viError = Visa32.viOpenDefaultRM(out m_viDefaultRM);
            if (viError != Visa32.VI_SUCCESS){
                return false;
            }
            viError = Visa32.viOpen(m_viDefaultRM, resourceName, Visa32.VI_NO_LOCK, Visa32.VI_TMO_IMMEDIATE, out m_session);
            if (viError == Visa32.VI_SUCCESS){
                m_connect = true;
                //clears spectrum清除寄存器
                Visa32.viClear(m_session);
                viError = Visa32.viPrintf(m_session, "*CLS\n");
                if (viError != Visa32.VI_SUCCESS){
                    m_connect = false;
                }
                System.Threading.Thread.Sleep(10);
            }else{
                m_connect = false;
            }
            return m_connect;
        }

说明

后经查资料,方法③和④的区别是,托管与非托管程序集的区别。
方法③使用是.NET Framwork提供的托管程序集, NationalInstruments.CommonNationalInstruments.VisaNS,相当于内置的第三方库。适用于C#和VB.NET语言
方法④使用是非托管程序集,VISA32.dll,真正的第三方库。使用C++也可以进行开发 ,有博主实现,参考2

参考1:C#使用NI VISA实现程控仪器的自动化控制
参考2:C++ 基于VISA控制电源

  • 3
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值