この記事で扱っていること
- 外部のVIから特定VIの制御器をコントロール
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWのプログラムを操作する際に、メインとなるVI以外に実行されるサブVIの値は、通常だとメインVIからサブVIのコネクタペーンに接続して与えるか、あるいはサブVIのフロントパネルを表示させてユーザーがこのサブVIを操作することで変えることができます。
これを、サブVI自体のフロントパネルをユーザーが触ることなく、他のVI(メインVIである必要はない)から値を変更する、あるいは値を表示させるにはVIリファレンスを使用します。
この方法を使うことで値の変更だけでなく、特定のプロパティ操作を行うこともできます。
本記事では、簡単な例を通してこれらのやり方を紹介します。
どんな結果になるか
今回は例として以下のようなプログラム(target.vi)を外部のVIから動かすという場面を想定します。
このプログラムを実行中に値を変更してみます。
プログラムの構造
target.viのつくりはどのようなものでも構いません。このVIに対してアクセスするプログラムではVIリファレンスを開くようにしています。
リファレンスを開いた対象であるtarget.viのフロントパネルにアクセスし、フロントパネルの中の制御器のリファレンスを取得、その中から特定のラベルを持った制御器リファレンスを抽出して値を指定します。
プログラムを作っている時点で、対象のVIのラベルは分かっているはずなので、基本的にラベル部分は定数で指定することが多いと思います。
なお、これは制御器だけでなく表示器の値も取得することができます。
ただし、プロパティノードのValue(値)はバリアントデータタイプなので、そのままでは値をうまく取得することができません。なので、バリアントから特定のデータタイプに変換します。
ブール制御器を扱う場合
上記の方法でブール制御器の値を変更する場合には、対象となるvi(target.viの方)のブール制御器が「スイッチ」タイプになっている必要があります。
今回に限らず、ラッチ動作の場合は基本的にプログラム的に値を変更できない、と覚えておくといいと思います。
このような仕組みを作っておくと、あまり機会はないかもしれないですが、非同期呼び出しで呼び出したサブVIを途中から止めるような仕組みを用意しておくことで、サブVIを開いていない状態で実行だけして外部から止めることができます。
具体的なイメージを考えるために、例えば入力された数値を2倍にするだけのsimple_multiply.viというプログラムがあったとして、これを非同期呼び出しで呼び出すasync_call.viというviがあるとします。
このasync_call.viで呼び出した際に、もしsimple_multiply.viにWhileループが使用されていてその停止条件をasync_call.viで指定していない場合には、simple_multiply.viが終わらないためにasync_call.viで結果を受け取るための「非同期呼び出しを待機」が終わらないという状態となりますが、これを解消することができます。
ただし、上記の様にsimple_multiply.viのWhileループを止める停止するためのブールは「ラッチ」ではなく「スイッチ」である必要があります。
非同期呼び出しで実行されている状態であっても、VIリファレンスを開いて制御器の値を指定できることは変わりません。
この場合の制御用のプログラムである以下の図のaccess.viのフロントパネル上のstopはTRUEにした状態で実行しています。
プロパティ操作を行う場合
値の変更のみならず、制御器のプロパティなども変更することができます。
例えば、target.viの制御器に対して、選択制御器にだけ「無効」プロパティを適用させるようにするためには以下のようなプログラムが考えられます。
制御器だけをリストボックス制御器に表示させるために、「表示器」プロパティを使用してこのブール値がFALSEになったときだけForループを抜けるように出力トンネルに条件を付けて、この値をリストボックスの「項目名」プロパティに入力しています。
このようなプログラムを作ることで、実行すると制御対象であるtarget.vi上の制御器名がリストボックスに表れて、選択した項目(1つ以上)に対して特定のプロパティの設定(今回で言えば無効プロパティ)を行うことができます。
なお、リストボックス制御器は、右クリックして「選択モード」を「1項目以上」などとしないと複数の項目が選べず、またブロックダイアグラム上でもこの設定をしないと(制御器パレットから配置しただけの状態だと)「スカラ」値であるとみなされて上のブロックダイアグラムのように書けないので注意してください。
本記事では、特定のVIの制御器を外部VIからコントロールする方法を紹介しました。
プロパティノードでリファレンスの情報を取得するというやり方はVIリファレンス以外でも応用できますが、慣れないと難しかったりするので参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント