Добро пожаловать в Scpi.NET, чистую библиотеку .NET для управления устройствами SCPI. Если вы когда-нибудь пытались управлять осциллографом или цифровым мультиметром с компьютера, вы наверняка сталкивались с командами SCPI, позволяющими управлять такими устройствами.
Хотя этот стандарт выглядит как простая текстовая связь, его реальное использование не так просто, поскольку эти текстовые команды должны быть заключены в протокол связи более низкого уровня, такой как TCP/IP или USBTMC, который понимает устройство. Большинство производителей предоставляют свои собственные библиотеки, такие как TekVISA от Tektronix или NI-VISA от National Instruments. К сожалению, на мой взгляд, эти библиотеки слишком тяжелы, создают нежелательные программные зависимости, увеличивают установочные пакеты, обычно ориентированы только на оборудование одного производителя и, в конце концов, предоставляют только «канал», который может передавать команды SCPI. Целью этого проекта является создание простой, легкой и независимой от производителя библиотеки, которая может взаимодействовать с любым устройством SCPI через USB или Ethernet.
Это самая простая часть библиотеки, и я реализовал ее только для того, чтобы предоставить одинаковый интерфейс управления устройствам USB и Ethernet. Устройства прослушивают TCP-порт 4000
, и команды SCPI отправляются непосредственно в полезной нагрузке без каких-либо заголовков.
Это самая сложная часть библиотеки. Устройства реализуют класс USB Test & Measurement Class (TMC), который требует весьма низкоуровневой USB-связи. Запросы на чтение и запись имеют свои собственные заголовки, что создает дополнительный уровень сложности. Хотя я прочитал несколько документов о TMC, мне все равно пришлось перепроектировать связь моего осциллографа, чтобы заставить ее работать. Еще один полезный фрагмент кода был найден в драйверах ядра Linux. Хотя есть еще места, где я не уверен в корректности реализации, библиотека хорошо работает с несколькими осциллографами Tektronix и цифровым мультиметром от Keysight.
Мой драйвер USB TMC использует вызовы API Windows к библиотекам kernel32.dll
и SetupApi.dll
, которые являются неотъемлемой частью операционной системы Windows, поэтому никаких дополнительных программных зависимостей не требуется.
Чтобы устройство USB TMC заработало, вам необходимо установить правильный драйвер USB. Получить драйвер довольно сложно, поскольку обычно он входит в состав библиотек VISA и не может быть загружен отдельно. Я не могу поделиться драйвером, который использую, из-за лицензионных ограничений, но в качестве отправной точки я могу порекомендовать ссылку ниже, где используется точно такой же драйвер, а контрольный список подключения абсолютно действителен для всех устройств USB TMC:
Контрольный список USB-подключения
Просто установите пакет NuGet или клонируйте репозиторий и добавьте ссылку на него. Тогда вы можете начать с примеров ниже.
using ScpiNet ;
.. .
// List available USB devices. We will get back USB identifiers which can be used to open the device.
List < string > devices = UsbScpiConnection . GetUsbDeviceList ( ) ;
// In order to get instrument name from the USB identifier, we need to open the device and ask it for
// the name. The connection implements IDisposable, so it's recommended to use it in the using block.
using ( IScpiConnection connection = new UsbScpiConnection ( devices [ 0 ] ) )
{
// Create the connection:
await connection . Open ( ) ;
// Get the instrument name:
string id = await connection . GetId ( ) ;
// Send some SCPI command:
await Connection . WriteString ( " My special SCPI command " , true ) ;
// Read the response:
string response = await Connection . ReadString ( ) ;
.. .
}
// Connecting the TCP/IP device is even easier because there is always one device listening
// on the port 4000:
using ( IScpiConnection connection = TcpScpiConnection ( " 192.168.1.100 " , 4000 ) )
{
// The rest is same as with the USB connection:
await connection . Open ( ) ;
string id = await connection . GetId ( ) ;
.. .
}
Считывание идентификатора инструмента осуществляется нормально, но вам, вероятно, захочется отправить устройству больше команд SCPI. Чтобы сохранить чистоту архитектуры приложения, вам следует создать отдельный класс для прибора, которым вы управляете. Это можно сделать путем наследования от класса ScpiDevice
, который уже предоставляет некоторые полезные методы, такие как Query()
. Дополнительную информацию см. в каталоге SampleApp
.
Эта библиотека занимается только передачей команд и ответов SCPI. Он не предоставляет каких-либо функций более высокого уровня, таких как драйверы инструментов. Причина в том, что реализация таких драйверов — очень сложная задача: