GP-IB device Description Langage (GDL)

96/9/13 KIS:吉田 奨

01/06/12 改訂


  1. GP-IB device Description Langage(GDL)について
  2. GDLファイル形式
  3. GDLキーワード(テーブル)及び、各フィールドの説明
    1. ファイル名
    2. デバイス名
    3. ネームテーブル
    4. Efastテーブル
    5. SrqHandlerテーブル
    6. TimeOut設定
    7. EOS設定
    8. IoType設定
    9. パラメータテーブル
  4. GDLファイルサンプル(Tek2430オシロスコープ)
  5. レコードタイプ別の必要最低限の記入項目(コマンドテーブル)
  6. コンパイル方法
  7. Device登録

1、GP-IB device Description Langage(GDL)について

今までの、EPICS Gpib device の作成ではC言語を使い、5つのテーブルと必要に応じてデータ変換関数などを書きます。
C言語の構造体で指定するテーブルは、可読性に欠けていて、記述する時に各フィールドの順番を考慮したりする必要が有りました。
GP-IB device Description Langage(以下GDL)は,EPICEのGpibデバイスサポートの記述を簡略し,EPICSでのGpib機器の取り扱いを容易にするために開発しました。

2、GDLファイル形式   

                                        *太字はキーワード
 
Device   DeviceName                  デバイス名
 
NameTable   NameTabl_name= name_1:val_1,name_2:val_2...;  ネームテーブル
 
EfastTable   Efast_name=name_1,name_2.....;        Efastテーブル
 
SrqHandler   Handler_name  param_name;        SrqHandlerテーブル
 
TimeOut  Time;                                                 TimeOut設定
 
EOS  EndOfString;                                               EOS設定
IoType  IO Type;                                               IO Type設定
%%C言語コード
%{
        C言語コード
}%
ParamTable {                  パラメータテーブル
        param_name1 {
                        rec = ai,
                        type = read,
                        .
                        ...
                                }
        param_name2 {
                        rec = bi,
                        type = read,
                        .
                        ...
                                }
}
 
%%C言語コード
%{
        C言語コード
}%
 
構文規則
1)Gpig機器1種類に対して、GDLファイル1つ作成する。
2)デバイス名は、ファイルの先頭に1回だけ、記述する。
3)ネームテーブルとEfastテーブルは、必ずパラメータテーブルの前に記述する。
3)各テーブルで文字列を入力する時は、”(ダブルコーテーション)で囲む。
4)C言語でデータ変換関数を記述する時は、%{C言語コード}%のように記述する。1ラインの時は、%%で書き始める。

3、GDLキーワード(テーブル)及び、各フィールドの説明

例に使用しているのはTek2430オシロスコープです。
 
 

ファイル名

 

devnameGpib.gt
上記のようにnameにGpib機器の名前など任意の名称を付ける。
拡張子はgt
 
例
devTek2430Gpib.gt
 
 

デバイス名

 

基本的にファイル名のnameに付けた名称を付ける。
必ず、書き出しはアルファベットで始めてください。
 
例
Device   Tek2430
ネームテーブル
binary、multibit binary レコードの VAL フィールドに対する NAMEフィールドの文字列を、ネームテーブルを使用することで DCT などを使わずに記述できる。このとき、DCT などで表示される NAME フィールドは空欄(ブランク)にしておく必要がある。空欄にしなければ DCT などで指定した NAME フィールドの名前が使用される。
NameTable NameTabl_Name = name_1:val_1,name_2:val_2......;

ネームテーブルは上記に示す通り,ネームテーブル名(NameTabl_Name),NAMEフィールドの文字列(name_n),文字列に対応するVALフィールドの値(val_n)から構成されている。val_nは省略ができ,記述しない時は,name_nに対して左から順に0〜nの数値が割り当てられる。

NameTable   NameTabl_Name = name_1:0,name_2:1;  と
NameTable   NameTabl_Name = name_1,name_2; は同じ表現となる。
 
