Bienvenido a Scpi.NET, una biblioteca .NET pura para controlar dispositivos SCPI. Si alguna vez intentó controlar un osciloscopio o un multímetro digital desde su computadora, probablemente se encontró con los comandos SCPI que permiten controlar dichos dispositivos.
Aunque este estándar parece una comunicación de texto simple, el uso real no es tan fácil porque estos comandos de texto deben incluirse en un protocolo de comunicación de nivel inferior como TCP/IP o USBTMC que el dispositivo entienda. La mayoría de los fabricantes proporcionan sus propias bibliotecas como TekVISA de Tektronix o NI-VISA de National Instruments. Desafortunadamente, en mi opinión, estas bibliotecas son demasiado pesadas, crean dependencias de software no deseadas, hacen que los paquetes de instalación sean más grandes, generalmente se centran en el hardware de un solo fabricante y al final solo proporcionan una "tubería" que puede transferir los comandos SCPI. El objetivo de este proyecto es crear una biblioteca simple, liviana e independiente del fabricante que pueda comunicarse con cualquier dispositivo SCPI a través de USB o Ethernet.
Esta es la parte fácil de la biblioteca y la he implementado solo para brindar la misma interfaz de control a dispositivos USB y Ethernet. Los dispositivos escuchan el puerto TCP 4000
y los comandos SCPI se envían directamente en la carga útil sin ningún encabezado.
Esta es la parte difícil de la biblioteca. Los dispositivos implementan la clase de prueba y medición USB (TMC), que requiere una comunicación USB de nivel bastante bajo. Tanto las solicitudes de lectura como de escritura tienen sus propios encabezados que crean un nivel adicional de complejidad. Aunque leí varios documentos sobre el TMC, todavía tuve que aplicar ingeniería inversa a la comunicación de mi osciloscopio para que funcionara. Se encontraron otros fragmentos de código útiles en los controladores del kernel de Linux. Aunque todavía hay algunos lugares en los que no estoy seguro de si la implementación es correcta, la biblioteca funciona bien con varios osciloscopios Tektronix y multímetros digitales de Keysight.
Mi controlador USB TMC se basa en llamadas API de Windows a las bibliotecas kernel32.dll
y SetupApi.dll
, que son parte integral del sistema operativo Windows, por lo que no se necesitan dependencias de software adicionales.
Para que el dispositivo USB TMC funcione, debe instalar el controlador USB correcto. Es bastante complicado conseguir el controlador porque normalmente forma parte de las bibliotecas de VISA y no se puede descargar por separado. No puedo compartir el controlador que uso debido a las restricciones de la licencia, pero como punto de partida, puedo recomendar el siguiente enlace donde se usa exactamente el mismo controlador y la lista de verificación de conectividad es perfectamente válida para todos los dispositivos USB TMC:
Lista de verificación de conectividad USB
Simplemente instale el paquete NuGet o clone el repositorio y agregue una referencia a él. Entonces puedes comenzar con los ejemplos siguientes.
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 ( ) ;
.. .
}
La lectura de la ID del instrumento está bien, pero probablemente desee enviar más comandos SCPI al dispositivo. Para mantener limpia la arquitectura de la aplicación, debe crear una clase separada para el instrumento que está controlando. Esto se puede hacer heredando de la clase ScpiDevice
que ya proporciona algunos métodos útiles como Query()
. Consulte el directorio SampleApp
para obtener más detalles.
Esta biblioteca se centra únicamente en la transmisión de comandos y respuestas SCPI. No proporciona ninguna funcionalidad de nivel superior como controladores de instrumentos. La razón es que la implementación de dichos controladores es una tarea muy compleja: