東陽テクニカ社製 CC/USB の Loop テストプログラム概説


はじめに

東陽テクニカ社製 CC/USB を用いてデータ収集を行う場合の指標と するため、模擬的なデータ収集サイクルを繰り返すプログラムを作成し、 テストしてみた。この具体的なプログラムや結果等については別に報告し、 ここでは、このプログラムの実装にあたって考察した点をまとめておく。

一般に CAMAC を使ってデータ収集を行う場合、状況により手順は 異なる場合もあるが、次のような手順になると考えられる。

  1. 特定のモジュールの LAM が発生するのを待つ(トリガーの発生を待つ)。
  2. LAM が発生したら Inhibit や disable を使って(データを読み出すまで) CAMAC 側の処理を(一時的に)止める。
  3. CAMAC モジュールからデータを読み出す。
  4. LAM を消す。
  5. モジュールを enable 状態にする。
  6. 外部ゲートを開けるために適当なモジュールにデータを書き込む。

平行処理の導入

LAM の発生を待つのはハードウェアの割り込みを使うことが多いが、CC/USB には その機能は無い。そこで、LAM を常時監視するプログラムを書く必要がある。 一方、測定の開始や停止、途中状況の表示なども行う必要がある。これらを 平行に走らせるのは thread を使うのが一般的である。今回は

の3つの処理を同時に走らせることにした。


Main Thread の選択

Thread に分けてプログラムを実行させる時、分け方も重要であるが、 どれを Main thread に選ぶかも考察を要する。しかしながら、今の場合は 明白で、Graphical User Interface の部分である。なぜなら、この部分は 測定の開始、停止にかかわらず常に存在していなければならず、測定中で あろがなかろうが、ユーザが望めば、このプログラムをいつでも止められる ようにしておく必要があるからである。


子 thread の起動・終了

Main thread が決まったので、残りの thread は、Main thread の GUI を 通して測定開始・終了の指示に従って、起動・停止することにする。 ここで、これらの起動・停止をどう実装するかという点に関して大きく二つの 方法が考えられる。

プログラムの実行効率から考えると前者の方が優れていると思われるが、 ここでは分かりやすさを優先して後者を選んだ。


子 thread の順序

二つの子 thread (データ収集 thread と途中経過を表示する thread)は論理的には 同時に走らせ、同時に停止させればよいのであるが、 それぞれ独立な thread であり、同時というのは現実的に無理である。さらに 少し考察すると、この二つの子 thread には順序があることがわかる。途中経過表示は データが一つも収集されていなくても何ら困らない(そう設計するべき)。一方、 データ収集が行われている時は、必ず途中経過表示 thread は動いているべきである。 そうでなければ途中経過の表示ができない期間が存在することになる。つまり、 途中経過表示 thread はデータ収集 thread より前に起動し、終了する時は、 データ収集 thread より後に終了すべきである。

このプログラムでは、この部分は手抜きを行っている。 コード上で thread の起動・終了の順番をこの条件の順番に合わせては いるが、二つの thread は独立なので、これで上記条件が満たされる保証はない。 上記条件を保証するにはこの部分を書き換える必要がある。

上記条件を保証する実装には、いくつかの方法が考えられる。


LAM 監視の実装

LAM の監視に関しては、

方法が考えられる。後者の場合、複数の LAM source を1回の読み出しで 扱うことが可能なので、より一般的と思われるが、今回はモジュールが 一つなので、前者を用いた(本当は、この時点では CCUSB class の 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() だけは残すことで測定することにした。