IBNOTIFY
ボードレベル/デバイスレベル
目的
ユーザのコールバックを呼び出して、1つまたは複数のGPIBイベントをユーザに通知します。
ibnotifyの形式
C
unsigned long ibnotify (int ud, int mask, GpibNotifyCallback_t Callback, void * RefData)
Visual Basic (6.0)
CALL ibnotify (ud%, mask%, AddressOf Callback&, RefData$)
または
status% = ilnotify (ud%, mask%, AddressOf Callback&, RefData$)
対話式制御
サポートされていません。
ibnotifyの入力
ud | ボードまたはデバイスデスクリプタ |
mask | 通知するGPIBイベントのビットマスク |
Callback | コールバック関数へのポインタ(以下のプロトタイプを参照) |
RefData | ユーザ定義のコールバック用参照データ |
ibnotifyの出力
関数からの戻り値 | Ibstaの値 |
ibnotifyの説明
maskが0以外の値の場合、ibnotifyはmaskが指定したイベントを監視し、発生したイベントがあれば指定のCallbackを呼び出します。ボードレベルのibnotifyコールでは、ERRとRQS以外のすべてのマスクビットが有効です。デバイスレベルのibnotifyコールでは、有効なマスクビットはCMPL、TIMO、END、およびRQSのみです。TIMOが通知マスクに設定されている場合、タイムアウト時間を超過した時、その他の指定イベントが既に発生していなければ、ibnotifyはCallback関数を呼び出します。TIMOが通知マスクに設定されていない場合、指定イベントが1つ以上発生するまでCallback関数は呼び出されません。
メモ 1つ以上のmaskビットの状態がTRUEの場合に、通知が実行されます。 CMPLがTRUEの時に通知をするように要求すると、現在CMPLがTRUEである場合、直ちにCallbackが呼び出されます。 |
デバイスレベルの使用では、自動シリアルポーリングが無効に設定されている場合、RQSの通知が正しく機能しない場合があります。デフォルトで、自動シリアルポーリングは有効になっています。
所定のudに有効なibnotifyコールは、一度につき1つだけです。現行のibnotifyがudに対して有効な場合、これは後続のibnotifyコールで置き替えられます。udに対して有効なibnotifyコールは、udに対する後続のibnotifyコールのmaskを0に指定する事により、取り消されます。
ibnotifyコールが有効で、待機している1つ以上のGPIBイベントの状態がTRUEになると、Callbackが呼び出されます。
ボードやデバイス(つまり、ud)をオフラインにする前に、有効なibnotifyコールはすべて、マスクが0であるudに対して後続のibnotifyコールでキャンセルする必要があります。
ibnotifyのコールバックプロトタイプ
C
int __stdcall Callback (int LocalUd, unsigned long LocalIbsta, unsigned long LocalIberr, unsigned long LocalIbcnt, void *RefData) |
Visual Basic (6.0)
Function Callback (LocalUd%, LocalIbsta%, LocalIberr%, LocalIbcnt&, RefData$) |
コールバックパラメータ
LocalUd | ボードまたはデバイスデスクリプタ |
LocalIbsta | Ibstaの値 |
LocalIberr | Iberrの値 |
LocalIbcnt | Ibcntの値 |
RefData | ユーザ定義のコールバック用参照データ |
コールバックの戻り値
次に通知するGPIBイベントのビットマスク
Callback関数は、プロセスの別のスレッドで実行されます。したがって、任意のプロセスのグローバルデータにはアクセスできますが、スレッドのローカルデータにはアクセスできません。Callbackがグローバルデータにアクセスする必要がある場合は、Callbackは別のスレッドコンテキストで実行されているため、同期プリミティブ(例えば、セマフォ)を使ってそのアクセスを保護する必要があります。あるいは、CallbackがWindowsのPostMessage()関数を使って単にアプリケーションにメッセージを送るだけの場合は、このデータ保護はまったく実行せずに済みます。Callback関数は、ibnotify以外のNI-488.2 APIすべてを呼び出すことができます。Callbackが呼び出されると、NI-488.2グローバル関数(Ibsta、Iberr、Ibcnt)の値が未定義になります。Callbackが呼び出された理由を判断するには、NI-488.2グローバル変数ではなく、Callbackに渡されたステータス変数を調べます。1つ以上の要求されたmaskビットの設定が原因なのではなく、エラー状況によりCallbackが呼び出された可能性があることに注意してください。
Callbackの戻り値は、非同期イベント通知メカニズムを自動的に再登録するのに使用されるマスク値として解釈されます。戻り値が0の場合、再登録は行われません。戻り値が0以外の値の場合、非同期イベント通知メカニズムは戻されたマスク値を使って再登録されます。エラーのためCallbackの再登録に失敗した場合には、Callbackは、ERRが設定されたLocalIbstaやEARMが設定されたLocalIberrとともに呼び出されます。
ibwait、ibstop、およびibonlと同様、非同期I/O処理が完了した後、ibnotify Callbackの呼び出しによってハンドラを再同期化することができます。この場合、I/O処理が完了した後でCallbackに渡されるグローバル変数には、I/O処理のステータスが含まれます。
NI-488.2アプリケーションでの非同期イベント通知の概要については、非同期イベント通知の項を参照してください。使用法についての詳細は、ibnotifyの使用の項を参照してください。
ibnotifyで発生する可能性のあるエラー
EARG | maskに設定されたビットが無効です。 |
ECAP | ibnotifyがibnotify Callback関数内から呼び出されたか、ハンドラが1つ以上指定されたmaskビットについて通知を実行できません。 |
EDVR | NI-488.2ドライバの構成またはインストールが正しくありません。Ibcntには、システム依存エラーコードが含まれます。 |
EHDL | udが無効または範囲外です。 |
ELCK | 他の処理によりロックされているため、要求された動作が行われませんでした。 |
ENEB | インタフェースが取り付けられていないか、正しく構成されていません。 |
コールバックで発生する可能性のあるエラー
EARM | Callbackの戻り値がCallbackの再登録に失敗しました。 |
ERST | インタフェースのリセットが原因でイベント通知がキャンセルされました。 |
関連項目: