Willkommen bei Scpi.NET, einer reinen .NET-Bibliothek zur Steuerung von SCPI-Geräten. Wenn Sie jemals versucht haben, ein Oszilloskop oder ein Digitalmultimeter von Ihrem Computer aus zu steuern, sind Sie wahrscheinlich auf die SCPI-Befehle gestoßen, mit denen Sie solche Geräte steuern können.
Obwohl dieser Standard wie eine einfache Textkommunikation aussieht, ist die tatsächliche Verwendung nicht so einfach, da diese Textbefehle in ein Kommunikationsprotokoll auf niedrigerer Ebene wie TCP/IP oder USBTMC eingebettet werden müssen, das das Gerät versteht. Die meisten Hersteller bieten ihre eigenen Bibliotheken wie TekVISA von Tektronix oder NI-VISA von National Instruments an. Leider sind diese Bibliotheken meiner Meinung nach zu umfangreich, erzeugen unerwünschte Softwareabhängigkeiten, machen Installationspakete größer, konzentrieren sich in der Regel nur auf die Hardware eines Herstellers und stellen am Ende nur eine „Pipe“ bereit, die die SCPI-Befehle übertragen kann. Das Ziel dieses Projekts besteht darin, eine einfache, leichte und herstellerunabhängige Bibliothek zu erstellen, die über USB oder Ethernet mit jedem SCPI-Gerät kommunizieren kann.
Dies ist der einfache Teil der Bibliothek und ich habe ihn nur implementiert, um sowohl USB- als auch Ethernet-Geräten die gleiche Steuerschnittstelle zu bieten. Die Geräte horchen auf dem TCP-Port 4000
und die SCPI-Befehle werden ohne Header direkt in der Nutzlast gesendet.
Das ist der schwierige Teil der Bibliothek. Die Geräte implementieren die USB Test & Measurement Class (TMC), die eine USB-Kommunikation auf recht niedrigem Niveau erfordert. Sowohl Lese- als auch Schreibanfragen haben ihre eigenen Header, was für zusätzliche Komplexität sorgt. Obwohl ich mehrere Dokumente über den TMC gelesen habe, musste ich die Kommunikation meines Oszilloskops dennoch umbauen, damit es funktionierte. Weitere nützliche Codefragmente wurden in den Linux-Kernel-Treibern gefunden. Obwohl ich an einigen Stellen noch nicht sicher bin, ob die Implementierung korrekt ist, funktioniert die Bibliothek gut mit mehreren Tektronix-Oszilloskopen und Digitalmultimetern von Keysight.
Mein USB-TMC-Treiber basiert auf Windows-API-Aufrufen an die Bibliotheken kernel32.dll
und SetupApi.dll
, die integraler Bestandteil des Windows-Betriebssystems sind, sodass keine zusätzlichen Softwareabhängigkeiten erforderlich sind.
Damit das USB-TMC-Gerät funktioniert, müssen Sie den richtigen USB-Treiber installieren. Es ist ziemlich schwierig, den Treiber zu bekommen, da er normalerweise Teil der VISA-Bibliotheken ist und nicht separat heruntergeladen werden kann. Aufgrund der Lizenzbeschränkungen kann ich den von mir verwendeten Treiber nicht weitergeben, aber als Ausgangspunkt kann ich den folgenden Link empfehlen, bei dem genau derselbe Treiber verwendet wird und die Konnektivitätscheckliste für alle USB-TMC-Geräte vollkommen gültig ist:
Checkliste für USB-Konnektivität
Installieren Sie einfach das NuGet-Paket oder klonen Sie das Repository und fügen Sie einen Verweis darauf hinzu. Dann können Sie mit den folgenden Beispielen beginnen.
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 ( ) ;
.. .
}
Das Auslesen der Geräte-ID ist in Ordnung, aber Sie möchten wahrscheinlich weitere SCPI-Befehle an das Gerät senden. Um die Anwendungsarchitektur sauber zu halten, sollten Sie eine separate Klasse für das Instrument erstellen, das Sie steuern. Dies kann durch Erben von der ScpiDevice
-Klasse erfolgen, die bereits einige nützliche Methoden wie Query()
bereitstellt. Weitere Informationen finden Sie im SampleApp
-Verzeichnis.
Diese Bibliothek konzentriert sich nur auf die Übertragung der SCPI-Befehle und -Antworten. Es bietet keine übergeordnete Funktionalität wie Instrumententreiber. Der Grund dafür ist, dass die Implementierung solcher Treiber eine sehr komplexe Aufgabe ist: