Bienvenue sur Scpi.NET, une bibliothèque pure .NET pour contrôler les appareils SCPI. Si vous avez déjà essayé de contrôler un oscilloscope ou un multimètre numérique depuis votre ordinateur, vous êtes probablement tombé sur les commandes SCPI qui permettent de contrôler de tels appareils.
Bien que cette norme ressemble à une simple communication textuelle, son utilisation réelle n'est pas si simple car ces commandes textuelles doivent être enveloppées dans un protocole de communication de niveau inférieur comme TCP/IP ou USBTMC que l'appareil comprend. La plupart des fabricants proposent leurs propres bibliothèques comme TekVISA de Tektronix ou NI-VISA de National Instruments. Malheureusement, à mon avis, ces bibliothèques sont trop lourdes, créent des dépendances logicielles indésirables, agrandissent les packages d'installation, se concentrent généralement sur le matériel d'un seul fabricant et, au final, ne fournissent qu'un "pipe" capable de transférer les commandes SCPI. L'objectif de ce projet est de créer une bibliothèque simple, légère et indépendante du fabricant, capable de communiquer avec n'importe quel périphérique SCPI via USB ou Ethernet.
C'est la partie la plus simple de la bibliothèque et je l'ai implémentée uniquement pour donner la même interface de contrôle aux périphériques USB et Ethernet. Les appareils écoutent le port TCP 4000
et les commandes SCPI sont envoyées directement dans la charge utile sans aucun en-tête.
C'est la partie la plus difficile de la bibliothèque. Les appareils implémentent la classe de test et de mesure USB (TMC) qui nécessite une communication USB de très bas niveau. Les requêtes de lecture et d'écriture ont leurs propres en-têtes, ce qui crée un niveau de complexité supplémentaire. Même si j'ai lu plusieurs documents sur le TMC, j'ai quand même dû procéder à une rétro-ingénierie de la communication de mon oscilloscope pour le faire fonctionner. D'autres morceaux de code utiles ont été trouvés dans les pilotes du noyau Linux. Bien qu'il y ait encore des endroits où je ne suis pas sûr que l'implémentation soit correcte, la bibliothèque fonctionne bien avec plusieurs oscilloscopes Tektronix et multimètre numérique de Keysight.
Mon pilote USB TMC s'appuie sur les appels d'API Windows aux bibliothèques kernel32.dll
et SetupApi.dll
qui font partie intégrante du système d'exploitation Windows, de sorte qu'aucune dépendance logicielle supplémentaire n'est nécessaire.
Afin de faire fonctionner le périphérique USB TMC, vous devez installer le pilote USB approprié. Il est assez délicat d'obtenir le pilote car il fait généralement partie des bibliothèques VISA et ne peut pas être téléchargé séparément. Je ne peux pas partager le pilote que j'utilise en raison des restrictions de licence, mais comme point de départ, je peux recommander le lien ci-dessous où exactement le même pilote est utilisé et la liste de contrôle de connectivité est parfaitement valable pour tous les périphériques USB TMC :
Liste de contrôle de la connectivité USB
Installez simplement le package NuGet ou clonez le référentiel et ajoutez-y une référence. Ensuite, vous pouvez commencer avec les exemples ci-dessous.
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 lecture de l'ID de l'instrument est acceptable, mais vous souhaiterez probablement envoyer davantage de commandes SCPI à l'appareil. Afin de garder l'architecture de l'application propre, vous devez créer une classe distincte pour l'instrument que vous contrôlez. Cela peut être fait en héritant de la classe ScpiDevice
qui fournit déjà des méthodes utiles telles que Query()
. Veuillez consulter le répertoire SampleApp
pour plus de détails.
Cette bibliothèque se concentre uniquement sur la transmission des commandes et réponses SCPI. Il ne fournit aucune fonctionnalité de niveau supérieur comme les pilotes d'instruments. La raison en est que la mise en œuvre de tels pilotes est une tâche très complexe :