Программирование PC NI-VISA: примеры программирования генераторов SDG/АКИП Fri, November 16 2018  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


NI-VISA: примеры программирования генераторов SDG/АКИП Печать
Добавил(а) microsin   

Здесь приведены примеры программ для 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.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ivi.Visa;
using NationalInstruments.Visa;
 
namespace visa
{
   class Program
   {
      static MessageBasedSession mbSession;
      static string rn;           //Resource Name (идентификатор прибора)
      static string writestr;     //строка для отправки команды (опции -w:, -q:)
      static string readstr;      //строка для приема ответа (опции -r, -q:)
      static bool write, read, query;
      static bool showhelp = false;
 
      static void parsecmdline (string[] args)
      {
         if ("-?" == args[0])
            showhelp = true;
         else
         {
            foreach (string s in args)
            {
               if ("-r"==s && 2==s.Length)
               {
                  read = true;
               }
               else if ("-i:" == s.Substring(0, 3))
               {
                  rn = s.Substring(3);
               }
               else if ("-w:" == s.Substring(0, 3))
               {
                  writestr = s.Substring(3);
                  write = true;
               }
               else if ("-q:" == s.Substring(0, 3))
               {
                  writestr = s.Substring(3);
                  query = true;
               }
            }
         }
      }
 
      static void ShowVisaResources()
      {
         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();
      }
 
      static void Usage()
      {
         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");
      }
 
      static string InsertCommonEscapeSequences(string s)
      {
         return s.Replace("\n", "\\n").Replace("\r", "\\r");
      }
 
      static void Main(string[] args)
      {
         // Сброс начальных параметров:
         rn = "";
         writestr = "";
         readstr = "";
         write = false;
         read = false;
         query = false;
         // Опрос командной строки:
         if (0 == args.Length)
         {
            ShowVisaResources();
            Console.WriteLine("Для выдачи подсказки используйте visa.exe -?");
            return;
         }
         else
         {
            parsecmdline(args);
         }
         // Проверка результатов опроса командной строки:
         if (showhelp)
         {
            Usage();
            return;
         }
         if ("" == rn)
         {
            //Не указан идентификатор прибора.
            Console.WriteLine("Нужно указать ID ресурса (опция -i:)");
            return;
         }
         if ((!write && !read && !query)
           ||(write && query)
           ||(read && query))
         {
            //Неправильно (не совместимо) указан набор опций.
            Console.WriteLine("Ошибка выбора операции (опции -w:, -r, -q:)");
            return;
         }
         var rmSession = new ResourceManager();
         if ("" != writestr)
         {
            mbSession = null;
            try
            {
               mbSession = (MessageBasedSession)rmSession.Open(rn);
               mbSession.RawIO.Write(writestr);
            }
            catch (Exception exp)
            {
               Console.WriteLine(exp.Message);
            }
         }
         if (read || query)
         {
            try
            {
               mbSession = (MessageBasedSession)rmSession.Open(rn);
               readstr = InsertCommonEscapeSequences(mbSession.RawIO.ReadString());
               Console.WriteLine(readstr);
            }
            catch (Exception exp)
            {
               Console.WriteLine(exp.Message);
            }
         }
         if (mbSession != null)
            mbSession.Dispose();
         if (rmSession != null)
            rmSession.Dispose();
      }
   }
}

Полностью проект для 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

Получение идентификационной строки от прибора:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -q:*IDN?
*IDN *,AKIP-3408-1,NDG080B2150089,1.08.01.08,02-00-00-04-00\n

Установка состояния выхода (отключено, нагрузка, выход в состоянии высокого сопротивления). Обратите внимание, что значения опций, в которых есть пробел, нужно указывать в двойных кавычках:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -w:"OUTP OFF,LOAD,HZ"

Включение выхода (подача на выход сигнала):

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -w:"OUTP ON"

Установка выходной частоты 8000.001 Гц:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -w:"BSWV FRQ,8000.001"

Установка уровня выходного сигнала от пика до пика в значение 1.44 вольт:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -w:"BSWV AMP,1.44"

Получение информации о сигнале на выходе:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -q:BSWV?
BSWV WVTP,SINE,FRQ,8000HZ,AMP,1.44V,OFST,0V,PHSE,0\n

Получение информации о текущей конфигурации:

>visa.exe -i:USB0::0xF4ED::0xEE3A::NDG080B2150089::INSTR -q:SCFG?
SCFG DEFAULT\n

Когда в наличии имеется старый парк компьютеров с 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.

NI VISA programming cpp setup 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.

NI VISA programming cpp setup Libraries

Примечание: если Вы сомневаетесь, какую версию библиотеки использовать, смело выбирайте 32-битную версию, потому что это должно корректно работать как на 32-битной операционной системе Windows, так и на 64-битной.

4. Настройте командную строку линкера в свойствах проекта на использование visa32.lib: Project -> Properties -> Linker -> Command Line -> Additional Options. 

NI VISA programming cpp setup Linker Additional Options

5.1. Напишите тест-функцию, которая будет использовать вызовы библиотеки NI-VISA. Этот пример использует локальные подключения (USB, COM-порты):

int Usbtmc_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];
   unsigned char 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");  // пауза, чтобы можно было успеть прочитать сообщение консоли
   return 0;
}

5.2. Этот пример использует для подключения протокол TCP/IP:

int TCP_IP_Test(char *pIP)
{
   char outputBuffer[VI_FIND_BUFLEN];
   ViSession defaultRM, instr;
   ViStatus status;
   ViUInt32 count;
   ViUInt16 portNo;
 
   /* Сначала нам нужно открыть менеджер ресурсов по умолчанию. */
   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");
   return 0;
}

