Управление осциллографами Tektronix из Visual Studio

от автора

С подобными задачами сталкиваешься редко, однако если это происходит, очень приятно прочитать исчерпывающую статью, которая поможет быстро начать продуктивную работу, а не ломать целый день голову вопросами «Что скачать?», «Где найти?», «Как это вообще работает?». У меня подобная задача возникла в рамках разработки автоматизированного стенда для тестирования плат. В процессе ее решения возник ряд проблем, а информации в интернете по этому поводу достаточно мало ввиду узости проблемы. Данная статья максимально подробно и емко описывает основные моменты для быстрого начала работы с осциллографами 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();         }     } } 

ссылка на оригинал статьи http://habrahabr.ru/post/271641/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *