С подобными задачами сталкиваешься редко, однако если это происходит, очень приятно прочитать исчерпывающую статью, которая поможет быстро начать продуктивную работу, а не ломать целый день голову вопросами «Что скачать?», «Где найти?», «Как это вообще работает?». У меня подобная задача возникла в рамках разработки автоматизированного стенда для тестирования плат. В процессе ее решения возник ряд проблем, а информации в интернете по этому поводу достаточно мало ввиду узости проблемы. Данная статья максимально подробно и емко описывает основные моменты для быстрого начала работы с осциллографами Tektronix из Visual Studio.

Во-первых нужно скачать и установить драйвер TekVISA (нужно будет пройти регистрацию, иначе вы не сможете скачать необходимые драйвера).

После установки драйвера TekVISA нужно зайти в директорию C:\Windows\assembly, именно там будет лежать необходимая для работы библиотека TekVISANet.dll. Далее добавляем библиотеку в проект (Project > Add Reference… > Browse...) и… все!

И казалось бы, что все так просто! Однако, была потрачена половина рабочего дня, для того чтобы понять, куда была сохранена эта чудо библиотека. Ведь следуя голосу разума, ты ожидаешь найти ее в совсем других директориях, например, C:\Program Files (x86)\IVI Foundation или C:\Program Files (x86)\Tektronix.

Взаимодействовать с осциллографом максимально просто. Например, следующий кусочек кода позволяет подключиться к устройству и прочитать его идентификационные данные:

using System;
using System.Collections;
using TekVISANet;

namespace TekVISAExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string response;
            ArrayList resources = new ArrayList();
            VISA tekVISA = new VISA();

            tekVISA.FindResources("?*", out resources);
            Console.WriteLine("RESOURCES:");
            foreach (string s in resources)
                Console.WriteLine(s);

            tekVISA.Open(resources[0].ToString());
            tekVISA.Write("*IDN?");
            bool status = tekVISA.Read(out response);
            if (status)
                Console.WriteLine("IDN (device information): {0}", response);

            Console.ReadKey();
        }
    }
}

OUTPUT:
RESOURCES:
USB0::0x0699::0x0376::C011053::INSTR
ASRL7::INSTR
ASRL8::INSTR
IDN (device information):
TEKTRONIX,MSO2012,C011053,CF:91.1CT FV:v1.52 DPO2COMP:V1.00

Для общения с устройством нужно использовать SCPI (Standard Commands for Programmable Instruments) команды. Ознакомиться с ними можно здесь: sdphca.ucsd.edu/Lab_Equip_Manuals/SCPI-99.pdf. Однако все приборы обладают разными настройками и функциональностью, таким образом, нужно найти набор SCPI команд, применимых именно к Вашему конкретному устройству. Как правило, их можно найти в Programmer Manual устройства.

Также можно скачать OpenChoice Desktop free application для осциллографов Tektronix. После скачивания и установки, нужно подключить прибор к компьютеру (USB), запустить приложение, перейти на вкладку Get & Send Settings и нажать кнопку Get Settings. На экране появятся все доступные команды для настройки устройства с их текущими параметрами.

Пример 1. Измерение значения RMS со второго канала:

using System;
using System.Collections;
using TekVISANet;

namespace TekVISAExample
{
    class Program
    {
        private const string OSCILLOSCOPE = "USB0::0x0699::0x0376::C011053::INSTR";

        static void Main(string[] args)
        {
            VISA tekVISA = new VISA();

            ArrayList resources = new ArrayList();
            tekVISA.FindResources("?*", out resources);

            bool opened = false;
            if (resources.Contains(OSCILLOSCOPE))
                opened = tekVISA.Open(OSCILLOSCOPE);

            if (opened)
            {
                ///настраиваем канал 2
                tekVISA.Write("CH2:COUPLING AC");
                tekVISA.Write("CH2:SCALE 20.000E-3");
                tekVISA.Write("CH2:BANDWIDTH 20.000E+6");
                ///что мы хотим измерять?
                tekVISA.Write("MEASUREMENT:MEAS1:TYPE RMS");
                tekVISA.Write("MEASUREMENT:MEAS1:SOURCE1 CH2");
                tekVISA.Write("MEASUREMENT:MEAS1:STATE ON");
                ///запрос на чтение значения RMS
                tekVISA.Write("MEASUREMENT:MEAS1:VALUE?");
                string response = "";
                ///чтение данных
                tekVISA.Read(out response);
                Console.WriteLine("RMS CH2 VALUE: {0}", response);
            }

            Console.ReadKey();
        }
    }

Пример 2. Получение формы сигнала в виде точек, сохраненных в .csv файл для дальнейшего использования:

using System;
using System.Linq;
using System.Collections;
using System.Globalization;
using TekVISANet;
using System.Threading;

namespace TekVISAExample
{
    class Program
    {
        private const string OSCILLOSCOPE = "USB::0x0699::0x0376::C011053::INSTR";

        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");

            VISA tekVISA = new VISA();

            ArrayList resources = new ArrayList();
            tekVISA.FindResources("?*", out resources);

            bool opened = false;
            if (resources.Contains(OSCILLOSCOPE))
                opened = tekVISA.Open(OSCILLOSCOPE);

            if (opened)
            {
                NumberStyles styles = NumberStyles.AllowExponent | NumberStyles.Number;
                string response = "";
                
                tekVISA.Write("DATA:SOU CH2");
                tekVISA.Write("DATA:WIDTH 1");
                tekVISA.Write("DATA:ENC ASCII");
                tekVISA.Write("DATA:STOP 5208");

                tekVISA.Query("WFMPRE:YMULT?", out response);
                response = response.Replace(":WFMPRE:YMULT ", "");
                float ymult = float.Parse(response, styles);

                tekVISA.Query("WFMPRE:YZERO?", out response);
                response = response.Replace(":WFMPRE:YZERO ", "");
                float yzero = float.Parse(response, styles);

                tekVISA.Query("WFMPRE:YOFF?", out response);
                response = response.Replace(":WFMPRE:YOFF ", "");
                float yoff = float.Parse(response, styles);

                tekVISA.Query("WFMPRE:XINCR?", out response);
                response = response.Replace(":WFMPRE:XINCR ", "");
                float xincr = float.Parse(response, styles);

                tekVISA.Write("CURVE?");             
                tekVISA.Read(out response);

                response = response.Replace(":CURVE ", "");
                sbyte[] rawwave = response.Split(',').Select(n => Convert.ToSByte(n)).ToArray();

                float[] wave = new float[rawwave.Count()];
                for (int j = 0; j < rawwave.Count(); j++)
                    wave[j] = (rawwave[j] - yoff) * ymult + yzero;

                System.IO.StreamWriter file = new System.IO.StreamWriter("waveform.csv");
                file.WriteLine("V,S");
                for (int j = 0; j < wave.Count(); j++)
                {
                    float timepoint = j * xincr;
                    file.WriteLine(wave[j].ToString() + "," + timepoint.ToString());
                }
                file.Close();

                tekVISA.Close();
            }

            Console.ReadKey();
        }
    }
}

Комментарии (1)


  1. leremin
    25.11.2015 12:30

    Что-то команды очень похожи на команды источников тока GW Instek PSH-*. А вообще статья ни о чем: нужен Programmer Manual, а все остальное — дело техники.