動作確認は、CentOS 6.8(64bit)上のEPICS R314.12.3-CSA + ASYN4-23、キーサイトテクノロジの LAN-GPIBで行っています。
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 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);
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")
DTYP | Record | Signal | Name | Function | Remarks |
---|---|---|---|---|---|
R3361 | ao | 0 | $(USER):SETCF | 中心周波数設定 | |
R3361 | ai | 1 | $(USER):GETCF | 中心周波数読み取り | |
R3361 | ao | 2 | $(USER):SETSTARTF | スタート周波数設定 | |
R3361 | ai | 3 | $(USER):GETSTARTF | スタート周波数読み取り | |
R3361 | ao | 4 | $(USER):SETSTOPF | ストップ周波数設定 | |
R3361 | ai | 5 | $(USER):GETSTOPF | ストップ周波数読み取り | |
R3361 | ao | 6 | $(USER):SETCFSTEP | 周波数ステップ設定 | 要るまい |
R3361 | ao | 7 | $(USER):SETCFSTEP:AUTO | 周波数ステップ自動 | 要らんじゃろう |
R3361 | ai | 8 | $(USER):GETCFSTEP | 周波数ステップ読み取り | 要らんわ |
R3361 | ao | 9 | $(USER):SETSPAN | スパン周波数設定 | |
R3361 | ai | 10 | $(USER):GETSPAN | スパン周波数読み取り | |
R3361 | ao | 11 | $(USER):SETRBW | RBW設定 | |
R3361 | ao | 12 | $(USER):SETRBW:AUTO | RBW自動 | |
R3361 | ai | 13 | $(USER):GETRBW | RBW読み取り | |
R3361 | ao | 14 | $(USER):SETVBW | VBW設定 | |
R3361 | ao | 15 | $(USER):SETVBW:AUTO | VBW自動 | |
R3361 | ai | 16 | $(USER):GETVBW | VBW読み取り | |
R3361 | ao | 17 | $(USER):SETSWEEP | sweep設定 | |
R3361 | ao | 18 | $(USER):SETSWEEP:AUTO | sweep自動 | |
R3361 | ai | 19 | $(USER):GETSWEEP | VBW読み取り | |
R3361 | ao | 20 | $(USER):SETAT | attenuator設定 | |
R3361 | ao | 21 | $(USER):SETAT:AUTO | attenuator自動 | |
R3361 | ai | 22 | $(USER):GETAT | attenuator読み取り | |
R3361 | ao | 23 | $(USER):SETCPL:AUTO | coupling auto | |
R3361 | ao | 24 | $(USER):SETYSCALE | Y軸設定 | 10,5,2,1,0.5,0.2,0.1のみ受け付ける(mbboにしろよ!) |
R3361 | mbbi | 25 | $(USER):GETYSCALE | Y軸読み出し | 0=10dB,1=5dB,2=2dB,3=1dB,4=0.5dB,5=0.2dB,6=0.1dB |
R3361 | ao | 26 | $(USER):SETREF | reference level設定 | |
R3361 | ai | 27 | $(USER):GETREF | reference level読み取り | |
R3361 | ao | 28 | $(USER):SETTGPWR | TG power設定 | |
R3361 | ao | 29 | $(USER):SETTGPWR:ON | TG on | |
R3361 | ao | 30 | $(USER):SETTGPWR:OFF | TG off | |
R3361 | ai | 31 | $(USER):GETTGPWR | TG power読み取り | |
R3361 | ao | 32 | $(USER):SETTGCAL:AUTO | TGトラッキング自動調整 | 通常は使用可。manualでないとダメなこともある。 |
R3361 | so | 33 | $(USER):TITLE | TITLE設定 | LON/たいとる/としてくだされ |
R3361 | so | 34 | $(USER):TITLE:OFF | TITLE off | |
R3361 | waveform | 35 | $(USER):GETTRACE:A | トレースA転送 | 701点、0から400の値になる |
R3361 | waveform | 36 | $(USER):GETTRACE:B | トレースB転送 | 701点、0から400の値になる |
R3361 | ao | 37 | $(USER):SETTRIG:SINGLE | シングルショットトリガー | |
R3361 | ao | 38 | $(USER):SETTRIG:START | トリガースタート | |
R3361 | ao | 39 | $(USER):SETTRIG:CONT | フリーラン | |
R3361 | ao | 40 | $(USER):SETTRACE:CLEARA | トレースAクリア | いらん |
R3361 | ao | 41 | $(USER):SETTRACE:CLEARB | トレースBクリア | 不要 |
R3361 | ao | 42 | $(USER):SETMARKER:PEAK | マーカーをpeakに | |
R3361 | ao | 43 | $(USER):SETMARKER:ON | マーカーON | |
R3361 | ao | 44 | $(USER):SETMARKER:OFF | マーカーをOFF | 要らんかも |
R3361 | ao | 45 | $(USER):SETMARKER:DELTA | マーカーをdelta modeに | いりませんとも |
R3361 | ao | 46 | $(USER):SETMARKER:NORMAL | マーカーをnormal modeに | |
R3361 | ai | 47 | $(USER):GETMARKER:FREQ | マーカー周波数読み取り | |
R3361 | ai | 48 | $(USER):GETMARKER:AMP | マーカーamplitude読み取り | |
R3361 | ao | 49 | $(USER):SETVEW:TRA | Trace Aをアクティブ設定 | |
R3361 | ao | 50 | $(USER):SETVEW:TRB | Trace Bをアクティブ設定 | |
R3361 | ao | 51 | $(USER):INIT_ALL | SA初期化 | やめて |
R3361 | ao | 52 | $(USER):SETVEW:WRITEA | A write | ? |
R3361 | ao | 53 | $(USER):SETVEW:WRITEB | B write | ? |
R3361 | ao | 54 | $(USER):SETVEW:VIEWA | A view | ? |
R3361 | ao | 55 | $(USER):SETVEW:VIEWB | B view | ? |
R3361 | ao | 56 | $(USER):SETVEW:MAXA | A maxhold | ? |
R3361 | ao | 57 | $(USER):SETVEW:MAXB | B maxhold | ? |
R3361 | longout | 58 | $(USER):SETAVGA | A avarage回数設定 | |
R3361 | ao | 59 | $(USER):SETVEW:AVGA:START | A Average start | |
R3361 | ao | 60 | $(USER):SETVEW:AVGA:STOP | A Average stop | |
R3361 | ao | 61 | $(USER):SOFTINIT | Status clear | 役に立たないかも |
R3361 | longout | 62 | $(USER):SETAVGB | B avarage回数設定 | |
R3361 | ao | 63 | $(USER):SETVEW:AVGB:START | B Average start | |
R3361 | ao | 64 | $(USER):SETVEW:AVGB:STOP | B Average stop | |
R3361 | longout | 65 | $(USER):SETTGMAN | TGトラッキングマニュアル調整 | |
R3361 | so | 66 | $(USER):SRQON | SRQ ON | 掃引終了時(など)にSRQ出る |
R3361 | so | 67 | $(USER):SRQOFF | SRQ OFF | |
R3361 | so | 68 | $(USER):SRQREC | ステータスバイトクリア | SRQ後このレコードが起動される |
R3361 | so | 69 | $(USER):SETDIV8 | 画面8divに設定 | 初期状態 |
R3361 | so | 70 | $(USER):SETDIV12 | 画面12divに設定 | とてものろくなる |
R3361 | mbbi | 71 | $(USER):GETDIV | 画面div数 | 0=8div,1=12div,2=その他(って何じゃ?) |
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_SAA.db","USER=FBBSM:MAIN, ADDR=A3") vxi11Configure("L0","172.19.xx.xxx",0,0.0,"gpib0",0,0)