C# 通過(guò)NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟
一、概述
本文描述采用C#語(yǔ)言訪問(wèn)控制Tektronix TBS 2000B 系列示波器。接口協(xié)議采用NI-VISA。
最近一個(gè)項(xiàng)目需要和一款示波器進(jìn)行通信,需要對(duì)示波器進(jìn)行一些簡(jiǎn)單控制并獲取到波形數(shù)據(jù)。經(jīng)過(guò)一段時(shí)間研究,大致了解了相關(guān)操作,因?yàn)榘l(fā)現(xiàn)相關(guān)資料不是很多,所以把我了解的相關(guān)知識(shí)和大家分享一下。文末將提供本文涉及的相關(guān)文檔、代碼、安裝程序的下載地址。
正常情況下,我們?nèi)绻枰鸵粋€(gè)設(shè)備進(jìn)行通信,首先需要知道PC通過(guò)什么方式和設(shè)備進(jìn)行連接,通信協(xié)議是什么。由于工作需要和很多設(shè)備進(jìn)行過(guò)連接,常用的連接方式主要有:網(wǎng)絡(luò)連接、串口連接、USB接口連接等;通信協(xié)議都是自定義的協(xié)議文本。 本來(lái)以為這個(gè)項(xiàng)目首先得需要搞清楚示波器的通信協(xié)議,然后才能進(jìn)行下一步開(kāi)發(fā),在官方網(wǎng)站下載了一些編程資料,發(fā)現(xiàn)該設(shè)備是可以通過(guò)VISA進(jìn)行連接的,那什么是VISA呢?VISA是由National Instruments公司牽頭,聯(lián)合一些設(shè)備制造廠商共同指定的一個(gè)通用設(shè)備連接標(biāo)準(zhǔn),不管設(shè)備通過(guò)何種方式進(jìn)行連接,只要符合VISA規(guī)范就可以通過(guò)該標(biāo)準(zhǔn)協(xié)議進(jìn)行連接,而NI-VISA就是NI公司實(shí)現(xiàn)的一個(gè)協(xié)議,通過(guò)這個(gè)協(xié)議接口,我們不用直接和設(shè)備進(jìn)行通信,只需要通過(guò)NI-VISA提供的接口就可以訪問(wèn)設(shè)備,而常用的接口非常簡(jiǎn)單,主要就是OPEN、WRITE、READ等幾個(gè)命令。符合規(guī)范的設(shè)備都會(huì)公開(kāi)一份SCPI指令集的文檔,只要仔細(xì)閱讀該文檔就可以實(shí)現(xiàn)設(shè)備的控制。在整個(gè)項(xiàng)目過(guò)程中,我僅僅通過(guò)幾個(gè)官方網(wǎng)站下載的文檔就完成項(xiàng)目開(kāi)發(fā),幾乎沒(méi)有什么障礙,在此不得不感慨我們的制造業(yè)和發(fā)達(dá)國(guó)家相比確實(shí)有很大差距,我們就缺少這樣標(biāo)準(zhǔn)性的東西,什么事情都得從底層做起,很不科學(xué)。要是那些巨頭們肯做一些這方面的工作就太好了,比做什么買(mǎi)菜、賣(mài)魚(yú)的APP有意義得多了。
二、連接
示波器通過(guò)網(wǎng)絡(luò)接口和PC進(jìn)行連接

配置示波器IP和PC在同一個(gè)網(wǎng)段,例如:192.168.11.11,在設(shè)置時(shí)注意IP內(nèi)不要有0,然后在PC上先ping一下,看能否ping通。

如果能ping通就在瀏覽器輸入http://192.168.11.11看能否打開(kāi)示波器主頁(yè),確認(rèn)SCPI指令可以運(yùn)行。

三、安裝驅(qū)動(dòng)
運(yùn)行NI-VISA Runtime安裝程序,選中運(yùn)行時(shí)基礎(chǔ)包和.NET支持包。

.NET支持包選.NET 4.0-4.5.1 Runtime Support(IVI),不選.NET XX Runtime Support(NS),NS的包是老版本。
安裝完成后形成兩個(gè)包:Ivi.Visa和NationalInstruments.Visa
其中Ivi.Visa有兩個(gè)版本:
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兩個(gè)引用。Ivi.Visa的庫(kù)根據(jù)需要可以選32位或64位。
程序運(yùn)行需要在目標(biāo)機(jī)器安裝運(yùn)行時(shí),所以引用的庫(kù)不需要復(fù)制到項(xiàng)目文件夾。

五、代碼
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("未找到設(shè)備!");
return;
}
try
{
_portOperatorBase = new LANPortOperator(fullAddress);
}
catch (Exception ex)
{
MessageBox.Show($"初始化設(shè)備失敗:{ex.Message}");
return;
}
try
{
_portOperatorBase.Timeout = 2000;
_portOperatorBase.Open();
}
catch (Exception ex)
{
MessageBox.Show($"連接設(shè)備失敗:{ex.Message}");
return;
}
EnabledControls(true);
MessageBox.Show("連接成功!");
寫(xiě)指令一共有兩種,一種不需要返回?cái)?shù)據(jù)、一種需要返回?cái)?shù)據(jù),下發(fā)了需要返回?cái)?shù)據(jù)的指令后才能進(jìn)行讀取指令,否則就會(huì)讀取失敗。
讀寫(xiě)指令如下:
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}]");
}
}
核心代碼就這么多,剩下的就根據(jù)需要查詢SCPI指令表就可以了。
附錄、相關(guān)SCPI指令
以下指令僅適用于Tektronix TBS 2000B系列示波器。
(一) 基本指令
1. 身份
WRITE:*IDN?
READ:
(二) 設(shè)置
1. 默認(rèn)設(shè)置
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. 觸發(fā)
模式
TRIGger:A:MODe?
NORMAL
觸發(fā)類(lèi)型
TRIGger:A:TYPe?
EDGE
觸發(fā)源
TRIGger:A:EDGE:SOUrce CH1
耦合:
TRIGger:A:EDGE:COUPling g {DC|HFRej|LFRej|NOISErej}
斜率
TRIGger:A:EDGE:SLOpe {RISe|FALL}
觸發(fā)電平(當(dāng)前)
TRIGger:A:LEVel?
2.0800
TRIGger:A:LEVel 3.5
觸發(fā)電平(指定通道)
TRIGger:A:LEVel:CH1?
2.0800
TRIGger:A:LEVel :CH1 3.5
(三) 控制
1. 設(shè)置/查詢工作類(lèi)型
ACQuire:STOPAfter SEQuence
ACQuire:STOPAfter RUNSTOP
查詢:ACQuire:STOPAfter?
返回最后一次設(shè)置的工作類(lèi)型
2. 設(shè)置/查詢運(yùn)行狀態(tài)
ACQuire:STATE?
0:Run或Single
1:Stop
設(shè)置:ACQuire:STATE ON/OFF
3. 查詢觸發(fā)狀態(tài)
TRIGger:STATE?
READY:等待觸發(fā)
SAVE:已經(jīng)觸發(fā)
(四) 讀取數(shù)據(jù)
1. 設(shè)置數(shù)據(jù)來(lái)源(通道)
DATA:SOURCE CH1
2. 設(shè)置/讀取記錄寬度
HORizontal:RECOrdlength?
2000
3. 讀取波形數(shù)據(jù)寬度(僅讀取,觸發(fā)完成后有效)
WFMOutpre:RECOrdlength?
2000
4. 設(shè)置傳輸數(shù)據(jù)窗口
DATa:STARt 1 最小為1
DATa:STOP 2000
DATa:WIDth? 單個(gè)數(shù)據(jù)寬度(字節(jié)數(shù))默認(rèn)為1,可以修改為2字節(jié),但高位始終為0
5. 數(shù)據(jù)讀取
CURVe?
Read(Bytes):返回指定長(zhǎng)度的字節(jié)數(shù)據(jù)【LENGTH= N+(STOP-STARt+1)+1】
數(shù)據(jù)為:幀頭(N字節(jié))+數(shù)據(jù)(STOP-STARt+1字節(jié))+幀尾(1字節(jié))。
幀頭為:#(1字節(jié))+數(shù)據(jù)長(zhǎng)度的長(zhǎng)度(1字節(jié))+數(shù)據(jù)長(zhǎng)度(1~9字節(jié))
幀尾為:\n
數(shù)據(jù)每個(gè)字節(jié)表示一個(gè)波形高度值,采用補(bǔ)碼方式,即第一個(gè)位表示符號(hào),范圍從-128~127
相關(guān)文檔、代碼下載:https://gitee.com/seabluescn/tksamples.git
以上就是C# 通過(guò)NI-VISA操作Tektronix TBS 2000B系列示波器的實(shí)現(xiàn)步驟的詳細(xì)內(nèi)容,更多關(guān)于c# 操作Tektronix TBS 2000B系列示波器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析XPath語(yǔ)法之在C#中使用XPath的示例詳解
本篇文章是對(duì)在C#中使用XPath的示例進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)的Excel文件操作類(lèi)實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的Excel文件操作類(lèi),結(jié)合具體實(shí)例形式分析了C#數(shù)據(jù)庫(kù)及Excel文件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
C#遍歷操作系統(tǒng)下所有驅(qū)動(dòng)器的方法
這篇文章主要介紹了C#遍歷操作系統(tǒng)下所有驅(qū)動(dòng)器的方法,涉及C#中DriveInfo類(lèi)GetDrivers方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
C#難點(diǎn)逐個(gè)擊破(1):ref參數(shù)傳遞
一般情況,方法的參數(shù)傳遞是通過(guò)值進(jìn)行傳遞的,另一種情況是引用傳遞,大家可以參考下。2010-02-02

