The BAQ/Data Acquisition/DAQ System/NBBQ/Setup

Japanese English
Nuclear Physics Data Acquisition Orchestra Gallery Memo Diary Link Home
DAQ System DAQ Module Pulse Shape Analysis RTLinux Linux Device Driver Home
Babirl Babarl NBBQ Home

もどる

NBBQでのドライバはCAMAC制御のコアとなる bbgcam というドライバと、データ構造を構築したり、ユーザープログラムとのインターフェイスになる nbbqdrv というドライバから構成されています。
現在の nbbqdrv ではパフォーマンスも考慮して、ドライバ内でデータをバッファリングして、まとめてユーザーに受け渡す設計なため、計測の度にソースをある程度書き換える必要があります。
学生実験などの典型的なデータ収集を行なう場合は お手軽セットアップでセットアップすると簡単です。

DAQセットアップの手順
ここでは ~/test/ でNBBQをセットアップする例です。
babaDAQモードかbabarlDAQモードはbbmodules.hで指定します。
基本的にはbabarlDAQモードで使用することを強くお勧めします。

  1. # mkdir ~/test/
  2. # cd ~/test/
  3. # nbbqcpy
    セットアップに必要なファイルをコピーします
  4. # emacs bbmodules.h / startup.c / evt.c / sca.c / stop.c
    収集したいデータに合わせてソースを編集します (後述)
  5. # make clean; make
    ドライバをコンパイルします
  6. # nbbqinst
    ドライバをインストールします
    (コンパイルをし直した場合などは nbbqrst で入れ直しが出来ます)
  7. # bbdaqcom か bbrlcom
    babaDAQモードならbbdaqcom、 babarlDAQモードならbbrlcomでコントローラを起動します

BBDAQ、BBRLに加えてIWADAQ = Iwasa DAQモードを追加しました。データフォーマットがIwasa形式になります。コントローラはbbrlcomかnbbqcomを使ってください。

コントローラの使い方
babaDAQモードならbbdaqcom、 babarlDAQモードならbbrlcomでコントローラを起動します。起動時にBBDAQ or BBRL MODEかが表示されるので、確認して下さい。

babarlDAQと違い、ヘッダー & エンダーはraw dataには書き込まれません。 (最新のNBBQでは書き込むようにしました)
その代わりに runinfo.txt というファイルにまとめてRUN情報が書き込まれます。
babaDAQモードでは****.dat、babarlDAQモードでは****.rdf(****はRUN番号) という名前でraw dataが作られます。
RUN番号を変更したい場合は、runcounter.txtというファイルの数値を書きかえて、コントローラを起動して下さい。(書かれた数値+1が次のRUN番号になります)
すでに同じRUN番号のraw dataが存在する場合は、データが上書きされてしまうので注意して下さい。
データ収集の途中で強制終了してしまった場合は、runcounter.txt が正しく更新されていな可能性が高いので要チェックです。


ソースを書き換える (CAMACの例)
NBBQで一番重要なところです。細かい関数についてはDriverの関数群を参照して下さい。(基本はbabarlDAQと同じです)
VMEの例は下部にあります。

bbmodules.h

#define BBRL
/* #define BBDAQ */

#define CAMAC
#define CAMACINT
#define CC7700
/*
#define VME
#define VMEINT
#define INTLEVEL 3
#define SBS620
*/

#define MAXBUFF 0x1e00
#define LAMN  3
#define OPRN 22
#define OPBUSYCL 1

#define BBDAQ か BBRL のどちらかを記述します。 BBDAQだとbabaDAQモードで、BBRLだとbabarlDAQモードになります。

#define MAXBUFFでバッファリングするサイズ(word単位)を指定します。
例では 0x1e00 = 7680 ですが、最大 0x1f00 = 7936 を越えない程度に指定して下さい。 (16進数でも10進数で書いてもかまいません)
babarlDAQモードではブロックが16kB(0x2000 = 8192word)固定なので、バッファサイズが小さいと無駄なデータが増えるので注意して下さい。
babaDAQではモードではブロックが不定長なので、無駄はありません。

