Skip to content

C# VISA 控制仪表

1. VISA 控制仪表

VISA 是美国国家仪器公司(National Instruments,简称 NI)推出的一种用于仪器编程和测量的通信协议。VISA 是 Virtual Instrument Software Architecture(虚拟仪器软件体系结构)的缩写。VISA 是一个面向仪器系统的通用软件标准,它为仪器系统中的仪器控制和管理提供了一个统一的框架,它使得测试测量应用程序的开发人员能够通过计算机控制仪器,而不需要担心不同仪器之间通信的差异。

现在大部分的仪器都支持VISA协议,所以我们可以通过VISA协议来控制仪器。

那么如何在C#中控制VISA协议呢?这个文章就是解决这个问题的。

软件控制仪器仪表的教程在网上相对比较少,都是一段一段的代码,没有从头开始带初学者来进行操作的一个完整流程,整个方案难度不高,跟着教程走的话,大家都可以开始自己的仪表编程。 希望给后来者一些帮助

2.准备阶段

我这使用的是keysight的万用表,可以使用它配套的软件 keysight connection expert 来获取设备信息 alt text

3.开始编程

3.1 创建项目

我这使用的软件版本是:Visual Studio 2022,如果你是之前的版本,推荐更换成我这个 alt text

alt textalt text

3.2 编程

alt textalt text

可以看到,添加了Visa相关的信息 alt text

3.3 全部工程代码

下面就是完整的 Form1.cs文件下的代码 如果需要开发其他的功能,可以自行在代码中添加功能 其中你的设备号,需要根据第一章节的提示获取

C
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace VISA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            //申明一个设备
            var session = (Ivi.Visa.IMessageBasedSession)
                Ivi.Visa.GlobalResourceManager.Open("你的设备号");


            //发送指令,并且读取返回值
            session.FormattedIO.WriteLine("*IDN?");
            string idName = session.FormattedIO.ReadLine();
            Console.WriteLine($"*IDN? = {idName}");

            //电压
            //session.RawIO.Write(":MEASure:VOLTage:DC?\n");
            // idName = session.FormattedIO.ReadString();
            //Console.WriteLine($"DC? = {idName}");

            //电流
            session.RawIO.Write(":MEASure:CURRent:DC?\n");
            idName = session.FormattedIO.ReadString();
            Console.WriteLine($"CURRent = {idName}");

            //频率
            session.RawIO.Write(":MEASure:FREQuency?\n");
            idName = session.FormattedIO.ReadString();
            Console.WriteLine($"频率? = {idName}");

            //释放 session
            session.Dispose();
            session = null;
        }
    }
}

下面就是打印出来的log信息 alt text

如果你需要更多的控制,可以参考下面的代码

C
//申明一个万用表设备,以及初始化配置
var session = (Ivi.Visa.IMessageBasedSession)
    Ivi.Visa.GlobalResourceManager.Open(ID_34461A);
session.FormattedIO.WriteLine("CONF:VOLT:DC");
session.FormattedIO.WriteLine("VOLT:DC:NPLC 10");
session.FormattedIO.WriteLine("VOLT:DC:IMPedance:AUTO 1");

第一句则是打开了ID_34461A 这个设备

第二句写的是 需要进行DC的控制

第三句 配置万用表的采样速度,10的话就是10个交流电的正弦波周期, 如市电50HZ,则持续采样10个正弦波周期,采样速度大约是10HZ 即100ms。 第四句 写的对应的则是使用了万用表的自动阻抗模式,自动阻抗能有10G欧姆的输入电阻

PS: 控制仪器设备,确实是比较冷门的操作,但学会了却能很大的提升工作效率,希望能对各位带来帮助

资料

下面两个可以看到

RIGOL 相关示波器编程手册 https://www.rigol.com/Images/MSO5000ProgrammingGuideCN_tcm4-4051.pdf

周立功示波器编程手册 https://www.zlg.cn/data/upload/software/Osc/ZDS2000C-bcsc.pdf

如果你使用的是其他的仪器,一般情况下官网,或者可以联系出售仪器给你的代理公司,他们一般都会提供相关的编程手册的。