[KEKB Bunch Feedback Group]

アジレントテクノロジ34410A DVM用EPICS Device Supportの製作(Japanese)


by とびやま まこと(Makoto Tobiyama)/KEKB ビームモニターグループ

警告
以下の記述に関しては、意図する、しないに関わらず多くの誤り、誤解が含まれていると思われますので、 決して信用してはいけません。これを信じて起きた損害に関しては、当方は一切責任を持ちません。


If you want to contact with the author, please E-mail to makoto.tobiyama@kek.jp.
目次

1.はじめに

アジレントテクノロジ34410A DVMは、高速高精度で電圧などのデータを 途切れること無く取得することが出来るデジタルマルチメータです。 インターフェースはLAN/GP-IB/USBとありますが、本件ではLANを使ってEPICSの ASYNドライバーで制御します。34410Aについての説明はご本家のwebで ご確認ください。いつ切れるか分からないリンクはこちらです。 特に、連続高速データ取得については、この資料を参考にしました。

今回34410Aを使う目的は、DCCTなどから得られるDC電圧を途切れること無く取得し、かつそれから 例えばビーム寿命などを推定することです。なので、34410Aが持っている多くの機能のうち、 必要なほんの一部の機能だけしか入っていません。なお、もともとこのデバイスサポートは2013年末に 作って動作テストなどをしていたのですが、作業していたサーバーのディスクがすっ飛び(ある日突然 一切読めなくなった)、ほとんど資料が無い状態からまたゼロからやり直しになってしまったため、 確か昔の物の方がずっと多機能で 美しかったはずですが、やる気がminimumなこともありひたすら手をぬいて作ったのが本 デバイスサポートです。

2.サポートするコマンド

本デバイスサポートで使えるコマンドの以下の通りです。
コマンド機能タイプデータベース番号備考
RST;*CLS全機能リセットbo0
DISP OFFディスプレイOFFbo1ほんのわずかデータ取得レートが上がる(ほとんど誤差)
DISP ONディスプレイONbo2本来はmbboで作るべきでしょうね
CONF:VOLT:DCDC電圧測定、固定レンジao3autoレンジだとデータ取得が遅くなる
SENS:VOLT:DC:APERアパーチャー時間設定ao4
SENS:VOLT:ZERO:AUTO OFF自動ゼロ測定OFFbo5autoだとデータ取得が遅くなる
SENS:VOLT:ZERO:AUTO ON自動ゼロ測定ONbo6これも本来ならmbboでつくるべき
TRIG:SOUR IMM内部トリガbo7
TRIG:SOUR EXT外部トリガbo8
TRIG:COUN INFトリガカウント無限大bo9
TRIG:DELトリガ遅延lo10高速化のためには0にセットする
FORM REAL,32;:FORM:BORD SWAPデータ転送フォーマットバイナリ、SWAPbo11SWAPを忘れると呪われる
INITデータ取得開始bo12
SENS:VOLT:DC:NPLC積分時間セットao1334410Aの場合minは0.006 PLC
R? 8000データ取得waveform14データを取得し、取ったデータはメモリから消去
ABORデータ取得停止bo15データ取得終了。INIT後はABORTしないとコマンドを送れない

データ転送フォーマットですが、FORM REAL, 32;:FORM:BORD SWAPのとき、Rコマンドで送られるデータは以下の形を しています。

# データ長のバイト長 データバイト長 1つめのデータ 2つめのデータ..

標準状態では、IEEE488.2 BINBLOCKフォーマットという、神代の昔のフォーマットで、要はデータがスワップしています。 ので、ふつーの計算機では、FORM:BORD SWAPを指定して、データスワップを指定しないと面倒です。まあ、アジレント殿 が提供するライブラリなどでは、自動的にスワップしてんでしょうけど、通常のプログラマにとっては 間違いの元です(私もひっかかり頭を抱えました)。

一般に、34410Aのコマンドで設定値などの読み出しは、メッセージで帰ってきたり(mbbiを使う必要が出てきて ちょい面倒)、複数のパラメータを返したり(waveformで中身を受けて、かつ、aSubなどでさらにばらす必要があり 超面倒)しますので、扱いがとにかく面倒なのでサポートしていません。必要になったら仕方なく実装しますが。

3.EPICS環境

本デバイスサポートは、Linux上のEPICS R314.12.1-CSAサポート版で開発しました。 ホストのOSはCentOS 6.5-64bitです。ASYNは4-21です。

EPICSそのものに対する入門出家入道については徳の高い専門家に帰依するなり、 コントロールグループの尊いページを読破するなどの自活努力が望まれます。

4.コードの概要(全体)

