GPIBデバイスがサービスを要求するときに、シリアルポーリングを使って、GPIBデバイスから特定の情報を取得することができます。シリアルポールを実行すると、コントローラは各デバイスにSRQをアサートしたデバイスを検索します。デバイスは、ステータスバイトの値を返すことでポールに応答します。この値は、使用可能なデータの有無やエラー状態など、デバイスに依存する条件によって決定されます。ANSI/IEEE Standard 488.1-1987では、ステータスバイトのビット6に1ビットのみが規定されています。これは、デバイスがサービスを要求するとTRUEになります。ステータスバイトの他のビットは、計測器の製造元に定義を委ねられています。IEEE 488.1互換の計測器には、計測器エラーが発生したか、デバイスがセルフテストを行っているかを判断するビットがあります。これらのビット定義は計測器ベンダ間で一貫しておらず、サービス要求の原因を特定する方法は各デバイスによって異なります。
ANSI/IEEE Standard 488.2-1987では、1つのモデルがすべての準拠デバイスのステータスバイトを表すように特定のサービス要求条件を定義することで、この問題を解決しています。ビット6 (デバイス要求サービス (RQS) ビット) は、IEEE 488.1定義を維持します。ビット6が設定されている場合、デバイスはサービスを要求します。IEEE 488.2規格ではビット4と5が定義されており、残りのビット(0~3、7)は計測器の製造元によって定義されています。ビット4はMAV(Message Available)ビットです。このビットは、デバイスに以前にデータをクエリし、送信する保留中のデータメッセージがある場合に設定されます。ビット5はイベントステータスビット(ESB)です。このビットは、IEEE 488.2で定義された有効なイベントが1つ以上発生した場合に設定されます。これらのイベントには、電源投入、ユーザ要求、コマンドエラー、実行エラー、デバイス固有エラー、問い合わせエラー、制御要求、動作完了などがあります。ESBまたはMAVが設定されたとき、または製造元が定義した状態が発生したときにデバイスはSRQをアサートできます。
NI-488.2ルーチンは、IEEE 488.2規格に記載されているシーケンスに基づいています。SRQサービスとシリアルポーリングに関係するルーチンは、AllSpoll、FindRQS、ReadStatusByte、TestSRQ、およびWaitSRQです。
AllSpollは、1回のルーチン呼び出しで複数のデバイスに対してシリアルポールを実行できます。AllSpollは、ポーリングされた各計測器のステータスバイトを定義済みの配列に配置します。各デバイスのステータスバイトのRQSビットを手動で確認して、そのデバイスがサービスを要求したかどうかを判断する必要があります。
FindRQSは、複数のデバイスをシリアルポールできます。デバイスの1つがSRQをアサートしてサービスを要求すると、ルーチンはサービスを要求しているデバイスのインデックスとステータスバイト値を返します。
ReadStatusByteは、単一のデバイスからのステータスバイトの値を返します。つまり、単一のシリアルポールを実行します。プログラムは、ステータスバイト値のRQSビットを手動で確認して、そのデバイスがサービスを要求したかどうかを判断する必要があります。
TestSRQは、SRQラインがアサートされているかどうかを決定します。
WaitSRQは、SRQがアサートされるかタイムアウト時間が経過するまでWaitSRQがアプリケーションを停止する点以外は、TestSRQに似ています。
次のQuickBASICサンプルは、SRQサービスを実行し、NI-488.2ルーチンを使用して要求されたデバイスを特定します。以下の例では、アドレス3、4、5の3つのデバイスがGPIBに存在し、GPIBインタフェースがバス指標0として指定されていると仮定します。
REM $include: 'qbdecl.bas'
REM NI-488.2ルーチンを使用したSRQサービスプログラム。このコードREMはSRQがアサートされるまでループ内で無限に待機します。REM SRQがアサートされると、プログラムはユーザ定義のREM サブルーチンにジャンプします。このサブルーチンは、デバイスをシリアルポールし、REM シリアルポールステータスバイトを解析します。
。
. ボード% = 0
100 CALL TestSRQ(board%, result%) IF result% = 1 THEN
CALL serial.poll ELSE
GOTO 100 END IF
または、以下の例に示すように、WaitSRQルーチンを実装して同じタスクを実行することもできます。主な違いは、SRQがアサートされるか、タイムアウト制限を超えるまで操作が中断されることです。
WaitSRQ(board%, result%) IF result% = 1 THENを呼び出す
CALL serial.poll ELSE
PRINT "WaitSRQ timed out; no SRQ" END IF
GPIBコントローラがNI-488.2ルーチンの1つを使用してSRQラインを検出したら、次の手順は各デバイスをシリアルポールします。各デバイスから返されたシリアルポールステータスバイトは、デバイスがサービスを要求したかどうか、および要求した理由などの貴重なステータス情報を提供します。コントローラは、各デバイスから取得したシリアルポールステータスバイトを解析してこの情報を取得できます。
FindRQSルーチンを使用して、どのデバイスがサービスを要求したかを確認できます。FindRQSは各デバイスをシリアルポールし、サービスを要求したデバイスのステータスバイトのみを返します。ルーチンは、各シリアルポールステータスバイトのRQSビットを自動的に確認します。アドレス配列にリストされているサービスを要求したデバイスの指標は、ibcntグローバル変数に返されます。以下の例では、アドレス3、4、5の3つのデバイスがGPIBに接続されており、そのうちの1つがSRQをアサートしたとします。
REM $include: 'qbdecl.bas'
DIM addresslist%(3) .
. addresslist% (0) = 3 addresslist% (1) = 4 addresslist% (2) = 5 addresslist% (3) = NOADDR
CALL FindRQS (0, addresslist% (), result%)
PRINT "Device at index";ibcnt;"requested service"
REM result%を解析して、デバイスがSRQをアサートした理由を特定します。REM シリアルポールステータスバイト定義の詳細については、 REM デバイスに付属のドキュメントを参照してください。
AllSpollまたはReadStatusByteを使用して、デバイスをシリアルポールできます。以下のコードは、AllSpollの可能な実装を示します。アドレス3、4、5の3つのデバイスがGPIBに存在し、SRQがコントローラによって検出されたとします。各デバイスのシリアルポールステータスバイトは、さらに解析するために配列resultlist%()に格納されます。
REM $include: 'qbdecl.bas'
DIM resultlist% (2) .
。
CALL AllSpoll (0, addresslist% (), resultlist% ())
FOR i% = 0 to 2
IF resultlist% (i%) AND &H40 THEN
PRINT "The device at index";i%;"requested service" END IF
NEXT i%
NI-488関数は、計測器制御アプリケーションの業界標準です。このセクションでは、SRQの検出とシリアルポールの実行に必要な機能について説明します。
NI-488の関数は、デバイス関数とボード関数の2つのグループに分けられます。デバイス関数は、デバイスのアドレス指定とデータ転送を1回の呼び出しで実行します。これに対し、1つのボード関数がGPIBボード上のデバイスに対応し、別の関数が実際にデータ転送を実行する場合があります。関数がボードまたはデバイス関数として指定されているかどうかは、関数のパラメータの1つとして渡されたユニットデスクリプタの値によって異なります。ユニットデスクリプタがインタフェースボードを参照する場合、関数はボード関数として指定されます。
シリアルポールに使用するNI-488関数はibrspです。ibrspは、単一のシリアルポールを実行し、シリアルポール応答バイトをアプリケーションプログラムに返します。これは、前述のNI-488.2 ReadStatusByteルーチンに似ています。
NI-488.2ドライバには、自動シリアルポーリングまたは自動ポーリングと呼ばれる内部機能があります。自動ポーリングがアクティブでSRQラインがHIGHになると、ドライバは自動的に以下を実行します。1) ibfindまたはibdevによって開かれた各デバイスのシリアルポーリングを開始し、SRQラインがLOWになると停止します。2) シリアルポール応答ステータスバイトを後で取得できるようにメモリキューに格納します。3) ビット6が設定されたステータスバイトを返した各デバイスのステータスワード (ibsta) にRQSビットを設定します。
アクティブにするには、自動ポーリングを有効にして許可する必要があります。自動ポーリングが有効かどうかは、ドライバ構成プログラムまたはibconfig関数によって決定されます。すべてのNIドライバは、ドライバ構成プログラムによってデフォルトで自動ポーリングが有効になっている状態で出荷されます。自動ポーリングは、NI-488のデバイスレベル関数の実行後に許可されます。NI-488 ボードレベル関数または NI-488.2 ルーチンの実行後は、オートポーリングは許可されません。
GPIBボードに割り込みが割り当てられている場合、GPIB I/Oが実行中でない限り、自動ポーリングはSRQラインに即時に応答できます。ボードに割り込みがない場合、自動ポーリングは、RQSのデバイスibwaitの間、またはデバイス機能が完了してアプリケーションプログラムに戻ろうとしている直後にのみサービス要求に応答できます。
自動ポーリングを使用する主な利点は、サービスを要求しているデバイスができるだけ速くポーリングされることです。GPIBボードに割り込みが割り当てられている場合、自動ポーリングは、設定されているSRQラインへの最速応答を保証する割り込みサービスルーチンです。自動ポーリングを使用する場合の欠点は、自動ポーリングがアクティブ (有効および許可) であることを確認できるように、アプリケーションのプログラミングを慎重に行う必要があることです。
プログラミングの観点からは、自動ポーリングは一度に1つのデバイスのみがサービスを要求する状況に最適です。これは、SRQラインをサービス要求の兆候として監視することは、自動ポーリングがアクティブなときに信頼性がないという事実から来ています。したがって、自動ポーリングがアクティブなときにサービス要求を確認するには、サービスを必要とする可能性のあるすべてのデバイスのibstaステータスワードのRQSビットを確認する必要があります。自動ポーリングがアクティブでない場合、サービス要求はSRQラインをチェックすることで監視されます。SRQラインは、任意のibstaのSRQIビットをチェックするか、iblinesを使用して確認できます。
以下のコードは、自動シリアルポーリングが無効の場合の一般的なSRQサービス状況でのibwaitおよびibrsp関数の使用を示します。ibwaitは、GPIBの特定の条件が満たされるまでプログラムの実行を中断します。
REM $include: 'qbdecl.bas'
REM このサンプルでは、2つのデバイスがGPIBに接続されているとします。REMどちらのデバイスにもSRQをアサートする機能があります。REM デバイスの1つはオシロスコープ(スコープ) REM で、もう1つはデジタルマルチメータ(dmm)です。
REM 最初のタスクは、SRQラインがアサートするまで待機することです。このREMは、SRQIのibwait、またはibwait 0またはiblines関数を使用したループストラクチャREMによって行われます。この図では、REM SRQIビットが設定されるかタイムアウトするまで待機するために、REM ibwait関数を使用します。
CALL ibfind ("gpib0", brd0%) CALL ibfind ("dev1", scope%) CALL ibfind ("dev2", dmm%)
CALL ibwait (brd0%, SRQI|TIMO)
REM SRQIが設定されているためにibwaitが終了した場合、REM デバイスをポーリングし、返されたステータスバイトを解釈して、両方でない場合はどちらのサービスが要求されたかを確認します。
IF(ibsta% AND SRQI)THEN
REM この場合、自動ポーリングはアクティブではないため、ibrsp REM はgpibバスを使用してスコープからステータスバイトを取得します。ibrsp(scope%, spr.scope%) IF (spr.scope% AND &H40) THEN PRINT "Scope asserted SRQ."を呼び出します。
REM ここでは、シリアルポールステータスバイトであるREM spr.scope%を解析し、SRQの原因を特定します。
CALL ibrsp(dmm%, spr.meter%)
IF (spr.meter% AND &H40) THEN PRINT "DMM asserted SRQ."
REM 残りのシリアルポールステータスバイト REM spr.meter% を解析し、SRQの原因を特定します。
END IF
自動ポーリングがアクティブな場合、デバイスのibstaのRQSビットを使用して、デバイスがサービスを要求したかどうかを判断する必要があります。ibrspはステータスバイトを返すために再び使用されますが、RQSビットは単一のデバイスベースでチェックされるため、今回はビット6がすでに設定されていることがわかります。さらに、ibrspは、以前にオートポーリングルーチンによって取得され保存されたステータスバイトのみにアクセスします。
REM 自動ポーリングがアクティブな場合、以下のコードの抜粋をサブルーチンとして使用して、特定のデバイスがREM サービスを要求しているかどうかを確認できます。
SUB RQScheck(デバイス%)
ibwait (device%, 0) IF (ibsta% AND RQS) THENを呼び出す
「デバイスがSRQをアサートした」を印刷します。
REM この場合、ibrspはデバイスをポーリングせず、REM はメモリから応答バイトを返します。REM ステータスバイトは、デバイスに対する REM サービス方法の決定に使用されます。
ibrspを呼び出し (デバイス%、spr.デバイス%)
END IF
END SUB
このドキュメントでは、GPIBコントローラがNI-488.2ソフトウェアを使用して、バス上のIEEE 488デバイスからのサービス要求を検出および応答する方法について説明します。このドキュメントで説明されているNI-488.2ルーチンおよびNI-488関数を実装することで、SRQサービスおよびシリアルポーリングを実行できます。コードサンプルは、アプリケーションプログラムのコンテキストでルーチンと関数を使用する方法を示します。