一、概述
本文描述采用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位,
程式運行需要在目標機器安裝運行時,所以參考的庫不需要復制到專案檔案夾,

五、代碼
已經有網友把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~127View Code
相關檔案、代碼下載:https://gitee.com/seabluescn/tksamples.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/260235.html
標籤:C#
上一篇:i7究竟能不能運行vs2013