例
NameTable   VoltRange="CH1 VOLTS:2E-3":2,"CH1 VOLTS:5E-3":5,"CH1 VOLTS:1E-2":10;
NameTable   OffOn = off, on;
Efastテーブル
binary、multibit binary レコード・タイプを使用する時にデータ変換用文字列として、使用される。"TERM LO"、"TERM HI" や "OFF"、"ON" などモードの切り替えなどの時使うと便利である。すなわち、BO レコードの VAフィールドの値が0のときに "TERM LO"、1のときに "TERM HI" コマンドを作る変換ルーチンが用意されている。レコードの VAL フィールドの値に対応するコマンドを以下のように EFAST テーブルに記述する。
EfastTable   Efast_name=name_1,name_2.....; 
 
Efastテーブルは上記に示す通り,Efastテーブル名(Efast_Name),変換
文字列(name_n)から構成されている。
 
Efast I/O オペレーションにおけるデータの流れを以下に示す。
○インプット

commandフィールドに登録されたコマンドが機器に送られ、データが読み返される読み返されたデータは、EFAST テーブルに登録された0番目の文字列から比較され、一致した文字列のインデックスがレコードの RVAL フィールドに入れられる。文字列の比較は左から右へ、EFAST テーブルに登録された文字数のみ行われる。例えば機器から読み返されるデータが、"OFF;XOFF;960"、"ON;XOFF;960" の場合、文字列の違いは "OFF" と "ON" だけなので、EFAST テーブルへの記述を以下のようにすれば、文字列の比較にかかる時間が短縮できる。

例
EfastTable    OffOn  =  "OFF", "ON";
 
"OFF;XOFF;960"が読み返されるとレコードには、値"0"が入る。
"ON;XOFF;960"が読み返されるとレコードには、値"1"が入る。
○アウトプット

VAL フィールドが EFAST テーブルへのインデックスとなり、機器に送られるコマンド(文字列)が選ばれる。EFAST テーブルに記述された文字列は変換されることなく、そのまま機器に送られる。

例
EfastTable    OffOn  =  "OFF", "ON";
 
値"0"を出力すると、Gpib機器に"OFF"が送られる。
値"1"を出力すると、Gpib機器に"ON"が送られる。
SrqHandlerテーブル
GPIB機器からのSrq割り込みに対する処理を行う関数名の定義を行います。
Srqには、コマンドを発行してSrqを待つ方法とGPIB機器から直接Srqが起こる場合の2つがあります。直接Srqが起こる時には、関数名の他に、実行するパラメータを指定する必要があります。パラメータは、パラメータテーブルで記述します。

SrqHandler Handler_name param_name;

Handler_nameには、関数名を指定します。
param_nameには、直接Srqが発生した時、実行するパラメータ名

TimeOut設定
GPIB機器へコマンドを発行した時のタイムアウトの時間を設定する。
通常は、設定の必要は有りませんが、レスポンスが遅いGPIB機器にアクセスするときには、設定が必要です。
TIME OUTのメッセージが出ている時には、変更してください。
単位はティクスで60で約1秒です。

デフォルトは[\nに設定されています。

EOS設定
GPIB機器から返送されるデータのEOSを設定する。
デフォルトは[\n]に設定されています。

EOSが異なる機器に対してのみ使用します。

IoType設定
GPIBインターフェースのタイプを記述する。
.dbdファイルに出力されるデバイスタイプに変更を加える時使用します。
デフォルトは[GPIB_IO]に設定されています。

パラメータテーブル
GPIB 機器に送るコマンドや読み取るデータに対する処理などをパラメータ・テーブルに記述する。そのフォーマット及び、各フィールドの説明を以下に示す。
Para  mTable { 
param_na  me {  パラメータテーブルネーム 
rec=...,  レコードタイプ 
type=...,  GPIB I/Oオペレーションタイプ 
pri=...,  プライオリティ 
comman=...,  GPIBコマンド 
rsp=...,  レスポンスエラーメッセージのバッファサイズ 
leng=...,  READ,WRITEデータバッファサイズ 
conv=...,  READオペレーション時のデータ変換フォーマット又は、データ変換関数名 
param1=...,  変換関数への引き数1(整数) 
param2=...,  変換関数への引き数2(整数) 
param3=...,  変換関数への引き数3(文字列) 
efast=...,  Efastテーブル名 
name=...,  ネームテーブル名 
comp=...  現時点では未使用 
*パラメータテーブルを記述する時、各フィールドの順番は任意で良い。

recフィールド
使用するレコードタイプを指定する。
現在は、AI,AO,BI,BO,SI,SO,LI,LO,MBBI,MBBO,WFがサポートされている。
*WF(WaveForm)レコードを使用する時は、データ変換関数を記述する必要がある。

typeフィールド
GPIB I/O オペレーション・タイプ。READ、WRITE、CMD などがある。

○READ
1)commandフィールドに登録されたコマンドが機器に送られ、データが読み返される。
2)機器から読み込まれたデータは dpvt.msg バッファに入れられる。
3)入力データ(dpvt.msg バッファ)からレコードの VAL フィールドへの変換
書式の変換仕様は convフィールド に指定する。
◎convフィールドに変換関数を設定した場合
VAL フィールドへの変換は convフィールドで指定されるファンクション・ポインタが用いられる。そのとき、引き数として param1param2、param3の3つのフィールドが使用できる。各フィールドの型はそれぞれ int、int、char * である。ファンクション・ポインタで示される関数の宣言は以下のように行う。vaid convフィールド( struct gpibDpvt *dpvt, int param1, int param2, char *(param3) ) {・・・}一番目の引き数 struct gpibDpvt *dpvt は、GPIB アドレスなどレコードの情報が格納されている構造体へのポインタであるので、変更してはならない。

○WRITE
1)(通常)レコードの VAL フィールドを参照して機器に送られるコマンドが作られる。
書式の変換仕様は convフィールド に指定する。
◎convフィールドに変換関数を設定した場合
convフィールドで指定されるファンクションポインタが用いられる。GPIBREAD と同じく、引き数に param1, param2, param3 の3つフィールドが使用できる。 各フィールドの型はそれぞれ int、int、char * である。ファンクション・ポインタで示される関数の宣言は以下のように行う。vaid convフィールド( struct gpibDpvt *dpvt, int param1, int param2, char *(param3) ) {・・・ }一番目の引き数 struct gpibDpvt *dpvt は、GPIB アドレスなどレコードの情報が格納されている構造体へのポインタであるので、変更してはならない。
2)1)で作られたコマンド dpvt.msg が機器に送られる。

○CMD
1)commandフィールドに登録されたコマンドが機器に送られる。

○CNTL
1)GPIB ATN ラインをアサートし、commandフィールドに登録されたコマンドを機器に送る。
そのあと、ATN ラインをデ・アサートする。

○SOFT
I/O オペレーションは行わず変換ルーチンを呼び出す。変換ルーチンは convフィール ドで指定され、引き数に param1, param2, param3 の3つのフィールドが使用できる。各 フィールドの型はそれぞれ int、int、char である。ファンクション・ポインタで示され る関数 の宣言は以下のように行う。vaid convフィールド( struct gpibDpvt *dpvt, int param1フィールド, int param2フィールド, char *(param3フィールド) ) {・・・}一番目の引き数 struct gpibDpvt *dpvt は、GPIB アドレスなどレコードの情報が格納さ れている構造体へのポインタであるので、変更してはならない。
SOFT の場合必ず convフィールドを指定しなければならない。

