Здесь приведены примеры программ для Microsoft Visual Studio на языках Visual C#, Visual C++, Visual Basic, а также в средах MATLAB и LabVIEW.
[Пример программирования на C#]
Здесь приведен код простейшей консольной утилиты visa.exe, написанной на C# в среде Microsoft Visual Studio 2010 на основе API библиотек .NET Ivi.Visa и NationalInstruments.Visa.
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingIvi.Visa;
usingNationalInstruments.Visa;
namespacevisa
{
classProgram
{
static MessageBasedSession mbSession;
staticstring rn; //Resource Name (идентификатор прибора)staticstring writestr; //строка для отправки команды (опции -w:, -q:)staticstring readstr; //строка для приема ответа (опции -r, -q:)staticbool write, read, query;
staticbool showhelp = false;
staticvoidShowVisaResources()
{
Console.WriteLine("Список ресурсов VISA:");
var rmSession = new ResourceManager();
//foreach (string s in rmSession.Find("USB?*INSTR"))foreach (string s in rmSession.Find("(ASRL|GPIB|TCPIP|USB)?*INSTR"))
{
Console.WriteLine(s);
}
rmSession.Dispose();
}
staticvoidUsage()
{
Console.WriteLine("Утилита для управления ресурсами инструментов. Использование:");
Console.WriteLine("visa.exe -?");
Console.WriteLine(" подсказка по командной строке");
Console.WriteLine("visa.exe");
Console.WriteLine(" вывод списка имен ресурсов VISA");
Console.WriteLine("visa.exe < -i:ID> < -w:command>");
Console.WriteLine(" отправка команды в ресурс инструмента по ID");
Console.WriteLine("visa.exe < -i:ID> < -r>");
Console.WriteLine(" получение ответа от ресурса инструмента по ID");
Console.WriteLine("visa.exe < -i:ID> < -q:query>");
Console.WriteLine(" отправка запроса и получение от ресурса инструмента по ID");
}
Полностью проект для Visual Studio 2010 можно скачать по ссылке [6]. Другие рабочие примеры программ на C# можно найти в пакете NI-VISA, см. папку "C:\Users\Public\Documents\National Instruments\NI-VISA\Examples\.NET" (Пользователи -> Общие -> Общие документы -> National Instruments -> NI-VISA -> Examples -> .NET -> 17.0).
Использование утилиты. Выдача списка доступных в системе ресурсов VISA:
>visa.exe
Список ресурсов VISA:
USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR
ASRL1::INSTR
ASRL2::INSTR
ASRL8::INSTR
ASRL10::INSTR
Для выдачи подсказки используйте visa.exe -?
Выдача подсказки по командной строке:
>visa.exe -?
Утилита для управления ресурсами инструментов. Использование:
visa.exe -?
подсказка по командной строке
visa.exe
вывод списка имен ресурсов VISA
visa.exe < -i:ID> < -w:command>
отправка команды в ресурс инструмента по ID
visa.exe < -i:ID> < -r>
получение ответа от ресурса инструмента по ID
visa.exe < -i:ID> < -q:query>
отправка запроса и получение от ресурса инструмента по ID
Установка состояния выхода (отключено, нагрузка, выход в состоянии высокого сопротивления). Обратите внимание, что значения опций, в которых есть пробел, нужно указывать в двойных кавычках:
Когда в наличии имеется старый парк компьютеров с Windows XP, от которых по разным причинам никак нельзя избавиться (по разным причинам, обычно из-за старого, давно написанного ПО), то в полный рост встает проблема: как написать программу C# для использования NI-VISA, чтобы она одинаково хорошо работала как на Windows XP SP3, так и на Windows 7, Windows 8 и других новых операционных системах линейки Windows? И конечно же, желательно, чтобы программа нормально работала как на 32-битной версии, так и на 64 битной версии.
Ниже приведено несколько простых советов, которые позволят решить эту проблему.
1. Всегда компилируйте приложение C# на 32-битную платформу. Тогда она будет нормально работать как на 32-битной версии Windows, так и на 64-битной.
2. Установите на рабочей станции, где Вы разрабатываете приложение, NI-VISA версии 15.5. Это последняя самая свежая версия, где поддерживается Windows XP.
3. Для того, чтобы работал пример кода C#, который показан выше, совсем не обязательно устанавливать на целевой клиентской системе Windows пакет NI-VISA. Достаточно в каталог программы (где находится exe-файл приложения) скопировать два DLL-файла: Ivi.Visa.dll и NationalInstruments.Visa.dll с компьютера, на котором разрабатывалось приложение.
[Пример программирования на VC++]
Рабочее окружение Windows 7 32-bit, Visual Studio, установлен пакет NI-VISA. В этом примере используется NI-VISA для управления прибором (запись и чтение) через подключение USBTMC. Процесс по шагам:
1. Запустите Visual Studio, создайте новый проект VC++ win32 console.
2. Настройте проект на использование библиотеки NI-VISA, что можно сделать двумя способами - статически (static) или динамически (automatic, через DLL):
2.1. Вариант Static: найдите файлы visa.h, visatype.h, visa32.lib в каталоге установки NI-VISA (обычно они находятся в подкаталогах папки %VXIPNPPATH%\WinNT\Include или %VXIPNPPATH64%\WinNT\Include, в зависимости от версии используемых библиотек - 32-битной или 64-битной). Скопируйте их в каталог своего проекта, и добавьте в проект. В файле имяпроекта.cpp добавьте следующие 2 строки:
#include "visa.h"
#pragma comment(lib,"visa32.lib")
2.2. Вариант Automatic: настройте путь поиска заголовочных файлов (*.h) на каталог установки NI-VISA своего компьютера. Обычно это каталог наподобие %VXIPNPPATH%\WinNT\Include или %VXIPNPPATH64%\WinNT\Include. Установите этот путь в настройках проекта: Project -> Properties -> C/C++ -> General -> Additional Include Directories.
Различие между этими вариантами только в том, что вариант 2.1 жестко вставляет код библиотек в тело исполняемого файла *.exe, а вариант 2.2 - подгружает код из DLL. Недостаток варианта 2.1 - размер генерируемого при компиляции кода увеличивается, но зато программа будет работать на другом компьютере, где не установлен пакет NI-VISA. Вариант 2.2 использует функции NI-VISA, загружаемые динамически из файлов *.dll. Это уменьшает размер файла *.exe приложения, но оно будет работать только на том компьютере, где установлен пакет NI-VISA. Альтернативно для варианта 2.2 можно создать инсталлятор, который будет поставлять вместе с приложением все необходимые dll-файлы зависимостей, но тогда вариант 2.2 уже будет по размеру даже больше, чем вариант 2.1. Короче говоря, выбор не очень-то и критичен, все больше зависит от предпочтений программиста.
Примечание: %VXIPNPPATH% и %VXIPNPPATH64% это переменные окружения, которые автоматически устанавливаются инсталлятором NI-VISA для указания на каталог установки библиотек NI-VISA.
3. Настройте путь до файлов *.lib. Обычно это каталог наподобие %VXIPNPPATH%\WinNT\lib\msc или %VXIPNPPATH64%\WinNT\Win64\Lib_x64\msc, в зависимости от версии используемых библиотек - 32-битной или 64-битной. Путь до используемых файлов библиотек настраивается в свойствах проекта: Project -> Properties -> Linker -> General -> Additional Library Directories.
Примечание: если Вы сомневаетесь, какую версию библиотеки использовать, смело выбирайте 32-битную версию, потому что это должно корректно работать как на 32-битной операционной системе Windows, так и на 64-битной.
4. Настройте командную строку линкера в свойствах проекта на использование visa32.lib: Project -> Properties -> Linker -> Command Line -> Additional Options.
5.1. Напишите тест-функцию, которая будет использовать вызовы библиотеки NI-VISA. Этот пример использует локальные подключения (USB, COM-порты):
intUsbtmc_test()
{
/* Этот код демонстрирует асинхронную отправку команд чтения и записи *//* в класс USBTMC (USB Test & Measurement Class) инструмента с помощью *//* библиотеки NI-VISA. *//* Пример записывает строку команды "*IDN?\n" во все устройства USBTMC, *//* подключенные к системе, и пытается прочитать ответ. *//* Здесь используется следующая последовательность действий: *//* Открытие Resource Manager *//* Открытие VISA Session к инструменту *//* Запись запроса идентификации (Identification Query) функцией viPrintf *//* Попытка чтения ответа функцией viScanf *//* Закрытие VISA Session */
ViSession defaultRM;
ViSession instr;
ViUInt32 numInstrs;
ViFindList findList;
ViUInt32 retCount;
ViUInt32 writeCount;
ViStatus status;
char instrResourceString[VI_FIND_BUFLEN];
unsignedchar buffer[100];
char stringinput[512];
int i;
/* Сначала мы должны вызвать viOpenDefaultRM, чтобы получить handle
для Resource Manager. Этот handle будет сохранен в переменную defaultRM. */
status=viOpenDefaultRM (&defaultRM);
if (status < VI_SUCCESS)
{
printf ("Could not open a session to the VISA Resource Manager!\n");
return status;
}
/* Найдем все ресурсы USB TMC VISA в нашей системе, и сохраним количество
этих ресурсов в переменную numInstrs. */
status = viFindRsrc (defaultRM, "USB?*INSTR", &findList, &numInstrs, instrResourceString);
if (status < VI_SUCCESS)
{
printf ("An error occurred while finding resources.\nHit enter to continue.");
fflush(stdin);
getchar();
viClose (defaultRM);
return status;
}
/* Теперь откроем сессии VISA ко всем инструментам USB TMC. Мы будем
использовать handle из viOpenDefaultRM, и мы также должны использовать
строку, которая будет идентифицировать открываемый инструмент. Эта строка
называется дескриптором инструмента (instrument descriptor). Её формат
можно найти в панели функций правым кликом мыши на параметре дескриптора.
После открытия сессии к устройству мы получим хендл к инструменту,
который будем использовать позже в функциях VISA. Параметры AccessMode
и Timeout в этой функции зарезервированы для использования в будущем.
Этим двум параметрам сейчас дается значение VI_NULL. */for (i=0; i < numInstrs; i++)
{
if (i >0)
viFindNext (findList, instrResourceString);
status = viOpen (defaultRM, instrResourceString, VI_NULL, VI_NULL, &instr);
if (status < VI_SUCCESS)
{
printf ("Cannot open a session to the device %d.\n", i+1);
continue;
}
/* В этой точке у нас есть открытая сессия к инструменту USB TMC.
Будем использовать функцию viPrintf для отправки строки "*IDN?\n",
запрашивая этой командой идентификацию устройства. */char* cmmand ="*IDN?\n";
status = viPrintf (instr, cmmand);
if (status < VI_SUCCESS)
{
printf ("Error writing to the device %d.\n", i+1);
status = viClose (instr);
continue;
}
/* Теперь мы попытаемся прочитать обратно ответ от устройства, которое
оно должно отправить на запрос идентификации. Для получения данных
ответа мы будем использовать функцию viScanf. После того, как данные
ответа прочитаны, они будут отображены. */
status = viScanf(instr, "%t", buffer);
if (status < VI_SUCCESS)
printf ("Error reading a response from the device %d.\n", i+1);
else
printf ("\nDevice %d: %s\n", i+1 , buffer);
status = viClose (instr);
}
/* Закроем сессию инструмента, используя функцию viClose. Эта операция
освободит все системные ресурсы, занятые предыдущими вызовами API NI-VISA. */
status = viClose (defaultRM);
system("pause"); // пауза, чтобы можно было успеть прочитать сообщение консолиreturn0;
}
5.2. Этот пример использует для подключения протокол TCP/IP:
/* Сначала нам нужно открыть менеджер ресурсов по умолчанию. */
status = viOpenDefaultRM (&defaultRM);
if (status < VI_SUCCESS)
{
printf("Could not open a session to the VISA Resource Manager!\n");
}
/* Теперь откроем сессию к TCP/IP-устройству */char head[256] ="TCPIP0::";
char tail[] ="::INSTR";
char resource [256];
strcat(head,pIP);
strcat(head,tail);
status = viOpen (defaultRM, head, VI_LOAD_CONFIG, VI_NULL, &instr);
if (status < VI_SUCCESS)
{
printf ("An error occurred opening the session\n");
viClose(defaultRM);
}
status = viPrintf(instr, "*idn?\n");
status = viScanf(instr, "%t", outputBuffer);
if (status < VI_SUCCESS)
{
printf("viRead failed with error code: %x \n",status);
viClose(defaultRM);
}
else
printf ("\ndata read from device: %*s\n", 0,outputBuffer);
status = viClose (instr);
status = viClose (defaultRM);
system("pause");
return0;
}
[Пример программирования на VB]
Рабочее окружение: Windows 7 32-bit, Microsoft Visual Basic 6.0. В этом примере демонстрируется использование NI-VISA для управления устройством через USBTMC и TCP/IP, выполняется запись и чтение.
1. Откройте Visual Basic, создайте стандартный проект приложения (Standard EXE).
2. Установите настройки окружения проекта на использование библиотеки NI-VISA. Добавьте новый модуль, для этого кликните закладке Existing при добавлении модуля (Project -> Add Existing Item). Найдите файл visa32.bas в папке include, находящейся в каталоге инсталляции NI-VISA, и добавьте его в проект.
Это позволит использовать в программе функции и типы данных VISA.
3.1. Пример доступа через USBTMC. Напишите следующую функцию:
PrivateFunctionUsbtmc_test() AsLong' Этот код демонстрирует синхронную отправку команд чтения и записи' к класс инструмента тестирования и измерения (USB Test & Measurement' Class, USBTMC) с использованием NI-VISA.' Пример записывает строку "*IDN?\n" во все устройства USBTMC,' подключенные к системе, и пытается прочитать от них ответ функциями' записи и чтения. Основной алгоритм работы приложения:' The general flow of the code is' - Open Resource Manager' - Open VISA Session к Instrument-у' - Write запрос Identification Query с помощью функции viWrite' - Попытка Read ответа (Response) функцией viRead' Close the VISA SessionConst MAX_CNT =200Dim defaultRM AsLongDim instrsesn AsLongDim numlnstrs AsLongDim findList AsLongDim retCount AsLongDim writeCount AsLongDim status AsLongDim instrResourceString AsString* VI_FIND_BUFLEN
Dim Buffer AsString* MAX_CNT
Dim i AsInteger
' Сначала мы должны вызвать viOpenDefaultRM, чтобы получить хендл Менеджера.' Этот хендл мы сохраним в переменную defaultRM.
status = viOpenDefaultRM(defaultRM)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Could not open a session to the VISA Resource Manager!"
Usbtmc_test = status
ExitFunctionEndIf' Найдем все ресурсы USB TMC VISA в нашей системе, и сохраним их количество' в переменной numInstrs.
status = viFindRsrc(defaultRM, "USB?*INSTR", findList, numlnstrs, instrResourceString)
If (status < VI_SUCCESS) Then
resultTxt.Text ="An error occurred while finding resources."
viClose (defaultRM)
Usbtmc_test = status
ExitFunctionEndIf
' Теперь мы откроем сессию VISA ко всем инструментам USB TMC.' Мы должны при этом использовать хендл из переменной viOpenDefaultRM,' и также должны использовать строку, которая показывает, какой' инструмент нужно открыть. Эта строка называется описателем' инструмента (instrument descriptor). Формат этой строки можно найти' на функциональной панели путем правого клика на параметр дескриптора.' После открытия сессии к устройству мы получим хендл к инструменту,' который будем использовать позже в вызовах функций VISA. Параметры' AccessMode и Timeout функции viOpen зарезервированы для будущего' использования, и поэтому должны получать значения VI_NULL.For i =0To numInstrs
If (i >0) Then
status = viFindNext(findList, instrResourceString)
EndIf
status = viOpen(defaultRM, instrResourceString, VI_NULL, VI_NULL, instrsesn)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Cannot open a session to the device "+CStr(i +1)
GoTo NextFind
EndIf' В этой точке у нас есть открытая сессия к инструменту USB TMC.' Мы будем использовать функцию viWrite для отправки в устройство' строки "*IDN?". Это команда, которая запрашивает идентификацию' у устройства.
status = viWrite(instrsesn, "*IDN?", 5, retCount)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Error writing to the device."
status = viClose(instrsesn)
GoTo NextFind
EndIf' Теперь мы попытаемся прочитать обратно данные от устройства, которые' оно отправит в ответ на запрос идентификации. Для этой цели будем' использовать функцию viRead. После того, как данные прочитаны, они' будут отображены.
status = viRead(instrsesn, Buffer, MAX_CNT, retCount)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Error reading a response from the device."+CStr(i +1)
Else
resultTxt.Text ="Read from device: "+CStr(i +1) +" "+ Buffer
EndIf' Закроем сессию к инструменту с помощью функции viClose.
status = viClose(instrsesn)
NextFind:
Next i
' Теперь мы закроем сессию к Менеджеру с помощью функции viClose.' Эта операция освободит все системные ресурсы.
status = viClose(defaultRM)
Usbtmc_test =0
EndFunction
3.2. Пример функции доступа через TCP/IP:
PrivateFunctionTCP_IP_Test(ip AsString) AsLongDim outputBuffer AsString* VI_FIND_BUFLEN
Dim defaultRM AsLongDim instrsesn AsLongDim status AsLongDim count AsLong
' Сначала нам нужно открыть Менеджер Ресурсов по умолчанию.
status = viOpenDefaultRM(defaultRM)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Could not open a session to the VISA Resource Manager!"
TCP_IP_Test = status
ExitFunctionEndIf
' Теперь откроем сессию к TCP/IP-устройству.
status = viOpen(defaultRM, "TCPIP0::"+ ip +"::INSTR", VI_LOAD_CONFIG, VI_NULL, instrsesn)
If (status < VI_SUCCESS) Then
resultTxt.Text ="An error occurred opening the session"
viClose (defaultRM)
TCP_IP_Test = status
ExitFunctionEndIf
status = viWrite(instrsesn, "*IDN?", 5, count)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Error writing to the device."EndIf
status = viRead(instrsesn, outputBuffer, VI_FIND_BUFLEN, count)
If (status < VI_SUCCESS) Then
resultTxt.Text ="Error reading a response from the device."+CStr(i +1)
Else
resultTxt.Text ="read from device:"+ outputBuffer
EndIf
status = viClose(instrsesn)
status = viClose(defaultRM)
TCP_IP_Test =0
EndFunction
3.3. Дополнительные функции управления (обработчики кнопок и подпрограмма выхода):
PrivateSubexitBtn_Click()
End
EndSub
PrivateSubtcpipBtn_Click()
Dim stat AsLong
stat = TCP_IP_Test(ipTxt.Text)
If (stat < VI_SUCCESS) Then
resultTxt.Text = Hex(stat)
EndIf
EndSub
PrivateSubusbBtn_Click()
Dim stat AsLong
stat = Usbtmc_test
If (stat < VI_SUCCESS) Then
resultTxt.Text = Hex(stat)
EndIf
EndSub
Примерно так будет выглядеть окно работающей программы:
[Пример MATLAB]
Рабочее окружение: Windows 7 32-bit, MATLAB R2010b. Демонстрируется запись и чтение через USBTMC и TCP/IP, как в предыдущем примере.
1. Откройте MATLAB, измените текущую директорию. В этом демонстрационном примере текущая директория была установлена на D:\USBTMC_TCPIP_Demo.
2. Выберите File -> New -> Script для создания пустого M-файла.
3.1. Добавьте в созданный файл код доступа через USB:
functionUSBTMC_test()
% Этот код демонстрирует синхронную отправку команд чтения и записи% в USB Test & Measurement Class (USBTMC) инструмента, используя NI-VISA.% Создайте VISA-USB, подключенный к USB-инструменту.
vu = visa('ni','USB0::0xF4EC::0xEE38::0123456789::INSTR');
% Запрос данных от устройства.
outputbuffer = fscanf(vu);
disp(outputbuffer);
% Закрытие объекта VISA.
fclose(vu);
delete(vu);
clear vu;
end
3.2. Код доступа через TCP/IP:
functionTCP_IP_test( IPstr )
% Демонстрация синхронной отправки команд чтения и записи% к TCP/IP-инструменту с помощью NI-VISA.% Создание объекта VISA-TCPIP, подключенный к инструменту через% сконфигурированный IP-адрес.
vt = visa('ni',['TCPIP0::',IPstr,'::INSTR']);
% Получение данных от устройства.
outputbuffer = fscanf(vt);
disp(outputbuffer);
%Закрытие объекта VISA.
fclose(vt);
delete(vt);
clear vt;
end
[Пример LabVIEW]
Рабочее окружение: Windows 7 32-bit, LabVIEW 2011. Пример демонстрирует использование NI-VISA для доступа к устройству на запись и чтение через USBTMC и TCP/IP.
1. Откройте LabVIEW, создайте VI-файл.
2. Добавьте элементы управления. Выполните правый клик в интерфейсе Front Panel, выберите и добавьте VISA resource name, error in, error out и несколько индикаторов из столбца органов управления (Controls).
3. Откройте интерфейс Block Diagram. Выполните правый клик на имени ресурса VISA, и Вы сможете выбрать и добавить следующие функции VISA Palette из всплывающего меню: VISA Write, VISA Read, VISA Open и VISA Close.
4. Подключите части схемы друг к другу, как показано на рисунке ниже.
5. Выберите ресурс устройства в диалоге VISA Resource Name, и запустите программу.
В этом примере VI (виртуальный инструмент LabVIEW) откроет сессию VISA к устройству USBTMC, запишет команду в устройство, и прочитает обратно ответ. Отправляемая команда настраивается через запрос к устройству по его идентификатору (device ID query). Проверьте правильность установки идентификатора и отправляемой команды по руководству прибора (команды генераторов сигналов SDG/АКИП см. в [3]). После завершения всех коммуникаций VI закроет сессию VISA.
6. Обмен с устройством через TCP/IP осуществляется так же, как и через USBTMC. Но для этого нужно поменять функции VISA Write и VISA Read на синхронный ввод/вывод, Synchronous I/O (LabVIEW по умолчанию использует асинхронный ввод/вывод). Выполните правый клик на узле, и выберите Synchronous I/O Mod -> Synchronous из меню, чтобы записывать и читать данные синхронно.
7. Подключите части схемы друг к другу, как показано на рисунке ниже.
8. Введите IP-адрес и запустите программу.
Вы можете получить исходный код этих примеров на сайте siglent.com. Код примеров .NET (C#) скачайте по ссылке [6].
У меня есть задача создать программный продукт, использующий данные сети приборов измерения температуры EX1048A. Данные приборы используют библиотеки написанные под IVI протокол. Если у вас есть опыт программирования приборов измерения температуры EX1048A или подобных, могу предложить поучаствовать в проекте или части, касающейся программирования прибора под нашу программную оболочку и интерфейс.
Вопрос возникает по FindResources. При запуске на Win. XP с Visa 15.5 выдает сообщение See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text ************** System.IO.FileNotFoundException: Could not load file or assembly 'NationalInstruments.Visa, Version=17.0.0.0, Culture=neutral, PublicKeyToken=2eaa5af0834e221d' or one of its dependencies. Не удается найти указанный файл. File name: 'NationalInstruments.Visa, Version=17.0.0.0, Culture=neutral, PublicKeyToken=2eaa5af0834e221d' ...
microsin: вероятно, что не установлена библиотека NI VISA.
Комментарии
При запуске на Win. XP с Visa 15.5 выдает сообщение
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.IO.FileNotFoundExc eption: Could not load file or assembly 'NationalInstrum ents.Visa, Version=17.0.0.0, Culture=neutral, PublicKeyToken=2eaa5af0834e221d' or one of its dependencies. Не удается найти указанный файл.
File name: 'NationalInstrum ents.Visa, Version=17.0.0.0, Culture=neutral, PublicKeyToken=2eaa5af0834e221d'
...
microsin: вероятно, что не установлена библиотека NI VISA.
RSS лента комментариев этой записи