[1] VXI-11 GPIB ライブラリの概要 VXI-11 は GPIB 機器をネットワーク経由で制御するための規格ですが、VXI-11 GPIB ライブラリは Agilent E5810A LAN/GPIB Gateway を使うことを前提に、従来の増設ボ ードを使う感覚で容易にプログラムが書けることを目的に設計したものです。E5810A の機能は VXI-11 規格を参考に、試行錯誤で調べました。 ライブラリ関数は、私が昔設計した INTEX 207X GPIB カードのライブラリとほぼ互換 になるように、VXI-11 サーバー透過な設計にしましたので、これらのカードのために 書かれたプログラムのほとんどは、 gbopn() の引数を追加する程度で動きます。 また、VXI-11 規格に基づいた機器であれば、E5810A 以外でも使えるはずです。 すべてのプログラムは FreeBSD-6.1 の ANSI-C で書いてありますが、Linux など、他 の Unix でも使えると思います。 [2] VXI-11 の仕組みとライブラリ設計 VXI-11 の仕組みは下記のようになっています。 1) Sun RPC を使う。 2) GPIB コントローラと GPIB デバイスの間には下記 3 つのチャネルを作成する。 Core channel (GPIB コントローラがクライアント) Abort channel (GPIB コントローラがクライアント) Interrupt channel (GPIB コントローラがサーバー) 3) 下記のメッセージとチャネルの組合せを使う。 メッセージ チャネル 内容 ----------------------------------------------------------------------- create_link core デバイスへのリンクを作成 dvice_write core デバイスにメッセージを送信 device_read core デバイスから結果を受信 device_readstb core デバイスのステイタス・バイトを読み取る device_trigger core デバイスをトリガーする device_clear core デバイスをクリアする device_remote core デバイスの正面パネルを無効にする device_local core デバイスの正面パネルを有効にする device_lock core デバイスをロックする(排他制御) device_unlock core デバイスのロックを外す device_intr_chan core SRQ 割り込みチャネルを作成 destroy_intr_chan core SRQ 割り込みチャネルを開放する device_enable_srq core デバイスの SRQ 割り込みの有効・無効を指示する device_docmd core GPIB のバス制御、状態監視 destroy_link core デバイスへのリンクを開放 device_abort abort デバイスの GPIB 操作を中断 device_intr_srq interrupt デバイスがサービス要求信号を送信 ライブラリで不規則に発生する SRQ Interrupt をどう扱うかが鍵ですが、ここではあら ゆる Unix 環境で使えるように、Interrupt チャネルを子プロセスが維持し、 device_intr_srq を受信したら、SIGUSR1 で親プロセスに知らせる設計にしました。 また、プログラムの中断時に全ての RPC リンクを開放するため、SIGINT を使っていま すので、アプリケーションプログラムで SIGINT を必要とするときのために hook を用 意してあります。 なお、Agilent E5810A では device_docmd メッセージをサポートしていません。 [3] コンパイルとインストール 適当なディレクトリにソースコードを展開して、 $ make を実行すれば、ライブラリとサンプルプログラムができます。ライブラリをダイナミッ クリンクしたいときは、 # make install を実行して、libgb.so.0.0, libgb.a を /usr/lib、gpib.h を /usr/include にインス トールしますが、それをせずに、自分が作成したアプリケーションプログラムに毎回 gb.o をリンクしても良いと思います。 独自に作成するプログラムには、サンプルプログラムと同じように gpib.h をインクル ードするほうが間違いが減ると思います。 [4] サンプルプログラム 1) s1 - 単純な制御 HP3478A MULTIMETER を直流電圧測定(F1)、5 桁測定(N5)、内部トリガ(T1)、SRQ なし (M00) に設定し、10 回の測定を行っています。 2) s2 - フロントパネル SRQ による測定 (SRQ 割り込み) HP3478A MULTIMETER を直流電圧測定(F1)、5 桁測定(N5)、外部トリガ(T2)、フロント パネル SRQ (M20) に設定し、10 回の測定を行っています。フロントパネル SRQ 釦が 押される度に、トリガをかけて測定します。 3) s3 - フロントパネル SRQ による測定 (ポーリング) s2 と同じですが、シリアルポールでステイタスバイトを読み出して、SRQ ビットがセ ットされるのを待ちます。 4) s4 - 複数プロセスによる共有 s1 と同じですが、HP 3478 MULTIMETER へのアクセスをロックしていますので、複数 のプロセスで共用することができます。他のプロセスが使用中のときは、gblost() で 指定された 10000 ms の間ロック解除を待つことになります。 5) s5 - 複数デバイス もう1台の HP3478A MULTIMETER (GPIB アドレス 22) を直流電流測定(F5)、 5 桁測定 (N5)、内部トリガ(T1)、SRQ なし(M00) に設定し、同時に 10 回の測定を行っています。 6) s6 - アプリケーションプログラムでの SIGINT の扱い s1 に SININT 割り込みの処理関数を追加したものです。ライブラリで SIGINT を使っ ているため、アプリケーションプログラムでは、SIGINT 発生時の処理をライブラリ内部 でやってもらうことになります。 7) s7 - HP 54616B OSCILLOSCOPE の画面ダンプ HP 54616B オシロスコープの画面をダンプするプログラムです。「:PRINT?」コマンド を使って、HP-PCL 対応のプリンタに出力する印刷データを取り出して、画像データに 変換しています。 8) s8 - RS-232 入出力 GPIB アドレスを 31 にすると、Agilent E5810A の RS-232 ポートへの入出力ができま すので、HP 34401A MULTIMETER の RS-232 インタフェースと Agilent E5810A LAN/GPIB Gateway をクロスケーブルで接続し、デバイス名を読み出した後、DC 電圧測定を 10 回 行っています。 9) s9 - SRQ 割り込み HP3478A MULTIMETER を直流電圧測定(F1)、5 桁測定(N5)、外部トリガ(T2)、測定完了 SRQ (M21) に設定し、10 回の測定を行っています。最初に gbspol() で過去の SRQ をクリアしてから、SRQ サービスルーチン(onsrq)を登録し、gbtrg() で測定を開始し、 測定完了 SRQ が出る度に、SRQ 割り込みルーチンでデータを読み取って、次の測定を 指示します。メインルーチンでは SRQ が出るまで pause() しながら、10 回の測定が 終わるのを待っています。 押される度に、トリガをかけて測定します。 [5] VXI-11 の規格 VXI-11 の規格は http://www.vxibus.org/files/VXI_Specs/VXI-11.zip から入手可能 で、下記 4 つの文書にまとめられています。 TCP/IP Instrument Protocol Specification VXI-11 TCP/IP-VXIbud Inteface Specification VXI-11.1 TCP/IP-IEEE488.1 Interface Specification VXI-11.2 TCP/IP-IEEE488.2 Instrument Interface Specification VXI-11.3 [6] E5810A の設定 DHCP サーバーがあれば、初期設定の E5810A は DHCP で自己アドレスを取得しますの で、その IP address を使って、ブラウザか telnet で接続し、dhcp、upnp ともに off にして、 ip address subnet-mask gateway を設定するだけで使えます。失敗したら、Preset 釦で初期化してください。 パネルに表示される hostname と dns-server も設定するほうが良いと思います。 このライブラリでは、GPIB アドレスに 31 を指定すると、RS-232 ポートへの書き込み と読み込みができるようになっていますので、RS-232 を使う場合は、RS-232 の設定も 行ってください。 Windows 用の Agilent IO Libraries などのソフトウェアは不要です。 [7] rpcbind (portmap) Program Number Version Protopcol -------------------------------------------------------- Core Channel 395183 1 TCP Abort Channel 395184 1 TCP Interrupt Channel 395185 1 TCP XVI-11 が使用する RPC のプログラム番号、バージョン番号は上記のとおりですが、 RPC は rpcbind 機構を使って、プログラム番号、バージョン番号、プロシージャ番号 と使用するアドレスの対応を付けますから、このライブラリを使うためには、 rpcbinder (portmapper) が動いていなければなりません。もしも、 $ rpcinfo -p などを実行して、 rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused といったエラーが出るようなら、rpcbind (以前は portmap) を動かしてから、このラ イブラリを使ってください。 FreeBSD では /etc/rc.conf に rpcbind_enable="YES" と書いておくと起動時に rpcbind(8) が動きます。少し前の FreeBSD では rpcbind で なく portmap(8) が使われていますので、 portmap_enable="YES" にしなければなりません。 [8] DNS rpcbind が動いていても、なかなかつながらないときは、使っている端末が DNS で正 逆両方の検索ができることを確認してください。 [9] Debian GNU/Linux の注意 (2013-05-31) 物材機構の轟さんから、下記注意点を教えていただきました。 症状: Debian 7.0 Wheezy 上で、svc_register() がエラーとなる。rootで実行すると この症状は現れない。 原因: Debian 6.0 Squeeze の portmap パッケージが rpcbind パッケージに代替とな り、rpcbind デーモンが Cannot register service: RPC: Authentication error; why = Client \ credential too weak と判定する。 対処法: rpcbind デーモンをinsequreモードで動かす。/etc/init.d/rpcbind 内の OPTIONS="-w" を OPTIONS="-w -i" に書き換える。 平林 浩一 (2008-07-10)