[KEKB Bunch Feedback Group]

17K66A任意分周・遅延回路デバイスサポート(XportでRS-232C)(Japanese)

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

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


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

1.はじめに

17K66Aモジュールは、入力クロック400-600MHzで動作する、周波数同期型のNIM一幅の 16ビットカウンターモジュールです。背面のRS-232C通信で、分周比とディレイを 設定でき、設定値を読み返すこともできます。

本デバイスサポートは、この17K66Aモジュールを、EPICSからXport経由でコントロール する、Asynドライバーです。

2.サポートする機能

リモートコマンドは以下の表の通りです。
HeaderFunctionコマンド例応答例
DLY遅延値の設定(0〜65535)DLY00100<CR>DLY00100<CR>
DVD分周値の設定DVD05120<CR>DVD05120<CR>
GET状態読み込みGET<CR> OEN/DVD05120/DLY00100<CR>

応答のOENは出力enable、ODSが出力disableです。デリミタとしては<CR> しか 許さず、上記以外のコマンド、文字が入力された場合は???を返すという きわめて頑なな仕様です。

3.EPICS環境

本デバイスサポートは、Linux PC上で動作しているEPICS R314.6+Async driver 4-8および相当品で開発したものです。これより以降のEPICS、およびasyncドライバであれば動作すると思われます。EPICSそのものに対する説明、入門出家入道については専門家に帰依するなり、コントロールグループのページをご参照なさるなりしてください。

4.コードの概要

きわめてシンプルな構造をしています。ソースコードは ここをご参照ください。
コマンドは3つしかありません。
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 }

};
注意点は
waveform用変換関数のうち、データバッファを数字データに変換する物は
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;
}
といった、実に不細工な関数で行っています。あーはずかし。
dbdファイルをデバイスサポートファイルに従い次のように定義します。(file名はdev17K66A.dbd)


#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")

これをincludeしておきます。

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

サンプルデータベースは以下のリンクをご参照ください。
サンプルデータベース

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

~/epicsApp/iocBoot/iocfblinux/で、st.cmdを変更します。ポイントは、 です。具体的には、例えば
dbLoadRecords("db/FB_DV.db","PORT=L2, A=1")

drvAsynIPPortConfigure("L2","172.19.**.***:23",0,0,0)
のように設定します。

7.おわりに

Xport+asynドライバーを使い、因業なRS-232Cインターフェースを持つ 17K66Aをコントロールするデバイスサポートを紹介しました。
Makoto Tobiyama
11/Aug/2009

Return to FB Home Page...