○READW
READW を使うときは SrqHndlerテーブルを登録しなければならない。
1)commandフィールドに登録されたコマンドが機器に送られる。
2)機器からの SRQ 割り込みを待つ。
3)割り込みが入ると機器からデータが読み込まれ、読み込まれたデータは dpvt.msg バッファに入れられる。
6)入力データ(dpvt.msg バッファ)からレコードの VAL フィールドへの変換
書式の変換仕様は convフィールド に指定する。
◎convフィールドに変換関数を設定した場合
convフィールドで示されるファンクション・ポインタが用いられる。そのとき、引き数として param1, param2, param3の3つのフィールドが使用できる。各フィールドの型はそれぞれ int、int、char である。ファンクション・ポインタで示され る関数の宣言は以下のように行う。vaid convフィールド( struct gpibDpvt *dpvt, int param1, int param2, char *(param3) ) {・・・ }一番目の引き数 struct gpibDpvt *dpvt は、GPIB アドレスなどレコードの情報が格納されている構造体へのポインタであるので、変更してはならない。

○EFASTO
EFASTO はレコード・タイプが BO、MBBO のときのみ使用される。
1)EFAST テーブルのインデックスがレコードの VAL 値であるコマンド(efastフィールド[VAL]) が機器に送られる。

○EFASTI
EFASTI はレコード・タイプが BI、MBBI のときのみ使用される。
1)commandフィールドに登録されたコマンドが機器に送られ、データが読み返される。
2)機器から読み返されたデータは、dpvt.msg バッファに入れられる。
3)入力データ(dpvt.msg バッファ)と EFAST テーブルの要素が比較される。
4)3)で一致した EFAST テーブル要素のインデックスがレコードの VAL フィールドに入れられる。
注)convフィールドは 未記入にしなければならない。

○EFASTW
EFASTW はレコード・タイプが BI、MBBI のときのみ使用される。EFASTW を使うと きは SrqHndlerテーブルを登録しなければならない。
1)commandフィールドに登録されたコマンドが機器に送られる。
2)機器からの SRQ 割り込みを待つ。
4)割り込みが入ると機器からデータが読み込まれ、読み込まれたデータは dpvt.msg バッファに入れられる。
6)入力データ(dpvt.msg バッファ)と EFAST テーブルの要素が比較される。
7)6)で一致した EFAST テーブル要素のインデックスがレコードの VAL フィール ドに入れられる。
注)convフィールドは 未記入にしなければならない。

priフィールド
GPIB ドライバが実行されるときのプライオリティ。HIGH か LOW のどちらかで登録 しなければならない。
デフォルトはLOW

commandフィールド
機器に送られる文字列(コマンド)の指定。
WRITEオペレーションの時は、C言語のprintf文のフォーマットを使用する事で入力データをWRITEコマンドに変換して機器に送る。

rspフィールド
write オペレーション時のレスポンス・エラー・メッセージに使用される dpvt.rsp バッファ・サイズ。
デフォルトは0

lengフィールド
機器への書き込みまたは読み込みのデータに使用される dpvt.msg バッファ・サイズ。
デフォルトは32

convフィールド
READオペレーションの時に使用(WRITEオペレーションのフォーマットはcommandフィールドに指定)
書式変換の指定、又は、データ変換関数の関数名。
convフィールドは、主に書式変換の指定として使用される。データ変換関数名として使用する場合は、予め、C言語を用いて関数を記述する必要がある。
書式変換の指定の仕方は、C言語のprintf文などのフォーマットの記述と同じ。
convフィールドの指定において、変換するレコード・タイプの VAL フィールドのデータ型に注意する必要がある。例えば、Analog Input レコードは倍精度の浮動小数点型で あるので、convフィールドには "%f" ではなく、"%lf" を指定しなければならない。
書式変換の時には必ず "(ダブルコーテーション)で囲む。
データ変換関数名として使用する時はダブルコーテーションは、必要ない。

param1フィールド
convフィールドで変換関数を使用した場合に変換関数へ渡される引き数となる(int 型)。

param2フィールド
convフィールドで変換関数を使用した場合に変換関数へ渡される引き数となる(int 型)。

param3フィールド
convフィールドで変換関数を使用した場合に変換関数へ渡される引き数となる(char * 型)。

efastフィールド
EFAST テーブル名。
レコード・タイプが BI、MBBI のときのみ使用

nameフィールド
ネーム・テーブル名。
レコード・タイプが BI、MBBI のときのみ使用

compフィールド
このフィールドは現時点では未使用。

*パラメータテーブルの各フィールドには、レコードタイプ(recフィールド)ごとに、デフォルトが設定されているので必要なフィールドのみ設定を行う。
デフォルトは以下の表に示す。


4、GDLファイルサンプル(Tek2430オシロスコープ)

Device   XxTek2430
 
NameTable offOn="OFF":0,"ON":1;
 
EfastTable debOffOn="DEBUG OFF","DEBUG ON";
 
ParamTable {
        "CH1 READ"{
                rec=ai,
                command="CH1? VOL",
                conv="CH1 VOLTS:%lf"
                }
        "CH1 WRITE"{
                rec=ao,
                command="CH1 VOL:%.lf"
                }
        "DEBUG STAT"{
                rec=bi,
                command="DEB?",
                efast=debOffOn,
                name=offOn
                }
        "DEBUG STAT SET"{
                rec=bo,
                efast=debOffOn,
                name=offOn
                }

各コマンドについての説明

CH1 READ

CH1 READを実行するとコマンド"CH1? VOL"がGpib機器に送られデータが読み返され フォーマット"CH1 VOLTS:%lf"で表示される。

CH1 WRITE

入力された数値データがコマンド"CH1 VOL:%.lf"に変換されてGpib機器に送られる。
1を入力すると"CH1 VOL:1"が出力される。

DEBUG STAT

DEBUG STATを実行するとコマンド"DEB?"がGpib機器に送られ現在のデバックステータスの状態が読み返される。その時、ステータスは文字列で返されEfaastテーブルと比 較されて"DEBUG OFF"の時は、0,"DEBUG ON"の時は、1の値となる。更にName テーブルが指定されているので、0の時は、OFF,1の時は、ONと表示される。

DEBUG STAT SET

0を入力するとEfastテーブルによって"DEBUG OFF"、1の時は"DEBUG ON"に変換さ れてコマンドとして、Gpib機器に送られOFF,ONの切り替えが行われる。


5、レコードタイプ別の必要最低限の記入項目(コマンドテーブル)

AI  レコード 
recフィールド  ai 
command フィールド  GpibREADコマンド 
AO  レコード 
recフィールド  ao 
command フィールド  GpibWRITEコマンドフォーマット 
BI  レコード 
recフィールド  bi 
commandフィールド  GpibREADコマンド 
efast フィールド  読み込まれる文字列を記述しておいたEfastTable名を記入 
nameフィールド  記述しておいたNameTable名を記入(省略可能) 
BO  レコード 
recフィールド  bo 
efast フィールド  出力時に変換する文字列を記述しておいたEfastTable名を記入 
nameフィールド  記述しておいたNameTable名を記入(省略可能) 
SI  レコード 
recフィールド  si 
commandフィールド  GpibREADコマンド 
SO  レコード 
recフィールド  so 
LI  レコード 
recフィールド  li 
commandフィールド  GpibREADコマンド 
LO  レコード 
recフィールド  lo 
command フィールド  GpibWRITEコマンドフォーマット 
MB  BIレコード 
recフィールド  mbbi 
command フィールド  GpibREADコマンド 
efast フィールド  読み込まれる文字列を記述しておいたEfastTable名を記入 
nameフィールド  記述しておいたNameTable名を記入(省略可能) 
MB  BOレコード 
recフィールド  mbbo 
efast フィールド  出力時に変換する文字列を記述しておいたEfastTable名を記入 
nameフィールド  記述しておいたNameTable名を記入(省略可能) 
WF  レコード 
recフィールド  wf 
commandフィールド  GpibREADコマンド 
convフィールド  データ変換関数 *C言語で記述が必要

6、コンパイル方法

R3.12のコンパイル方法

1)Makefileに新しいデバイスサポートのコンパイルの定義を記述する。
ファイル名.o:  $(SRC)/ファイル名.gt 
$(MAKE_GPIB) 

