今回34410Aを使う目的は、DCCTなどから得られるDC電圧を途切れること無く取得し、かつそれから 例えばビーム寿命などを推定することです。なので、34410Aが持っている多くの機能のうち、 必要なほんの一部の機能だけしか入っていません。なお、もともとこのデバイスサポートは2013年末に 作って動作テストなどをしていたのですが、作業していたサーバーのディスクがすっ飛び(ある日突然 一切読めなくなった)、ほとんど資料が無い状態からまたゼロからやり直しになってしまったため、 確か昔の物の方がずっと多機能で 美しかったはずですが、やる気がminimumなこともありひたすら手をぬいて作ったのが本 デバイスサポートです。
コマンド | 機能 | タイプ | データベース番号 | 備考 |
---|---|---|---|---|
RST;*CLS | 全機能リセット | bo | 0 | |
DISP OFF | ディスプレイOFF | bo | 1 | ほんのわずかデータ取得レートが上がる(ほとんど誤差) |
DISP ON | ディスプレイON | bo | 2 | 本来はmbboで作るべきでしょうね |
CONF:VOLT:DC | DC電圧測定、固定レンジ | ao | 3 | autoレンジだとデータ取得が遅くなる |
SENS:VOLT:DC:APER | アパーチャー時間設定 | ao | 4 | |
SENS:VOLT:ZERO:AUTO OFF | 自動ゼロ測定OFF | bo | 5 | autoだとデータ取得が遅くなる |
SENS:VOLT:ZERO:AUTO ON | 自動ゼロ測定ON | bo | 6 | これも本来ならmbboでつくるべき |
TRIG:SOUR IMM | 内部トリガ | bo | 7 | |
TRIG:SOUR EXT | 外部トリガ | bo | 8 | |
TRIG:COUN INF | トリガカウント無限大 | bo | 9 | |
TRIG:DEL | トリガ遅延 | lo | 10 | 高速化のためには0にセットする |
FORM REAL,32;:FORM:BORD SWAP | データ転送フォーマットバイナリ、SWAP | bo | 11 | SWAPを忘れると呪われる |
INIT | データ取得開始 | bo | 12 | |
SENS:VOLT:DC:NPLC | 積分時間セット | ao | 13 | 34410Aの場合minは0.006 PLC |
R? 8000 | データ取得 | waveform | 14 | データを取得し、取ったデータはメモリから消去 |
ABOR | データ取得停止 | bo | 15 | データ取得終了。INIT後はABORTしないとコマンドを送れない |
# データ長のバイト長 データバイト長 1つめのデータ 2つめのデータ..
標準状態では、IEEE488.2 BINBLOCKフォーマットという、神代の昔のフォーマットで、要はデータがスワップしています。 ので、ふつーの計算機では、FORM:BORD SWAPを指定して、データスワップを指定しないと面倒です。まあ、アジレント殿 が提供するライブラリなどでは、自動的にスワップしてんでしょうけど、通常のプログラマにとっては 間違いの元です(私もひっかかり頭を抱えました)。
一般に、34410Aのコマンドで設定値などの読み出しは、メッセージで帰ってきたり(mbbiを使う必要が出てきて ちょい面倒)、複数のパラメータを返したり(waveformで中身を受けて、かつ、aSubなどでさらにばらす必要があり 超面倒)しますので、扱いがとにかく面倒なのでサポートしていません。必要になったら仕方なく実装しますが。
EPICSそのものに対する入門出家入道については徳の高い専門家に帰依するなり、 コントロールグループの尊いページを読破するなどの自活努力が望まれます。
#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データ変換ですが、大したことないコードなのに色々超常現象に見舞われ ました。このため、色々不細工な仕掛けがしてありますが、気にしないで下さい。 あえて恥を忍んでコードの注意点を並べると
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は以下をご覧ください。
variable(CwavDebug) function(CwavInit) function(CwavProcess)データベース内では、以下を追加、変更しておきます。(DATAレコードの FLNKを$(USER):$(RING):CONCATにしておきます)。
record(waveform,"$(USER):$(RING):CDATA"){この状態で、FBX:LER:CDATAをedmで表示させた物が以下の様になり、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")}