SCPI デバイスを制御するための純粋な .NET ライブラリである Scpi.NET へようこそ。コンピュータからオシロスコープやデジタル マルチメータを制御しようとしたことがあるなら、おそらく、そのようなデバイスを制御できる SCPI コマンドに出会ったことがあるでしょう。
この規格は単純なテキスト通信のように見えますが、これらのテキスト コマンドをデバイスが理解できる TCP/IP や USBTMC などの下位レベルの通信プロトコルにラップする必要があるため、実際の使用はそれほど簡単ではありません。ほとんどのメーカーは、Tektronix の TekVISA や National Instruments の NI-VISA などの独自のライブラリを提供しています。残念ながら、私の意見では、これらのライブラリは重すぎ、不要なソフトウェア依存関係が作成され、インストール パッケージが大きくなり、通常は 1 つのメーカーのハードウェアのみに焦点を当てており、最終的には SCPI コマンドを転送できる「パイプ」しか提供しません。このプロジェクトの目標は、USB またはイーサネット経由で任意の SCPI デバイスと通信できる、シンプルで軽量、メーカーに依存しないライブラリを作成することです。
これはライブラリの簡単な部分であり、USB デバイスとイーサネット デバイスの両方に同じ制御インターフェイスを提供するためだけに実装しました。デバイスは TCP ポート4000
をリッスンし、SCPI コマンドはヘッダーなしでペイロードで直接送信されます。
ここが図書館の難しいところです。デバイスは、非常に低レベルの USB 通信を必要とする USB テスト & 測定クラス (TMC) を実装しています。読み取りリクエストと書き込みリクエストの両方に独自のヘッダーがあり、さらに複雑なレベルが生じます。 TMC に関するいくつかのドキュメントを読みましたが、オシロスコープを動作させるには、オシロスコープの通信をリバース エンジニアリングする必要がありました。 Linux カーネル ドライバーには、別の有用なコードが見つかりました。実装が正しいかどうかまだわからないところがいくつかありますが、このライブラリはいくつかの Tektronix オシロスコープや Keysight のデジタル マルチメータでうまく動作します。
私の USB TMC ドライバーは、Windows オペレーティング システムの不可欠な部分であるkernel32.dll
およびSetupApi.dll
ライブラリへの Windows API 呼び出しに依存しているため、追加のソフトウェア依存関係は必要ありません。
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 ( ) ;
.. .
}
機器 ID の読み取りは問題ありませんが、さらに多くの SCPI コマンドをデバイスに送信する必要がある場合があります。アプリケーションのアーキテクチャをクリーンに保つには、制御している計測器用に別のクラスを作成する必要があります。これは、 Query()
などの便利なメソッドをすでに提供しているScpiDevice
クラスから継承することで実行できます。詳細については、 SampleApp
ディレクトリを参照してください。
このライブラリは、SCPI コマンドと応答の送信のみに焦点を当てています。計測器ドライバーのような高レベルの機能は提供しません。その理由は、このようなドライバーの実装は非常に複雑な作業であるためです。