現時点(2014年)で製造中止からすでに時間が経っていますが、まだ修理不能の連絡は 頂いていません(少なくとも2012年に修理は可能でした--所有しているR3172及びR3132のほとんどが トラッキング同期がとれなくなってしまった。もちろん修理費は高額になって破産しかけました)。
動作確認は、CentOS 6.5(64bit)上のEPICS R314.12.1-CSA + ASYN4-21、Agilentの LAN-GPIBで行っています。
内容はsource codeをご覧下さい。以前に比べて相当シンプルに なっています。
以前は-1になっていましたが、今回はNULLです。これをdefineで与えています。
このため、get_trace_aが、single sweep、sweep終了でSRQ発効、sweepスタート、
そしてtrace A取得というコマンドの連続になっています。具体的には
DL0; SI; *SRE128; OPR 8; S0; SR; DL2 TBA?です。データ取得が終わったら、マーカーpeak、マーカー 読み取り後、SRQ禁止、連続スイープに戻しておくのが 吉と思います。
static long init_ai(int parm)
{
if(parm==0) {
devSupParms.name = "devR3172Gpib";
devSupParms.gpibCmds = gpibCmds;
devSupParms.numparams = NUMPARAMS;
devSupParms.timeout = TIMEOUT;
devSupParms.timeWindow = TIMEWINDOW;
devSupParms.respond2Writes = -1.0;
}
return(0);
}
ここで、TIMEOUTやTIMEWINDOWは外で定義しておきます。適正値を
調べるのが面倒なので(<ちゃんと調べろ!)、今のところ
TIMEOUT=600、TIMEWINDOWS=5になっています。
aSubレコードのフィールドには以下の特徴があります。
#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 wavADSADebug;
static long wavADSAInit(aSubRecord *precord)
{
if (wavADSADebug)
printf("Record %s called wavADSAInit(%p)\n",
precord->name, (void*) precord);
return 0;}
static long wavADSAProcess(aSubRecord *precord)
{
short i;
int count=1001;
short *raw1;
int *bin;
double *cin;
int getscale;
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;
getscale = (bin[0]);
getref = cin[0];
conv_fac1 = 10.0*xdb[getscale]/12800.0;
conv_fac2 = getref - 10.0*xdb[getscale];
for (i=0;i<count;i++)
{
trace[i]=(raw1[i]-1792)*conv_fac1+conv_fac2;
// fprintf(stdout,"i =%d data%f\r",i,trace[i]);
}
memcpy(precord->vala, trace, count*sizeof(float));
precord->neva = count;
precord->nova = count;
return 0;
}
epicsExportAddress(int, wavADSADebug);
epicsRegisterFunction(wavADSAInit);
epicsRegisterFunction(wavADSAProcess);
使い方として
variable(wavADSADebug) function(wavADSAInit) function(wavADSAProcess)といった形になります。
データベース側では、GETTRACE:AのFLNKをこのレコード(RAWTODBM)にしておき、
record(waveform,"$(USER):GETTRACE:A") {
field(FLNK,"$(USER):RAWTODBM")
}
RAWTODBM自体は以下の様に
record(aSub, "$(USER):RAWTODBM"){ field(INAM,"wavADSAInit")
field(SNAM,"wavADSAProcess")
field(INPA,"$(USER):GETTRACE:A")
field(NOA,1001)
field(INPB,"$(USER):GETYSCALE")
field(NOB,1)
field(INPC,"$(USER):GETREF")
field(NOC,1)
field(EFLG, "ALWAYS")
field(FTA,"SHORT")
field(FTB,"LONG")
field(FTC,"DOUBLE")
field(FTVA,"FLOAT")
field(FLNK,"$(USER):FAN1")
field(OUTA,"$(USER):SPECTRUM:A")
field(NOVA,1001)
}
の様な形でINPA、INPB、INPC及びOUTA、そしてそれぞれの要素の
propertyを指定する形になります。FLNKはfanoutでマーカー操作
とSpectrum更新を行う形です。dbdファイルの中で次のように本体機能を定義します。
#R3172 dbd list device(ai,GPIB_IO,devAiR3172Gpib,"R3172") device(ao,GPIB_IO,devAoR3172Gpib,"R3172") device(bi,GPIB_IO,devBiR3172Gpib,"R3172") device(bo,GPIB_IO,devBoR3172Gpib,"R3172") device(stringin,GPIB_IO,devSiR3172Gpib,"R3172") device(stringout,GPIB_IO,devSoR3172Gpib,"R3172") device(longin,GPIB_IO,devLiR3172Gpib,"R3172") device(longout,GPIB_IO,devLoR3172Gpib,"R3172") device(mbbi,GPIB_IO,devMbbiR3172Gpib,"R3172") device(mbbo,GPIB_IO,devMbboR3172Gpib,"R3172") device(waveform,GPIB_IO,devWfR3172Gpib,"R3172")
| DTYP | Record | Signal | Name | Function | Remarks |
|---|---|---|---|---|---|
| R3172 | ao | 0 | $(USER):SETCF | 中心周波数設定 | |
| R3172 | ai | 1 | $(USER):GETCF | 中心周波数読み取り | |
| R3172 | ao | 2 | $(USER):SETSTARTF | スタート周波数設定 | |
| R3172 | ai | 3 | $(USER):GETSTARTF | スタート周波数読み取り | |
| R3172 | ao | 4 | $(USER):SETSTOPF | ストップ周波数設定 | |
| R3172 | ai | 5 | $(USER):GETSTOPF | ストップ周波数読み取り | |
| R3172 | ao | 6 | $(USER):SETCFSTEP | 周波数ステップ設定 | やっぱり要りますか? |
| R3172 | ao | 7 | $(USER):SETCFSTEP:AUTO | 周波数ステップ自動 | 本当に? |
| R3172 | ai | 8 | $(USER):GETCFSTEP | 周波数ステップ読み取り | |
| R3172 | ao | 9 | $(USER):SETSPAN | スパン周波数設定 | |
| R3172 | ai | 10 | $(USER):GETSPAN | スパン周波数読み取り | |
| R3172 | ao | 11 | $(USER):SETRBW | RBW設定 | |
| R3172 | ao | 12 | $(USER):SETRBW:AUTO | RBW自動 | |
| R3172 | ai | 13 | $(USER):GETRBW | RBW読み取り | |
| R3172 | ao | 14 | $(USER):SETVBW | VBW設定 | |
| R3172 | ao | 15 | $(USER):SETVBW:AUTO | VBW自動 | |
| R3172 | ai | 16 | $(USER):GETVBW | VBW読み取り | |
| R3172 | ao | 17 | $(USER):SETSWEEP | sweep設定 | |
| R3172 | ao | 18 | $(USER):SETSWEEP:AUTO | sweep自動 | |
| R3172 | ai | 19 | $(USER):GETSWEEP | VBW読み取り | |
| R3172 | ao | 20 | $(USER):SETAT | attenuator設定 | |
| R3172 | ao | 21 | $(USER):SETAT:AUTO | attenuator自動 | |
| R3172 | ai | 22 | $(USER):GETAT | attenuator読み取り | |
| R3172 | ao | 23 | $(USER):SETCPL:AUTO | coupling auto | |
| R3172 | ao | 24 | $(USER):SETYSCALE | Y軸設定 | 10,5,2,1のみ受け付ける(mbboにしろよ!) |
| R3172 | mbbi | 25 | $(USER):GETYSCALE | Y軸読み出し | 0=10dB,1=5dB,2=2dB,3=1dB |
| R3172 | ao | 26 | $(USER):SETREF | reference level設定 | |
| R3172 | ai | 27 | $(USER):GETREF | reference level読み取り | |
| R3172 | ao | 28 | $(USER):SETTGPWR | TG power設定 | |
| R3172 | ao | 29 | $(USER):SETTGPWR:ON | TG on | |
| R3172 | ao | 30 | $(USER):SETTGPWR:OFF | TG off | |
| R3172 | ai | 31 | $(USER):GETTGPWR | TG power読み取り | |
| R3172 | ao | 32 | $(USER):SETTGCAL:AUTO | TGトラッキング自動調整 | |
| R3172 | so | 33 | $(USER):TITLE | TITLE設定 | LON/たいとる/としてくだされ |
| R3172 | so | 34 | $(USER):TITLE:OFF | TITLE off | |
| R3172 | waveform | 35 | $(USER):GETTRACE:A | シングルスイープ、SRQオンしてトレースA転送 | 1001点、1792から14592の値になる |
| R3172 | waveform | 36 | $(USER):GETTRACE:B | トレースB転送 | 1001点、1792から14592の値になる |
| R3172 | ao | 37 | $(USER):SETTRIG:SINGLE | シングルショットトリガー | |
| R3172 | ao | 38 | $(USER):SETTRIG:START | トリガースタート | |
| R3172 | ao | 39 | $(USER):SETTRIG:CONT | フリーラン | |
| R3172 | ao | 40 | $(USER):SETTRACE:CLEARA | トレースAクリア | いらん |
| R3172 | ao | 41 | $(USER):SETTRACE:CLEARB | トレースBクリア | 不要 |
| R3172 | ao | 42 | $(USER):SETMARKER:PEAK | マーカーをpeakに | |
| R3172 | ao | 43 | $(USER):SETMARKER:ON | マーカーON | |
| R3172 | ao | 44 | $(USER):SETMARKER:OFF | マーカーをOFF | 要らんかも |
| R3172 | ao | 45 | $(USER):SETMARKER:DELTA | マーカーをdelta modeに | |
| R3172 | ao | 46 | $(USER):SETMARKER:NORMAL | マーカーをnormal modeに | |
| R3172 | ai | 47 | $(USER):GETMARKER:FREQ | マーカー周波数読み取り | |
| R3172 | ai | 48 | $(USER):GETMARKER:AMP | マーカーamplitude読み取り | |
| R3172 | ao | 49 | $(USER):SETSA:INIT | SA初期化 | やめて |
| R3172 | ao | 50 | $(USER):SETVEW:WRITEA | A write | ? |
| R3172 | ao | 51 | $(USER):SETVEW:WRITEB | B write | ? |
| R3172 | ao | 52 | $(USER):SETVEW:VIEWA | A view | ? |
| R3172 | ao | 53 | $(USER):SETVEW:VIEWB | B view | ? |
| R3172 | ao | 54 | $(USER):SETVEW:MAXA | A maxhold | ? |
| R3172 | ao | 55 | $(USER):SETVEW:MAXB | B maxhold | ? |
| R3172 | longout | 56 | $(USER):SETAVGA | A avarage回数設定 | |
| R3172 | ao | 57 | $(USER):SETVEW:AVGA:START | A Average start | |
| R3172 | ao | 58 | $(USER):SETVEW:AVGA:STOP | A Average stop | |
| R3172 | ao | 59 | $(USER):SOFTINIT | Status clear | 役に立たないかも |
| R3172 | longout | 60 | $(USER):SETAVGB | B avarage回数設定 | |
| R3172 | ao | 61 | $(USER):SETVEW:AVGB:START | B Average start | |
| R3172 | ao | 62 | $(USER):SETVEW:AVGB:STOP | B Average stop | |
| R3172 | longout | 63 | $(USER):SETTGMAN | TGトラッキングマニュアル調整 | |
| R3172 | so | 64 | $(USER):SRQON | SRQ ON | 掃引終了時だけにSRQ出る |
| R3172 | so | 65 | $(USER):SRQOFF | SRQ OFF | |
| R3172 | so | 66 | $(USER):SRQREC | ステータスバイトクリア | SRQ後このレコードが起動される |
| R3172 | so | 67 | $(USER):SETTRACE501 | 横軸501点に | しないで |
| R3172 | so | 68 | $(USER):SETTRACE1001 | 横軸1001点 | 初期状態 |
| R3172 | mbbi | 69 | $(USER):GETTRACE:NUM | 横軸点数 | 0=501,1=1001 |
| R3172 | so | 70 | $(USER):SETHISENSE:ON | Hi Sense On | |
| R3172 | so | 71 | $(USER):SETHISENSE:OFF | Hi Sense OFF | |
| R3172 | mbbi | 72 | $(USER):GETSENSE | Sense Mode | 0=OFF,1=ON |
| Soft | waveform | N/A | $(USER):SPECTRUM:A | トレースAの値 | シーケンサが変換 |
| Soft | waveform | N/A | $(USER):SPECTRUM:B | トレースBの値 | シーケンサが変換 |
| Soft | bi | N/A | $(USER):TRACE:SEL | SPECTRUMAB変換選択 | 0ならA、その他はB |
| Soft | calc | N/A | $(USER):SWTRIG | スイープ終了トリガ | シーケンサ使用 |
dbLoadRecords("db/FB_SAA2.db","USER=FBH:AD, ADDR=A4")
vxi11Configure("L0","172.19.xx.xxx",0,0.0,"gpib0",0,0)