栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

仪器控制手册

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

仪器控制手册

仪器控制
  • 概述
  • 前期准备
    • VISA协议及辅助工具
      • VISA协议
      • 辅助工具:NI-MAX
    • SCPI指令
    • 仪器硬件驱动
  • 仪器控制方法
    • 方法一:仪器硬件驱动
      • 步骤①:导入第三方库 sa_api.dll,直接放在Debug文件夹中
      • 步骤②:直接使用驱动提供的函数
    • 方法二:(适用LAN口通讯)用户自定义通讯
    • 方法三:基于VISA协议
      • 步骤①:引用第三方库 NI-VISA库
      • 步骤②:确定仪器资源的名称
      • 步骤③:打开一个 VISA 会话
      • 步骤④:发送数据
      • 步骤⑤:关闭该 VISA 会话
    • 方法④ :使用visa接口(`本方法博主并未使用过`)
      • 步骤①:将Visa32.dll文件放在工程的debug目录下面
      • 步骤②:引用Visa32.dll里面的函数,具体的使用方法请参考:NI-Visa help
    • 说明

概述

仪器控制,就是计算机通过介质(网线、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,其实这个就是一个远程操作仪器的工具。


然后选择面板上的“打开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, "*CLSn");
                if (viError != Visa32.VI_SUCCESS){
                    m_connect = false;
                }
                System.Threading.Thread.Sleep(10);
            }else{
                m_connect = false;
            }
            return m_connect;
        }
说明

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984807.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号