GPIBエラーコード一般解決方法

概要

このドキュメントでは、GPIBエラーコードの解決策を説明します。

 

以下のテキストの大部分は、『NI-488.2ユーザマニュアル - Windows用』(下記の「その他のリソース」を参照)から引用されています。

内容

EDVR (0)

エラー状態:ドライバエラーです。

説明:EDVRは、GPIBハードウェアが正しく構成されていない場合、または「ibfind」関数に渡されたインタフェース名またはデバイス名が正しくない場合に返されます。

考えられる原因:EDVRエラーは、ボードのインタフェース名または計測器のデバイス名を誤って入力した場合によく発生します。たとえば、NIボードのデフォルトのインタフェース名はGPIB0ですが、ゼロの代わりに英文字のohを入力してGPIBOと入力するとエラーが発生します。このエラーは、誤ったボード指標をibdev関数に渡した場合にも発生します。ボード指標は、GPIBボードのインタフェース名の数字の部分ですが、プライマリアドレスと勘違いされることがよくあります。たとえば、PCI-GPIBボードをコンピュータにインストールし、プライマリアドレスを2に設定したとします。ボードのデフォルトのインタフェース名はGPIB0であるため、ボード指標は2ではなく0です。

解決策:

  • GPIB構成ユーティリティでGPIBハードウェアのデフォルト設定(インタフェース名はGPIB0、プライマリアドレスは0)を使用します。
  • ibfind関数の代わりにibdev関数を使用して計測器と通信します(デバイス名の使用を避けるため)。
  • 計測器のデバイス名を使用する必要がある場合は、GPIB構成ユーティリティのデバイステンプレートでデバイス名が正しく構成されていることを確認します。
  • ibdevまたはibfindから返されたユニットデスクリプタを、後続のNI-488関数の最初のパラメータとして使用してください。エラーが発生している関数の前の変数の値が破損していないことを確認してください。

ECIC (1)

エラー状態:この機能を使用するには、GPIBボードがコントローラーインチャージ (CIC) である必要があります。

説明:特定の関数では、GPIBボードをCICにする必要があります。これらの関数は、『NI-488.2 Function Reference Manual』(下記の関連リンクを参照)に記載されています。GPIBボードはデフォルトでシステムコントローラとなります。これは、コントローラインチャージとは異なります。システムコントローラは、いつでもCICになることができます(特定の汎用インタフェースバスには1つのシステムコントローラを使用できます)。

考えられる原因:ECICエラーは、GPIBボードがCICであることを確認するためにプログラムの開始時にインタフェースクリアを送信しない場合によく発生します。

解決策:

  • GPIBボードをシステムコントローラにする必要がある場合は、ibrsc 1を使用してGPIBボードがシステムコントローラとして構成されていることを確認します。
  • GPIBボードがシステムコントローラである場合は、ibsic関数(またはSendIFC関数)を使用してインタフェースクリアを送信します。これにより、GPIBボードがCICとなり、バス上のGPIB通信がリセットされます。
  • GPIBボードがバス上の複数のコントローラの1つである場合は、CICステータスのGPIBボードを必要とする関数を呼び出す前に、CICビットにステータスワードibstaが含まれていることをを確認してください。含まれていない場合は、(CICビットに待機マスクを設定して)ibwait関数を呼び出し、コントロールがGPIBボードに渡されるまでその後の処理を遅らせることができます。

ENOL (2)

エラー状態:関数がリスナを検出しませんでした。

説明:GPIB通信には、1つのトーカ(データメッセージを書き込む)と1つ以上のリスナ(データメッセージを読み取る)が必要です。ENOLは、リスナのアドレスが指定されていないか、指定されたアドレスにリスナが存在しない状態で書き込み処理を実行しようとした場合によく発生します。デバイス書き込みの場合、ENOLは通信しようとしているGPIBアドレスがバスに接続されているデバイスのGPIBアドレスと一致していないことを示します。

