[經驗棧]C#與泰克示波器(Tektronix oscilloscope)MSO64通信操作

来源:https://www.cnblogs.com/mjoin/archive/2020/06/23/13183123.html
-Advertisement-
Play Games

1、前言 此次需要用到工具操作示波器動態配置和檢驗數據,下麵為此次開發的一些總結記錄。按理說這裡應該用泰克(tektronix)提供的示波器(oscilloscope)驅動和API,但是我沒有找到泰克提供的.NET版本的API,我又不是特別熟悉C封裝到C#的開發,所以乾脆使用了NI-VISA .NE ...


1、前言

此次需要用到工具操作示波器動態配置和檢驗數據,下麵為此次開發的一些總結記錄。按理說這裡應該用泰克(tektronix)提供的示波器(oscilloscope)驅動和API,但是我沒有找到泰克提供的.NET版本的API,我又不是特別熟悉C封裝到C#的開發,所以乾脆使用了NI-VISA .NET,可能是沒有使用到特殊驅動部分,使用並沒有出現異常。

2、安裝環境

1、NI-VISA

3、C#代碼

using System;
using System.Collections.Generic;
using Ivi.Visa;
using NationalInstruments.Visa;

namespace VisaInstruments
{
    public class NiVisaInstrumentsAPIs
    {
        private MessageBasedSession mbSession;
        private IVisaAsyncResult asyncHandle = null;

        public void FindResources(string filter)
        {
            using (var rm = new ResourceManager())
            {
                try
                {
                    IEnumerable<string> resources = rm.Find(filter);
                    foreach (string s in resources)
                    {
                        //可以根據ParseResult查詢出硬體類型,如Custom,Gpib,Serial,Usb等
                        //ParseResult parseResult = rm.Parse(s);
                        //HardwareInterfaceType hardwareType = parseResult.InterfaceType;
                    }
                }
                catch (Exception ex)
                {
                   //處理錯誤
                }
            }
        }


        public bool OpenInstrument(string address)
        {
            try
            {
                using (var rmSession = new ResourceManager())
                {
                    mbSession = (MessageBasedSession)rmSession.Open(address);
                    //mbSession.SynchronizeCallbacks = true;使用非同步方法需設SynchronizeCallbacks為true
                    return true;
                }
            }
            catch (Exception exp)
            {
                return false;
            }
        }


        public void Write(string s)
        {
            mbSession.RawIO.Write(ReplaceCommonEscapeSequences(s));
        }
    
        public string Read()
        {
            return InsertCommonEscapeSequences(mbSession.RawIO.ReadString());
        }
    
        public void WriteAsync(string s)
        {
            try
            {
                string textToWrite = ReplaceCommonEscapeSequences(s);
                asyncHandle = mbSession.RawIO.BeginWrite(
                    textToWrite,
                    new VisaAsyncCallback(OnWriteComplete),
                    (object)textToWrite.Length);
            }
            catch (Exception exp)
            {
               
            }
        }
    
        private void OnWriteComplete(IVisaAsyncResult result)
        {
            try
            {
                mbSession.RawIO.EndWrite(result);
                // "Success";
            }
            catch (Exception exp)
            {
                
            }
        }
    
        public void ReadAsync()
        {
            try
            {
                asyncHandle = mbSession.RawIO.BeginRead(
                    1024,
                    new VisaAsyncCallback(OnReadComplete),
                    null);
            }
            catch (Exception exp)
            {
                
            }
        }


        private void OnReadComplete(IVisaAsyncResult result)
        {
            try
            {
                string responseString = mbSession.RawIO.EndReadString(result);
                string info = InsertCommonEscapeSequences(responseString);
            }
            catch (Exception exp)
            {
                
            }
        }
    
        public void AbortRW()
        {
            try
            {
                mbSession.RawIO.AbortAsyncOperation(asyncHandle);
            }
            catch (Exception exp)
            {
               
            }
        }
    
        private string ReplaceCommonEscapeSequences(string s)
        {
            return (s != null) ? s.Replace("\\n", "\n").Replace("\\r", "\r") : s;
        }
    
        private string InsertCommonEscapeSequences(string s)
        {
            return (s != null) ? s.Replace("\n", "\\n").Replace("\r", "\\r") : s;
        }
    
    }

}

4、實體按鈕對應指令

重新設置參數  --- *RST

前面板Autoset按鈕    ----  AUTOSet EXECute

前面板通道1,2,3,4按鈕 --- DISplay:GLObal:CH1:STATE on 

ACQUIRE:STOPAFTER RUNSTOP

前面板Single/Seq按鈕 --- ACQUIRE:STOPAFTER SEQuence

前面板放大鏡按鈕  ---  DISplay:WAVEView1:ZOOM:ZOOM1:STATe ON

前面板Default setup按鈕  --- FACtory

需要先執行此條命令解鎖命令操作旋鈕 HORIZONTAL:DELAY:MODE ON

前面板HORizontal區域position旋鈕 -- HORizontal:DELay:TIME 0.3

前面板HORizontal區域scale旋鈕 HORIZONTAL:MODE:SCALE 0.5e-3

HORIZONTAL:MODE:SCALE?

前面板vertical區域scale旋鈕 CH1:SCAle 100E-2

前面板vertical區域position旋鈕  CH2:POSition -2.0

前面板touch off按鈕 --- TOUCHSCReen:STATe OFF

前面板trigger區域force按鈕 --- TRIGGER FORCE

前面板trigger區域mode按鈕 --- TRIGger:A:MODe {AUTO|NORMal}

前面板A,B旋鈕  --- TRIGger:{A|B|B:RESET}

5、簡單測量參數指令

//設定讀取通道和參數

MEASUREMENT:MEAS1:TYPE AMPLITUDE

MEASUREMENT:MEAS1:SOURCE CH1

//讀取信息

MEASUREMENT:MEAS1:RESUlts:CURRentacq:MEAN?

//刪除測試信息

MEASUREMENT:DELETE "MEAS1"

//截屏

SAVE:IMAGE "C:/Dut12–tests.png"

//可測參數列表

MEASUrement:MEAS<x>:TYPe

{ACCOMMONMODE|ACRMS|AMPlITUDE|AREA|BASE|BITAMPLITUDE|BITHIGH|BITLOW|BURSTWIDTH|COMMONMODE|DATARATE|DCD|DDJ|DDRAOS|DDRAOSPERTCK|DDRAOSPERUI|DDRAUS|DDRAUSPERTCK|DDRAUSPERUI|DDRHOLDDIFF|DDRSETUPDIFF|DDRTCHABS|DDRTCHAVERAGE|DDRTCKAVERAGE|DDRTCLABS|DDRTCLAVERAGE|DDRTERRMN|DDRTERRN|DDRTJITCC|DDRTJITDUTY|DDRTJITPER|DDRTPST|DDRTRPRE|DDRTWPRE|DDRVIXAC|DDRTDQSCK|DELAY|DJ|DJDIRAC|DPMOVERSHOOT|DPMUNDERSHOOT|DPMRIPPLE|DPMTURNOFFTIME|DPMTURNONTIME|EYEHIGH|EYELOW|FALLSLEWRATE|FAHIGH|HEIGHT|HEIGHTBER|HIGHTIME|HOLD|JITTERSUMMARY|J2|J9|LOW|LOWTIME|MAXIMUM|MEAN|MINIMUM|NDUtY|NPERIOD|NPJ|NOVERSHOOT|NWIDTH|PDUTTY|PERIOD|PHASE|PHASENOISE|PJ|PK2Pk|POVERSHOOT|PWIDTH|QFACTOR|RISESLEWRATE|RISETIME|RJ|RJDIRAC|RMS|SRJ|SSCFREQDEV|SSCMODRATE|SETUP|SKEW|TIE|TIMEOUTSIDELEVEL|TJBER|TNTRATIO|TOP|UNITINTERVAL|VDIFFXOVR|WIDTH|WIDTHBER|}

6、簡單的GPIO測試用例

//設置垂直刻度為300mv

CH1:SCAle 300E-3 

//位置為-3div

CH1:POSition -3.0 

//耦合為DC

CH1:COUPLING DC 

//設置水平刻度為20ms

HORIZONTAL:MODE:SCALE 20e-3

//打開采集

ACQUIRE:STATE ON

//測量最大電壓

MEASUREMENT:MEAS1:TYPE MAXIMUM

MEASUREMENT:MEAS1:SOURCE CH1

//測量最小電壓

MEASUREMENT:MEAS2:TYPE MINIMUM

MEASUREMENT:MEAS2:SOURCE CH1

//測量高值

MEASUREMENT:MEAS3:TYPE TOP

MEASUREMENT:MEAS3:SOURCE CH1

//測量低值

MEASUREMENT:MEAS4:TYPE BASE

MEASUREMENT:MEAS4:SOURCE CH1

//停止採集

ACQUIRE:STATE OFF

//設置標簽

CH1:LABEL:NAME "GPIO1HIGH"

//截屏

SAVE:IMAGE "G:/GPIO1HIGH.png"

參考資料

4, 5, 6 Series MSO (MSO44, MSO46, MSO54, MSO56, MSO58, MSO58LP, MSO64, LPD64) Programmer Manual

TEKVISA Connectivity Software - V4.2.0


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用好數據映射,MongoDB via Dotnet Core開發變會成一件超級快樂的事。 一、前言 MongoDB這幾年已經成為NoSQL的頭部資料庫。 由於MongoDB free schema的特性,使得它在互聯網應用方面優於常規資料庫,成為了相當一部分大廠的主數據選擇;而它的快速佈署和開發簡單 ...
  • // A delegate type for hooking up change notifications. public delegate void ProgressChangingEventHandler(object sender, string e); /// <summary> /// ...
  • 概念介紹: 單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。 鏈表中的數據是以結點來表示的,每個結點的構成:元素(數據元素的映象) + 指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據 由圖可知: 鏈表在進行添加/刪除時,只需要 ...
  • .NET 人臉識別庫 ViewFaceCore 這是基於 SeetaFace6 人臉識別開發的 .NET 平臺下的人臉識別庫這是一個使用超簡單的人臉識別庫這是一個基於 .NET Standard 2.0 開發的庫這個庫已經發佈到 NuGet ,你可以一鍵集成到你的項目此項目可以免費商業使用 ⭐、開源 ...
  • 0. 前言 通過前兩篇我們實現瞭如何在Service層如何訪問數據,以及如何運用簡單的加密演算法對數據加密。這一篇我們將探索如何實現asp.net core的身份驗證。 1. 身份驗證 asp.net core的身份驗證有 JwtBearer和Cookie兩種常見的模式,在這一篇我們將啟用Cookie ...
  • 當我們使用DB First時,設計好的資料庫,我們怎麼生成一些實體類、通用的代碼、控制器、服務層、Dto呢。今天我來給大家介紹一下FreeSql項目中的一些工具。當然,不使用此ORM的小伙伴也能使用此工具,因為他是通用。 ...
  • 新建Web API工程 選Empty,勾選Web API,不要選擇Web API,那樣會把MVC勾上,這裡不需要MVC Web API工程屬性 XML文件用於生成線上文檔 新建Windows服務作為Web API的宿主 WebApiHost工程屬性 控制台應用程式方便調試 Windows服務安裝Mi ...
  • 針對火車頭7.6爬取https網站報錯System.Net.HttpWebRequest問題的處理方案 1.先看看火車頭7.6爬取https網站時出現的報錯情況 System.Net.HttpWebRequest 2.廢話不多說,先看看解決方案的效果,可以看到已經沒有報錯了,而且標題也採集到了(其它 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...