全体のコードを以下のリンクに示します。
ソースファイル(dev34410A.c)
また、dbdファイルの中身は
#34410A dbd list
device(ai,GPIB_IO,devAi34410A,"A34410A")
device(ao,GPIB_IO,devAo34410A,"A34410A")
device(bi,GPIB_IO,devBi34410A,"A34410A")
device(bo,GPIB_IO,devBo34410A,"A34410A")
device(stringin,GPIB_IO,devSi34410A,"A34410A")
device(stringout,GPIB_IO,devSo34410A,"A34410A")
device(longin,GPIB_IO,devLi34410A,"A34410A")
device(longout,GPIB_IO,devLo34410A,"A34410A")
device(mbbi,GPIB_IO,devMbbi34410A,"A34410A")
device(mbbo,GPIB_IO,devMbbo34410A,"A34410A")
device(waveform,GPIB_IO,devWf34410A,"A34410A")

です。

waveformデータ変換ですが、大したことないコードなのに色々超常現象に見舞われ ました。このため、色々不細工な仕掛けがしてありますが、気にしないで下さい。 あえて恥を忍んでコードの注意点を並べると

5.EPICSデータベースサンプル

サンプルファイルは以下を参照してください。 特にリンクなどもありません。

6.スタートアップファイルサンプル

関連部分は以下の様です。
epicsEnvSet(EPICS_CA_MAX_ARRAY_BYTES, 20000000)

dbLoadRecords("db/FDCCT.db","USER=FBX, RING=LER, L=L0, A=1")

drvAsynIPPortConfigure("L0","172.19.193.*:5025",0,0,0)

dbpf "FBX:LER:ABORT","1"
dbpf "FBX:LER:DCV:SET","10"
dbpf "FBX:LER:AZERO:OFF","1"
dbpf "FBX:LER:TRIG:IMM","1"
dbpf "FBX:LER:TRIG:COUNT:INF","1"
dbpf "FBX:LER:TRIG:DELAY","0"
dbpf "FBX:LER:FORMAT:REAL32","1"
dbpf "FBX:LER:NPLC","0.006"
dbpf "FBX:LER:INIT","1"
dbpf "FBX:LER:DATA.SCAN","6"
はじめにABORTコマンドをいれて動作を停止させないと、以下のコマンドを 受け付けません。

上記の設定が、最高速でデータをとれる設定と思われますが、これでデータロギングを させてwaveformのNORD(実際に入っているデータ数)を見てみると、scan 1秒の設定で 4991〜5030を行き来 しているようで、まあ、大体5ksps程度が34410Aの最高速ということのようです。 34411Aだともっと積分時間を短く出来るので、もう数倍いくかもしれません。なお、 データのスループット自体は十分早い模様で、5kデータ読むこと自体は全然問題には なっていません。LAN IFも100Mですが、それが問題になることはなさそうです。 (EPICSの大broadcast環境下で大丈夫かどうかはちょい問題ですが)。

ちゃんとデータがとれているかを、function generatorから50Hzののこぎり波を入れ、 見てみました。
全体図(edm)
先頭部分拡大図
ついでに、取りこぼし無く(データ転送中サボること無く)データがとれているかを 見てみました。一つ前のwaveformに今取ったwaveformを連結するaSubレコードを 作ります。sourceは以下をご覧ください。

dbdファイルももちろん必要で、Cwav.dbdを以下の様に作ります。
variable(CwavDebug)
function(CwavInit)
function(CwavProcess)
データベース内では、以下を追加、変更しておきます。(DATAレコードの FLNKを$(USER):$(RING):CONCATにしておきます)。

record(waveform,"$(USER):$(RING):CDATA"){
field(DTYP,"Soft Channel") field(NELM,"10000") field(FTVL,"FLOAT")
} record(aSub,"$(USER):$(RING):CONCAT"){
field(INAM,"CwavInit") field(SNAM,"CwavProcess") field(INPA,"$(USER):$(RING):DATA") field(INPB,"$(USER):$(RING):CDATA") field(INPC,"$(USER):$(RING):DATA.NORD") field(NOA,"10000") field(NOB,"10000") field(FTA,"FLOAT") field(FTB,"FLOAT") field(FTC,"LONG") field(FTVA,"FLOAT") field(OUTA,"$(USER):$(RING):CDATA") field(NOVA,"10000") field(FLNK,"$(USER):$(RING):CDATA")
}
この状態で、FBX:LER:CDATAをedmで表示させた物が以下の様になり、
全体
つなぎ目付近拡大
データ欠損無く、ちゃんとつながっていることが分かります。

7.おわりに

アジレントテクノロジ殿34410Aマルチメータのデバイスサポートを紹介しました。
Makoto Tobiyama
3/Jun/2014

Return to FB Home Page...