[KEKB Bunch Feedback Group]

Rohde-Schwartz RTA4004オシロスコープ用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.はじめに

ローデシュワルツRTA4004オシロスコープはアナログ帯域1GHzで最大5GSPS(4チャンネル時は2.5GSPSまで下がる模様)のコンパクトなオシロスコープです。私は、(ちゃんと使える)オシロスコープを埋め殺しにしてデータ取ってくる、という使い方は今まであまりやってきておらず、そちら方面のEPICSデバイスサポートは作っていませんでしたが、今回種々の事情で追い込まれてしまい、仕方なく手近なこのオシロスコープを使ってデータ取得をすることになってしまいました。設定などは(少なくともリモートからは)あまり変えることはないし、現場でやった方が圧倒的に楽なので、その辺の常識的な設定部分は実は入っていません。単純に、シングルショットモードにして、外部トリガーがかかったらデータを取りに行く、という機能を実現するだけのものです。普通のリモートオシロスコープにしたい方は、頑張って他の機能もimplementしてください。

なお、コマンドはSCPIだと言っていますが、SCPIで一般的なマルチコマンドは使えないようです(プログラム例にも入っているし、たまに使えることもある気もしたが、ほぼ動作しない)。なので、初期設定など、いっぱいのコマンドを送りたいときも諦めて1つずつ送るのが吉のようです(EPICSで別のデータベースにして、それを延々とFLNKで繋いでいく)。

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

本デバイスサポートで使えるコマンドの以下の通りです。
コマンド機能タイプデータベース番号備考
CHAN:TYPE SAMPELサンプルモード設定bo0
FORMAT:DATA REAL,32データ転送REAL32指定bo1
FORMAT:BORDER LSBFLSBFirst指定bo2defaultはMSBFだが、今時MSBFで動くCPUあるの?
CHAN:DATA:POIN DMAXデータ転送範囲bo3表示エリアデータ全部転送
*RSTフルリセットbo4極めて危険。これ発行するくらいなら現場に走って行く
ACQ:NSING:COUNT 1シングルショット回数1bo51を増やすとN回取得もできるらしい
STOPrun停止bo6
ACQ:STAT?トリガー状態mbbi7答えはRUN,STOP,COMP,BREのいずれか
CHAN1:SCALE?CH1のVスケール読み出しai8
CHAN2:SCALE?CH2のVスケール読み出しai9
CHAN3:SCALE?CH3のVスケール読み出しai10
CHAN4:SCALE?CH4のVスケール読み出しai11
CHAN1:SCALE CH1のVスケール設定ao12
CHAN2:SCALE CH2のVスケール設定ao13
CHAN3:SCALE CH3のVスケール設定ao14
CHAN4:SCALE CH4のVスケール設定ao15
CHAN1:DATA?CH1データ読みだしwaveform16
CHAN2:DATA?CH2データ読みだしwaveform17
CHAN3:DATA?CH3データ読みだしwaveform18
CHAN4:DATA?CH4データ読みだしwaveform19
CHAN1:DATA:XINC?CH1の水平方向時間差ai20チャンネル毎違うケースは考えにくいが
CHAN2:DATA:XINC?CH2の水平方向時間差ai21チャンネル毎違うケースは考えにくいが
CHAN3:DATA:XINC?CH3の水平方向時間差ai22チャンネル毎違うケースは考えにくいが
CHAN4:DATA:XINC?CH4の水平方向時間差ai23チャンネル毎違うケースは考えにくいが
*TRGForce triggerbo24
TIM:SCAL?水平スケール読み出しai24
TIM:SCAL水平スケール設定ao25
SINGシングルショット開始bo26
データ転送フォーマットですが、FORM REAL,32 FORM:BORD LSBFのとき、CHAN:DATA?コマンドで送られるデータは以下の形をしています。

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

標準状態では、IEEE 754 Floatingp-pointフォーマットです。但し、バイトオーダーは(神代の昔のCPUでない限り)FORM:BORD LSBFを指定して、データスワップを指定しないと変換が大変です。
なお、32ビットありますが、オシロスコープから出てくるデータは16ビット分は完全に0のデータしか入っていないので、無駄と言えば無駄が多いフォーマットです(ASCIIよりはマシですが)。
UINTegerだと、無駄なくデータを送ってきますが、その後変換するのがまだイヤだなぁ、という気もします。
トリガーがかかったかどうかは、ACQ:STAT?の結果で、シングルショットの場合、トリガー待ちの場合はSTOP, トリガーがかかった場合はCOMPになります。

