LabVIEWでプログラムを書くときの強みの一つは、ユーザーインタフェースであるフロントパネルをドラッグアンドドロップの操作だけで簡単に構築することができることだと思います。
本ブログのまずこれのシリーズでは主にプログラムのアルゴリズムの部分の書き方について解説してきましたが、アルゴリズムを知っているだけではプログラムは書けず、どのような選択肢があるかということも知っておく必要があります。
使い方集は、まずこれのシリーズでステートマシンまでの知識はある程度知っている前提で、アルゴリズム以外に関わるプログラムの書き方について紹介するシリーズです。
本記事ではデータタイプの中の一つであるブールデータタイプについて紹介しています。
ブールデータの扱い方
本ブログの別記事で、ブールについては既に紹介していました。今回の記事ではもう少し応用的な内容も含め、実際にプログラムを作成する上で気を付けるべきブールデータの扱いについてまとめています。
数値データに次いで、ブールも多くの見た目の制御器、表示器があります。アプリケーションの用途や雰囲気で使い分けることができます。
これらはそのほとんどがプログラムの中での使われ方は同じですが、デフォルトの機械的動作はモノによって異なります。
また、一部のスタイルには特殊な使い方のブール「もどき」があり、一見ブールっぽいのですがブロックダイアグラム上で扱うには注意が必要です。
また、ブール値そのものはTRUEとFALSEの二通りしかないのですが、上記のトライステートの話とは別に、フロントパネル上でのブール制御器の「状態」は3つ以上あるものがあります。
それは、「TRUE」、「FALSE」以外に「FALSEからTRUE」、「TRUEからFALSE」になる状態を表わすことができるということです。
実際にこれらの状態を表したいかどうかはともかく、表せることは覚えておいて損はないと思います。普段は意識しないかもしれませんが、例えばシルバーのスタイルのブール制御器を見てもこれら4つの状態が存在していることは分かるはずです。
これらについてはブールのカスタマイズで変更することができます。カスタマイズの基本的なやり方については以下の記事で紹介しています。
ブールを出力する比較関数の扱い
ブールデータは、条件を指定するために使用されることがあり、その条件とは「比較」であることがよくあります。
普通に使っている分にはあまり気にならないことも多いと思いますが、比較の関数、実はモードがあり、配列とスカラー値(配列ではないもの)の比較の際には「要素比較」か「集合比較」が選べます。
これによって、結果自体はブールですが配列になるかスカラー値になるかが変わってきます。
値変更イベントを使用するときの注意
ブールデータを制御器として使用するある程度の規模のプログラムだと、イベントストラクチャを使用したプログラムとなることが多いと思います。
すると、フロントパネル上のブール制御器は、何かしらのイベントを駆動するトリガーのような使われ方をされ、これを検出するためにブールの「値変更」イベントがよく使われます。
どちらかというとこういう場合のブールの機械的動作は「スイッチ」ではなく「ラッチ」が多いと思いますが、こうしたブールは必ずイベントストラクチャの中に入れるべきです。
なぜなら、ラッチは「LabVIEWがブールの値を読み取った後に値をTRUEからFALSEに戻す」という挙動になっているからです。
イベントストラクチャの中にブールがある場合、値変更イベントが起こるとそのイベント内のブールがLabVIEWによって読み出されて結果、フロントパネル上でTRUEがFALSEとなります。
しかし、イベントストラクチャとは関係のない場所にブール制御器が置いてあると、そのブール制御器をLabVIEWが読み取るまで値変更イベントが行われません。
例えば以下のような組み方にしていると、Whileループの外に置かれたブールはプログラム開始と同時に読みだされてそれ以降読み出されないため、機械的動作がラッチでもFALSEに戻らず、スイッチ的な動作をすることになります。
ブールのローカル変数にも注意する
ブールの機械的動作のスイッチ、ラッチの違いは、ブールに対してローカル変数を作った際にも影響します。
それは、「機械的動作がラッチのブールデータはローカル変数が作れない」という制約に表れます。
ローカル変数は、たとえブール制御器であっても、値を読み取ったり書き込んだりすることができます。この状態、「LabVIEWがブールの値を読み取った後に値をTRUEからFALSEに戻す」というラッチ動作と相いれません。あくまでLabVIEWがTRUEからFALSEに戻すという動作であるはずが、ローカル変数でFALSEを書き込んでしまえるようになるのが問題となります。
一方で、機械的動作がスイッチであればローカル変数を作ることができます。スイッチの場合、TRUEにするのもFALSEにするのも全てフロントパネルの操作あるいはブロックダイアグラムの処理次第で、LabVIEWが勝手に値を変えることがないためです。
機械的動作をスイッチにした状態で注意する必要があるのはプログラムの最初、あるいは最後の状態です。プログラム実行時にはFALSEだったスイッチがあったとして、これをユーザーがTRUEに変更後プログラムを終了、再びプログラムを実行するとTRUEのままになっています。
プログラム実行時には常にFALSEにしておきたい、などと指定する場合には、ローカル変数を用いてスイッチ動作の「初期化」を行うと便利です。
この記事ではブールデータタイプについて紹介しました。結局はTRUEかFALSEの二つの状態しか表せないデータタイプなので、あまり複雑な使い方はないのですが、機械的動作については慣れが必要かもしれません。スイッチとラッチの違いによるプログラム作成時に気を付けるポイントが何となくでも伝わればうれしいです。
ここまで読んでいただきありがとうございました。
コメント