Bem-vindo ao Scpi.NET, uma biblioteca .NET pura para controlar dispositivos SCPI. Se você já tentou controlar um osciloscópio ou multímetro digital a partir de seu computador, provavelmente se deparou com comandos SCPI que permitem controlar tais dispositivos.
Embora este padrão pareça uma comunicação de texto simples, o uso real não é tão fácil porque esses comandos de texto precisam ser agrupados em um protocolo de comunicação de nível inferior, como TCP/IP ou USBTMC, que o dispositivo entende. A maioria dos fabricantes fornece suas próprias bibliotecas, como TekVISA da Tektronix ou NI-VISA da National Instruments. Infelizmente, na minha opinião essas bibliotecas são muito pesadas, criam dependências de software indesejadas, tornam os pacotes de instalação maiores, geralmente focam no hardware de um fabricante e no final fornecem apenas um "pipe" que é capaz de transferir os comandos SCPI. O objetivo deste projeto é criar uma biblioteca simples, leve e independente do fabricante que possa se comunicar com qualquer dispositivo SCPI via USB ou Ethernet.
Esta é a parte fácil da biblioteca e eu a implementei apenas para fornecer a mesma interface de controle para dispositivos USB e Ethernet. Os dispositivos escutam a porta TCP 4000
e os comandos SCPI são enviados diretamente na carga útil sem nenhum cabeçalho.
Esta é a parte difícil da biblioteca. Os dispositivos implementam a classe USB Test & Measurement Class (TMC), que requer comunicação USB de baixo nível. As solicitações de leitura e gravação têm seus próprios cabeçalhos, o que cria um nível adicional de complexidade. Embora eu tenha lido vários documentos sobre o TMC, ainda tive que fazer engenharia reversa na comunicação do meu osciloscópio para fazê-lo funcionar. Outros pedaços úteis de código foram encontrados nos drivers do kernel Linux. Embora ainda existam alguns lugares onde não tenho certeza se a implementação está correta, a biblioteca funciona bem com vários osciloscópios Tektronix e multímetro digital da Keysight.
Meu driver USB TMC depende de chamadas de API do Windows para as bibliotecas kernel32.dll
e SetupApi.dll
, que são parte integrante do sistema operacional Windows, para que nenhuma dependência adicional de software seja necessária.
Para fazer o dispositivo USB TMC funcionar, você precisa instalar o driver USB correto. É bastante complicado obter o driver porque geralmente faz parte das bibliotecas VISA e não pode ser baixado separadamente. Não posso compartilhar o driver que utilizo devido às restrições de licença, mas como ponto de partida, posso recomendar o link abaixo onde exatamente o mesmo driver é usado e a lista de verificação de conectividade é perfeitamente válida para todos os dispositivos USB TMC:
Lista de verificação de conectividade USB
Basta instalar o pacote NuGet ou clonar o repositório e adicionar referência a ele. Então você pode começar com os exemplos abaixo.
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 ( ) ;
.. .
}
A leitura do ID do instrumento é adequada, mas você provavelmente desejará enviar mais comandos SCPI ao dispositivo. Para manter a arquitetura do aplicativo limpa, você deve criar uma classe separada para o instrumento que está controlando. Isso pode ser feito herdando da classe ScpiDevice
que já fornece alguns métodos úteis, como Query()
. Consulte o diretório SampleApp
para obter mais detalhes.
Esta biblioteca concentra-se apenas na transmissão dos comandos e respostas SCPI. Ele não fornece nenhuma funcionalidade de nível superior, como drivers de instrumentos. A razão é que a implementação de tais drivers é uma tarefa muito complexa: