「Serial, GPIB, and VXI Instrument Control with Measurement Studio VISA」

概要

シリアル、GPIB、およびVXI計測器は、VISA (仮想計測器ソフトウェアアーキテクチャ) アプリケーションプログラミングインタフェース (API) という単一のインタフェースを介して構成および制御できます。VISAは、各計測器用の低レベルドライバを呼び出すハイレベルドライバです。このアプリケーションノートでは、VISAの概要とVisual BasicのMeasurement Studio VISA(CWVISA)ActiveX制御器を使用してVISAを活用し、単一のプログラミングインタフェースでシリアル、GPIB、およびVXI計測器による計測器制御を実行する方法について説明します。

  • メモ



内容

VISA概要

VISAは、シリアル、GPIB、VXI計測器との通信を統一し、計測器制御プログラムを簡素化するためにNIが開発したドライバソフトウェアアーキテクチャです。VISA APIは、図1に示すように、オペレーティングシステム呼び出しおよびNI-488.2およびNI-VXIドライバソフトウェアを介してシリアル、GPIB、およびVXI計測器にアクセスします。


図1.VISAストラクチャ


VISAには次の利点があります。

  • VISAは、非依存インタフェースであり、それぞれのインタフェースに関わらず、同様のメソッドで計測器との通信を可能にします。たとえばVISAがメッセージベース計測器に書き込むASCII文字列は、計測器がシリアル、GPIB、VXIのどれでも同じものです。この機能を使用すると、1つのAPIを使用して異なる計測器を操作できます。
  • オブジェクト指向アーキテクチャで、将来開発される新しい計測器インタフェースにも容易に対応できます。新しいインタフェースを簡単に追加できます。

非常にコンパクトなコマンドセットに計測器プログラミング用の組み込み機能。

CWVISAとは


CWVISAはVISA APIを抽象化するActiveX制御器であるため、対話式プロパティページや簡易APIを介してシリアル、GPIB、VXI計測器と通信できます。たとえば、CWVISAプロパティページを使用して、対話的に計測器を検索して通信したり、インタフェースの問題を発見したり、設計時に計測器との通信を検証したりすることができます。VISA ActiveXコントロールは、Microsoft Visual Basic、Visual C++、Borland Delphiなど、任意のActiveXコントロールコンテナで使用できます。

ヒント:Measurement Studio または CWVISA 制御器の詳細については、『Measurement Studio Reference』を参照してください。リファレンスは、Windowsのスタートメニューから起動できます。

CWVISA使用方法

 

まず、ユーザインタフェースフォームにCWVISA制御器を配置します。Visual Basicがこの制御器にCWVisa1という名前を付けていることに注目してください。制御器を右クリックして、プロパティを選択します。このアプリケーションノートの以降の部分では、プロパティページを使用してリソースと通信プロパティを選択し、通信をテストし、計測器からデータを構文解析する方法と、簡素化されたAPIを使用して通信をプログラム的に制御する方法について説明します。


計測器リソース名の決定

リソースは、通信するシリアル、GPIB、またはVXI計測器またはコントローラです。リソース名は、VISAリソースの正確な名前と場所を指定します。たとえば、図2に示すように、リソース名ASRL1::INSTRはお使いのコンピュータのCOMポート1の計測器を示し、GPIB0::13::INSTRはアドレス13のGPIB計測器を示します。


図2.一般プロパティページから計測器を選択する


計測器と対話する際の最初の課題は、多くの場合、アドレスとリソース名を決定することです。CWVISAは、使用可能なすべてのCOMポートとアクティブなGPIBおよびVXI計測器をコンピュータで検索し、リソース名リストに使用可能なすべてのリソースを含めます。通信する計測器のリソース名がわかっている場合、または実行時にリソースを変更する場合は、以下のコード行のようにリソース名をプログラム的に指定します。

CWVisa1.RsrcName = "GPIB::13::INSTR"

読み取り/書き込み設定を構成する

RdWrtプロパティページで以下の一般的なインタフェースと通信設定を構成します。図3は、通信設定を構成する1つの方法を示しています。


図3.RdWrtプロパティページで一般通信設定を構成する
メモ:プロパティページとプロパティオプションはコンテキストに依存します。つまり、使用可能なオプションは通信しようとしている計測器のタイプによって異なります。

シリアルI/Oプロトコル標準またはASRL488を選択します。シリアル計測器が488.2スタイルのコマンドを受け入れる場合は、ASRL488設定を使用します。ASRL488設定では、以下の例のように、他のメッセージベースデバイスと同様に計測器と通信できます。

輝度ステータス (バリアント)

'I/OプロトコルASRL488データ転送を設定
CWVisa1.RdWrt.IOProtocol = cwvisaProtocolASRL488

'デバイスをクリア
CWVisa1.クリア

「*IDN?」を計測器に書き込む
CWVisa1.「*IDN?」と書き込みます。

'シリアルポール値 (ステータスバイト) を取得
ステータス = CWVisa1.ReadSTB

'応答を読み取り、ユーザインタフェースのテキストボックスに表示する
Text1.Text = CWVisa1.Read

GPIB I/Oプロトコル―通常のIEEE488通信では標準、高速488データ転送ではHS488を選択します。

VXI I/Oプロトコル―ほとんどのVXI計測器では、標準を選択します。一部の計測器はFDC (高速データチャンネル) I/Oをサポートしています。

メモ:使用可能なI/Oプロトコルについては、計測器またはコントローラのドキュメントを参照してください。

バイトをスワップは、デバイスからバイトを反転します。デバイスがビッグエンディアンの場合、このオプションを有効にします。計測器がビッグエンディアン形式でデータを返すかどうかを確認するには、デバイスのドキュメントを参照してください。

'ビッグエンディアン形式 (最上位バイト優先)
CWGPIB1.SwapBytes = TRUE

終端文字は、読み取り操作を終了するために使用する文字を指定します。計測器のドキュメントを参照して、終端文字を使用する必要があるかどうか、また終端文字が何であるかを確認してください。

'復帰文字を終端文字として使用
CWVisa1.RdWrt.TerminationCharacter = 13

'終端文字の使用を有効にする
CWVisa1.RdWrt.TerminationCharacterEnable = TRUE

インタフェース設定を構成する

シリアルまたはVXI計測器と通信する場合は、追加のインタフェースプロパティを設定する必要があります。

シリアル通信―図4に示すように、シリアルプロパティページを使用してボーレート、データビット、ストップビット、およびフロー制御方法を設定するか、以下の例のようにシリアルプロパティをプログラム的に設定します。

CWVisa1.Asrl.BaudRate = 9600
CWVisa1.Asrl.DataBits = cwasrlDataBits8
CWVisa1.Asrl.StopBits = cwasrlStopBits1
CWVisa1.Asrl.FlowControl = cwasrlFlowNone


図4.シリアルプロパティページでシリアルインタフェースを設定する


VXI通信―VXIメモリプロパティページを使用して、VXIレジスタアクセスに関連するプロパティを設定します。レジスタベースの計測器には、処理中にデータを一時的に格納するレジスタと呼ばれるプロセッサデバイスがあります。ソースおよび出力先プロパティは上位レジスタアクセス操作に適用され、ウィンドウプロパティは下位レジスタアクセスに適用されます。Access Priv.プロパティでVMEアクセス権限を指定し、Address Inc.を使用してMoveInまたはMoveOutメソッドを使用するたびに転送先アドレスを1ずつ増分します。

図5は、VXI計測器でデータを転送する方法の1つを示しています。


図5.VXIメモリプロパティページを使用してVXIレジスタアクセスプロパティを設定する


これらの同じ通信プロパティをプログラム的に設定できます。以下の例では、FIFO (増分しないアドレス) にアクセスするようにCWVisa1制御器を構成します。

「データへのソースアクセス権限」

CWVisa1.VxiMemory.SrcAccessPriv = cwVxiMemoryDataPriv
「バイト順序をビッグエンディアンに変換」
CWVisa1.VxiMemory.SrcByteOrder = cwVxiMemoryBigEndian
'アドレス増分を0にする
CWVisa1.VxiMemory.SrcIncrement = 0

計測器の通信をテストする

Measurement Studioを使用すると、通信テストが簡単に行えるため、計測器の動作を確認できます。

1.テストプロパティページを開きます。このプロパティページから、メッセージベースのコマンドを読み書きできます。すべてのシリアルおよびGPIB計測器と多くのVXI計測器は、さまざまなメッセージベースのコマンド文字列を認識します。

2.文字列送信フィールドに*idn? IDクエリなどのコマンドを入力します。計測器のドキュメントを参照して、認識するメッセージベースの文字列を確認してください。

メモ: すべてのVXI計測器およびコントローラがメッセージベースの通信を使用するわけではありません。VXIデバイスがメッセージベースのコマンドを受け付けない場合は、代わりにレジスタアクセスを使用してください。メッセージおよびレジスタベースの通信については、「データを転送する」セクションを参照してください。

3.実行を押します。受信した文字列表示器に応答が表示されます。図6は、NI GPIBおよびシリアルデバイスシミュレータから受信した応答を示しています。また、書き込みを押して計測器にデータを書き込み、読み取りを押して計測器からの応答を読み取ることもできます。


図6.テストプロパティページを使用して計測器と読み書きする


VISAセッションを開く

セッションを開き、プログラムから計測器との通信を開始します。セッションは、CWVISA制御器からリソースへの接続またはリンクで、「開く」メソッドで開きます。「開く」メソッドは、リソースを初期化し、プロパティページまたはプログラムで指定した設定でVISA通信セッションを構成します。たとえば、以下のイベント手順のように、ユーザがフロントパネルで「セッションを開く」ボタンをクリックしたときにVISAセッションを開くことができます。

「セッションを開く」
プライベートサブ OpenSession_Click()

CWVisa1.Open

End Sub

データの転送

CWVISAは、シリアル、GPIB、およびメッセージベースとレジスタベースの両方のVXI計測器およびコントローラと通信できます。メッセージベースの計測器は、定義されたVXIbusレジスタと通信プロトコルを実装し、Wordシリアルプロトコルを認識します。すべてのシリアルおよびGPIB計測器と多くのVXI計測器は、さまざまなメッセージベースのコマンド文字列を認識します。標準のメソッド呼び出しセットを使用して、すべてのメッセージベースの計測器と読み書きします。CWVISA制御器は、VXI計測器で使用できる一連のレジスタアクセスメソッドを提供します。上位レジスタにアクセスするには、入力および出力メソッドを使用します。低レベルレジスタアクセスには、ピークおよびポークメソッドを使用します。

メッセージベースの同期I/O―同期メッセージベースのI/Oを実行するには、書き込みメソッドと読み取りメソッドを使用します。たとえば、以下のコードは、計測器に識別クエリを送信し、計測器の応答をユーザインタフェースのテキストボックスに表示します。

CWVisa1.Open
CWVisa1.「*IDN?」とvbLfを書き込む
Text1.Text = CWVisa1.Read

メッセージベースの非同期I/O―「非同期書き込み」と「非同期読み取り」を使用して非同期I/Oを実行することで、書き込み操作と読み取り操作が即座に開始され、返されます。ReadAsyncメソッドが完了すると、CWVISA制御器はイベントを生成し、データをDataReadyイベントプロシージャに渡します。書き込み非同期メソッドが終了すると、CWVISA制御器は書き込み完了イベントを生成します。これらの非同期メソッドおよびイベントを使用して、長時間の読み取りまたは書き込み操作中に他のタスクの実行を継続できます。たとえば、「ReadAsync」を呼び出すと、プログラムはデータの読み取りを完了し、CWVISA制御器は以下のイベントプロシージャを呼び出すDataReadyイベントを生成します。

プライベートサブCWVisa1_DataReady(ByVal taskNumber As Integer, data As Variant)

'読み取られたらすぐにテキストボックスにデータを表示する
Text1.Text = data

End Sub

入力および出力メソッドによる上位レジスタアクセス―上位VXIレジスタからデータを読み取るには、以下の例のように、In8、In16、およびIn32メソッドを使用して8、16、および32ビット値を読み取ります。

'VXIバスのA32空間のオフセット0から32ビット値を読み取ります。
X = CWVisa1.In32 cwVxiA32Space, 0

メモ: 入力メソッドには、スペースとオフセットの2つのパラメータがあります。オフセットパラメータは、ベースアドレスに相対する、指定されたアドレス空間のアドレスを指定します。

以下の例のように、対応する出力メソッドを使用して指定されたオフセットにデータを書き込みます。

「オフセット0から32ビット値YをVXIバスのローカル領域に書き込む
CWVisa1.Out32 cwVxiLocalSpace, 0, Y

ヒント 大きなデータブロックを移動する場合は、MoveInメソッドとMoveOutメソッドを使用して、Address Incrementプロパティを選択し、データが1つの場所(FIFO)に移動されないようにします。

ピークおよびポークメソッドによる下位レジスタアクセス―ピークおよびポークメソッドを使用する前に、マップアドレスメソッドを使用してVXIメモリ空間の一部をローカルメモリにマップします。マップアドレスは、アドレス空間、ベースVXIアドレス、バイト単位のメモリサイズ、およびメモリをマップできる推奨ローカルアドレスをパラメータとして受け入れます。このメソッドは、指定されたベースVXIアドレスがマッピングされた実際のローカルアドレスを返します。次に、ピークメソッドとポークメソッドを使用して、マップされた領域からデータを読み書きします。

以下のコードは、ローカルメモリのスペースをマップし、そのスペースを覗いて突いて、マップ解除します。

'A16領域に16バイトのメモリをマップ
X = CWVisa1.MapAddress(cwVxiA16Space, &hC000, 64, False, 0)

'アドレス空間の先頭の16ビット値を読み取る
Y = CWVisa1.Peek16(X)

'アドレス空間の2バイト目のレジスタに16ビット値35を書き込む
CWVisa1.Poke16 X + 2, 35

'ローカルメモリの領域を解放
CWVisa1.UnmapAddress

メモ:MapAddressメソッドを使用して、VXIアドレス空間の領域をローカルメモリにマッピングします。マッピングされたウィンドウサイズとウィンドウベースプロパティを確認し、このウィンドウの外側の領域にアクセスしていないことを確認してください。

イベントを使用して通信を同期する

イベントは、VISAリソースとプログラム間の通信を提供します。プログラムで以下の条件のいずれかに応答する場合は、適切なイベントのイベントプロシージャを定義します。

  • サービス要求―デバイスがコントローラにサービスを要求したときにプログラムに通知します。このイベントは、要求を生成しているデバイスをシリアルポーリングして取得したステータスバイトを返します。このイベントは、主にGPIB SRQラインをアサートするGPIB計測器およびメッセージベースのVXI計測器によって生成されます。
  • トリガ―デバイスがVXIバックプレーンでトリガラインをアサートすると、プログラムに通知します。返されたVISAイベントには、イベントが関連付けられているトリガラインを指定するTriggerIdプロパティが含まれています。
  • VxiSignalProc―デバイスがVXIバックプレーンで割り込みをアサートするか、VXI信号を生成するとプログラムに通知します。VXI割り込みまたは信号が発生すると、VXISignalProcイベントによってStatusId値が返されます。StatusIdの下位8ビットは、信号または割り込みを作成する計測器の論理アドレスに設定されます。
  • VxiVmeInterrupt―計測器がVXIバックプレーンで割り込みをアサートすると、プログラムに通知します。このイベントは、信号ではなくVXIまたはVME割り込みに対してのみ生成される点を除いて、VxiSignalProcイベントに似ています。


CWVISA制御器は、後でイベントにアクセスして処理できるようにイベントをキューに入れます。CWVISAは、開くメソッドが呼び出されると、トリガを除くすべてのイベントタイプで有効イベントメソッドを自動的に呼び出します。EnableEventメソッドを使用して、イベントキューに配置するイベントのみを追加できます。たとえば、以下のVisual Basicコードでは、VxiVmeInterruptイベントのイベントキューを有効にして、このイベントが発生したときにイベントプロシージャを呼び出すのではなくキューに入れることができます。

