NI-488.2ソフトウェアおよびLabVIEWによるシリアルポーリングSRQサービス

概要

GPIBコントローラの1つの機能は、バス上のデバイスからのサービス要求を検出して応答することです。GPIBのSRQ(Service Request Line)は、サービス要求が保留中にコントローラに信号を送るように設計されています。コントローラは、どのデバイスがSRQラインをアサートしたかを調べて応答する必要があります。SRQを検出してサービスするもっとも一般的な方法は、シリアルポールです。このアプリケーションノートでは、NI-488.2ソフトウェアがIEEE 488デバイスからのサービス要求を検出して応答する方法について説明します。また、このアプリケーションノートには、LabVIEWプログラムでNI-488.2ソフトウェアルーチンおよび関数を実装する方法を示すコードサンプルも含まれています。

内容

シリアルポーリング必要性教室たとえ

GPIBコントローラと計測器間の通信は、教室の講師と生徒間の通信と比較することができます。教室では、講師がクラスを担当してアクティビティを制御します。GPIBは、タスクの実行タイミングをコントローラが決定する、類似した方法で動作します。教室では、生徒は声を大にして話す許可を持っている必要があり、GPIBでは、バスで話すようにアドレス指定されていないデバイスは通信できません。しかし、コントローラから通信するように指示されていないと通信を開始できない場合、デバイスはコントローラに通信する必要があることをどのようにして伝えることができるでしょうか。

授業のたとえで言えば、生徒が何か言いたいことがあることを、生徒が言わなければ話せないことを考慮して、生徒にどのように伝えることができるでしょうか。よい方法は、生徒が手を上げることです。同様に、計測器はSRQと呼ばれるハードウェアラインをアサートできます。これは、GPIBバス内の完全に独立したラインで、デバイスに注意が必要であることをコントローラに通知します。

デバイスがサービスを要求する必要があるのはなぜですか。場合によっては、コントローラはデバイスからデータを要求(デバイスへの書き込み)し、書き込み操作が完了するとすぐにデータを読み取り直すことができます。しかし、これはすべてのケースで可能ではありません。コントローラは、データが使用可能になる前に計測器からデータを読み戻そうとして(計測器がデータを生成するのに時間がかかる)、タイムアウトエラーが発生する場合があります。この状況は、学生が問題を解く前に、教授が学生に答えを求めるのと似ています。この場合、教授は、問題を解くたびに学生が手を挙げるのを待ちます。学生が手を挙げたら、教授は学生に答えを求めます。ただし、GPIBの場合、すべてのデバイスがSRQラインを共有しているため、コントローラはどのデバイスがサービスを要求したかを認識しません。コントローラがどのデバイスが注意を要求したかを検出するには、シリアルポーリングが必要です。

シリアルポーリング理論


GPIBデバイスがサービスを要求するときに、シリアルポーリングを使って、GPIBデバイスから特定の情報を取得することができます。シリアルポールを実行すると、コントローラは各デバイスにクエリを行い、SRQラインをアサートしたデバイスを検索します。各デバイスは、ステータスバイトレジスタに含まれるステータスバイトの値を返すことで、ポールに応答します(図1を参照)。この値は、使用可能なデータの有無やエラー状態など、デバイスに依存する条件によって決定されます。ANSI/IEEE Standard 488.1-1987では、デバイスがサービスを要求した場合、ステータスバイトの1つのビットであるRQSビット(ビット6)がTRUEであると規定されています。ステータスバイトの他のビットは、計測器の製造元に定義を委ねられています。IEEE 488.1対応計測器には、計測器エラーが発生したか、デバイスがセルフテストを行っているかを判断するビットがあります。これらのビット定義は計測器ベンダ間で一貫していないため、サービス要求の原因を特定する方法は各デバイスによって異なります。


図1.ステータスバイトレジスタ

ANSI/IEEE Standard 488.2-1987では、488.2準拠のすべてのデバイスのステータスバイトを1つのモデルで表すように特定のサービス要求条件を定義することで、この問題を解決しています。IEEE 488.2規格は、前のセクションで説明したIEEE 488.1ステータスバイトをベースに拡張したものです(図2を参照)。IEEE 488.2は、IEEE 488.1規格と同様にRQSビットを定義します。IEEE 488.2では、メッセージ有効(MAV)ビットとイベントステータスビット(ESB)が追加されました。MAVビットは、デバイスが以前にデータをクエリされ、送信する保留中のデータメッセージがある場合に設定されます。ESBビットは、標準イベントステータスレジスタで定義された標準イベントの1つが発生したことを示します。標準イベントステータス有効レジスタで対応するビットを設定することで、ESBを設定する標準イベントを定義します。これらのイベントには、電源投入、ユーザ要求、コマンドエラー、実行エラー、デバイス固有エラー、問い合わせエラー、制御要求、動作完了などがあります。サービス要求有効化レジスタで対応するビットを設定することにより、ESBまたはMAVが設定されている場合、または製造元が定義した条件が発生した場合にSRQラインをアサートするように計測器を構成できます。


図2.IEEE 488.2ステータスレポートモデル

シリアルポーリングLabVIEW関数

以下の関数はLabVIEW GPIB 488サブパレットに含まれており、LabVIEWでシリアルポーリングを実行するために不可欠です。

GPIBシリアルポール (NI-488ではibrsp) は、シリアルポールを実行し、単一デバイスからステータスバイトの値を返します。プログラムは、ステータスバイト値のRQSビットを手動で確認して、そのデバイスがサービスを要求したかどうかを判断する必要があります。

GPIB待機 (NI-488ではibwait) は、特定のGPIBバスで指定されたステータスワードマスクで指定された状態を待機します。ステータスワードはグローバル変数 (16ビット) で、GPIB情報の中でもSRQラインの状態 (ビット12、SRQI)、およびデバイスがサービスを要求したかどうか (ビット11、RQS) を含みます。渡されたベクトルが0に等しい場合、指定されたケースを待機せず、ibstaまたはステータスワードを更新します。ただし、マスクがビット12 (SRQI) をチェックするように設定されている場合、関数はその特定のラインが特定のGPIBボードに対してアサートされるまで待機します。そのアドレスは「GPIB待機」で指定します。

GPIB RQSを待機 (NI-488ではibwait、ビット11はマスク付き) は、「GPIB待機」関数でビット11のマスクを使用する操作に似ていますが、GPIBボードのアドレスではなく、特定のデバイスアドレスのGPIBアドレスを使用します (ビット12を待機する場合)。この関数は、特定のデバイスがサービスを要求するまで待機し、複数のデバイスが接続可能なボードがサービス要求を受信するまで待機しません。この関数は、RQSビットがアサートされるか、タイムアウトを超えるまで待機します。

次の例は、LabVIEW GPIB関数を使用してSRQにサービスを提供し、デバイスをシリアルポールする方法を示しています。

LabVIEWサンプル1(図3)では、NI計測器シミュレータにコマンドが書き込まれています。このコマンドには、操作完了イベントがイベントステータスレジスタ (ESR) に登録されている場合に、計測器がサービスリクエスト (SRQ) を生成するための手順が含まれています。最初の2つのコマンドは、サービス要求有効レジスタとイベントステータス有効レジスタ(IEEE-488.2仕様)にこれらの命令を書き込みます。3番目のコマンドは、計測器シミュレータに正弦波を生成するように要求し、最後のコマンドは操作完了イベントを生成します。コードの以下のセクションでは、ステータスワードのビット12を確認してSRQの生成を待機します。生成されたら、デバイスシミュレータでシリアルポールを実行してステータスバイトを読み取り、SRQを生成した理由を確認します。ビット5が(操作完了ビットが設定されたイベントステータスレジスタから)設定され、ビット6が(RQS、デバイスがサービスを要求した)設定されている場合、コントローラはデバイスシミュレータからデータを読み取ります。ESRレジスタをクリアする必要があることに注意してください。これにより、計測器が不要なサービス要求を生成することを防ぎます。



図3.LabVIEWのサンプル1

LabVIEW 例 2(図 4)は、デバイスがサービスを要求するまで待機する別の方法を示します。ただし、この最後の例では、プロセッサは停止し、他の操作を実行せずに待機します。最初の例では、デバイスがサービスを要求するまで待機している間に、他の操作が並列で実行された可能性があります。



図4.LabVIEWのサンプル2

シリアルポーリングLabVIEW GPIB 488.2関数

GPIB 488.2関数は、1つのGPIBコマンドで複数のデバイスをポーリングできるように、シリアルポーリングの新機能を追加します。LabVIEWでは、これらの関数をGPIB 488.2関数サブパレットのAllSpollおよびFindRQSに追加しました。

AllSpollは、1回のルーチン呼び出しで複数のデバイスに対してシリアルポールを実行できます。AllSpollは、ポーリングされた各計測器のステータスバイトを定義済みの配列に配置します。各デバイスのステータスバイトのRQSビットを手動で確認して、そのデバイスがサービスを要求したかどうかを判断する必要があります。

FindRQSは、複数のデバイスをシリアルポールできます。デバイスの1つがSRQをアサートしてサービスを要求した場合、ルーチンはサービスを要求した最初のデバイスのインデックスとステータスバイト値を返します。

1つの計測器のみがSRQをアサートし、どの計測器かおよびそのシリアルポール応答バイトを知りたい場合は、FindRQS関数を使用します。複数の計測器がSRQをアサートした可能性がある場合は、AllSpollを使用してすべてのデバイスからシリアルポール応答バイトを受信します。ステータスバイトにビット6が設定されている場合は、デバイスがサービスを要求したことを意味します。つまり、デバイスがサービスを要求する場合、ステータスバイトの値は少なくとも16進数の40になります。

LabVIEWサンプル3(図5)は、LabVIEW NI-488.2関数を使用してシリアルポーリングを実行する方法を示します。このGPIB 488.2サンプルは、前に示したGPIBサンプルとよく似ています。ほとんどのLabVIEW GPIB関数は、同等のLabVIEW GPIB 488.2関数に置き換えられました。たとえば、「GPIB書き込み」と「GPIB読み取り」の代わりに「送信」と「受信」、「GPIBシリアルポール」の代わりに「読み取りステータス」、および「GPIB待機」を使用してマスクを0に設定する代わりに「SRQテスト」などです。さらに、このサンプルは、シフトレジスタを使用してWhileループのサイクル間でエラークラスタを渡すことにより、プログラムで発生する可能性のあるエラーを制御するより良い方法も示しています。



図5.LabVIEWのサンプル3

まとめ

このアプリケーションノートでは、GPIBコントローラがNI-488ソフトウェアを使用して、バス上のIEEE 488デバイスからのサービス要求を検出および応答する方法について説明します。また、LabVIEW GPIB関数を使用してデバイスをシリアルポールする方法を示します。

Was this information helpful?

Yes

No