現時点(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)