考えられる原因:通信しようとしている計測器が予期されたプライマリアドレスにないか、計測器の電源がオンになっていないか、計測器へのケーブルが切断されているか、破損しています。

解決策:

  • デバイスのGPIBアドレスとデータの書き込み先のデバイスのGPIBアドレスが一致することを確認します。
  • 計測器にケーブルが正しく接続されていることを確認します。ケーブルを取り替えてみて、ケーブルが破損していないことを確認します。
  • 少なくても3分の2のデバイスに電源が入っていることを確認してください。
  • ボードレベルの通信では、ibcmd関数を使用し、リスナとするデバイスのアドレスを適切な16進法コードで指定します。
  • ibpad関数(および、必要に応じてibsad)を呼び出し、デバイスのプライマリアドレスを設定します。ibpad関数はデバイスの前回の設定を返すため、構成されたアドレスがデバイスの実際のアドレスと一致するかどうか確認できます。

EADR (3)

エラー状態:GPIBボード(GPIB0またはGPIB1)のアドレスが正しくありません。

説明:EADRは、GPIBボードがコントローラインチャージ(CIC)で、読み取り/書き込み関数の前に正しくアドレス指定されていない場合に発生します。また、EADRは、シャドウハンドシェイク機能が要求されたときにGPIB ATNラインがすでにアサート解除されている場合にも、ibgts関数から返されます。この場合、このエラーは、シャドウハンドシェイクが不可能であることを伝えるためのものです。

考えられる原因:GPIBボードと、通信しようとしている計測器が同じプライマリアドレスに構成されています。

解決策:

  • GPIBボードとデバイスを同じアドレスに構成しないでください。通常、GPIBボードはプライマリアドレス0に構成し、セカンダリアドレスは使用しないようにします。プログラムの最初でibpad 0およびibsad 0を呼び出し、ボードのアドレスを正しく構成します。
  • ibrd、ibwrt、RcvRespMsg、またはSendDataBytesが呼び出される前に、GPIBボードのアドレスが正しく設定されるようにします。
  • ibcmd呼び出しの直後を除き、ibgtsの呼び出しは避けます。ibcmd関数はATNラインをアサートするため、計測器はデータメッセージの代わりにコマンドメッセージを待機します。

EARG (4)

エラー状態:関数呼び出しに無効な引数です。

説明:EARGは、次の例のように、関数呼び出しに無効な引数が渡されたときに返されます。

考えられる原因:0~17の範囲以外の値(タイムアウト値は0~17の値、デフォルトは13、つまり10秒間のタイムアウト)でibtmoを呼び出した場合、第2パラメータの上位バイトに無意味なビットが設定されている状態でibeosを呼び出した場合、無効なアドレスでibpad(またはibsad)を呼び出した場合などが挙げられます。

解決策:

  • 『NI-488.2 Function Reference Manual』(下記の関連リンクを参照)を参照し、パラメータが有効であることを確認します。
  • ボードレベル関数でデバイスデスクリプタ、またはデバイスレベル関数でボードデスクリプタを使用しないようにします。

ESAC (5)

エラー状態:必要なGPIBボードがシステムコントローラではありません。

説明:ESACは、GPIBボードにシステムコントローラ機能がない場合にibsic、ibsre、SendIFC、またはEnableRemoteが呼び出されると発生します。

考えられる原因:GPIBボードがシステムコントローラとして構成されていません。

解決策:

  • ibrsc 1を呼び出すか、GPIB構成ユーティリティを使用してGPIBボードにシステムコントローラ機能を追加します。

EABO (6)

エラー状態:I/O操作が中断されました。

説明:EABOは、I/O操作が何らかの理由でキャンセルされたことを示します。

考えられる原因:EABOエラーは、通常、読み取りまたは書き込み操作中にタイムアウトが発生した場合に発生しますが、I/O操作の実行中にibstop関数、ibclr関数、または同様の関数を呼び出した場合にも発生します。PCIバスマスタ(コンピュータのBIOSでのオプション)が有効になっていないと、PCI-GPIBボードでの書き込み操作中にタイムアウトが起きることがあります。読み取り用のデータが存在している計測器が前のコマンドを認識しなかった場合、その計測器には返すデータがないため、読み取り操作中にタイムアウトが起きることがあります。計測器が応答しない原因はいくつか考えられます。

  • 計測器へのメッセージが正しく入力されていない場合。たとえば、「*IDN?」はIEEE 488.2準拠の計測器に対する一般的なIDクエリです。このメッセージは「*IND?」と誤って入力されることがよくあります。この場合、計測器はメッセージを理解できないため、計測器はメッセージ文字列を生成しません。
  • 計測器へのメッセージに計測器が認識できないコマンドが含まれている場合。たとえば、前の例で挙げた「*IDN?」メッセージは、IEEE 488.2準拠の計測器のみが認識できます。IEEE 488.2準拠でない旧型の計測器は、「*IDN?」を認識できないため、メッセージ文字列を生成しません。
  • 計測器が終端方法として使用している特定のEOS(文字列の終わり)文字をメッセージに追加し忘れた場合。たとえば、その計測器が改行文字をEOS文字として使用している場合、「ID?」は認識されませんが、「ID?\n」(\nは、IBICで改行を意味する)は認識されます。\nたとえば、その計測器が改行文字をEOS文字として使用している場合、「ID?」は認識されませんが、「ID?\n」(\nは、IBICで改行を意味する)は認識されます。 \n たとえば、その計測器が改行文字をEOS文字として使用している場合、「ID?」は認識されませんが、「ID?\n」(\nは、IBICで改行を意味する)は認識されます。
  • EOI(end or identify、5つのバス管理ラインの1つ)は終了方法ですが、計測器でメッセージの送信終了時にEOIラインが設定されていない場合、すべての読み取り操作はタイムアウトします。

解決策:

  • 計測器が認識できるコマンドのみをメッセージに使用します。使用可能なコマンドのリストは、デバイスのユーザマニュアルで確認してください。
  • GPIBモードまたは488.2モードのどちらにより計測器をGPIBリスナにするのかをユーザマニュアルで確認します。  計測器は、このモードに設定すると標準コマンドに応答するようになりますが、設定しないと有効なコマンドを送信してもエラーを返します。
  • 計測器で正しい終了方法が使用されていることを確認します。バイトカウント(メッセージに含まれているバイト数)は常に使用されますが、計測器によっては、EOSとバイトカウント、EOIとバイトカウント、またはバイトカウントのみを使用する場合があります。計測器で使用可能な終了方法は、デバイスのユーザマニュアルで確認してください。
  • EOSが終了方法の場合は、メッセージの最後に必ず追加します。終端文字は、GPIB構成ユーティリティで指定できますが、NI-488.2ドライバが自動的に追加することはありません。
  • ibtmoコマンドを使用して、I/O操作のタイムアウト時間を延長します。
  • すべてのデータを受信した後でEABOエラーを受け取った場合は、終端文字列(改行文字または復帰文字など)を確認し、ibeos関数を使用してその文字で読み取りを終了するようにGPIBボードを構成します。

ENEB (7)

エラー状態:GPIBボードは存在しません。

説明:ENEBは、構成ユーティリティで指定されたI/OアドレスにGPIBボードが存在しないときに発生します。この問題は、ボードがシステムに物理的に接続されていない場合、構成時に指定されたI/Oアドレスが実際のボード設定と一致しない場合、ベースI/Oアドレスでシステムの競合が発生している場合、またはボードのインタフェース名とデバイスに関連付けられているボードのインタフェース名が異なる場合に発生します。

解決策:

  • GPIB構成ユーティリティでボードのI/Oアドレスを特定します。システムのリソースマネージャで、別のボードがこのアドレス範囲の一部または全体を使用しようとしているかどうか確認します。ボードのインタフェース名が、デバイスの通信相手として構成されているボードのインタフェース名と同じであることを確認します。
  • 従来型ボードの場合は、ボードのジャンパおよびディップスイッチが、GPIB構成ユーティリティで構成されているものと同じリソース設定に設定されていることを確認します。
  • コンピュータの電源をオフにし、ボードがスロットに正しく取り付けられていることを確認します。

EDMA (8)

エラー状態:データ転送にDMAを使用中にエラーが発生しました。

説明:EDMAは、NI-488.2ドライバがDMAを使ってGPIB経由でデータを転送しようとしたときに、システムDMAエラーが発生した場合に発生します。

解決策:

  • GPIB構成ユーティリティを使用してGPIBボードを再構成し、DMAリソースを使用しないようにすることで、ハードウェアのEDMAの問題を解決できます。
  • ibdma関数を使用してDMAを無効にすると、ソフトウェアでEDMAの問題を修正できます。

EOIP (10)

エラー状態:非同期I/Oの実行中は、関数は使用できません。

説明:EOIPは、非同期I/O処理が終了する前に別のGPIB呼び出しが実行された場合に発生します。ibstop、ibnotify、ibwait、またはibonl関数は、非同期I/O操作中にのみ使用できます。その他のGPIB呼び出しを実行しようとすると、EOIPが返されます。

考えられる原因:非同期I/O中にサポートされていないGPIB関数を呼び出す。

ソリューション:

  • その後GPIBを呼び出す前に、ドライバとアプリケーションを再同期してください。再同期は、ibnotify (ibnotifyコールバックに渡されたibsta値にCMPLが含まれている場合、ドライバとアプリケーションが再同期されます)、ibwait (返されたibstaにCMPLが含まれている場合、ドライバとアプリケーションが再同期されます)、ibstop (非同期I/O操作がキャンセルされ、ドライバとアプリケーションが即時に再同期されます)、またはibonl (非同期I/O操作がキャンセルされ、インタフェースがリセットされ、ドライバとアプリケーションが即時に再同期されます) のいずれかの関数を使用して行われます。

ECAP (11)

エラー状態:操作する機能がありません。

説明:ECAPは、GPIBボードで操作を実行できない場合や、呼び出しに必要な機能がソフトウェアで無効にされている場合に発生します。

ソリューション:

EFSO (12)

エラー状態:ファイルシステムエラーです。

説明:EFSOは、ibrdfまたはibwrtf呼び出しでファイル処理の実行中に問題が発生した場合に設定されます。具体的には、このエラーは関数がアクセス対象ファイルに対して開く、作成、検索、書き込み、または閉じる操作のいずれかができないことを示します。この状態の特定のオペレーティングシステムエラーコードはibcntlに含まれています。

解決策:

EBUS (14)

エラー状態:コマンドバイト転送エラーです。

説明:EBUSは、デバイス機能中に特定のGPIBバスエラーが発生した場合に設定されます。すべてのデバイス関数は、アドレス指定やその他のバス管理作業を行うためにコマンドバイトを送信します。デバイスは、これらのコマンドバイトをデフォルト構成、またはibtmo関数で指定された制限時間内に受け入れなければなりません。これらのコマンドバイトを送信中にタイムアウトが発生した場合に、EBUSが設定されます。

考えられる原因:GPIBコントローラにGPIBデバイスが接続されていません。これは、すべての計測器の電源がオフになっている、計測器の1つがエラーでハンドシェイクラインをアサートしている、GPIBケーブルがボードから切断されている、またはGPIBケーブルが壊れているなどの原因が考えられます。

