以前作成したEPICSデバイスサポートは、R313用で、かつ、VMEバスに接続したNI GP-IBカードに 接続してVxWORKS環境下で使うことを前提とした内容になっていました。SuperKEKBでは、 EPICSは標準でR314以降の系統になりますし、VMEバスに接続するNI GP-IBカードは (トラブルの多さもあって)サポートされません。 このため、ASYNに対応したAgilent LAN-GPIB経由で使えるデバイスサポートに移行することが 必要です。 本稿では、出来るだけ以前作ったデバイスサポート(及びデータベース)を 再利用する方向で作成した、ASYN GP-IB対応のデバイスサポートについて 紹介します。
内容はsource codeをご覧下さい。以前に比べて相当シンプルに なっています。
以前は-1になっていましたが、今回はNULLです。これをdefineで与えています。
このため、get_trace_aが、single sweep、転送unit設定、sweep終了でSRQ発効、sweepスタート、
そしてtrace A取得というコマンドの連続になっています。具体的には
SNGLS;TDF P;AUNITS DBM;RQS 4;TS;TA;です。データ取得が終わったら、SRQ禁止、連続スイープに戻しておくのが 吉と思います。
static long init_ai(int parm) { if(parm==0) { devSupParms.name = "devHP8590LGpib"; devSupParms.gpibCmds = gpibCmds; devSupParms.numparams = NUMPARAMS; devSupParms.timeout = TIMEOUT; devSupParms.timeWindow = TIMEWINDOW; devSupParms.respond2Writes = -1.0; } return(0); }ここで、TIMEOUTやTIMEWINDOWは外で定義しておきますが、こいつのGPIB転送は やたらに遅く、しかもsweepがまた鈍いのでそれなりに大きな値にしておかないと データ転送の途中で打ち切りに悲劇に遭います(当初この理由が分からず、 またデータ転送点数に再現性がないため結構悩みました)。
#HP8590L dbd list device(ai,GPIB_IO,devAiHP8590LGpib,"HP8590L") device(ao,GPIB_IO,devAoHP8590LGpib,"HP8590L") device(bi,GPIB_IO,devBiHP8590LGpib,"HP8590L") device(bo,GPIB_IO,devBoHP8590LGpib,"HP8590L") device(stringin,GPIB_IO,devSiHP8590LGpib,"HP8590L") device(stringout,GPIB_IO,devSoHP8590LGpib,"HP8590L") device(longin,GPIB_IO,devLiHP8590LGpib,"HP8590L") device(longout,GPIB_IO,devLoHP8590LGpib,"HP8590L") device(mbbi,GPIB_IO,devMbbiHP8590LGpib,"HP8590L") device(mbbo,GPIB_IO,devMbboHP8590LGpib,"HP8590L") device(waveform,GPIB_IO,devWfHP8590LGpib,"HP8590L")Makefileでは
fblinux_DBD += devHP8590Gpib.dbd fblinux_SRCS += devHP8590Gpib.c fblinux_LIBS += asynのような感じで、通常通り追加してあれば良いはずです。なお、追加後、 忘れずにmake cleanをしないと、dbdファイルの更新がされません。
dbLoadRecords("db/FB_HPSA.db","USER=FBH, ADDR=A2") vxi11Configure("L0","172.19.xx.xxx",0,0.0,"gpib0",0,0)get_trace_aをプロセスしたあとのGP-IBラインの振る舞いを以下に示します。