GP-IB の制御を簡単にするプログラミング言語 gpx

過去 10 年程、207XシリーズにはGP-IB制御の簡易化を目的にした gpxというプログラミング言語のバイナリを添付してきましたが、ソース もほしいというご要望に答えるため、新しい公開用のバージョンを用意し、現在 そのベータテスト版が 配布可能になりました。

GP-IBの制御には当社の207Xシリーズのライブラリを使っていますが、 他社製品も使えるように、インタフェース関数を作るための「porting guide」も 用意してあります。

1. 概要

gpxGP-IB制御の簡略化を目的とした言語で、構文はawkに 準拠していますので、Unixの利用者は簡単にマスターできます。

プログラム例を見ていただくのが理解の早道でしょう。

2. プログラム例 (1)

次のプログラムは、インピーダンス測定器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は即座に終了しますが、breaknextでメインループを抜け出した場合はENDセクションがあれば それを一度だけ実行してから終了します。

2. プログラム例 (2)

デジタルマルチメータ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になります。

2. プログラム例 (3)

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
!