当前位置: 首页 > news >正文

射频测试入门学习(四)——C#是如何控制一台仪器的

目录

一、写作说明

二、常用两种库对比

1. 库对比分析表格

2. 常用方法说明

三、代码实现示例

1.NI-VISA 封装类

2.Ivi.VISA 封装类

3.主函数调用

四、两种库适用范围总结


一、写作说明

刚入行时很疑惑,一门编程语言是如何和仪器实现通信的。在上篇文章《射频测试入门学习(三)——程控仪器是怎样和电脑连接通信的》中已经详细说明控制仪器的电脑必备条件。本文通过实际举例介绍C#是如何控制仪器并与之通信的。

二、常用两种库对比

1. 库对比分析表格

特性NI-VISAIvi.VISA
依赖需安装 NI-VISA Runtime(商业授权)无需 NI 依赖,通过 NuGet 直接安装(如 Ivi.Visa 包),但需底层 VISA 驱动(如 Keysight IO 套件)
跨平台支持支持 Windows/Linux(需对应版本)跨平台兼容性更好(支持 .NET Core/Standard)
接口支持GPIB、USB、LAN、Serial 等(需硬件支持)类似 NI-VISA,但依赖底层驱动
性能高(专为仪器通信优化)中等(托管实现,略低于原生库)
开发便捷性需 NI 软件环境,文档完善轻量级集成(NuGet),代码更简洁
适用场景需稳定性和高性能的场景(如产线测试)跨平台开发、快速原型设计或避免商业依赖

2. 常用方法说明

操作NI-VISA 方法Ivi.VISA 方法
连接仪器ResourceManager.Open()ResourceManager.Open()
发送指令MessageBasedSession.RawIO.Write()IMessageBasedSession.RawIO.Write()
读取响应MessageBasedSession.RawIO.ReadString()IMessageBasedSession.RawIO.ReadString()
断开连接MessageBasedSession.Dispose()IMessageBasedSession.Dispose()

三、代码实现示例

1.NI-VISA 封装类

using NationalInstruments.Visa;
using System;

public class PowerSupply_NIVisa {
    private MessageBasedSession _session;

    public void Connect(string visaAddress) {
        var rm = new ResourceManager();
        _session = (MessageBasedSession)rm.Open(visaAddress);
    }

    public void Disconnect() {
        _session?.Dispose();
    }

    public string Query(string command) {
        _session.RawIO.Write(command);
        return _session.RawIO.ReadString().Trim();
    }

    public void SetVoltage(double voltage, int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        _session.RawIO.Write($"VOLT {voltage}");
    }

    public void SetCurrent(double current, int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        _session.RawIO.Write($"CURR {current}");
    }

    public void OutputOn() {
        _session.RawIO.Write("OUTP:STAT ON");
    }

    public void OutputOff() {
        _session.RawIO.Write("OUTP:STAT OFF");
    }

    public double MeasureVoltage(int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        return double.Parse(_session.RawIO.ReadString());
    }

    public double MeasureCurrent(int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        return double.Parse(_session.RawIO.ReadString());
    }
}

2.Ivi.VISA 封装类

using Ivi.Visa;
using System;

public class PowerSupply_IviVisa {
    private IMessageBasedSession _session;

    public void Connect(string visaAddress) {
        var rm = new ResourceManager();
        _session = rm.Open(visaAddress) as IMessageBasedSession;
    }

    public void Disconnect() {
        _session?.Dispose();
    }

    public string Query(string command) {
        _session.RawIO.Write(command);
        return _session.RawIO.ReadString().Trim();
    }

    public void SetVoltage(double voltage, int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        _session.RawIO.Write($"VOLT {voltage}");
    }

    public void SetCurrent(double current, int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        _session.RawIO.Write($"CURR {current}");
    }

    public void OutputOn() {
        _session.RawIO.Write("OUTP:STAT ON");
    }

    public void OutputOff() {
        _session.RawIO.Write("OUTP:STAT OFF");
    }

    public double MeasureVoltage(int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        return double.Parse(_session.RawIO.ReadString());
    }

    public double MeasureCurrent(int channel) {
        _session.RawIO.Write($"INST:NSEL {channel}");
        return double.Parse(_session.RawIO.ReadString());
    }
}

3.主函数调用

class Program {
    static void Main() {
        string visaAddress = "TCPIP0::192.168.1.101::inst0::INSTR";

        // 使用 NI-VISA
        var niPs = new PowerSupply_NIVisa();
        niPs.Connect(visaAddress);
        Console.WriteLine("IDN: " + niPs.Query("*IDN?"));
        niPs.SetVoltage(12.0, 1);
        niPs.SetCurrent(1.0, 1);
        niPs.OutputOn();
        Console.WriteLine("Measured Voltage: " + niPs.MeasureVoltage(1));
        niPs.Disconnect();

        // 使用 Ivi.VISA
        var iviPs = new PowerSupply_IviVisa();
        iviPs.Connect(visaAddress);
        Console.WriteLine("IDN: " + iviPs.Query("*IDN?"));
        iviPs.SetVoltage(5.0, 2);
        iviPs.SetCurrent(0.5, 2);
        iviPs.OutputOn();
        Console.WriteLine("Measured Current: " + iviPs.MeasureCurrent(2));
        iviPs.Disconnect();
    }
}

四、两种库适用范围总结

推荐场景
NI-VISA需要高性能、稳定性的环境(如产线测试),且允许安装 NI 商业软件。
Ivi.VISA跨平台开发、快速原型设计,或需避免依赖 NI 的商业授权(依赖底层 VISA 驱动)。

相关文章:

  • node 使用 Redis 缓存
  • 高级应用:使用 p-retry 处理 Node.js 中的重试逻辑
  • 【量化科普】Sharpe Ratio,夏普比率
  • python 量化交易入门到提升详细教程,python量化交易教程
  • k8s ssl 漏洞修复
  • netcore 启用gzip压缩及缓存
  • 鸿蒙初学者学习手册(HarmonyOSNext_API14)_组件截图(@ohos.arkui.componentSnapshot (组件截图) )
  • 数据结构:二叉树
  • 【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session
  • 设计模式教程:外观模式(Facade Pattern)
  • IDEA + 通义灵码AI程序员:快速构建DDD后端工程模板
  • 【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
  • 前后端项目部署服务器(传统部署和Docker部署)
  • 科普:“git“与“github“
  • JAVA:集成 Drools 业务规则引擎的技术指南
  • 浅谈网络 | 容器网络之Cilium
  • Unity通过Vosk实现离线语音识别方法
  • 深度学习之图像回归(一)
  • Ubuntu部署ktransformers
  • CTF 代码学习日记 PHP
  • 网站建设中 gif/网销怎么找客户资源
  • wordpress站点结构/线上推广有哪些渠道
  • joomla 做外贸网站 好的/亿速云
  • 手工活接单在家做有正规网站吗/国内免费域名
  • 关于协会网站建设的建议/有创意的网络广告案例
  • 深圳营销型网站建设服务/线上营销方式