C# 通过NI-VISA操作Tektronix TBS 2000B系列示波器的实现步骤

 更新时间:2021年02月19日 10:11:13   作者:seabluescn  
这篇文章主要介绍了C# 通过NI-VISA操作Tektronix TBS 2000B系列示波器的实现步骤,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

一、概述

本文描述采用C#语言访问控制Tektronix TBS 2000B 系列示波器。接口协议采用NI-VISA。

最近一个项目需要和一款示波器进行通信,需要对示波器进行一些简单控制并获取到波形数据。经过一段时间研究,大致了解了相关操作,因为发现相关资料不是很多,所以把我了解的相关知识和大家分享一下。文末将提供本文涉及的相关文档、代码、安装程序的下载地址。

正常情况下,我们如果需要和一个设备进行通信,首先需要知道PC通过什么方式和设备进行连接,通信协议是什么。由于工作需要和很多设备进行过连接,常用的连接方式主要有:网络连接、串口连接、USB接口连接等;通信协议都是自定义的协议文本。 本来以为这个项目首先得需要搞清楚示波器的通信协议,然后才能进行下一步开发,在官方网站下载了一些编程资料,发现该设备是可以通过VISA进行连接的,那什么是VISA呢?VISA是由National Instruments公司牵头,联合一些设备制造厂商共同指定的一个通用设备连接标准,不管设备通过何种方式进行连接,只要符合VISA规范就可以通过该标准协议进行连接,而NI-VISA就是NI公司实现的一个协议,通过这个协议接口,我们不用直接和设备进行通信,只需要通过NI-VISA提供的接口就可以访问设备,而常用的接口非常简单,主要就是OPEN、WRITE、READ等几个命令。符合规范的设备都会公开一份SCPI指令集的文档,只要仔细阅读该文档就可以实现设备的控制。在整个项目过程中,我仅仅通过几个官方网站下载的文档就完成项目开发,几乎没有什么障碍,在此不得不感慨我们的制造业和发达国家相比确实有很大差距,我们就缺少这样标准性的东西,什么事情都得从底层做起,很不科学。要是那些巨头们肯做一些这方面的工作就太好了,比做什么买菜、卖鱼的APP有意义得多了。

二、连接

示波器通过网络接口和PC进行连接

配置示波器IP和PC在同一个网段,例如:192.168.11.11,在设置时注意IP内不要有0,然后在PC上先ping一下,看能否ping通。

如果能ping通就在浏览器输入http://192.168.11.11看能否打开示波器主页,确认SCPI指令可以运行。

三、安装驱动

运行NI-VISA Runtime安装程序,选中运行时基础包和.NET支持包。 

.NET支持包选.NET 4.0-4.5.1 Runtime Support(IVI),不选.NET XX Runtime Support(NS),NS的包是老版本。

安装完成后形成两个包:Ivi.Visa和NationalInstruments.Visa

其中Ivi.Visa有两个版本:

32位位置:C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v2.0.50727\VISA.NET Shared Components 5.8.0

64位位置:C:\Program Files\IVI Foundation\VISA\Microsoft.NET\Framework64\v2.0.50727\VISA.NET Shared Components 5.8.0

NationalInstruments.Visa位置:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\NationalInstruments.Visa\v4.0_17.0.0.0__2eaa5af0834e221d

四、引用

新建VS工程,按上述地址添加Ivi.Visa和NationalInstruments.Visa两个引用。Ivi.Visa的库根据需要可以选32位或64位。

程序运行需要在目标机器安装运行时,所以引用的库不需要复制到项目文件夹。

五、代码

https://github.com/cnxy/VISAInstrument

连接代码:

string IP = this.txtIP.Text.Trim();

      string IpRegex = @"^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$";

      if (!Regex.IsMatch(IP, IpRegex))
      {
        MessageBox.Show("IP地址不正确!");
        return;
      }

      if (!PortUltility.OpenIPAddress(IP, out string fullAddress))
      {
        MessageBox.Show("未找到设备!");
        return;
      }

      try
      {
        _portOperatorBase = new LANPortOperator(fullAddress);
      }
      catch (Exception ex)
      {
        MessageBox.Show($"初始化设备失败:{ex.Message}");
        return;
      }

      try
      {
        _portOperatorBase.Timeout = 2000;
        _portOperatorBase.Open();
      }
      catch (Exception ex)
      {
        MessageBox.Show($"连接设备失败:{ex.Message}");
        return;
      }

      EnabledControls(true);
      MessageBox.Show("连接成功!");

写指令一共有两种,一种不需要返回数据、一种需要返回数据,下发了需要返回数据的指令后才能进行读取指令,否则就会读取失败。

读写指令如下:

private void btnWrite_Click(object sender, EventArgs e)
    {
      string CmdStr = this.txtCommand.Text.Trim();

      
      try
      {
        _portOperatorBase.WriteLine(CmdStr);
        ShowLog($"[Write][{CmdStr}][Success]");
      }
      catch
      {
        ShowLog($"[Write][{CmdStr}][ERROR]");
      }
    }

    private void btnReadString_Click(object sender, EventArgs e)
    {
      try
      {
        var result = _portOperatorBase.Read();
        ShowLog($"[Read][{result}][{result.Length}]");
      }
      catch (IOTimeoutException)
      {
        ShowLog($"[Read][ERROR:Timeout]");
      }
      catch (Exception ex)
      {
        ShowLog($"[Read][Exception:{ex.Message}]");
      }
    }

