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