*$(MAKE_GPIB)の前の空白は必ず、タブで入れる。

2)gmake ファイル名.oでコンパイルを行う。
3)gmakeを行うとオブジェクトファイルと一緒に、デバイス名_command.listと言うファイルが作成される。このファイルには、レコードタイプとコマンドテーブル名の一覧が出力されている。データベース作成の時は、このリストを参照して下さい。
なおデータベースで、Gpibコマンドの指定はリストのNoを使用して下さい。


/*** COMMAND LIST ***/
 
No.  SI  status read
No.  SO  status write 
No.  BO  trigger off 
No.  BI  trigger on 

status writeコマンドを使用するときは、SOレコードを使いGpibコマンドの指定は1となります。

R3.13のコンパイル方法

1)デバイス登録を行う為srcディレクトリにあるxxxInclude.dbdファイルに次の一行を追加する。

include ファイル名.dbd

2)同じくMakefile.Vxに新しいデバイスサポートのコンパイルの定義を記述する。

LIBOBJS += ファイル名.o

3)gmakeを行いコンパイルする。


7、Device登録

新規にデバイスサポートを作成した場合、デバイスを登録する作業が必要となります。

R3.12の登録方法

EPICSのワークディレクトリの下にcat_asciiディレクトリが有ることを確認する。
cat_asciiディレクトリが無いときは、作成する。
cat_asciiにdevSup.asciiファイルがある事を確認する。
devSup.asciiがない時は、EPICSのワークディレクトリの下のbase/src/asciiからコピーする。

devSup.asciiに登録する内容を以下に示します。
record type link type device support name module name/description(GPIB)

record type: デバイス・サポートのレコード型。
link type: デバイスが使用するインターフェイス型。
GPIBの時は、GPIB_IOを指定
device support name: 登録するデバイス・サポート名。  "devDeviceNameGpib"
DeviceNameの所には、GDLのデバイス名で指定した名前の前にレコードタイプを付けて記入する。レコードタイプの頭文字は大文字で記入する。
module name/description: レコードの DTYP フィールド名。
データベースを作成する時に、デバイスタイプを指定する時に使用される。


GDLのデバイス名にTek2430を登録し、aiレコードを使用する場合

"ai"     GPIB_IO   "devAiTek2430Gpib"     "Tek2430"

devSup.asciiの登録が終了したらEPICSのワークディレクトリでmakesdrを実行する。
makesdrが正常に終了すると、default.dctsdrとdefault.sdrSumファイルが更新され新しいデバイスが登録される。
dctを使用してデータベースを作成している場合データベースを作成しているディレクトリに有るdefault.dctsdrとdefault.sdrSumのリンクを張り直す必要が有ります。

データベース
レコードに GPIB を使用する場合、DTYP フィールドに devSup.ascii で登録した module name/description を指定し、OUT/INP フィールドに次のように指定する。
GPIB_IO: #L0 A16 @1
#Lx: GPIB コントローラのリンク・ナンバ。同一クレート内に同じ GPIB コントローラが複数台ある場合にコントローラの指定を行う。1つの場合は0を指定
Ax: GPIB アドレス。
@x: GPIB デバイス・サポートで登録したパラメータ・テーブルのパラメータ番号。コンパイル時に作成されたコマンドリストを参照

R3.13の登録方法

R31.3ではコンパイルの指定の時にデバイス登録の記述を行いgmakeを行うことによってデバイス登録されます。
データベースを作成する時にDTYPフィールドに指定するデバイスタイプはGDLの中で指定したデバイス名となります。その他の指定はR3.12と同様です。


質問、要望に付いては関東情報サービス 吉田 奨 まで宜しくお願いします。
e_mail syoshida@post.kek.jp