CWVisa1.EnableEvent cwvisaEventVXIVMEInterrupt

以下のVisual Basicコードは、イベントキューを確認してVXIVMEInterruptイベントがキューにあるかどうかを判断し、ある場合は割り込みのStatusId値を取得します。

Dim ReturnEvent As CWVisaEvent
Dim stat As Boolean

stat = CWVisa1.WaitOnEvent(cwvisaEventVXIVMEInterrupt, 0, ReturnEvent)
If stat Then

'ユーザインタフェースのテキストボックスにStatusIDを表示
Text1.Text = ReturnEvent.StatusId

End If

プログラム内の特定の場所で発生するイベントが心配な場合は、キューを空にするか、イベントキューを無効にすることができます。同じタイプのすべてのイベントのキューを空にするには、イベントを破棄メソッドを使用します。

CWVisa1.DiscardEvents cwvisaEventVXIVMEInterrupt

イベントがキューに配置されないようにするには、DisableEventメソッドを使用します。

CWVisa1.DisableEvent cwvisaEventVXIVMEInterrupt

データの構文解析

計測器は、ヘッダとデータ情報の組み合わせを含む、分かりにくいバイナリ文字列や文字列を送信することで有名です。これらの文字列を有効なデータ形式に解析するのは、多くの場合、困難です。CWVISA制御器には、計測器データの操作を容易にするデータ解析機能が組み込まれています。

解析タスクを作成するには、解析プロパティページを使用します。解析タスクは、データの解析方法を記述します。次に、コードからこのタスクを実行して、計測器から返されたデータを自動的に解析します。必要な数の解析タスクを指定することで、計測器との各タイプの対話を異なる方法で解析できます。

CWVISA制御器には、数値パーサーと呼ばれる標準タスクがあります。数値パーサーは、区切られた文字列を数値の配列に変換し、ヘッダおよびその他の非数値情報を除去します。たとえば、DATA?コマンドに応答する計測器があり、ヘッダ情報の前にカンマで区切られた数値のリストを返すとします。文字列はWFM3.246,3.295,4.653,3.334のようになります。数値解析タスクを使用しない場合、文字列を構文解析して各ASCII表記の数値を取得し、実数タイプに変換します。数値解析タスクでは、同じメソッド呼び出しでデータの構文解析と読み取りを行います。以下のVisual Basicコードは、VISAセッションを開き、データ?コマンドでメッセージベースの計測器をクエリし、構文解析されたデータを読み取る方法を示します。

「バリアントは倍精度の配列を保持します - 構文解析されたデータ」
データをバリアントとして減光
「VISAセッションを開く」
CWVisa1.Open
計測器に「データを書き込む?」
CWVisa1.「データ?」を書き込む
'応答を読み取る
データ = CWVisa1.Tasks.Item ("Number Parser") 読み取り

ヒント:CWVISA制御器を使用した上級構文解析の詳細については、アプリケーションノート148「Visual Basicでの計測器データの解析」を参照してください。

VISAセッションを閉じる

閉じるメソッドを使用してリソースを解放し、VISAセッションを終了します。以下のイベント手順では、ユーザがセッションを閉じるコマンドボタンをクリックするとVISAセッションが終了します。

'セッションを閉じる

プライベートサブCloseSession_Click()

CWVisa1.閉じる

End Sub

まとめ


NI VISAは、多様な計測器制御のためのソリューションです。Measurement Studioには、VISA計測器制御をプログラムに対話的に統合するためのプロパティページが用意されています。たとえば、CWVISA制御器はすべてのVISAリソースを検出するため、リストされているリソースから選択する必要があります。CWVISAには、計測器の操作や通信問題のトラブルシューティングを行うためのテストプロパティページがあります。解析プロパティページを使用して、解析タスクを指定して、データを使用可能な形式でプログラムに返すことができます。Measurement Studio VISA APIを使用すると、シリアル、GPIB、およびVXI計測器との同期および非同期通信を実行したり、イベント処理およびキューイングを使用してプログラムの実行速度を向上させることができます。

Was this information helpful?

Yes

No