[KEKB Bunch Feedback Group]

株式会社デジテックス研究所製高速大容量メモリー(Bunch Oscillation Recorder)用EPICS Device Support(Japanese)


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

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


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

1.はじめに

バンチ振動モニターメモリー(BOR-memory)は509MHzで動作する8ビットのメモリーボードです。メモリー自体は20Mb(5120バンチ×4096周)もっています。

2.VMEバスレジスタ

メモリーボードのアドレスマップは以下の通りです。

3.EPICS環境

本デバイスサポートは、EPICS R313改訂版で開発したものです。EPICSそのものに対する説明、入門出家入道遁世については専門家に帰依するなり、コントロールグループのページをご参照なさるなり勝手になさってください。動作はPPC750のみで確認しています。

4.コードの概要

コードは以下の通りです。

変数定義

ファイル名、ファイルハンドル、File記録ON/OFF用の変数を定義します。

static char file_name[5][255];
FILE *FHAND;

static int fileflag[5];

configuration file

過去割り込みモードで動かしていた痕跡があり、interrupt level及びinterrput vectorを指定するようになっていますが、適当な数字を入れれば結構です。
int devVmemem2Config(ncards,a32base,intlevel,intvecbase)

初期化部

初期時には動作停止状態にしておきます。
logMsg("Found vmemem2 with cardNum= %d\n address= %x\n",cardNum,p);
	 cards[cardNum].card = p;  /* Remember address of the board */

	 cards[cardNum].card->cntl1 = 0x01;

String out(SO)レコード

データ記録用ファイル名をデバイスサポートが覚えるために使います。ボードには何のアクセスもしません。

static long write_stringout(pstringout)
struct stringoutRecord      *pstringout;
{
    long status = 0;
    short cardN;

    cardN = pstringout->out.value.vmeio.card;
    if (checkLink(cardN) == ERROR)
    {
      logMsg("Error--- No vmemem2 for card %d\n",cardN);
      return(ERROR);
    }
    strcpy(file_name[cardN],FPATH);
    strcat(file_name[cardN],pstringout->val);
    
    return(status);
}

BOの動作

waveform読みとり

はじめに(念のため)ボードを読みとり状態に再設定し、ストップアドレス1、2をよみとります。
  cards[cardN].card->cntl1 = 0x09;
  s1=cards[cardN].card->stop1;
  s2=cards[cardN].card->stop2;
  
  s1=(s1 & 0x7fff);
  s2=(s2 & 0x1f);
  
ファイルに記録するときは、fileをopenしてストップアドレス1、2をまず記録しておきます。このデバイスサポートはメモリーボード内データを一応時間順に並べ替えて記録しますが、メモリーの途中にあるストップポイントに関しては何の処理もしません。データ処理プログラム側で記録されているストップアドレス1、2を使って再ソートすることになります。全体のストップアドレスはstop1+stop2*32768です。詳しくは以下の文章(古いが間違ってはいないはず)を参照してください。
メモリーマップは以下のようになっています。
20191817161514131211109876543210
ボード切り換えボード内下位アドレス
D16アクセス時、ボード内アドレスはcntl2で0から19まで設定します。D16データは、[D15..D08][D07..D00]の上位、下位8バイトずつ、それぞれボード番号が0なら(0,2)、1なら(1,3)という風に入っています。ボード0とボード2のデータは全く同じ(フィルターボードとの互換性のためこうならざるをえなかった)です。そこで
ボード切り換え上位バイト下位バイト
002
113
202
313
446
557
646
757
8810
9911
10810
11911
121214
131315
141214
151315
161618
171719
181618
191719
202022
212123
222022
232123
242426
252527
262426
272527
282830
292931
302830
312931
のようにデータが入っているので、これを並べ替えるため
static int isel(int i)
{
  int sel[16] = {0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29};

  return(sel[i]);
}
という関数を用意し、順番を並べ替えます。下位アドレス全部で1Mbなのでここまで読んだところでデータをファイルに書きます(実際はtftpなので結局最後にまとめて転送される)。
for (k=0;k<20;k++)
    {
      cards[cardN].card->cntl2 = (unsigned short)k;
      for (i=0;i<32768; i++)
	for (j=0; j<16; j++)
	  {
	    a1=cards[cardN].card->board[isel(j)][i];
	    if ((j%2)==0)
	      {
		memory_data[j*2+2+i*32]=(unsigned char)(a1>>8);
		memory_data[j*2+i*32]=(unsigned char)(a1 & 0xff);
	      }
	    else
	      {
		memory_data[j*2+1+i*32]=(unsigned char)(a1>>8);
		memory_data[j*2-1+i*32]=(unsigned char)(a1 & 0xff);
	      }
	  }
      if (fileflag[cardN]!=0)
	fwrite(memory_data,1,1048576,FHAND);
このあと、ファイルをcloseして待機します。
    if (fileflag[cardN]!=0)
    fclose(FHAND);
なお、D32アクセスをするときは、ボード切り替えはD16アクセス時と同じくA20-A16を使いますが、0〜7までしか使いません。
ボード切り換えD31-D24D23-D16D15-D08D07-D00
03120
17564
2119108
315131412
419171816
523212220
627252624
731293028
コードはバンチ電流モニター部を参照ください。

dbdファイル

dbdファイルの中で次のように定義します。
device(bo,VME_IO,devBoVmemem2,"VMEMEM2")
device(mbbiDirect,VME_IO,devMbbiVmemem2,"VMEMEM2")
device(waveform,VME_IO,devWfVmemem2,"VMEMEM2")
device(stringout,VME_IO,devSoVmemem2,"VMEMEM2")

初期化ファイルはdevVmeFIRCnfigで、ベースアドレスが0x20000000で3枚使うとすると、
devVmemem2Config(3,0x20000000,0x05,0xf0)

の様に指定します。

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

このデバイスサポートで使うデータベースをまとめると、以下の様になります。
DTYPRecordSignalNameFunctionRemarks
VMEMEM2waveform0($USER):BUNCHBunch oscillation data(0アドレスから5120)このままでは表示等できないのでデータベースで分割する必要あり
VMEMEM2mbbiDirect0($USER):statusボードのステータスデータ転送中にscanが入るとデータが化けるボードがあるので通常読まない
VMEMEM2BO0($USER):SYNCボードスタートアクセスで起動
VMEMEM2BO1($USER):STOPボードストップアクセスで起動
VMEMEM2BO2($USER):FILEIOディスク記録ON/OFF1でdisk save ready
VMEMEM2SO0($USER):FILENAME記録用ファイル名

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

現在ののスタートアップファイル(の関係部分)は次のようになります。
dbLoadRecords("fbppcApp/Db/FB_MEM.db","USER=FBL:MEMX , CHAN=C0")
dbLoadRecords("fbppcApp/Db/FB_MEM.db","USER=FBL:MEMY , CHAN=C1")
dbLoadRecords("fbppcApp/Db/FB_MEM.db","USER=FBL:MEMZ , CHAN=C2")

devVmemem2Config(3,0x20000000,0x05,0xf0)

iocInit

7.おわりに

バンチ振動モニター用大容量メモリーボード用EPICSデバイスサポートについて紹介しました。saveされたデータの活用法についてはこちらをご参照ください。
Makoto Tobiyama
14/Mar/2001

Return to FB Home Page...