GPIB-VXI/CプログラムをNI-488.2からNI-VISAに変換する

NI-VISA Measurement & Automation

GPIB-VXI/CプログラムをNI-488.2からNI-VISAに変換する

GPIB-VXIを介したメッセージベースVXIデバイスの制御において、NI-488を使用したプログラムとNI-VISAを使用したプログラムの最大の相違点は、最初と最後に行われた呼び出しの違いです。レジスタベースのデバイスでは、その違いがより顕著になります。ここでは、両タイプのデバイスに共通の基本的な変更点について検討します。次に、レジスタベースのプログラミングに必要な変更点について検討します。

メッセージベースのプログラミングでは、通常NI-488のプログラムは特定のデバイスに対するハンドルを取得するために、VXIデバイスのGPIBプライマリアドレスおよびセカンダリアドレスをパラメータとしたibdev()関数を呼び出します。NI-VISAでは、プログラムはVXIデバイスの論理アドレス(デバイスがVXIであるため、より自然なアドレス)をパラメータとしたviOpen()を呼び出し、それに対するハンドルを取得します。データブロックの読み取りや書き込みを行う呼び出しだけでなく、他のIEEE 488通信(ステータスバイトの読み取りやバッファのクリアなど)に対応する呼び出しが、NI-488とNI-VISAのそれぞれに存在します。ここで留意すべきことは、サービスリクエストを待機する際に、まずviEnableEvent()を使用して、VISAのアプリケーションをそのイベントに対して有効化しなければならない点です。アプリケーションの最後に、デバイスのハンドルを閉じるために、ibonlではなくviClose()を使用してください。

レジスタベースのプログラミングでは、直接的な関連関数は存在しません。GPIB-VXIを使用したレジスタのアクセスは、コントローラ自体へリクエストを送信するため(ローカルコマンドセットを使用)、NI-488のプログラムではGPIB-VXIコントローラのGPIBプライマリアドレスおよびセカンダリアドレスをパラメータとしたibdev()を使用します。NI-VISAでは、VXIデバイスの論理アドレスをパラメータとしてviOpen()(これはメッセージベースおよびレジスタベースデバイスのどちらの場合も同じで、より自然で直感的なAPIです)を呼び出します。コントローラへ送信する必要のあるメッセージは、VISAが処理します。デバイスのプログラミングについては、以下のNI-488メッセージおよびNI-VISAオペレーションはほぼ同等です。

NI-488 NI-VISA
"Laddrs?"または"DLAD?" viFindRsrc()
"RMentry?"または "DINF?" viGetAttribute()
"Cmdr?" VI_ATTR_CMDR_LAを使用したviGetAttribute()
"LaSaddr?" VI_ATTR_GPIB_SECONDARY_ADDRを使用したviGetAttribute()
"Primary?" VI_ATTR_GPIB_PRIMARY_ADDRを使用したviGetAttribute()
"WREG"または"A16" VI_A16_SPACEを使用したviOut16()
"RREG?"または"A16?" VI_A16_SPACEを使用したviIn16()
"A24" VI_A24_SPACEを使用したviOut16()
"A24?" VI_A24_SPACEを使用したviIn16()
"SrcTrig" viAssertTrigger()

INSTRレジスタアクセス操作のviOut16()viIn16()では、指定されたアドレス範囲のデバイス相対オフセットが渡されることに注目してください。これは絶対アドレスを受け付けるGPIB-VXIのローカルコマンドセットとは異なります。ご使用のアプリケーションが絶対アドレス指定を使用している場合、また、デバイス相対オフセットに変換したくない場合は、絶対アドレスを受け付けるMEMACCリソースの使用を検討してください。viOut8()およびviIn8()オペレーションを使用して、8ビットアクセス(ローカルコマンドセットではサポートされない機能)を行うことができます。VISAはA32領域への32ビットオペレーションおよびアクセスも定義しますが、これらのオペレーションはGPIB-VXIによって実装されないためエラーを返します。

code instrumentのDMAmoveを使用する代わりに、viMoveInxx()およびviMoveOutxx()オペレーションを使用できるようになりました。これらのオペレーションはGPIB-VXIのDMA機能を利用しますが、コマンドおよびデータブロックの送信、そしてオペレーションの完了を待機するためのポールに必要なのは1回のコールのみで、複数ののコールを呼び出す必要はありません。データブロックを移動するためにVISAを使用すれば、NI-VISAは別のcode instrumentを自動的にダウンロードしてこれらのオペレーションやその他のオペレーションを処理するので、code instrumentのDMAmoveをロードする必要がなくなります。

つまり、NI-VISAを使用してGPIB-VXIで制御するVXIデバイスのプログラミングを行う操作は、外部コントローラまたはVXIpcシリーズなどのネイティブのVXIコントローラで制御する場合の操作と同じことです。レジスタベースのプログラミングの場合、NI-488からNI-VISAにコードを移植する操作は容易でありませんが、より単純なAPIおよびネイティブのVXIコントローラとの互換性のメリットを考慮すると変更の価値があります。