一、概述
本文描述采用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
连接代码:
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