DAQセットアップ

Back / Up / Next


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でコントローラを起動します
コントローラの使い方
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){ }

June 25, 2003
Hidetada Baba <baba@daq.rikkyo.ac.jp>