DAQセットアップ
Back /
Up / Next
NBBQでのドライバはCAMAC制御のコアとなる bbgcam というドライバと、
データ構造を構築したり、ユーザープログラムとのインターフェイスになる
nbbqdrv というドライバから構成されています。
現在の nbbqdrv ではパフォーマンスも考慮して、ドライバ内でデータを
バッファリングして、まとめてユーザーに受け渡す設計なため、
計測の度にソースをある程度書き換える必要があります。
学生実験などの典型的なデータ収集を行なう場合は
お手軽セットアップでセットアップすると簡単です。
DAQセットアップの手順
ここでは ~/test/ でNBBQをセットアップする例です。
babaDAQモードかbabarlDAQモードはbbmodules.hで指定します。
基本的にはbabarlDAQモードで使用することを強くお勧めします。
- # mkdir ~/test/
- # cd ~/test/
- # nbbqcpy
セットアップに必要なファイルをコピーします
- # emacs bbmodules.h / startup.c / evt.c / sca.c / stop.c
収集したいデータに合わせてソースを編集します (後述)
- # make clean; make
ドライバをコンパイルします
- # nbbqinst
ドライバをインストールします
(コンパイルをし直した場合などは nbbqrst で入れ直しが出来ます)
- # bbdaqcom か bbrlcom
babaDAQモードならbbdaqcom、
babarlDAQモードならbbrlcomでコントローラを起動します
コントローラの使い方
babaDAQモードならbbdaqcom、
babarlDAQモードならbbrlcomでコントローラを起動します。
起動時にBBDAQ or BBRL MODEかが表示されるので、確認して下さい。
- help
申し訳程度のヘルプです
- status
現在のステータス表示
- wth (header)
ヘッダーを書きます
- start
Save modeでデータ収集を開始します
(すでにヘッダーが書かれていることが必要です)
- nssta
No save modeでデータ収集を開始します
- stop
start / nssta でデータ収集中では stop と打ち込むと終了します
(データ収集中に他のコマンドは使えません)
- exit
コントローラを終了します
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>