#define CAMAC でCAMACを使うことを宣言します。
#define VME でVMEを使うことを宣言します。
#define CAMACINT でCAMACを割り込みソースにします。(省略可)
#define VMEINT でVMEを割り込みソースにします。
#define CC7700 だとTOYO CC/7700、#define K2915 でKinetic K3912+K2915を使うことを宣言します。
#define SBS620 でSBS Bit3 618/620を使うことを宣言します。
割り込みソースがCAMACの場合は #define LAMN でLAMにするモジュールのStation Numberを指定します。
割り込みソースがVMEの場合は #define INTLEVEL で割り込みレベルを指定します。
なるべくOutput Registerを使ってVETO処理をして下さい。
私の場合は#define OPRNでOutput RegisterのStation Number、 #define OPBUSYCLでOutput Registerに書き込む値をセットします。


startup.c
ここではデータ収集開始時の動作を記述します。

void startup(void){
  crate_define_lam(LAMN);
  control_mod(0,LAMN,0,26);
  write_data(0,OPRN,0,17,OPBUSYCL);
}

crate_define_lam(LAMN)でLAMにするモジュールを指定し、 control_mod(0,LAMN,0,26)でLAMにするモジュールに対して LAMを許可しています。
また、write_data(c,n,a,f,data)を使って、 Output RegisgerからVETO解除信号を出力しています。

stop.c
データ収集終了時の動作を記述します。

void stop(void){
  control_mod(0,LAMN,0,9);
  control_mod(0,LAMN,0,24);
}

control_mod(0,LAMN,0,9)で念のためLAMモジュールをクリアし、 control_mod(0,LAMN,0,24)でLAMを禁止しています。

evt.c
イベントが発生した時の動作を記述します。

void evt(void){
  /* for BBRL */
   init_event(1);

   init_segment(1);
   read_segndata(2,0,3,0,0);
   end_segment();

   init_segment(2);
   read_segndata(6,0,4,0,0);
   end_segment();

   control_mod(0,3,0,9);
   control_mod(0,4,0,9);
}

void evt(void){
  /* for BBDAQ */
   init_segment();
   read_segndata(2,0,3,0,0);
   end_segment();

   control_mod(0,LAMN,0,9);
}

babalrDAQではinit_event(1)は約束ごとで、evt.cの先頭に書いて下さい。 (babaDAQモードでは書かないで下さい)
babarlDAQモードでは複数のセグメントが扱えます。 init_segment(segid) <-> end_segment() の間にセグメントのデータを記述していきます。
evt.c内でcontrol_mod(0,LAMN,0,9)などを使って、必ずLAMモジュールをクリアして下さい。

clear.c
主にVETO解除のために使います。

void clear(void){
  write_data(0,OPRN,0,17,OPBUSYCL);
}

clear.cではwrite_mod(c,n,a,f,data)を使って、 Output RegisterでVETO解除信号を送ります。
Output Registerを使わない場合は、とくに記述する必要はありません。

sca.c
スケーラ情報を収集します。 (babarlDAQモードのみ使えます)

void sca(void){
  read_scaler(2,12,0,1);
  read_scaler(1,12,0,2);
  control_mod(0,1,0,9);
  control_mod(0,2,0,9);
}

read_scaler(pos,len,c,n);でスケーラモジュールからデータを読み込みます。 posはスケーラの台数で決まります。スケーラが2台ある場合は1台目に2 2台目に1を指定します。1台しかない場合はposは1です。
lenは必ず12にして下さい。


ソースを書き換える (VMEの場合)
VME SBS620とCAEN V785 ADCを使う場合の例を以下にのせておきます。

-- bbmodules.h --
#define BBRL 
#define MAXBUFF 0x1e00 
 
#define ADCADDR 0x13000000  <- 変えて下さい

#define VME 
#define VMEINT 
#define INTLEVEL 3 
#define SBS620 


-- startup.c --
void startup(void){ 
  vme_define_intlevel(INTLEVEL); 
} 
 


-- evt.c --
void evt(void){ 
  init_event(1); 
  init_segment(1); 
  v785_segdata(ADCADDR); 
  end_segment(); 
} 


-- stop.c --
void stop(void){

}

Last Update: 2005/4/7
Hidetada Baba
baba rarfaxp.riken.jp