IBNOTIFY

NI-488.2

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以外の値の場合、ibnotifymaskが指定したイベントを監視し、発生したイベントがあれば指定の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つだけです。現行のibnotifyudに対して有効な場合、これは後続の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グローバル関数IbstaIberrIbcnt)の値が未定義になります。Callbackが呼び出された理由を判断するには、NI-488.2グローバル変数ではなく、Callbackに渡されたステータス変数を調べます。1つ以上の要求されたmaskビットの設定が原因なのではなく、エラー状況によりCallbackが呼び出された可能性があることに注意してください。

Callbackの戻り値は、非同期イベント通知メカニズムを自動的に再登録するのに使用されるマスク値として解釈されます。戻り値が0の場合、再登録は行われません。戻り値が0以外の値の場合、非同期イベント通知メカニズムは戻されたマスク値を使って再登録されます。エラーのためCallbackの再登録に失敗した場合には、Callbackは、ERRが設定されたLocalIbstaEARMが設定されたLocalIberrとともに呼び出されます。

ibwaitibstop、およびibonlと同様、非同期I/O処理が完了した後、ibnotify Callbackの呼び出しによってハンドラを再同期化することができます。この場合、I/O処理が完了した後でCallbackに渡されるグローバル変数には、I/O処理のステータスが含まれます。

NI-488.2アプリケーションでの非同期イベント通知の概要については、非同期イベント通知の項を参照してください。使用法についての詳細は、ibnotifyの使用の項を参照してください。

ibnotifyで発生する可能性のあるエラー

EARG maskに設定されたビットが無効です。
ECAP ibnotifyibnotify Callback関数内から呼び出されたか、ハンドラが1つ以上指定されたmaskビットについて通知を実行できません。
EDVR NI-488.2ドライバの構成またはインストールが正しくありません。Ibcntには、システム依存エラーコードが含まれます。
EHDL udが無効または範囲外です。
ELCK 他の処理によりロックされているため、要求された動作が行われませんでした。
ENEB インタフェースが取り付けられていないか、正しく構成されていません。

コールバックで発生する可能性のあるエラー

EARM Callbackの戻り値がCallbackの再登録に失敗しました。
ERST インタフェースのリセットが原因でイベント通知がキャンセルされました。

関連項目:

ibnotifyの使用

ibnotifyの使用例

GpibNotify

GpibNotifyの使用