C#經過NI-VISA操做Tektronix TBS 2000B系列示波器

1、概述html

本文描述採用C#語言訪問控制Tektronix TBS 2000B 系列示波器。接口協議採用NI-VISA。git

最近一個項目須要和一款示波器進行通訊,須要對示波器進行一些簡單控制並獲取到波形數據。通過一段時間研究,大體瞭解了相關操做,由於發現相關資料不是不少,因此把我瞭解的相關知識和你們分享一下。文末將提供本文涉及的相關文檔、代碼、安裝程序的下載地址。編程

正常狀況下,咱們若是須要和一個設備進行通訊,首先須要知道PC經過什麼方式和設備進行鏈接,通訊協議是什麼。因爲工做須要和不少設備進行過鏈接,經常使用的鏈接方式主要有:網絡鏈接、串口鏈接、USB接口鏈接等;通訊協議都是自定義的協議文本。 原本覺得這個項目首先得須要搞清楚示波器的通訊協議,而後才能進行下一步開發,在官方網站下載了一些編程資料,發現該設備是能夠經過VISA進行鏈接的,那什麼是VISA呢?VISA是由National Instruments公司牽頭,聯合一些設備製造廠商共同指定的一個通用設備鏈接標準,無論設備經過何種方式進行鏈接,只要符合VISA規範就能夠經過該標準協議進行鏈接,而NI-VISA就是NI公司實現的一個協議,經過這個協議接口,咱們不用直接和設備進行通訊,只須要經過NI-VISA提供的接口就能夠訪問設備,而經常使用的接口很是簡單,主要就是OPEN、WRITE、READ等幾個命令。符合規範的設備都會公開一份SCPI指令集的文檔,只要仔細閱讀該文檔就能夠實現設備的控制。在整個項目過程當中,我僅僅經過幾個官方網站下載的文檔就完成項目開發,幾乎沒有什麼障礙,在此不得不感慨咱們的製造業和發達國家相比確實有很大差距,咱們就缺乏這樣標準性的東西,什麼事情都得從底層作起,很不科學。要是那些巨頭們肯作一些這方面的工做就太好了,比作什麼買菜、賣魚的APP有意義得多了。瀏覽器

 

2、鏈接

示波器經過網絡接口和PC進行鏈接網絡

  

 配置示波器IP和PC在同一個網段,例如:192.168.11.11,在設置時注意IP內不要有0,而後在PC上先ping一下,看可否ping通。ide

 

 若是能ping通就在瀏覽器輸入http://192.168.11.11看可否打開示波器主頁,確認SCPI指令能夠運行。網站

 

    

3、安裝驅動

運行NI-VISA Runtime安裝程序,選中運行時基礎包和.NET支持包。 ui

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

安裝完成後造成兩個包:Ivi.Visa和NationalInstruments.Visaspa

其中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

 

4、引用

新建VS工程,按上述地址添加Ivi.Visa和NationalInstruments.Visa兩個引用。Ivi.Visa的庫根據須要能夠選32位或64位。

程序運行須要在目標機器安裝運行時,因此引用的庫不須要複製到項目文件夾。

    

5、代碼

 已經有網友把VISA接口得調用進行了封裝,我直接使用了相關代碼,幾乎一字未改,相關代碼請查閱:https://www.cnblogs.com/cncc/p/7866899.html

鏈接代碼:

            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("鏈接成功!");
View Code

寫指令一共有兩種,一種不須要返回數據、一種須要返回數據,下發了須要返回數據的指令後才能進行讀取指令,不然就會讀取失敗。

讀寫指令以下:

        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}]");
            }
        }
View Code

核心代碼就這麼多,剩下的就根據須要查詢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
View Code

 

相關文檔、代碼下載:https://gitee.com/seabluescn/tksamples.git

相關文章
相關標籤/搜索