ibnotifyの使用例

NI-488.2

ibnotifyの使用例


int __stdcall MyCallback (int LocalUd, unsigned long LocalIbsta, unsigned long LocalIberr, unsigned long LocalIbcnt, void *RefData);
int ReadingsTaken = 0;
float Readings[1000];
BOOL DeviceError = FALSE;
char expectedResponse = 0x43;

int main() 
{
   int ud;

// 固有の識別子をデバイスに割り当て、変数udに格納します。利用可能な 
// デバイスをibdevが開き、GPIB0にアクセスするためにプライマリアドレス1、 
// セカンダリアドレス0、タイムアウト10秒を設定します。
// E0Iラインによる終了メッセージを有効にして、EOSモードを無効にします。 
   // udが0より小さい場合は、呼び出しが失敗したというエラーメッセージを表示し、 
// プログラムを終了します。
   ud = ibdev   (0,   // デバイスが接続されたボード番号
1,   //GPIBデバイスのプライマリアドレス
0,   //GPIBデバイスのセカンダリアドレス
T10s,   // タイムアウト10秒
1,   //EOTモードON
0);   //EOSモード解除

if (ud < 0)  {
printf ("ibdevに失敗しました。\n");
return 0;
   }

// データを送信するように、デバイスに対して要求します。ERRビットがIbstaに 
// 設定されていたら、コールに失敗したというエラーメッセージを表示して、 
// プログラムを終了します。
ibwrt (ud, "SEND DATA", 9L);
if (Ibsta() & ERR) {
printf ("デバイスへ書き込みできません。\n");
return 0;
   }
   // RQSビットに対する、非同期のイベント通知の設定を行います。
ibnotify (ud, RQS, MyCallback, NULL);
if (Ibsta() & ERR) {
printf ("ibnotifyコールに失敗しました。\n");
return 0;
   }

   while ((ReadingsTaken < 1000) && !(DeviceError))  {
// アプリケーションが有効な処理をします。たとえば、デバイスの
// 読み取り処理などです。
   }
   
// イベント通知を解除
ibnotify (ud, 0, NULL, NULL);

// ibonl関数をコールして、ハードウェアおよびソフトウェアを無効にします。
   ibonl (ud, 0);
return 1;

}

int __stdcall MyCallback (int LocalUd, unsigned long LocalIbsta, unsigned long LocalIberr, 
unsigned long LocalIbcnt, void *RefData)
{
char SpollByte;
char ReadBuffer[40];
// LocalIbstaにERRビットが設定されていたら、エラーメッセージを表示して 
   // 戻ります。
      if (LocalIbsta & ERR)  {
printf("GPIBエラー%dが発生しました。これ以上、コールバックはありません。\n", 
LocalIberr);
DeviceError = TRUE;
return 0;
   }
   
// Read the serial poll byte from the device.ERRビットが
// LocalIbstaに設定されている場合、エラーメッセージを表示して戻ります。
LocalIbsta = ibrsp (LocalUd, &SpollByte);
if (LocalIbsta & ERR)  {
printf("ibrspに失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
   }

// 返されたステータスバイトが予期された応答であれば、デバイスには 
// 送信する有効データがあります。ない場合は失敗状態なので、 
   // そのことを知らせます。
   if (SpollByte != expectedResponse)   {
printf ("デバイスは無効な応答を返しました。Status byte = 0x%x\n",  
SpollByte);
DeviceError = TRUE;
return 0;
   }

// デバイスからデータを読み取ります。ERRビットがLocalIbstaに設定されている場合、 
// エラーメッセージを表示して戻ります。
LocalIbsta = ibrd (LocalUd, ReadBuffer, 40L);
if (LocalIbsta & ERR)  {
      printf("ibrd に失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
   }

// ibrdによって返された文字列は、Ibcntlのバイトカウント 
// により指定された長さを持つバイナリ文字列です。ただし、
// 多くのGPIB計測器は、ASCIIデータ文字列を返します。この
// サンプルもそうであると仮定します。このため、NULL文字
// を受信データの終わりに追加し、printf()関数を使用して
// ASCIIデータを表示することができます。以下のコードは、
// それを示しています。
ReadBuffer[LocalIbcnt()] = '\0';

// データを数値に変換します。
sscanf (ReadBuffer, "%f", &Readings[ReadingsTaken]);

// データを表示します。
Printf ("Reading : %f\n", Readings [ReadingsTaken]);

   ReadingsTaken += 1;
if (ReadingsTaken >= 1000)  {
return 0;
   }
else {

// データを送信するようにデバイスに対して要求し、RQSに対するコールバック
// を再設定します。
LocalIbsta = ibwrt (LocalUd, "SEND DATA", 9L);
if (LocalIbsta & ERR)  {
printf("ibwrtに失敗しました。これ以上、コールバックはありません。\n");
DeviceError = TRUE;
return 0;
      }
else {
return RQS;
      }
   }
}


関連項目:

ibnotifyの使用

ibnotify

GpibNotify

GpibNotifyの使用