[KEKB Bunch Feedback Group]

アドバンテスト製R3361スペクトラムアナライザ用EPICS Device Support(R314-ASYN対応版)


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

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


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

1.はじめに

R3361Dは株式会社アドバンテスト製の9kHz〜3.6GHzの周波数領域をカバーするポータブル・スペクトラムアナライザです。 この広範囲において最高分解能30Hz、残留FM20Hzp-p、近傍ノイズ特性-105dBc/Hzという高度な基本性能を有しています。 トラッキングジェネレーターは、9kHzから3.6GHzまで掃引可能で、HP8590Eなどと異なり、自動的にトラッキングエラーを 較正する機能を有しています。
本device supportは昔作ったR313用(VxWorks上から制御)を、R314-ASYN対応させたものです。

2.サポートする機能

R3361は非常に多くの機能を持っており、それぞれGP-IB経由で コントロールする事ができます。このデバイスサポートでは、 ベータトロンチューン測定に必要最低限な機能をサポートしています。

3.EPICS環境

本デバイスサポートは、EPICS R314.12.3-CSA及びASYN4-23環境下で開発したものです。 EPICSそのものに対する説明、入門出家入道遁世については徳の高い専門家に帰依するなり、 コントロールグループのページをご参照なさるなり、それなりの厳しい修行が必要かもしれません。KEK所内限定で 入門サイトもあります。 (2007年度にやった内容なので、すでにちょっと古いですが、一応R314ベースの 説明になっています)。

動作確認は、CentOS 6.8(64bit)上のEPICS R314.12.3-CSA + ASYN4-23、キーサイトテクノロジの LAN-GPIBで行っています。

4.コードの概要

R314-ASYNへの対応はR3172のところに書いた物と同じですので、省略します。
全体のコードは以下の通りです。 ADVANTEST殿のSpectrum Analyzerは トレースデータは「測定値」ではなく、画面上のトレースポジションを出力する 伝統があります。以前のデバイスサポートと同じく、waveformには この値を直接出力しますが、使い物になるデータのためにはdBm単位への変換が 必要です。今回は、この変換をaSubレコードを使って行っています。

aSubレコードのフィールドには以下の特徴があります。

このレコードのプログラム(wavR3361.c)は以下の様になります。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <dbDefs.h>
#include <registryFunction.h>
#include <subRecord.h>
#include <aSubRecord.h>
#include <epicsExport.h>

int wavR3361Debug;