解決策:

  • すべての計測器が正しく動作し、通信する計測器に電源が入っていることを確認します。
  • すべての計測器を接続解除し、1つずつ接続して、1つの計測器が問題を引き起こしているかどうかを確認します。
  • ケーブルがゆるんでいないか、不良がないかを確認し、少なくとも2/3の計測器に電源が入っていることを確認します(これはIEEE 488仕様の必要条件です)。
  • タイムアウト時間がドライバのコマンドバイトの送信に十分でない場合は、この時間を延長します。

ESTB (15)

エラー状態:シリアルポールのステータスバイトが失われました。

説明:ESTBはibrsp関数によってのみ報告されます。ESTBは、自動シリアルポールから受信した1つ以上のシリアルポールステータスバイトが、ストレージスペースの不足により破棄されたことを示します。いくつかの古いステータスバイトを使用できますが、最も古いステータスバイトはibrsp呼び出しによって返されています。

考えられる原因:計測器がSRQラインを繰り返しアサートしています。

解決策:

  • ibrspをより頻繁に呼び出してキューを空にします。
  • ibconfig関数 (オプションIbcAUTOPOLL) を使用して自動ポーリングを無効にするか、GPIB構成ユーティリティで自動ポーリングを無効にします。

ESRQ (16)

エラー状態:SRQがONの状態から動きません。

説明:ESRQは、ステータスワード(ibsta)のRSQビットがアサートされた後に返すようにibwait関数を構成したデバイスレベルのibwait呼び出しによってのみ返されます。ESRQは、GPIB SRQラインが固定状態で使用できず、RQSを待機できないことを示します。

考えられる原因:この状況は、ケーブルの問題によりSRQラインがアサートされたままになっている、ソフトウェアが認識していないデバイスがSRQラインをアサートしている - ソフトウェアがこのデバイスを認識していないため、デバイスをシリアルポールしてSRQラインのアサートを解除できない、GPIBバステスタ(または同様の装置)がSRQラインをアサートさせている、などのイベントによって発生する可能性があります。

解決策:

  • バス上のデバイスの1つ(アプリケーションで使用されていないデバイスも含む)がSRQラインをアサートしているかどうかを確認します。必要ならば、デバイスとGPIBの接続を切断します。
  • GPIBケーブルを調べ、コネクタが正しく取り付けられていることを確認します。

ETAB (20)

エラー状態:表に問題があります。

説明:ETABは、FindLstnFindRQS呼び出しの間にのみ発生します。ETABはこれらの関数が使用する表に関して、以下のような問題があることを示します。

考えられる原因:FindLstnの場合は、ETABは、検出されたリスナの全アドレスを保持するための容量がないことを示します。FindRQSの場合は、ETABは、使用されている配列の中のデバイスにサーバを要求しているものがないことを示します。

解決策:

  • FindLstnの場合は、結果配列のサイズを大きくします。
  • FindRQSの場合、アプリケーションで使用されていないデバイスがSRQをアサートしていないかどうかを確認します。必要ならば、デバイスとGPIBの接続を切断します。

ELCK (21)

エラー状態:GPIBインタフェースはロックされているためアクセスできません。

考えられる原因:このエラーは、通常、同じインタフェースにアクセスする複数のプロセスがあり、1つのプロセスがすでにインタフェースをロックしている場合に発生します。このエラーは、インタフェースに既存のロックがあるために操作を実行できない場合に返されます。また、そのようなロックがないときにプロセスがインタフェースのロックを解除しようとした場合にも返されます。

ソリューション:

  • ELCKエラーを回避するには、ランダムな時間待機してからインタフェースを再度ロックします。iblckコマンドを使用してインタフェースをロックする場合は、LockWaitTimeの値を増やし、他のプロセスがインタフェースの制御権を解放するまで待機します。また、プロセスが実行中ずっとインタフェースをロックしないように注意してください。

EARM (22)

エラー状態: ibnotifyコールバックのリアームに失敗しました。

