VXI-11 GPIB ライブラリ関数説明書

VXI-11 サーバー透過になるように設計されていますが、 サンプルプログラムと見比べると、理解が早いと思います。

gbopn(char *host)

host で指定した機器との Core Channel を作成し、 Abort Channel, Interrupt Channel の作成準備を行います。 host には VXI-11 機器の IP address か DNS で引ける名前を指定します。 失敗すると -1、成功すると 0 が戻ります。 プログラムの開始時に1度だけ実行します。

gbcls(void)

すべての Device Link を切り、VXI-11 機器との Channel を開放します。 失敗すると -1、成功すると 0 が戻ります。 プログラムの終了時に1度だけ実行します。 これを忘れると、子プロセスが残ってしまいますので、 その場合は ps(1) コマンドで残った子プロセスを見付けて kill(1) してください。

gblost(int time)

I/O timeout の時間を ms 単位で指定します。Lock timeout は変わりません。

gblost2(int time1, int time2)

I/O timeout の時間を time1、Lock timeout の時間を time2 で ms 単位で指定します。 初期値はそれぞれ 10 秒と 0 秒です。 デバイスが他のプロセスにロックされているとき、 GPIB デバイスにアクセスする関数は、 Lock timeout が 0 ならエラー終了し、 Lock timeout が 0 より大きければ、その時間までロック解除を待ちます。

gbwrt(int ad, char *buf, int cnt, int del)

ad で指定する GPIB デバイスに、データを出力します。 パラメータの意味は、次のとおりです。

  ad  - GPIB アドレスを指定します。
  buf - 出力データのアドレスです。
  cnt - 出力データのバイト数を指定します。
  del - デリミタを指定します。

アドレスとして2次アドレスを必要とする場合は、

  1次アドレス * 100 + 2次アドレス
とします。 例えば、 702 なら、1次アドレス 7 、2次アドレス 2 になります。

GPIB アドレスに 31 を指定すると、 E5810A の RS-232 ポートに出力します。

cnt が 0 以下の場合は、buf にセットした文字列の長さになります。 cnt が 1 より大きい場合は、指定されたバイト数だけのデータを出力し、デリミタ があれば、その後に追加します。

del (デリミタ)の指定法は、次のとおりです。

  0 - なし
  1 - END (最後の出力データに END を付加します。)
  2 - CR/LF (データの終りに CR と LF を追加します。)
  3 - CR+END (データの終りに END 付きの CR を付加します。)
1 は IEEE488、2 は HP 社、3 は TEKTRONIX 社の標準的なデリミタです。 HP 社の古いデバイスの中には、 END をデリミタにするとうまく動かないものがありますので、注意してください。 IEEE488 の前身である HP-IB 時代には EOI はパラレルポールにしか使われなかった ため、 END メッセージの意味はなく、 HP 社のコントローラには、END メッセージを使わないものがあります。

失敗したら -1、成功したら実際に出力したバイト数を返します。

gbred(int ad, char *buf, int cnt, int del)

ad で指定する GPIB デバイスから、データを入力します。 パラメータの意味は、次のとおりです。

  ad  - GPIBアドレスを指定します。
  buf - 入力データを格納するアドレスです。
  cnt  - 入力データのバイト数を指定します。
  del - デリミタを指定します。

アドレスとして2次アドレスを必要とする場合は、

  1次アドレス * 100 + 2次アドレス
とします。例えば、 1512 なら、1次アドレス 15 、2次アドレス 12 になります。

del(デリミタ)の指定法は、次のとおりです。

  0 - なし(デリミタなしの固定長入力)
  1 - END
  2 - CR/LF (データの終りの CR と LF は削除します。)
  3 - CR+END (データの終りの CR は削除します。)
0 はバイトカウント方式の固定長入力で、AD変換器などに良く見られる方式です。 ただし、 END を受信した場合は、cnt に満たなくても終了します。 1 は IEEE488、2 は HP 社、3 は TEKTRONIX 社の標準的なデリミタです。

入力データが END や EOS で終ったかどうかは、 gbwait(-1) 関数で調べることができます。

gbred() は、実際にバッファに格納したバイト数を返します。 CR/LF か CR のデリミタを指定した場合は、デリミタを削除します。

GPIB アドレスに 31 を指定すると、 E5810A の RS-232 ポートから入力します。

gbwait(int mask)

mask が -1 なら、直前の read() や GPIB の状態を示すステイタスワードを持ち帰ります。 これは read() の終了が EOI 受信で終ったかどうかを調べたり、 制御権の移動を確認したりするのに使います。 情報ビットの内容は次のとおりです。

  ビット 意味
  ---------------------------------------------------------------------
  0 - REQCNT: 直前の read() は cnt で指定した最大長で終了
  1 - CHR   : 直前の read() は del で指定されたデリミタ文字 (EOS) で終了
  2 - END   : 直前の read() は END で終了
  6 - SRQ   : SRQ を受信

