【LabVIEWまずこれ⑱】プロパティノードとインボークノード | マーブルルール

【LabVIEWまずこれ⑱】プロパティノードとインボークノード

LabVIEWまずこれ

スポンサーリンク

LabVIEWを触ったことがない方に向けて、それなりのプログラムが書けるようになるところまで基本的な事柄を解説していこうという試みです。

シリーズ18回目としてプログラムのバリエーションを増やすのに必要なプロパティノードとインボークノードです。

この記事は、以下のような方に向けて書いています。

  • LabVIEWで制御器のプロパティを変更したい
  • LabVIEWでメソッドの変更はどうやるの?
  • 制御器や表示器のリファレンスってなに?

もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。

なお、前回の記事はこちらです。

スポンサーリンク

プロパティノードを使ってみよう

もういよいよLabVIEWである程度の規模のプログラムを作るための準備が整ってきました。繰り返したり、条件分岐をしたり、効率のいい動作をするように考えたり、オリジナルの関数も作れるようになりました。ここまでの内容だけでもいろいろなプログラムが作れます。

ただ、まだまだできないこともたくさんあるはずです。そこでここからはプログラムを作るうえでバリエーションを増やすのに必要になってくる道具について紹介していきます。それはプロパティノードとインボークノード、そしてタイプ定義の考え方です。

まずはプロパティノードを扱っていきます。これは、特定のオブジェクトについてのプロパティをプログラム的に変更するためのノードになっています。

何のことだか分からないと思うので、具体例を挙げます。例えばフロントパネルに数値制御器と表示器が一つずつ置いてあったとします。

シルバーのスタイルならグレーの枠で囲まれています。そして文字色も黒で固定です。

ただ、例えば「数値が5以上のときには表示器に表示される数値の色を赤くしたい」と思ったとします。何か数値の表示を強調させるような場合ですね。これは今まで紹介してきた方法ではできません。こんなときにプロパティノードを使用します。

まずはとりあえず次のように操作をしてみてください。はじめにプロパティを操作したい対象、今回で言えば数値表示器ですが、これを右クリックして作成からプロパティノードにマウスカーソルを合わせます。すると下の図のように項目がずらっと並んで表示されます。

この中から、数値テキスト、テキストカラーを選んでクリックします。すると、横長のものが表れてNumText.Textcolorと表示されます。

これが、プロパティノードです。テキストカラーという名前からもわかる通り、このプロパティノードはテキストに関する色の設定になります。そこで、このプロパティノードに「赤くする」という情報を渡してやることにします。

さて、このプロパティノード、ブロックダイアグラム上に現れた段階では、黒い矢印が右側に来ています。この状態は、このプロパティノードから値を出す、つまり表示器を付けることしかできません。

いわゆる制御器と同じような位置に黒い三角形がきているということは、表示器を配線することができます。このように「NumText.Textcolor」に表示器をつけられる場合には、区別のために、この状態を「読み取り」の状態と呼んでいます。この場合、「現在の数値表示器の数値の表示の色を読み取る」機能を持っています。

しかし今は読み取りたいのではなくて設定をしたいため、右クリックして「書き込みに変更」を選択します。すると今度は黒い三角形が左側に移り、制御器あるいは定数を配線できるようになります。

値を指定することを「値を書き込む」と表現しています。ここで右クリックして作成、定数とします。すると、真っ黒い四角が表れます。これは、数値定数を色で表したものですが、単に色を指定する定数と思って差し支えありません。

さて、数値が5以上の時には数値の色を赤くするという目的でしたが、5未満の時には色を変更しない(つまり黒色にする)ようにプログラムを書きます。そのために、下の図のように書きます。

ここではじめて出てきた選択関数は、ケースストラクチャよりも簡便に場合分けの処理を書き表せます。

選択関数には入力が3つあり、「選択の基準となるTRUEあるいはFALSE」を入力するのが真ん中、その上が「TRUEが配線されたときに出力するもの」を、下が「FALSEが配線されたときに出力するもの」を配線するノードになっています。

このプログラムの場合、5以上出るかという判定をまず行い、5以上であればTRUEが選択関数に渡されます。TRUEのときに赤にするという指定をしているので、数値制御器の値が5以上であればこのプロパティノードに「赤」という定数が入り、表示器の色を赤くします。

