この記事で扱っていること
- 複数選択できないブールクラスタを作成する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
プログラムの内容によっては、同時に実行(選択)される処理は一つで、常にどれかは選択されている状態にある、といった機能を実装している場合があるかと思います。
通常、ブールは「スイッチ」か「ラッチ」の機械的動作であり、「ラッチ」だとLabVIEWがブールの状態を読み取った瞬間にTRUE(つまり「選択」された状態)からFALSEとなってしまいます。一方でスイッチだとユーザーあるいはLabVIEWがプログラム的に値を変えない限りTRUEはTRUEのまま、としておくことができるので、これが便利です。
この記事では、扱いやすさの都合上イベントストラクチャを使用し、さらに複数のブールボタンはクラスタにひとまとめにした状態の例を紹介しています。
どんな結果になるか
フロントパネルには、ブールボタンのクラスタと、どのブールボタンが押されたかを表示するための文字列表示器、およびプログラムの終了ボタンがあります。
プログラムを実行するとまずデフォルトで真ん中のボタンが押された状態となります。その後、ボタンを押すと、押したボタンのみTRUEとなりその他はFALSEとなります。
プログラムの構造
イベントストラクチャを使う利点として、「旧値」と「新規値」を扱えることが挙げられます。これらを駆使して、押されたボタンのみをTRUEにし、前にTRUEだった値をFALSEにすることができます。
実際に各ボタンが押された後の具体的な処理は、それぞれのボタン毎に異なる文字列を用意しておいてこれをイベントストラクチャの中からエンキューし、別のWhileループ内でデキューしてその文字列を受け取るようにしています。
まずはクラスタを初期化します。今回は選択肢(ブールボタン)が5つあり、そのうちの真ん中をTRUEにするような初期化方法としていますが、別に真ん中である必要はありません。
イベントストラクチャの中でクラスタの値変更イベントを使用して、まずは旧値と新規値をクラスタから配列に変換し、Forループに入れます。
この中で「新規値」と「旧値」の大小を比較し、大きい場合、つまり新規値がTRUEになっていて旧値がFALSEになっている場合のみTRUEとするようにしてこれをForループから取り出し、再びクラスタに変換してローカル変数に入力しています。
またこれとは別に、何番目のブール値がTRUEになったかをForループの反復端子の値として取得し、その値に依ってケースストラクチャを分けるような処理を行っています。
その際にForループ内の不等号の結果で一つもTRUEになっていない場合には空の配列が出ることになりますが、その場合には「-1」などといったありえない数字をケースストラクチャに入れるようにします。
ケースストラクチャに「-1」が入った場合は「デフォルト」ケースとし、この場合にはエンキューに空文字を入れます。
こうすることで、フロントパネル上のブールボタンのいずれかが押されてTRUEになるとそのTRUEになったボタンの処理を実行できるようにし、もしすでにTRUEになっているボタンを押してすべてがFALSEになった場合にはデフォルトケースが実行されるようにしています。
他のイベントは今回は停止イベントしか用意していません。
停止ボタンが押されると停止イベントが実行され、イベントストラクチャが入ったWhileループは停止、その後キューが解放されることで、デキューの関数からはエラーが発生しこのエラーによってデキューのWhileループが止まってプログラム全体が止まる仕組みとしています。
同じボタンが押された場合への対応
上記のプログラム、ほとんど意図したとおりに動作はするのですが、「同じボタンが押されたとき」にはそのボタンがTRUEからFALSEになるだけとなります。
意図してそういった動作にしたいのであればこれでいいのですが、同じボタンが押された場合には反応しない(TRUEがTRUEのまま)という動作にしたい場合には少し工夫が必要になります。
もっと効率のいいプログラムの組み方がありそうですが、以下のようなプログラムで一応実現できます。
この記事では、二つ以上は選択できないブールクラスタを作成する方法を紹介しました。
機能としてはよくありがちなのですが、これをスイッチ動作で実装しようとすると多少の工夫が必要となりますので参考にしてもらえたらうれしいです。
ここまで読んでいただきありがとうございました。
コメント