[Пример программирования на 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, и добавьте его в проект.

NI VISA programming VB add visa32

Это позволит использовать в программе функции и типы данных VISA.

3.1. Пример доступа через USBTMC. Напишите следующую функцию:

Private Function Usbtmc_test() As Long
   ' Этот код демонстрирует синхронную отправку команд чтения и записи
   ' к класс инструмента тестирования и измерения (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 Session
   Const MAX_CNT = 200
   Dim defaultRM As Long
   Dim instrsesn As Long
   Dim numlnstrs As Long
   Dim findList As Long
   Dim retCount As Long
   Dim writeCount As Long
   Dim status As Long
   Dim instrResourceString As String * VI_FIND_BUFLEN
   Dim Buffer As String * MAX_CNT
   Dim i As Integer
 
   ' Сначала мы должны вызвать 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
      Exit Function
   End If
   
   ' Найдем все ресурсы 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
      Exit Function
   End If
 
   ' Теперь мы откроем сессию VISA ко всем инструментам USB TMC.
   ' Мы должны при этом использовать хендл из переменной viOpenDefaultRM,
   ' и также должны использовать строку, которая показывает, какой
   ' инструмент нужно открыть. Эта строка называется описателем
   ' инструмента (instrument descriptor). Формат этой строки можно найти
   ' на функциональной панели путем правого клика на параметр дескриптора.
   ' После открытия сессии к устройству мы получим хендл к инструменту,
   ' который будем использовать позже в вызовах функций VISA. Параметры
   ' AccessMode и Timeout функции viOpen зарезервированы для будущего
   ' использования, и поэтому должны получать значения VI_NULL.
   For i = 0 To numInstrs
      If (i > 0) Then
         status = viFindNext(findList, instrResourceString)
      End If
      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
      End If
      ' В этой точке у нас есть открытая сессия к инструменту 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
      End If
      ' Теперь мы попытаемся прочитать обратно данные от устройства, которые
      ' оно отправит в ответ на запрос идентификации. Для этой цели будем
      ' использовать функцию 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
      End If
      ' Закроем сессию к инструменту с помощью функции viClose.
      status = viClose(instrsesn)
NextFind:
      Next i
   ' Теперь мы закроем сессию к Менеджеру с помощью функции viClose.
   ' Эта операция освободит все системные ресурсы.
   status = viClose(defaultRM)
   Usbtmc_test = 0
End Function

3.2. Пример функции доступа через TCP/IP:

Private Function TCP_IP_Test(ip As String) As Long
   Dim outputBuffer As String * VI_FIND_BUFLEN
   Dim defaultRM As Long
   Dim instrsesn As Long
   Dim status As Long
   Dim count As Long
 
   ' Сначала нам нужно открыть Менеджер Ресурсов по умолчанию.
   status = viOpenDefaultRM(defaultRM)
   If (status < VI_SUCCESS) Then
      resultTxt.Text = "Could not open a session to the VISA Resource Manager!"
      TCP_IP_Test = status
      Exit Function
   End If
 
   ' Теперь откроем сессию к 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
      Exit Function
   End If
   status = viWrite(instrsesn, "*IDN?", 5, count)
   If (status < VI_SUCCESS) Then
      resultTxt.Text = "Error writing to the device."
   End If
   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
   End If
   status = viClose(instrsesn)
   status = viClose(defaultRM)
   TCP_IP_Test = 0
End Function

3.3. Дополнительные функции управления (обработчики кнопок и подпрограмма выхода):

Private Sub exitBtn_Click()
   End
End Sub
 
Private Sub tcpipBtn_Click()
   Dim stat As Long
   stat = TCP_IP_Test(ipTxt.Text)
   If (stat < VI_SUCCESS) Then
      resultTxt.Text = Hex(stat)
   End If
End Sub
 
Private Sub usbBtn_Click()
   Dim stat As Long
   stat = Usbtmc_test
   If (stat < VI_SUCCESS) Then
      resultTxt.Text = Hex(stat)
   End If
End Sub

Примерно так будет выглядеть окно работающей программы:

NI VISA programming VB app Form

[Пример MATLAB]

Рабочее окружение: Windows 7 32-bit, MATLAB R2010b. Демонстрируется запись и чтение через USBTMC и TCP/IP, как в предыдущем примере.

1. Откройте MATLAB, измените текущую директорию. В этом демонстрационном примере текущая директория была установлена на D:\USBTMC_TCPIP_Demo.

2. Выберите File -> New -> Script для создания пустого M-файла.

3.1. Добавьте в созданный файл код доступа через USB:

function USBTMC_test()
   % Этот код демонстрирует синхронную отправку команд чтения и записи
   % в USB Test & Measurement Class (USBTMC) инструмента, используя NI-VISA.
   % Создайте VISA-USB, подключенный к USB-инструменту.
   vu = visa('ni','USB0::0xF4EC::0xEE38::0123456789::INSTR');
 
   % Откройте созданный объект VISA.
   fopen(vu);
 
   % Отправьте строку "*IDN?", запрашивая идентификацию устройства.
   fprintf(vu,'*IDN?');
 
   % Запрос данных от устройства.
   outputbuffer = fscanf(vu);
   disp(outputbuffer);
 
   % Закрытие объекта VISA.
   fclose(vu);
   delete(vu);
   clear vu;
end

NI VISA programming MATLAB USB

3.2. Код доступа через TCP/IP:

function TCP_IP_test( IPstr )
   % Демонстрация синхронной отправки команд чтения и записи
   % к TCP/IP-инструменту с помощью NI-VISA.
   % Создание объекта VISA-TCPIP, подключенный к инструменту через
   % сконфигурированный IP-адрес.
   vt = visa('ni',['TCPIP0::',IPstr,'::INSTR']);
 
   % Открытие созданного объекта VISA.
   fopen(vt);
 
   % Отправка строки "*IDN?", запрашивающей идентификацию устройства.
   fprintf(vt,'*IDN?');
 
   % Получение данных от устройства.
   outputbuffer = fscanf(vt);
   disp(outputbuffer);
 
   %Закрытие объекта VISA.
   fclose(vt);
   delete(vt);
   clear vt;
end

NI VISA programming MATLAB TCPIP

[Пример 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. Подключите части схемы друг к другу, как показано на рисунке ниже.

NI VISA programming LabVIEW sch USB

5. Выберите ресурс устройства в диалоге VISA Resource Name, и запустите программу.

NI VISA programming LabVIEW USB 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. Подключите части схемы друг к другу, как показано на рисунке ниже.

NI VISA programming LabVIEW sch TCPIP

8. Введите IP-адрес и запустите программу.

NI VISA programming LabVIEW IP address

Вы можете получить исходный код этих примеров на сайте siglent.com. Код примеров .NET (C#) скачайте по ссылке [6].

[Ссылки]

1. SIGLENT function / arbitrary waveform generators site:siglent.com.
2. Обзор NI-VISA.
3. SDG Series Waveform Generator Programming Guide site:siglent.com.
4. Библиотека VISA .NET.
5. 171213NI-VISA-170.ZIP - пакет NI-VISA версии 17.0.
6. 171219NI-VISA-NET-examples.ZIP - примеры кода на C#, документация.

 

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


Защитный код
Обновить

Top of Page