一方、数値制御器の値が5未満の場合、選択関数にはFALSEが入るので、「黒」の情報がプロパティノードに入り、文字は黒となります。

このように、プロパティノードを使用することで、表示器の表示色を変えることができました。

もう一つ、プロパティノードの有用な例を紹介します。波形チャートを扱ったときに、チャートでは過去の履歴を残した状態で各点をプロットできるという話をしました。しかし、プログラムを再開すると前の値の続きでデータが表示されてしまうという特徴もありました。

これでいい場合には問題ないのですが、場合によっては「さっき実行した結果は消してほしいんだけれど?」ということもあるかと思います。そんな時にはプロパティノードを使用します。

波形チャートを右クリックして作成、プロパティノードで一番下に履歴データというものがあるのでこれを選択します。

ブロックダイアグラムに表れた場合には最初読み取り状態なので書き込みの状態にして、右クリックで作成の定数とします。あとはこのプロパティノードがプログラムの一番最初に実行されるようにします。

こうすることで、プログラムを実行ごとに履歴データは消去され、新しいプロットが10点出るようになります。このテクニックはチャートを使用する上でよく出てきます。

プロパティノードは(後で出てくるインボークノードもそうですが)すべての制御器や表示器についてそれぞれ固有の設定が出てきます。例えば数値の制御器とブールの制御器とでは表示される項目が異なりますが、これはデータタイプが異なるため持っているプロパティも異なるためです。

実際、プロパティノードで行えることはかなり多くあります。制御器や表示器を右クリックして作成、プロパティノードとして見たときにずらっと表示されていたもの、これらすべてが、プログラム的にアクセスできるプロパティです。

ただし、プロパティは表示されているものすべてが「書き込みできる(=変更できる)」わけではないです。中には、読み取り専用として、プログラム的に指定することはできず、プログラム的にその状態を表示させることしかできないものもあります。

もしひとつの対象に対して複数のプロパティへの読み書きを行いたい場合、トーテムポールのようにプロパティノードを積み上げることができます。プロパティノードにマウスカーソルを合わせて上か下に引っ張ることで複数の項目を出せます。このようにしたときに、プロパティの変更は上から順番に実行されます。

上の図の例だと、ActPlotでまずプロット0を指定してからそのプロットに対してPlot.Colorで赤を指定、次にActPlotで今度はプロット1を指定してからPlot.Colorで緑を指定、といった具合です。

なお、余談ですが、プロパティノードそして次に紹介するインボークノードも、通常項目の名前は英語で表されます。しかし、右クリックして「名前形式」で「長い名前」とすると日本語表示にすることができます。

とはいえよほどわかりにくいものも少ないため、本記事では以降もデフォルトの英語表記のまま紹介していきます。

インボークノードを使ってみよう

さて、プロパティノードと似たような形をしているもので、インボークノードというものもあります。他言語を知っている方は、メソッドを操作するものと表現したほうが分かりやすいかもしれません。これも対象となるものを右クリックして作成でインボークノード(プロパティノードの下)で選ぶことで表示されるものを指定できます。

使い方はプロパティノードと全く同じです。このインボークノードもできることがたくさんあるためすべてを紹介することはできませんが、例えば配列のデータをファイルIOを使用せずにExcelに出力することができます。

配列自体がこのような機能を持っている状態であるため、特に入力を必要としません。その分、実行順序はエラーワイヤを使用したり、フラットシーケンスストラクチャで指定する必要があります。

もちろん、入力を必要とするものもあります。例えば、グラフやチャートの画像の様子をそのまま画像ファイルとして出力することができるインボークノードでは、画像タイプの種類やパスの情報、グリッドを画像につけるかどうかといった設定があります。

なお、インボークノードはプロパティノードと異なり、一つの項目で複数の入力を行う場合があります。上の図で言えば、Export Imageがインボークノードの項目の種類であり、下二つの背景が白で表示されているものが入力必須(入力がないとプログラムが動作しない)のもの、残りの背景がグレーの項目が任意入力の項目です。

その代わり、といっては何ですが、プロパティノードと異なりインボークノードは複数の項目をトーテムポールのように縦につなげることはできません。同じ対象に対して複数のインボークノードを設定するときにはそれぞれ別個に用意します。

プロパティノード、インボークノードを応用する

プロパティノードとインボークノードの違いを大雑把に言うと、

  • プロパティノードは対象の外観や性質に対してプログラム的に読み書きできる
  • インボークノードは対象の動作をプログラム的に読み書きできる

といった具合です。

プロパティノードとインボークノードは「ある対象に対してプロパティあるいはメソッドを変える」ためのものなので、その「ある対象」を指定する必要があります。

上記の説明だと対象とする制御器や表示器を直接右クリックして作成からプロパティノードあるいはインボークノードとしていました。

一方で、関数パレットの「アプリケーション制御」にもプロパティノードとインボークノードがあり、これらをブロックダイアグラムに配置することもできます。

配置すると、どちらも「App」と書かれた状態になっています。これは、アプリケーションに対するプロパティノードおよびインボークノードとなっている状態、といえます。

右クリックして「クラスを選択」とすることでとても多くのクラスがあることがわかります。クラスを選択してそのクラスの中にあるオブジェクトをさらに選択していく、という作りになっています。

もちろんこの方法でしか編集できない項目もあるのでクラスを選択してプロパティおよびメソッドを編集することも必要な場合がありますが、上記までの使い方(特定の制御器や表示器を指定する)とはまた違う話となり困惑するかもしれません。

では、関数パレットからプロパティノード、インボークノードを取り出した場合では特定の制御器や表示器を指定する方法は使えないのかというとそうではなく、ちゃんと指定する方法もあります。中には、こちらの方法の方が便利というケースもあります。

まずは簡単な例で方法を見ていきます。ここでは数値表示器を例にとります。右クリックで作成から「リファレンス」があるのでこれを選択します。そしてこれをプロパティノードやインボークノードにつなげます。

この操作で表れたリファレンスは、そのリファレンスに紐づいた制御器あるいは表示器を「参照」するための定数と思ってください。このリファレンスをプロパティノードやインボークノードのリファレンス入力に配線することで、「リファレンスが関連している制御器(あるいは表示器)を指定した」状態となります。

「わざわざこんな書き方をしなくても、それぞれでプロパティノードやインボークノードを用意したほうが楽じゃん」という声が聞こえてきそうですが、この方法が役に立つケースがあります。

例えば、複数の似た制御器、表示器すべてに同じ設定を行うときにプログラムをスマートに書くことができます。

下の例では、複数のブール制御器に「無効」というプロパティの設定を行うことで、指定した4つのブールすべての設定をまとめて変える方法を示しています。リファレンスを使用しない場合、プロパティノードを制御器の数分用意する必要があります。

しれっとWhileループの後、プログラムの最後に「リファレンスを閉じる」をおいています。プログラムの中で使用したリファレンス(という情報)を閉じる(解放する)ことをしています。

なくても動作はしますが、大きなプログラムで多くのリファレンスがあるときにいわゆるリファレンスリークと呼ばれる状態が起こりプログラムのパフォーマンスに影響が出ることがあります。なので、使わなくなったリファレンスはちゃんと閉じるのが望ましいです。

なお、上記の「無効」のプロパティは、ユーザーに操作をしてほしくない時によく利用されます。上記のプログラムの結果は以下のようです。

あとは、VIそのものに対するプロパティやメソッドを指定するときにもリファレンスを使用することがあります。VIを右クリックしてプロパティノードを作成、はできないからですね。

なので、リファレンスを駆使してプロパティノードやインボークノードを使用する方法もぜひ覚えておいて損はないと思います。

今回の記事でLabVIEWにおけるオブジェクトのプロパティやメソッドの編集についても一通り見てきました。どんなことができるのか、操作の手順は紹介してきたので、少しずつ触って慣れていってもらえればと思います。

次回はこれまた経路が異なる話で、タイプ定義という話を取り上げようと思います。ある程度大きなプログラムを作るうえでは結構重要なトピックですが、難しい内容ではないので何のためにあるのかどんなときに必要なのか感覚を身に着けてもらえればと思います。

もしよろしければ次の記事も見ていってもらえると嬉しいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました