服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 通过NI-VISA操作Tektronix TBS 2000B系列示波器的实现步骤

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

2022-11-01 14:51seabluescn C#

这篇文章主要介绍了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进行连接

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

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

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

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

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

三、安装驱动

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

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

.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位。

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

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

五、代码

https://github.com/cnxy/VISAInstrument

连接代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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("连接成功!");

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

读写指令如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
(一)    基本指令
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系列示波器的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/seabluescn/p/14404546.html

延伸 · 阅读

精彩推荐
  • C#WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法

    WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法

    这篇文章主要介绍了WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法,涉及C#针对WinForm事件的判定技巧,具有一定参考借鉴价值,需要的朋友可以...

    我心依旧9742021-10-25
  • C#C#将配置文件appsetting中的值转换为动态对象调用

    C#将配置文件appsetting中的值转换为动态对象调用

    这篇文章主要介绍了将配置文件appsetting中的值转换为动态对象调用 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    深入学习ing10642022-03-01
  • C#C#实现发送邮件的方法

    C#实现发送邮件的方法

    这篇文章主要为大家详细介绍了C#实现发送邮件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    高软玩家4792022-01-21
  • C#C#实现顺序栈和链栈的代码实例

    C#实现顺序栈和链栈的代码实例

    今天小编就为大家分享一篇关于的C#实现顺序栈和链栈的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    Czhenya3872022-03-03
  • C#winform 实现控制输入法

    winform 实现控制输入法

    在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的。对此,在这里做个备...

    C#教程网9782021-10-21
  • C#轻松学习C#的方法

    轻松学习C#的方法

    轻松学习C#的方法,对C#的方法感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的方法。...

    C#教程网10222021-11-04
  • C#C# 操作 MongoDB的示例demo

    C# 操作 MongoDB的示例demo

    这篇文章主要介绍了C# 操作 MongoDB的示例demo,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    chesterdotchen8212022-10-20
  • C#C#提高编程能力的50个要点总结

    C#提高编程能力的50个要点总结

    这篇文章主要介绍了C#提高编程能力的50个要点,较为详细的总结分析了C#程序设计中常见的注意事项与编程技巧,需要的朋友可以参考下...

    礼拜一10712021-11-11