核心代码就这么多,剩下的就根据需要查询SCPI指令表就可以了。

附录、相关SCPI指令

 以下指令仅适用于Tektronix TBS 2000B系列示波器。

(一)    基本指令
1.   身份
WRITE:*IDN?

READ:

(二)    设置
1.   默认设置
RECAll:SETUp FACtory

2.  通道控制
Select:CH<x> ON/OFF

3.  水平位置与比例
HORizontal:POSition?

HORizontal:POSition 10

 

HORizontal:SCAle?

400  单位是秒

HORizontal:SCAle 0.2

 

4.  垂直位置与比例
CH1:POSition?

CH1:POSition 1

 

CH1:SCAle?

CH1:SCAle 2.5

 

5.  触发
模式

TRIGger:A:MODe?

NORMAL

 

触发类型

TRIGger:A:TYPe?

EDGE

 

触发源

TRIGger:A:EDGE:SOUrce CH1

 

耦合:

TRIGger:A:EDGE:COUPling g {DC|HFRej|LFRej|NOISErej}

 

斜率

TRIGger:A:EDGE:SLOpe {RISe|FALL}

 

触发电平(当前)

TRIGger:A:LEVel?

2.0800

TRIGger:A:LEVel 3.5

 

触发电平(指定通道)

TRIGger:A:LEVel:CH1?

2.0800

TRIGger:A:LEVel :CH1 3.5

 

(三)    控制
1.   设置/查询工作类型
ACQuire:STOPAfter SEQuence

ACQuire:STOPAfter RUNSTOP

查询:ACQuire:STOPAfter?

返回最后一次设置的工作类型

 

2.  设置/查询运行状态
ACQuire:STATE?

0:Run或Single

1:Stop

设置:ACQuire:STATE ON/OFF

 

3.  查询触发状态
TRIGger:STATE?

READY:等待触发

SAVE:已经触发

 

(四)    读取数据
1.   设置数据来源(通道)
DATA:SOURCE CH1

 

2.  设置/读取记录宽度
HORizontal:RECOrdlength?

2000

 

3.  读取波形数据宽度(仅读取,触发完成后有效)
WFMOutpre:RECOrdlength?

2000

4.  设置传输数据窗口
DATa:STARt 1  最小为1

DATa:STOP 2000

DATa:WIDth? 单个数据宽度(字节数)默认为1,可以修改为2字节,但高位始终为0

 

5.  数据读取
CURVe?

Read(Bytes):返回指定长度的字节数据【LENGTH= N+(STOP-STARt+1)+1】

数据为:帧头(N字节)+数据(STOP-STARt+1字节)+帧尾(1字节)。

帧头为:#(1字节)+数据长度的长度(1字节)+数据长度(1~9字节)

帧尾为:\n

数据每个字节表示一个波形高度值,采用补码方式,即第一个位表示符号,范围从-128~127

相关文档、代码下载:https://gitee.com/seabluescn/tksamples.git

以上就是C# 通过NI-VISA操作Tektronix TBS 2000B系列示波器的实现步骤的详细内容,更多关于c# 操作Tektronix TBS 2000B系列示波器的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

相关文章

  • C#实现批量更改文件名称大小写或扩展名

    C#实现批量更改文件名称大小写或扩展名

    这篇文章主要为大家详细介绍了如何利用C#实现批量更改文件名称大小写或扩展名的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 一篇文章教会你用Unity制作网格地图生成组件

    一篇文章教会你用Unity制作网格地图生成组件

    网格地图这个功能在策略型游戏中应用比较广泛,基本情况下会将地图分割成正方形网格或者六边形网格,这篇文章主要给大家介绍了如何通过一篇文章学会用Unity制作网格地图生成组件的相关资料,需要的朋友可以参考下
    2021-08-08
  • C#利用雪花算法实现生成ID工具类

    C#利用雪花算法实现生成ID工具类

    雪花算法表示生成的ID如雪花般独一无二,该算法源自Twitter,主要用于解决分布式系统的唯一Id生成问题,本文主要介绍了C#如何利用利用雪花算法实现生成ID,需要的可以参考下
    2023-12-12
  • c# 两种发送邮件的方法

    c# 两种发送邮件的方法

    这篇文章主要介绍了c# 两种发送邮件的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#之关于Base64简单加密与解密方式

    C#之关于Base64简单加密与解密方式

    这篇文章主要介绍了C#之关于Base64简单加密与解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 详解WPF中的隧道路由和冒泡路由事件

    详解WPF中的隧道路由和冒泡路由事件

    这篇文章主要介绍了WPF中的隧道路由和冒泡路由事件的相关资料,帮助大家更好的理解和学习使用c#的wpf,感兴趣的朋友可以了解下
    2021-04-04
  • C++中const的实现细节介绍(C,C#同理)

    C++中const的实现细节介绍(C,C#同理)

    本篇文章主要是对C++中const的实现细节进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 说说C#的async和await的具体用法

    说说C#的async和await的具体用法

    本篇文章主要介绍了说说C#的async和await的具体用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C#图像处理之图像平移的方法

    C#图像处理之图像平移的方法

    这篇文章主要介绍了C#图像处理之图像平移的方法,涉及C#操作图形实现平移的相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#简单聊天室雏形

    C#简单聊天室雏形

    这篇文章主要为大家详细介绍了C#简单聊天室雏形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论