mask が 0 なら上記のうち SRQ ビットだけをセットします。 これは、ポーリングで SRQ の存在を確認したりするのに使います。 mask の値が 1 以上の場合は、SRQ が出るのを待ちます。

gbspol(int ad)

ad で指定された GPIB アドレスの機器に対してシリアルポールを実行し、 入手したステイタスバイトを持ち帰ります。

gblcl(int ad)

ad で指定された GPIB アドレスの機器をローカル状態にして、 正面パネルからのマニュアル操作を受け付けるようにします。

gbrmt(int ad)

ad で指定された GPIB アドレスの機器をリモート状態にして、 正面パネルからのマニュアル操作を禁止します。

gbclr(int ad)

ad で指定された GPIB アドレスの機器をクリアします。

gbtrg(int ad)

ad で指定された GPIB アドレスの機器をトリガします。

gbabort(int ad)

ad で指定された GPIB アドレスの機器の入出力を中断します。

gblock(int ad)

ad で指定された GPIB アドレスの機器をロックして、 他のプロセスから使えないようにします。

gbunlock(int ad)

ad で指定された GPIB アドレスの機器をロック解除して、 他のプロセスから使えるようにします。

gberr(void)

VXI-11 RPC メッセージの最後のエラーコード(Deevice_ErrorCode)を返します。

gbint(void *)

SIGINT シグナル受信時に実行すべき関数を VXI-11 GPIB ライブラリに登録します。

gbsrq(void *)

SRQ 受信時に実行すべき関数を VXI-11 GPIB ライブラリに登録します。

注記事項

  1. ライブラリ内部で SIGINT を捕捉していますので、 アプリケーションプログラムで SIGINT を使うことができません。 必要なときは、 gbint(void *) で SIGINT 発生時の処理を行う関数をライブラリに登録してください。
  2. Interrupt Channel を生成する子プロセスが device_intr_srq メッセージの受信を Core Channel を生成する親プロセスに伝えるために、 SIGUSR1 シグナルを使っているため、 アプリケーションプログラムで SIGUSR1 を使うことができません。
  3. アプリケーションプログラムでは、 下記のいずれかでライブラリをリンクします。
  4. ライブラリはすべての Unix 環境で使えるように、 子プロセスで非同期に device_intr_srq メッセージが発生する Interrupt Channel を引き受け、 シグナルで Core Channel を引き受ける親プロセスに通知する設計にしてあります。 共有メモリが使えるシステムならシグナルを共有メモリにすることができますし、 Posix Thread が使えるシステムなら、 fork() を別の thread にすることができます。
  5. DeviceLink が作成されるのは、 最初にその GPIB デバイスにアクセスしたときです。
  6. Interrupt Channnel の生成は、 最初の DeviceLink が作成されたときです。
  7. アプリケーションプログラムのソースコードで gpib.h をインクルードすると間違いが減ります。
  8. VXI-11 GPIB ライブラリは VXI-11 デバイスを簡単なプログラムで制御できるようにする ことを目的に設計されたもので、 INTEX 207X 用 GPIB ライブラリとほぼ互換になっています。
  9. RS-232 ポートが使えるのは、gbwrt(), gbred() だけです。 RS-232 ポートの設定はブラウザか telnet で行います。
  10. gpib.h(インクルードファイル)の内容は次のとおりです。
    /* wait() function status bits */
    #define GBR_REQCNT	0x01	/* device_read reason REQCNT bit */
    #define GBR_CHR		0x02	/* device_read reason CHR bit */
    #define GBR_END		0x04	/* device_read reason END bit */
    #define GBI_SRQ		0x40	/* this library dependent */
    
    /* library funcyion prototypes */
    int gbabort(int ad);
    int gblock(int ad);
    int gbunlock(int ad);
    int gbwrt(int ad, char *buf, int cnt, int del);
    int gbred(int ad, char *buf, int cnt, int del);
    int gbspol(int ad);
    int gbtrg(int ad);
    int gbclr(int ad);
    int gbrmt(int ad);
    int gblcl(int ad);
    int gblost(int time);
    int gblost2(int time1, int time2);
    int gbwait(int mask);
    int gbopn(char *host);
    int gbcls(void);
    int gberr(void);
    void gbint(void *);
    
    /* INTEX 207X GPIB library compatible functions */
    int gbcmod(int mode);
    int gbifc(void);
    int gbren(int f);
    int gblst(int time);
    int issrq(void);
    
    /* INTEX 207X GPIB library compatible dummy functions */
    int gbadr(int ad);
    int gbmsg(char *msg);
    int gbppol(int ad);
    int gbppc(int ad, int data);
    int gbppu(int ad);
    int gbsrq(int data);
    
2008-07-10 Kouichi Hirabayashi