C#通过NI-VISA操作TektronixTBS2000B系列⽰波器的实现步骤
⼀、概述
本⽂描述采⽤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通。
三、安装驱动
运⾏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位。
程序运⾏需要在⽬标机器安装运⾏时,所以引⽤的库不需要复制到项⽬⽂件夹。
连接代码:
string IP = IP.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 = Command.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)
{
write的返回值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 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?
返回最后⼀次设置的⼯作类型
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论