static long wavR3361Init(aSubRecord *precord)
{

  if (wavR3361Debug)
    printf("Record %s called wavADSAInit(%p)\n",
precord->name, (void*) precord);
return 0;} static long wavR3361Process(aSubRecord *precord) { short i; int count=701; short *raw1; int *bin; double *cin; int *din; int getscale; int trace_sel; double getref; static double conv_fac1, conv_fac2; static float trace[1001]; static double xdb[8]={10.0, 5.0, 2.0, 1.0, 10.0, 10.0,10.0, 10.0}; raw1 = (short *)precord->a; bin = (int *)precord->b; cin = (double *)precord->c; din = (int *)precord->d; getscale = (bin[0]); getref = cin[0]; trace_sel= (din[0]); conv_fac1 = 8.0*xdb[getscale]/400.0; conv_fac2 = getref - 8.0*xdb[getscale]; for (i=0;i<count;i++) { trace[i]=(raw1[i])*conv_fac1+conv_fac2; // fprintf(stdout,"i =%d data%f\r",i,trace[i]); } if (trace_sel == 0) { memcpy(precord->vala, trace, count*sizeof(float)); precord->neva = count; precord->nova = count; } else { memcpy(precord->valb, trace, count*sizeof(float)); precord->nevb = count; precord->novb = count; } return 0; } epicsExportAddress(int, wavR3361Debug); epicsRegisterFunction(wavR3361Init); epicsRegisterFunction(wavR3361Process);
使い方として といった注意があります。また、dbdファイルの作成、登録 も必要で、wabR3361.dbdは
variable(wavR3361Debug)
function(wavR3361Init)
function(wavR3361rocess)
といった形になります。

データベース側では、GETTRACE:AのFLNKをこのレコード(RAWTODBM)にしておき、

record(waveform,"$(USER):GETTRACE:A") {


field(FLNK,"$(USER):RAWTODBM")

}
RAWTODBM自体は以下の様に
record(aSub, "$(USER):RAWTODBM"){  
  field(INAM,"wavR3361Init")
  field(SNAM,"wavR3361Process")
  field(INPA,"$(USER):GETTRACE:A")
  field(NOA,701)
  field(INPB,"$(USER):GETYSCALE")
  field(NOB,1)
  field(INPC,"$(USER):GETREF")
  field(INPD,"$(USER):TRACE:SEL")
  field(NOC,1)
  field(EFLG, "ALWAYS")
  field(FTA,"SHORT")
  field(FTB,"LONG")
  field(FTC,"DOUBLE")
  field(FTD,"LONG")
  field(FTVA,"FLOAT")
  field(FTVB,"FLOAT")
  field(FLNK,"$(USER):FAN1")
  field(OUTA,"$(USER):SPECTRUM:A")
  field(OUTB,"$(USER):SPECTRUM:B")
  field(NOVA,701)
  field(NOVB,701)
}

の様な形でINPA、INPB、INPC及びOUTA、そしてそれぞれの要素の propertyを指定する形になります。FLNKはfanoutでマーカー操作 とSpectrum更新を行う形です。

dbdファイルの中で次のように本体機能を定義します。

#R3361 dbd list
device(ai,GPIB_IO,devAiR3361Gpib,"R3361")
device(ao,GPIB_IO,devAoR3361Gpib,"R3361")
device(bi,GPIB_IO,devBiR3361Gpib,"R3361")
device(bo,GPIB_IO,devBoR3361Gpib,"R3361")
device(stringin,GPIB_IO,devSiR3361Gpib,"R3361")
device(stringout,GPIB_IO,devSoR3361Gpib,"R3361")
device(longin,GPIB_IO,devLiR3361Gpib,"R3361")
device(longout,GPIB_IO,devLoR3361Gpib,"R3361")
device(mbbi,GPIB_IO,devMbbiR3361Gpib,"R3361")
device(mbbo,GPIB_IO,devMbboR3361Gpib,"R3361")
device(waveform,GPIB_IO,devWfR3361Gpib,"R3361")

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

このデバイスサポートで使うデータベースの例を示します。
DTYPRecordSignalNameFunctionRemarks
R3361ao0$(USER):SETCF中心周波数設定
R3361ai1$(USER):GETCF中心周波数読み取り
R3361ao2$(USER):SETSTARTFスタート周波数設定
R3361ai3$(USER):GETSTARTFスタート周波数読み取り
R3361ao4$(USER):SETSTOPFストップ周波数設定
R3361ai5$(USER):GETSTOPFストップ周波数読み取り
R3361ao6$(USER):SETCFSTEP周波数ステップ設定要るまい
R3361ao7$(USER):SETCFSTEP:AUTO周波数ステップ自動要らんじゃろう
R3361ai8$(USER):GETCFSTEP周波数ステップ読み取り要らんわ
R3361ao9$(USER):SETSPANスパン周波数設定
R3361ai10$(USER):GETSPANスパン周波数読み取り
R3361ao11$(USER):SETRBWRBW設定
R3361ao12$(USER):SETRBW:AUTORBW自動
R3361ai13$(USER):GETRBWRBW読み取り
R3361ao14$(USER):SETVBWVBW設定
R3361ao15$(USER):SETVBW:AUTOVBW自動
R3361ai16$(USER):GETVBWVBW読み取り
R3361ao17$(USER):SETSWEEPsweep設定
R3361ao18$(USER):SETSWEEP:AUTOsweep自動
R3361ai19$(USER):GETSWEEPVBW読み取り
R3361ao20$(USER):SETATattenuator設定
R3361ao21$(USER):SETAT:AUTOattenuator自動
R3361ai22$(USER):GETATattenuator読み取り
R3361ao23$(USER):SETCPL:AUTOcoupling auto
R3361ao24$(USER):SETYSCALEY軸設定10,5,2,1,0.5,0.2,0.1のみ受け付ける(mbboにしろよ!)
R3361mbbi25$(USER):GETYSCALEY軸読み出し0=10dB,1=5dB,2=2dB,3=1dB,4=0.5dB,5=0.2dB,6=0.1dB
R3361ao26$(USER):SETREFreference level設定
R3361ai27$(USER):GETREFreference level読み取り
R3361ao28$(USER):SETTGPWRTG power設定
R3361ao29$(USER):SETTGPWR:ONTG on
R3361ao30$(USER):SETTGPWR:OFFTG off
R3361ai31$(USER):GETTGPWRTG power読み取り
R3361ao32$(USER):SETTGCAL:AUTOTGトラッキング自動調整通常は使用可。manualでないとダメなこともある。
R3361so33$(USER):TITLETITLE設定LON/たいとる/としてくだされ
R3361so34$(USER):TITLE:OFFTITLE off
R3361waveform35$(USER):GETTRACE:AトレースA転送701点、0から400の値になる
R3361waveform36$(USER):GETTRACE:BトレースB転送701点、0から400の値になる
R3361ao37$(USER):SETTRIG:SINGLEシングルショットトリガー
R3361ao38$(USER):SETTRIG:STARTトリガースタート
R3361ao39$(USER):SETTRIG:CONTフリーラン
R3361ao40$(USER):SETTRACE:CLEARAトレースAクリアいらん
R3361ao41$(USER):SETTRACE:CLEARBトレースBクリア不要
R3361ao42$(USER):SETMARKER:PEAKマーカーをpeakに
R3361ao43$(USER):SETMARKER:ONマーカーON
R3361ao44$(USER):SETMARKER:OFFマーカーをOFF要らんかも
R3361ao45$(USER):SETMARKER:DELTAマーカーをdelta modeにいりませんとも
R3361ao46$(USER):SETMARKER:NORMALマーカーをnormal modeに
R3361ai47$(USER):GETMARKER:FREQマーカー周波数読み取り
R3361ai48$(USER):GETMARKER:AMPマーカーamplitude読み取り
R3361ao49$(USER):SETVEW:TRATrace Aをアクティブ設定
R3361ao50$(USER):SETVEW:TRBTrace Bをアクティブ設定
R3361ao51$(USER):INIT_ALLSA初期化やめて
R3361ao52$(USER):SETVEW:WRITEAA write?
R3361ao53$(USER):SETVEW:WRITEBB write?
R3361ao54$(USER):SETVEW:VIEWAA view?
R3361ao55$(USER):SETVEW:VIEWBB view?
R3361ao56$(USER):SETVEW:MAXAA maxhold?
R3361ao57$(USER):SETVEW:MAXBB maxhold?
R3361longout58$(USER):SETAVGAA avarage回数設定
R3361ao59$(USER):SETVEW:AVGA:STARTA Average start
R3361ao60$(USER):SETVEW:AVGA:STOPA Average stop
R3361ao61$(USER):SOFTINITStatus clear役に立たないかも
R3361longout62$(USER):SETAVGBB avarage回数設定
R3361ao63$(USER):SETVEW:AVGB:STARTB Average start
R3361ao64$(USER):SETVEW:AVGB:STOPB Average stop
R3361longout65$(USER):SETTGMANTGトラッキングマニュアル調整
R3361so66$(USER):SRQONSRQ ON掃引終了時(など)にSRQ出る
R3361so67$(USER):SRQOFFSRQ OFF
R3361so68$(USER):SRQRECステータスバイトクリアSRQ後このレコードが起動される
R3361so69$(USER):SETDIV8画面8divに設定初期状態
R3361so70$(USER):SETDIV12画面12divに設定とてものろくなる
R3361mbbi71$(USER):GETDIV画面div数0=8div,1=12div,2=その他(って何じゃ?)
SoftwaveformN/A$(USER):SPECTRUM:AトレースAの値シーケンサが変換
SoftwaveformN/A$(USER):SPECTRUM:BトレースBの値シーケンサが変換
SoftbiN/A$(USER):TRACE:SELSPECTRUMAB変換選択0ならA、その他はB
SoftcalcN/A$(USER):SWTRIGスイープ終了トリガシーケンサ使用
データベースファイル本体例は以下をご参照ください。 MakefileにdevR3361Gpib.c、devR3361Gpib.dbd、wavR3361.c、wavR3361.dbdを登録、 makeでinstallします。

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

通常通り設定します。
dbLoadRecords("db/FB_SAA.db","USER=FBBSM:MAIN, ADDR=A3")

vxi11Configure("L0","172.19.xx.xxx",0,0.0,"gpib0",0,0)

7.おわりに

Advantest R3361スペクトラムアナライザ用ASYN対応版GP-IBデバイスサポート を紹介しました。
Makoto Tobiyama
2/Jun/2017

Return to FB Home Page...