本デバイスサポートは、この17K66Aモジュールを、EPICSからXport経由でコントロール する、Asynドライバーです。
| Header | Function | コマンド例 | 応答例 |
|---|---|---|---|
| DLY | 遅延値の設定(0〜65535) | DLY00100<CR> | DLY00100<CR> |
| DVD | 分周値の設定 | DVD05120<CR> | DVD05120<CR> |
| GET | 状態読み込み | GET<CR> | OEN/DVD05120/DLY00100<CR> |
static struct gpibCmd gpibCmds[] = {
/* COMAND 0 set_delay */
{&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "DLY%05ld\r", 511, 511, NULL, 0, 0, NULL, NULL, EOSNL },
/* COMAND 1 set_dev */
{&DSET_LO, GPIBWRITE, IB_Q_LOW, NULL, "DVD%05ld\r", 511, 511, NULL, 0, 0, NULL, NULL, EOSNL },
/* COMAND 2 read status */
{&DSET_WF, GPIBREAD, IB_Q_LOW, "GET\r",NULL, 0, 8191, rd_wf_data, 0,0,NULL,NULL, EOSNL }
};
注意点は
static int rd_data(char wav[], long data[])
{
/* 012345678901234567890
OEN/DVD12345/DLY12345
*/
int i;
char wa1[32767];
/* printf("input %s\n",wav); */
strcpy(wa1,strtok(wav,"/"));
if (strcmp(wa1,"OEN")==0) {
data[0]=0;
}
else {
data[0]=1;
}
for (i=7;i<12;i++)
{
wa1[i-7]=wav[i];
}
/* printf("DVD %s\n",wa1); */
data[1]=atoi(wa1);
for (i=16;i<21;i++)
{
wa1[i-16]=wav[i];
}
data[2]= atoi(wa1);
return 0;
}
といった、実に不細工な関数で行っています。あーはずかし。
#dev17K66A dbd list device(ai,GPIB_IO,devAi17K66A,"DV66A") device(ao,GPIB_IO,devAo17K66A,"DV66A") device(bi,GPIB_IO,devBi17K66A,"DV66A") device(bo,GPIB_IO,devBo17K66A,"DV66A") device(stringin,GPIB_IO,devSi17K66A,"DV66A") device(stringout,GPIB_IO,devSo17K66A,"DV66A") device(longin,GPIB_IO,devLi17K66A,"DV66A") device(longout,GPIB_IO,devLo17K66A,"DV66A") device(mbbi,GPIB_IO,devMbbi17K66A,"DV66A") device(mbbo,GPIB_IO,devMbbo17K66A,"DV66A") device(waveform,GPIB_IO,devWf17K66A,"DV66A")
dbLoadRecords("db/FB_DV.db","PORT=L2, A=1")
drvAsynIPPortConfigure("L2","172.19.**.***:23",0,0,0)
のように設定します。