PROLOGIX GPIB-ETHERNET CONTROLLER

知人から教えていただいた手軽な GPIB コントローラ

いずれも、汎用のネットワークチップと AVR の 8 bit マイクロコントローラを使っ たシンプルな設計で、安価なので手軽に使えます。

このうち USB の製品は FreeBSD でも uftdi(4) で /dev/cuaU0 になりますから、 tip(1) で直接アクセスするにしても、プログラムを書くにしても、簡単。

一方、LAN インタフェースの製品は Infoseek Search Agent に割当済みの Port 1234 を使った TCP コネクションを使って、コマンドやデータを受渡しするだけですから、 これも telnet(1) で直接アクセスするにしても、プログラムを書くにしても簡単です が、ネットワーク設定をどうするかが問題で、通常のデバイスなら、デバイス側に telnet サーバーとか HTTP サーバーを用意して、ホスト側はデバイスの MAC アドレス を調べて arp -s で ARP entry を作成してから telnet とかブラウザでデバイスにア クセスして、デバイスのネットワークを構成するのが普通ですが、ATmega644P の Flash memory は 64 kbyte しかありませんから、これができません。

そのため、GPIB-ETHERNET Controller では、BOOTP や DHCP のように、既知の UDP ポートを使った broadcast を使うしかなさそうで、供給元では NETFINDER という名前 の Windows で動くユーティリティを用意していて、これで、static IP address か DHCP の設定ができるようになっていますが、私のように、Windows マシンを持たない 環境だと、NETFINDER と同等なプログラムを作るしかありません。そこで、「Windows のない環境で使うために、設定プログラムを自作するための資料がほしいのだが」と聞 いてみたら、驚くべきことに、1 時間もしないうちに、なんとも簡潔・明瞭なドキュメ ントをメイルで送ってくれました。ネットワーク設定の仕組みは極めてシンプルで、 ポート 3040 を使った UDP の limited broadcast で、ネットワークパラメータの設定 と読み出しを行うようになっています。

これなら簡単というわけで、in(4) を見ながら UDP ソケットを作って、setsockopt() で SO_BROADCAST を設定し、255.255.255.255 宛パケットを出してみると、ルータに 配送されてしまいます! それではと、SO_DONTROUTE を追加すると、Network is unreachable のエラー!!

SO_BROADCAST と IP_ONESBCAST の組み合わせでもルータに配達され、ローカルブロード キャストを送り先に切替えて、SO_BROADCAST と IP_ONESBCAST を指定すると、イサネッ トフレームの宛先は ff:ff:ff:ff:ff:ff になりますが、IP フレームの宛先が 255.255.255.255 になりません。

O_BROADCAST と IP_ONESBCAST の組み合わせで宛先を 255.255.255.255 にした場合も ルータに配送。

誰か同じ苦労をしていないかと検索してみたら、

  http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/99558

が見付って、普段使っている FreeBSD-6.1 から FreeBSD-7.2 に切替えてみたところ、 UDP はダメですが、RAW socket で正常に動作しました。具体的には、

  1. fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)
  2. setsockopt(fd , IPPROTO_IP, IP_ONESBCAST, ..)
の組み合わせで、うまくゆきます。注意点は、
  1. sin.sin_addr.s_addr は 255.255.255.255 でなく、自分のネットワークの broadcast address にする (これで、送信時に 255.255.255.255 に変更される。 255.255.255.255 を指定すると、うまくゆかない)
  2. SOCK_UDP で soket() を作ると、うまくゆかない。
  3. SO_BROADCAST の socket option は要らない。
です。

SO_DONTROUTE が使えないのは FreeBSD の bug だと思いますが、もっと前の RELEASE だと、IPPROTO_RAW でもだめだということがわかって、最終的に bpf(4) で直接イー サネットフレームを送り出す方針に切替えました。

どなたかのお役にたつこともあるでしょうから、作成したプログラム はPrologix, LLCが用意してくれた資料ととも に公開しておきますが、極めてコスト パフォーマンスの高い製品だと思います。

VXI-11 用 GPIB ライブラリを使ったアプリケーションプログラムが使えるように設計 したライブラリも用意してておきました。

注 1 - デバイスの概要と入手法

マニュアルはPrologix, LLCのサイトから 入手できます。REN の制御ができませんし、EOI なしの固定長バイナリデータの入力が できないとか、lockout, parallel poll など複雑な制御ができない、 SRQ の非同期割り込みが使えないといったことはありますが、日常の制御で困ることは なさそうですし、完全ではないにしても、デバイスモード(ノン・コントローラ・モー ド)でも使えますから、現時点でこれを越えるコストパーフォーマンスを持つ製品はな いと思います。

日本からの通信販売では、入手に 1 週間かかりますが、最大の遅延は通関手続きです。

注 2 - Mac OS X でのコンパイル

Mac OS X で動かされたかたから、注意点をまとめていただきました。 Mac OS X でも bpf(4) - Berkeley Packet Filter が使えるようです。

「下記のアーカイブを解凍し、pgconfの下にある "pgconf.xcodeproj" をダブルクリックするだけで、Xcode上でのコンパイルの準備ができますから、 Buildするだけです。一応、manファイルも作ってみました。 programの下に実行ファイルが入っています。」ということです。

pgconf.zip - Mac OS X 用パッケージ

平林浩一, 2009-10-07, 2013-06-18