Библиотека NI-VISA .NET содержит классы, которые предоставляют интерфейс .NET к NI-VISA [2]. Эта библиотека совместима со стандартом VISA Implementation Specification for .NET (VPP-4.3.6), разработанным организацией IVI Foundation. Она заменяет библиотеку VisaNS компании National Instruments, которая была реализована до того, как IVI Foundation стандартизовала .NET API для VISA. NI-VISA это реализация индустриального стандарта Virtual Instrumentation Software Architecture (VISA) от компании National Instruments. Спецификации VISA и VISA .NET вместе определяют стандартный, целостный API для коммуникации с инструментами (приборами) и другими устройствами в рабочем окружении .NET. NI-VISA .NET поддерживает несколько технологий шин и интерфейсов подключения, включая TCP/IP, USB, GPIB, Serial и PCI/PXI. Классы, предоставленные библиотекой NI-VISA .NET, реализуют интерфейсы и используют типы, которые определены в библиотеке IVI VISA .NET (Ivi.Visa), предоставленной IVI Foundation. Подробнее про библиотеку IVI VISA .NET см. спецификацию VPP-4.3.6 [3].
[Выбор Instrument Control API]
В типовом приложении National Instruments рекомендует использовать инструментальный драйвер, специфичный для Вашего инструмента (прибора), если таковой драйвер имеется. Используйте библиотеку NI-VISA .NET только если такого драйвера нет, или если нужно получить доступ к дополнительным функциям, не реализованным в специальном драйвере прибора.
[Совместная работа NI-VISA .NET и драйвера NI-VISA]
Пространство имен (namespace) NationalInstruments.Visa включает классы .NET, предоставляющие богатый, объектно-ориентированный интерфейс к драйверу NI-VISA. Объект сессии VISA это фундаментальная концепция в спецификации VISA API. Сессия VISA идентифицирует ресурс. Есть несколько типов ресурсов, включая instrument resources, socket resources и interface resources. В библиотеке классов NI-VISA .NET классы, которые произведены от класса Session, называются классами "Session-derived", они инкапсулируют в себе объекты сессии VISA (что такое ресурс, сессия, см. [2]).
Методы Session-derived классов выполняют разные операции, такие как например чтение или запись данных из/в объект сессии VISA. Методы классов NI-VISA .NET отображаются на операции NI-VISA API на языке C (NI-VISA C API). Свойства Session-derived классов конфигурируют объект сессии VISA, отображаясь на атрибуты в NI-VISA C API.
Session-derived классы имеют члены событий .NET (event members). Вы можете регистрировать делегата с событием .NET, чтобы принять оповещение, когда произошло событие. Методы и свойства Session-derived класса выполняют проверку ошибок (error checking) и трансляцию кодов ошибок драйвера NI-VISA в типы исключений .NET (exception types).
Таким образом, классы NI-VISA .NET фактически являются обертками над вызовами функций драйвера NI-VISA.
[Использование Session-Derived классов]
Классы GpibSession, PxiSession, SerialSession, TcpipSession, TcpipSocket, UsbSession и VxiSession являются первичными (главными) в пространстве имен библиотеки NI-VISA .NET (NationalInstruments.Visa namespace). Эти Session-derived классы, которые также называются в этом документе как "leaf"-классы, косвенно унаследованы (derive indirectly) от класса Session. Эти классы предоставляют доступ к основному функционалу VISA. Каждый Session-derived класс представляет тип ресурса VISA. Каждый Session-derived класс предоставляет только те методы (methods), свойства (properties) и события (events), которые допустимы именно для этого Session-derived класса. GpibInterface, PxiBackplane, PxiMemory, UsbRaw, VxiBackplane и VxiMemory это дополнительные Session-derived leaf-классы для продвинутых приложений.
Чтобы обмениваться данными с ресурсом VISA в обычном приложении или библиотеке .NET, создайте экземпляр (instance) определенного Session-derived класса, который соответствует ресурсу. Установите свойства у этого экземпляра, чтобы сконфигурировать ресурс. Вызовите методы экземпляра для того, чтобы прочитать данные из ресурса или записать данные в него. Вы должны вызвать Dispose, чтобы освободить ресурс, когда доступ к нему больше не нужен.
Некоторые типы приложений или библиотек, такие как драйверы инструмента (instrument drivers), должны обращаться к ресурсам специальным способом, не зависящем от интерфейса подключения (interface-independent). NI-VISA .NET включает дополнительные классы, которые Вы можете использовать для получения доступа к ресурсам VISA таким интерфейсно-независимым способом. Например, чтобы создать объект, Вы можете использовать использовать для обмена с инструментом интерфейс GPIB или Serial, для этого вызовите Open и сделайте приведение типа возвращенного значения (cast) к типу MessageBasedSession.
[Операции ввода/вывода (I/O Operations)]
Основной набор операций, которые Вы производите с Session-derived объектом, это операции ввода/вывода (input/output, I/O). Операции, которые Вы используете для ресурсов, основанных на сообщениях (message-based resources) отличаются от методов, которые Вы используете на ресурсах, основанных на регистрах (register-based resources). Каждый Session-derived leaf-класс предоставляет только методы I/O, которые являются подходящими для ресурса, представляющего этот Session-derived класс.
Для обмена данными с message-based ресурсами Вы должны передать строки или массивы байт между приложением и ресурсом. В качестве примера, инструмент GPIB использует message-based ресурс. Для обмена данными с register-based ресурсом Вы должны установить регистры на ресурсе, или напрямую обратиться к памяти, которую экспортирует этот ресурс. Примером такого register-based ресурса является инструмент PXI.
[Простые Message-Based операции I/O]
Session-derived классы, представляющие message-based ресурсы, включают свойство RawIO. Оно представляет методы, которые Вы можете использовать для чтения из message-based ресурсов или записи в них. Объект RawIO предоставляет как синхронные, так и асинхронные методы чтения и записи. Синхронные методы выполнят всю операцию полностью, и выполнят возврат только по завершению запрошенной операции, т. е. заблокируют на время выполнения операции поток, вызвавший синхронный метод. Асинхронные методы, наоборот, запускают выполнение операции и немедленно делают возврат, не блокируя работу вызвавшего потока. Когда операция завершится, будет вызван делегат, который Вы предоставляете для хранения данных, пока Вы их не запросите.
Используйте ReadString для синхронного чтения строки из ресурса. Используйте Read для синхронного чтения двоичных данных из ресурса. Используйте BeginRead для запуска асинхронной операции чтения. Используйте EndReadString или EndRead для получения результата асинхронной операции чтения.
Используйте Write для синхронной записи в ресурс строки или массива двоичный данных. Используйте BeginWrite для запуска асинхронной операции записи. Используйте EndWrite, чтобы получить результат асинхронной операции записи.
[Форматированные Message-Based операции I/O]
Session-derived классы, которые представляют message-based ресурсы, включают свойство FormattedIO, предоставляющее высокоуровневые операции ввода/вывода с поддержкой форматирования. Их можно использовать для чтения из message-based ресурсов и для записи в них.
Используйте методы Write или WriteLine для синхронного форматирования и записи в ресурс текстовых сообщений. Используйте WriteBinary для отправки блоков двоичных данных. Используйте свойство BinaryEncoding, чтобы указать, как объект FormattedIO будет форматировать двоичные данные.
Используйте один из методов Read для синхронного чтения и парсинга текстовых сообщений и двоичных данных из ресурса. Различные методы Read включают функционал для чтения значений байта (byte), символа (character), числа плавающей точкой двойной точности (double), целого числа (integer) и числа с плавающей запятой (floating point). Например, ReadInt64 читает закодированное в ASCII значение Int64, и ReadDouble читает закодированное в ASCII значение Double. Используйте свойство BinaryEncoding, чтобы указать, как объект FormattedIO должен обрабатывать двоичные данные.
Используйте один из методов Printf для форматирования данных специальным образом и записи из в ресурс. Используйте один из методов Scanf для чтения форматированной строки из ресурса, и парсинга этой строки в соответствии с указанным форматом. Спецификаторы формата, предоставленные для методов Printf и Scanf, очень похожи на используемые для функций VISA viPrintf и viScanf, с некоторыми отличиями. Для дополнительной информации о методах FormattedIO и поддерживаемых спецификаторах формата см. описание IMessageBasedFormattedIO в спецификации VPP-4.3.6.
[Операции I/O, основанные на регистрах]
Session-derived классы, которые представляют основанные на регистрах (register-based) ресурсы, включают методы, которые используются для прямого чтения и записи памяти, которую экспортируют эти register-based ресурсы.
Используйте In8, In16, In32 и In64 для чтения скалярных значений из памяти устройства. Используйте MoveIn8, MoveIn16, MoveIn32 и MoveIn64 для чтения массивов значений из памяти устройства.
Используйте Out8, Out16, Out32 и Out64 для записи скалярных значений в память устройства. Используйте MoveOut8, MoveOut16, MoveOut32 и MoveOut64 для записи массивов в память устройства.
[Использование обработки ошибок (Error Handling)]
Драйвер NI-VISA возвращает коды ошибок, которые показывают успех или сбой операции. Когда метод NI-VISA .NET вызывает метод или обращается к свойству, и это приводит к ошибке в драйвере NI-VISA, то класс .NET создает и возвращает исключение Ivi.Visa.NativeVisaException. Свойство ErrorCode в этом объекте исключения содержит код ошибки, который вернул драйвер NI-VISA при выполнении операции.
Различные методы MessageBasedSession для чтения и записи данных вернут Ivi.Visa.IOTimeoutException, если произойдет таймаут операции. Свойство ActualCount в этом исключении содержит количество элементов прочитанных или записанных перед тем, как произошел таймаут. Свойство ActualData в этом исключении содержит байты, прочитанные или записанные перед тем, как произошел таймаут.
Для получения списка всех кодов ошибок NI-VISA, обратитесь к теме Error Codes в системе подсказки (NI-VISA Help). Чтобы получить доступ к NI-VISA Help из меню Start, выберите Start -> Programs -> National Instruments -> VISA -> NI-VISA Help (на моем компьютере с Windows 7 путь выглядит так: Пуск -> Все программы -> National Instruments -> NI-VISA -> NI-VISA Documentation -> NI-VISA Help).
[Использование Менеджера Ресурсов]
Класс ResourceManager предоставляет функционал для нахождения, парсинга и открытия Session-derived классов по именам ресурсов. Используйте Open для создания экземпляра (instantiate) подходящего Session-derived класса в зависимости от имеющегося имени ресурса. Используйте Find, чтобы по указанному выражению для поиска (search expression) получить список доступных в домене приложения имен ресурсов. Используйте Parse, чтобы получить дополнительную информацию об имени ресурса.
Вы должны вызвать Dispose, чтобы освободить ресурс, когда к нему больше не нужен доступ. Любой Session-derived объект, инстанцированный с использованием метода Open, остается все еще действительным после освобождения (Dispose) ResourceManager.
NI-VISA .NET API похож на VisaNS API, и поддерживает большинство функций, которые предоставляет VisaNS. VisaNS это старый (legacy) .NET API для VISA, созданный National Instruments до появления стандартной спецификации. National Instruments рекомендует Вам использовать стандартный NI-VISA .NET API вместо VisaNS для любого нового разрабатываемого приложения. Поддержка VisaNS API будет удалена в будущем релизе.
Дополнительно есть возможность модифицировать приложения, которые используют VisaNS API, для использования вместо этого стандартного NI-VISA .NET API. Например, поддерживаемые Session-derived классы в новом API именованы одинаково и имеют похожие конструкторы. Однако из-за того, что новый API реализует интерфейсы, указанные спецификацией IVI, и использует некоторые типы, определенные в этой спецификации, реальные члены этих Session-derived классов отличаются от членов в VisaNS, и поэтому потребуются ручные изменения в Ваших приложениях для миграции с библиотеки VisaNS на библиотеку NI-VISA .NET. В некоторых случаях, таких как функционал форматированного ввода/вывода (formatted I/O), новый API значительно отличается от VisaNS, и может потребовать больших изменений для миграции.
Некоторые функции, поддерживаемые VisaNS API, не поддерживаются или поддерживаются по-другому в NI-VISA .NET API. Некоторые из основных различий описаны ниже.
• Операции Message-based I/O предоставляются по-другому. Простые message-based операции, такие как ReadString или Write, которые реализованы некоторыми Session-derived классами в VisaNS, теперь предоставлены свойством RawIO в интерфейсе Ivi.Visa.IMessageBasedSession, который реализуют некоторые Session-derived классы. Свойство RawIO имеет тип, который реализует интерфейс Ivi.Visa.IMessageBasedRawIO.
Подобным образом форматированные message-based операции, которые реализованы MessageBasedSessionReader и MessageBasedSessionWriter в VisaNS, теперь предоставляются свойством FormattedIO в интерфейсе Ivi.Visa.IMessageBasedSession, который реализуют некоторые Session-derived классы. Свойство FormattedIO имеет тип, который реализует интерфейс Ivi.Visa.IMessageBasedFormattedIO.
• Другие спецификаторы формата для formatted I/O. Методы форматированного ввода/вывода (formatted I/O) в VisaNS поддерживают строки формата для использования методом String.Format. Однако NI-VISA .NET поддерживает строки формата со спецификаторами формата, подобными используемым в функциях VISA viPrintf и viScanf. Для дополнительной информации по методам FormattedIO и поддерживаемым спецификаторам формата см. описание интерфейса Ivi.Visa.IMessageBasedFormattedIO в спецификации VPP-4.3.6.
• Класс ResourceManager стал освобождаемым (disposable). Класс менеджера ресурсов теперь используется по-другому. Чтобы получить экземпляр (instance) объекта ResourceManager, сконструируйте новый экземпляр с использованием public-конструктора ResourceManager(). Объект ResourceManager является освобождаемым (он одноразовый, disposable), и должен быть уничтожен, когда он больше не нужен. Обратите внимание, что Session-derived объект, полученный методом Open менеджера ресурсов, остается действительным даже после того, как объект ResourceManager был уничтожен.
• По-другому поддерживаются нестандартные типы события (VISA event types). Члены событий .NET (event members), доступные в различных Session-derived классах, могут использоваться для регистрации методов делегата (delegate methods), чтобы принимать оповещения о возникновении стандартных типов событий (standard VISA events types). Использование нестандартных типов событий с делегатом события не поддерживается, и такие события могут быть только разрешены с использованием метода EnableEvent в классе Session, которые использует механизм очереди, доступный в драйвере NI-VISA. Оповещения о таких событиях могут быть приняты с использованием метода WaitOnEvent класса Session.
• Не поддерживается .NET Remoting. API .NET Remoting считается устаревшей технологией, и не рекомендуется компанией Microsoft для использования в новых приложениях. NI-VISA .NET не предоставляет поддержку .NET Remoting. Сервер NI-VISA предоставляет способ дистанционно получить доступ к ресурсам VISA, и это может использоваться как альтернатива .NET Remoting.
• Session-derived leaf-классы изолированы. Leaf-классы, такие как GpibSession или TcpipSession, изолированы от других классов, и другие классы не могут быть произведены (derived) от них.
• Не поддерживается FirewireSession. Драйвер NI-VISA больше не поддерживает ресурсы FireWire, и как результат библиотека NI-VISA .NET не предоставляет Session-derived класс для таких ресурсов.
Для дополнительной информации по NI-VISA .NET API загрузите и распакуйте файл NINETVisa.zip, и следуйте инструкциям в файле readme.txt, чтобы посмотреть NINETVisa.chm.
[Дополнительные ресурсы]
• Documentation: National Instruments .NET Support site:ni.com • Tutorial: C# and Visual Basic .NET Instrument Control Tutorial site:ni.com • Product Manual: NI-VISA Programmer Reference Manual site:ni.com • Download: NI-VISA site:ni.com • Tutorial: C# Instrument Control site:ni.com
После установки пакета NI-VISA [4] примеры приложений можно найти в папке "C:\Users\Public\Documents\National Instruments\NI-VISA\Examples\.NET" (Пользователи -> Общие -> Общие документы -> National Instruments -> NI-VISA -> Examples -> .NET -> 17.0).