3.EPICS環境

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

EPICSそのものに対する入門出家入道については徳の高い専門家に帰依することをおすすめしますが、そうでない場合、古今東西の古文書、wikiなどを読破する努力が必要となります。

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

全体のコードを以下のリンクに示します。
ソースファイル(devRTA4004.c)
また、dbdファイルの中身は
device(ai,        GPIB_IO, devAiRTA4004,    "RTA4004")
device(ao,        GPIB_IO, devAoRTA4004,    "RTA4004")
device(bi,        GPIB_IO, devBiRTA4004,    "RTA4004")
device(bo,        GPIB_IO, devBoRTA4004,    "RTA4004")
device(event,     GPIB_IO, devEvRTA4004,    "RTA4004")
device(longin,    GPIB_IO, devLiRTA4004,    "RTA4004")
device(longout,   GPIB_IO, devLoRTA4004,    "RTA4004")
device(mbbi,      GPIB_IO, devMbbiRTA4004 , "RTA4004")
device(mbbiDirect,GPIB_IO, devMbbidRTA4004, "RTA4004")
device(mbbo,      GPIB_IO, devMbboRTA4004,  "RTA4004")
device(mbboDirect,GPIB_IO, devMbbodRTA4004, "RTA4004")
device(stringin,  GPIB_IO, devSiRTA4004,    "RTA4004")
device(stringout, GPIB_IO, devSoRTA4004,    "RTA4004")
device(waveform,  GPIB_IO, devWfRTA4004,    "RTA4004")

include "asyn.dbd"
です。

変換部などのコードは、キーサイトDMM 34465A用device supportを参考に作りました。当初、マルチコマンドが使えないことによる呪いを受けたり、怪しいsegmentation faultに悩まされましたが、一応安定に動く様になったと思います。segmentation faultについてはまだ完全に理解していないのですが、配列をやたらに大きく余裕をもって設定したりすると起きやすい傾向が見られました。これは、このEPICS IOCのメモリーサイズ上限が決まっていて、staticに配列などに食われているとdynamicに確保するときにくたばる、と疑っているのですが、間違っているでしょうか。

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

サンプルファイルは以下を参照してください。 前述の理由で、マルチコマンドを避けるため、例えば 初期化コマンドは

INIT1 ->INIT2 -> INIT4

をFLNKで繋いで実行するようにしてあります。また、データ読み込みは

GETDATA-> CH1:DATA:READ -> CH2:DATA:READ -> CH3:DATA:READ -> CH4:DATA:READ

もFLNKで繋いであります。全チャンネル読むのに2-3秒かかっていましたが、この試験を行っていた場所のネットワークが100baseであったのが影響していると思います。

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

関連部分は以下の様です。
!../../bin/linux-x86_64/fblinux

## You may have to change fblinux to something else
## everywhere it appears in this file

< envPaths
epicsEnvSet(EPICS_CA_MAX_ARRAY_BYTES, 1500000)

cd ${TOP}

## Register all support components
dbLoadDatabase("dbd/fblinux.dbd")
fblinux_registerRecordDeviceDriver(pdbbase)

## Load record instances
dbLoadRecords("db/FB_RTA.db","USER=FBL, PLACE=**,LNK=0,ADD=1")

drvAsynIPPortConfigure("L0","172.19.***.***:5025",0,0,0)
#asynSetTraceMask("L0",0,0x8)
#asynSetTraceIOMask("L0",0,0x4)

cd ${TOP}/iocBoot/${IOC}
iocInit()

簡単な操作と表示をするCSSパネルを作りました。

CH1(青)には509MHLz/5120=100kHzのfiducial信号、CH2(赤)には509MHzのRF、CH3(緑)には(故障して暴走している)fiducial、CH4(黒)には信号未接続です。5 revolution周期のデータが2.5GSPSで取れています。この絵を拡大したのが次で、

さらに拡大したのが

で、RF周期の間に5点データが取れているのが見えます。

9.おわりに

ローデシュワルツRTA4004オシロスコープ用デバイスサポートを紹介しました。
Makoto Tobiyama 14/May/2022

Return to FB Home Page...