東陽テクニカ社製 CC/USB を用いてデータ収集を行う場合の指標と するため、模擬的なデータ収集サイクルを繰り返すプログラムを作成し、 テストしてみた。この具体的なプログラムや結果等については別に報告し、 ここでは、このプログラムの実装にあたって考察した点をまとめておく。
一般に CAMAC を使ってデータ収集を行う場合、状況により手順は 異なる場合もあるが、次のような手順になると考えられる。
LAM の発生を待つのはハードウェアの割り込みを使うことが多いが、CC/USB には その機能は無い。そこで、LAM を常時監視するプログラムを書く必要がある。 一方、測定の開始や停止、途中状況の表示なども行う必要がある。これらを 平行に走らせるのは thread を使うのが一般的である。今回は
Thread に分けてプログラムを実行させる時、分け方も重要であるが、 どれを Main thread に選ぶかも考察を要する。しかしながら、今の場合は 明白で、Graphical User Interface の部分である。なぜなら、この部分は 測定の開始、停止にかかわらず常に存在していなければならず、測定中で あろがなかろうが、ユーザが望めば、このプログラムをいつでも止められる ようにしておく必要があるからである。
Main thread が決まったので、残りの thread は、Main thread の GUI を 通して測定開始・終了の指示に従って、起動・停止することにする。 ここで、これらの起動・停止をどう実装するかという点に関して大きく二つの 方法が考えられる。
二つの子 thread (データ収集 thread と途中経過を表示する thread)は論理的には 同時に走らせ、同時に停止させればよいのであるが、 それぞれ独立な thread であり、同時というのは現実的に無理である。さらに 少し考察すると、この二つの子 thread には順序があることがわかる。途中経過表示は データが一つも収集されていなくても何ら困らない(そう設計するべき)。一方、 データ収集が行われている時は、必ず途中経過表示 thread は動いているべきである。 そうでなければ途中経過の表示ができない期間が存在することになる。つまり、 途中経過表示 thread はデータ収集 thread より前に起動し、終了する時は、 データ収集 thread より後に終了すべきである。
このプログラムでは、この部分は手抜きを行っている。 コード上で thread の起動・終了の順番をこの条件の順番に合わせては いるが、二つの thread は独立なので、これで上記条件が満たされる保証はない。 上記条件を保証するにはこの部分を書き換える必要がある。
上記条件を保証する実装には、いくつかの方法が考えられる。
LAM の監視に関しては、
ここで制作した、CCUSB class を用いると、実際の監視(TestLAM)は、 次のようなコードになるだろう(Java の場合のコードを示す。C# の 場合は、Thread.sleep() を Thread.Sleep() に変える。なお、実際の コードは測定停止の指示で止まることができるようにするため、 もう少し複雑になっている)。
int stn = 2; // Station Number
CCUSB ccusb = new CCUSB();
:
while( (ccusb.NAF(stn,0,8) & 0x03000000) != 0 )
Thread.sleep( sleeptime );
ここで、ccusb.NAF() の戻り値は 32bit 整数であり、bit24 が CAMAC Q 応答、 bit25 が CAMAC X 応答を示し、0 の場合が、応答あり である。 従って、上のコードは X 及び Q 応答があった場合、すなわち TestLAM が成功し LAM が発生していた場合にループを抜ける。
しかしながら、今回テストで用いた回路モジュールは LAM の発生は押しボタンを 人間が手で押すことで発生する。そこで、今回のテストでは、while ループを はずし、TestLAM と sleep() だけは残すことで測定することにした。