考えられる原因:このエラーは、NI-488.2アプリケーションで非同期通知(ibnotify)を使用すると発生します。この関数は、1つまたは複数のGPIBイベントの発生を非同期でアプリケーションに通知したい場合に使用します。このイベント通知は、コールバック関数によって行われます。コールバック関数は、ibnotify呼び出しが行われたときにNI-488.2ドライバに登録されます。このエラーは、このコールバック通知が不正な値を返すことによって自身をリアームできなかったか、致命的なドライバエラー (EDVR) が発生したことを示します。

解決策:

  • コールバック関数が返す値が有効なibnotifyマスク値となるようにしてください。
  • コールバック関数からゼロ値を返すことにより、非同期イベント通知メカニズムの登録を解除します。その後でibnotifyを呼び出しし、通知を再登録します。

EHDL (23)

エラー状態:入力ハンドルが無効です。

考えられる原因:一部のGPIBコマンドは、ボードまたはデバイスの入力ハンドルを入力パラメータとして取り込み、このエラーの原因となります。このエラーは、いくつかの状況で発生する可能性があります。いくつかのシナリオを次に示します。

  • 有効なボードハンドルがデバイスハンドルパラメータとして渡されたか、またはその逆です。
  • 無効なボードまたはデバイスデスクリプタが、入力としてNI-488.2関数に渡されたとき。
  • 0~99の範囲外のboardIDが、従来のNI-488.2ボードレベル関数またはNI-488.2ルーチンへ渡されたとき
  • ibconfigまたはibmaskに対して、デバイスユニットデスクリプタとボード構成オプション、またはボードユニットデスクリプタとデバイス構成オプションが使用されて呼び出しされたとき。

解決策:

  • 各関数を呼び出す際に、デバイスレベルとボードレベルの関数が混同されていないか確認してください。
  • また、NI 488.2呼び出しに渡されたボード指標が有効な指標番号かどうかも確認してください。

EWIP(26)

エラー状態:指定された入力ハンドルは待機中です。

考えられる原因:このエラーは、同じプロセスに複数のスレッドがあり、2つ以上のスレッドが同じインタフェースにアクセスしている場合に発生します。EWIPは、指定されたユニットデスクリプタでibwait呼び出しがすでに進行中であり、スレッドが同じデスクリプタを使用してibwaitをすでに実行しており、別のスレッドが同じデスクリプタでibwaitの呼び出しを試みたときに発生することを示します。

ソリューション:

  • 特定の時点で、1つのスレッドのみが特定のユニットデスクリプタに対してibwait呼び出しを実行していることを確認します。

ERST(27)

エラー状態:インタフェースのリセットが原因でイベント通知がキャンセルされました。

考えられる原因:ERSTエラーは、インタフェースのリセットによりイベント通知がキャンセルされたときに返されます。ドライバで待機中のibwait呼び出しは、以下の状況でERSTエラーを返します。

  • ibwaitと同じユニットデスクリプタをして使用して、同じプロセス内の別のスレッドが、ibonlを呼び出す場合。
  • 別のスレッドまたはプロセスがボードレベルのibonl 1を発行する場合。

以下の場合には、ibnotifyのコールバック関数がERSTで呼び出される可能性があります。

  • 別スレッドがボードレベルのibonl 1を発行する場合。

解決策:

  • ibwait呼び出しがドライバで待機中の場合にibonlを呼び出さないようにします。
  • iblckでインタフェースをロックし、他のアプリケーションによるibonlの呼び出しを阻止します。

EPWR(28)

エラー状態:インタフェースの電源が失われました。

考えられる原因:インタフェースへの電力が失われた場合、EPWRとなります。システムがスタンバイ状態になった後、スタンバイ状態から復帰した場合には、しばしばこのような結果となります。

解決策:

  • ハンドルをすべてオフラインにし、アプリケーションをもう一度初期化してください。
  • アプリケーションを終了し、システムを再起動してください。
  • PCのスタンバイモードおよびハイバーネーションモードを無効にしてください。

Was this information helpful?

Yes

No