ちなみにカタログを真面目に読むと、34410AのSCPIコマンドと100%の互換性をもつのは唯一の機械は34461Aです。が、 こいつは測定速度が34410Aよりずっと遅く、今回の目的には使えません。34465Aは、 オプション34465A-DIGを つけることで、34410Aより高速なデータ取り込みができるようです。(オプションなしだと 34410Aの半分くらいかと思われます)。ということで、34410Aに用に作った各種コードが そのまま使えることを(話半分)信じて購入し、試験しました。で、結果ですが、やはり 結局ある程度の書き換えは必要でした。いささか無念じゃ。
本DVMはSuperKEKB Damping RingのDCCT高速読み出しに利用します。このため、 とった電圧値を周回電流値に変換し、DCオフセットを除去し、 また入射率、 減衰率、平均、最大、最小電流値などを計算する部分も必要です。これらの部分を aSubレコード、及びEPICSシーケンサで実現して(しようとして)います。
コマンド | 機能 | タイプ | データベース番号 | 備考 |
---|---|---|---|---|
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,64;:FORM:BORD SWAP | データ転送フォーマットバイナリ、SWAP | bo | 11 | SWAPを忘れると呪われる |
INIT | データ取得開始 | bo | 12 | |
SENS:VOLT:DC:NPLC | 積分時間セット | ao | 13 | 34465A-DIGの場合minは0.001 NPLC |
R? 8000 | データ取得 | waveform | 14 | データを取得し、取ったデータはメモリから消去 |
ABOR | データ取得停止 | bo | 15 | データ取得終了。INIT後はABORTしないとコマンドを送れない |
# データ長のバイト長 データバイト長 1つめのデータ 2つめのデータ..
標準状態では、IEEE488.2 BINBLOCKフォーマットという、神代の昔のフォーマットで、要はデータがスワップしています。 ので、ふつーの計算機では、FORM:BORD SWAPを指定して、データスワップを指定しないと面倒です。 一度設定すると、不揮発性メモリに記録されて、いちいち設定しなくても良いそうですが。
さて、このバイナリー転送コマンド及びデータフォーマットが、34410Aと互換性がありません。34410A ではreal32(単精度実数)フォーマットで送っていました。34465Aでは、REALを指定すると real64になります。というか、REAL,のあと64以外はコマンドエラーになってしまいます。 当然、デバイスサポート内での変換関数はデータがdoubleだ、ということを考えて作り直す 必要がありますし、waveformのFTVLもいっそFLOATではなくDOUBLE にするのが自然になります。別にDOUBLEにしてもハードで精度が決まっているので、 特に高速にしたときは精度が上がるわけではないのですが。
一般に、34465Aのコマンドで設定値などの読み出しは、メッセージで帰ってきたり(mbbiを使う必要が出てきて ちょい面倒)、複数のパラメータを返したり(waveformで中身を受けて、かつ、aSubなどでさらにばらす必要があり 超面倒)しますので、扱いがとにかく面倒なのでサポートしていません。必要になったら仕方なく実装しますが。
EPICSそのものに対する入門出家入道については徳の高い専門家に帰依するか、 古今東西の古文書、wikiなどを読破する努力が望まれるのでないでしょうか。
#34465A dbd list device(ai,GPIB_IO,devAi34465A,"A34465A") device(ao,GPIB_IO,devAo34465A,"A34465A") device(bi,GPIB_IO,devBi34465A,"A34465A") device(bo,GPIB_IO,devBo34465A,"A34465A") device(stringin,GPIB_IO,devSi34465A,"A34465A") device(stringout,GPIB_IO,devSo34465A,"A34465A") device(longin,GPIB_IO,devLi34465A,"A34465A") device(longout,GPIB_IO,devLo34465A,"A34465A") device(mbbi,GPIB_IO,devMbbi34465A,"A34465A") device(mbbo,GPIB_IO,devMbbo34465A,"A34465A") device(waveform,GPIB_IO,devWf34465A,"A34465A")です。
変換部などのコードの注意点は、34410A用と同じです。
variable(DDRwavDebug) function(DDRwavInit) function(DDRwavProcess)
registrar(FDCCT_DRRegistrar)
epicsEnvSet(EPICS_CA_MAX_ARRAY_BYTES, 20000000) dbLoadRecords("db/FDCCT.db","USER=BMD, RING=FAST, L=L0, A=1") drvAsynIPPortConfigure("L0","172.19.193.*:5025",0,0,0) dbpf "BMD:FAST:DCV:SET","0.1"上記の設定が、34410A時代と互換の設定と思われますが、これでデータロギングを させてwaveformのNORD(実際に入っているデータ数)を見てみると、scan 1秒の設定で 5200〜5700程度で、Agilent 34410A実績の4991〜5030よりはいささか速くなっています。
dbpf "BMD:FAST:AZERO:OFF","1"
dbpf "BMD:FAST:TRIG:IMM","1"
dbpf "BMD:FAST:TRIG:COUNT:INF","1"
dbpf "BMD:FAST:TRIG:DELAY","0"
dbpf "BMD:FAST:FORMAT:REAL32","1"
dbpf "BMD:FAST:NPLC","0.006"
dbpf "BMD:FAST:INIT","1"
dbpf "BMD:FAST:DATA.SCAN","11"
dbpf "BMD:FAST:DCCT:THR","0.2"