過去 10 年程、207XシリーズにはGP-IB制御の簡易化を目的にした gpxというプログラミング言語のバイナリを添付してきましたが、ソース もほしいというご要望に答えるため、新しい公開用のバージョンを用意し、現在 そのベータテスト版が 配布可能になりました。
GP-IBの制御には当社の207Xシリーズのライブラリを使っていますが、 他社製品も使えるように、インタフェース関数を作るための「porting guide」も 用意してあります。
gpxはGP-IB制御の簡略化を目的とした言語で、構文はawkに 準拠していますので、Unixの利用者は簡単にマスターできます。
プログラム例を見ていただくのが理解の早道でしょう。
次のプログラムは、インピーダンス測定器YHP4191(GP-IB address 17)の 自動スイープ機能を利用して、 1 MHz から 2 MHz まで 0.05 MHz 間隔で反射係数 を測定し、スミスチャートにプロットしています。
入力フィールドセパレータをコンマに設定し、データの数値部分だけをスミス チャート作成コマンドsmithに渡していることに注意して下さい。 if 文は、自動スイープの終わりをチェックしています。
gpx ' BEGIN { FS = "," # データのフィールドセパレータをコンマに設定 print "A6TF1ENPF2ENSF.05ENWU" >"GPIB 17" # ファンクション設定 } { getline < "GPIB 17" # 測定データの読みだし x = substr($2, 4) # 反射係数の実部 y = substr($3, 4) # 反射係数の虚部 print x, y | "smith" # スミスチャート作図コマンドの呼び出し if (!spoll(17) & 16) # スイープの終りをチェック exit }'BEGINは実行時の最初に一度だけ実行されます。メインループの部分は exit, break, nextのいずれかが実行されるまで永久 ループになります。exitは即座に終了しますが、breakと nextでメインループを抜け出した場合はENDセクションがあれば それを一度だけ実行してから終了します。
デジタルマルチメータHP3478Aから、パネル正面の SRQ ボタンを押す度に、 データを入力しています。
gpx ' BEGIN { print "F1N5M20" >"GPIB 23" # ファンクション設定 } INR > 10 { # データを 10 読んだら終り next } SRQ 23 { # GP-IB address 23 の SRQ 割り込みサービスルーチン getline < "GPIB 23" print STB, INR # ステイタスバイトとレコード番号を表示 print ?0 } END { print "M00" >"GPIB 23" # SRQ がでないように設定して終了 }'
SRQ割り込みを使った例です。割り込みサービスルーチンで入力した データは$*でなく、?*で参照し、レコード番号もNR でなくINRになります。
HP54616B OSCILLOSCOPEを Autoscale に設定し、デジタイジングした波形 データを読み込んで、gnuplotコマンドでグラフ表示しています。
オシロスコープが出力する波形データは大きいですから、メモリに読み込まずに 直接ファイルに出力し、それをgnuplotで作図できるように、awkで 処理しています。
# get wave form data from HP54616B trap 'rm tmp.pre tmp.dat' 0 1 2 3 4 5 15 gpx ' BEGIN { print "*RST" >"GPIB 7" print ":AUTOSCALE" >"GPIB 7" print ":DISPLAY:GRID ON" >"GPIB 7" print ":ACQUIRE:TYPE AVERAGE" >"GPIB 7" print ":ACQUIRE:COMPLETE 100" >"GPIB 7" print ":WAVEFORM:SOURCE CHANNEL1" >"GPIB 7" print ":WAVEFORM:FORMAT ASCII" >"GPIB 7" print ":ACQUIRE:COUNT 8" >"GPIB 7" print ":WAVEFORM:POINTS 500" >"GPIB 7" print ":DIGITIZE CHANNEL1" >"GPIB 7" print ":WAVEFORM:PREAMBLE?" >"GPIB 7" gbget("tmp.pre", 7, 1); # preamble print ":WAVEFORM:DATA?" >"GPIB 7" gbget("tmp.dat", 7, 1); # data } ' awk ' BEGIN { getline <"tmp.pre" n = split($0, p, ","); getline <"tmp.dat" n = split($0, y, ",") i = substr(y[1], 2, 1) y[1] = substr(y[1], substr(y[1], 2, 1) + 3) for (i = 1; i <= n; i++) print (i-p[7])*p[5]+p[6], (y[i]-p[10])*p[8]+p[9] >"wave.dat" exit 0 }' gnuplot <<! plot "wave.dat" with lines pause 10 !