制御器/表示器、ローカル変数、値プロパティノードの相違点

更新しました Nov 20, 2018

使用製品

Software

  • LabVIEW Base
  • LabVIEW Full
  • LabVIEW Professional

問題

値のプロパティノードや制御器/表示器を直接使用する場合と、ローカル変数を使用する場合では、VIは異なる動作をします。 これらの間にはどのような違いがありますか?

解決策

フロントパネルの制御器を更新するために使用する方法を選択する際には、いくつかパフォーマンスのトレードオフを考慮する必要があります。利用可能な更新方法は、制御器/表示器、ローカル変数、または値プロパティノードです。各方法の長所と短所は次のとおりです。

制御器/表示器
長所
  • 同じ値を継続的に更新する際、フロントパネルの更新を防ぐためのロジックが組み込まれています。これにより、フロントパネルの再描画が防止されます。
  • ポインタ参照を解除したり、メモリ内でデータコピーを作成したりする必要はありません。これは最も速く、メモリ量の少ないオプションです。
短所
  • クラスタ/配列内の単一項目に書き込むことはできないため、変数全体を更新する必要があります。
C言語の例 
(C言語と同一ではありませんが、対応するフロントパネルにある制御器/表示器の更新に必要な手順を示すのに役立ちます)。

int x;   // フロントパネルの表示器
x = 10;  // フロントパネルにある表示器に直接書き込む。



ローカル変数
長所
  • 同じ値を継続的に更新する際、フロントパネルの更新を防ぐためのロジックが組み込まれています。これにより、フロントパネルの再描画が防止されます。
  • プロパティノードとは異なり、ポインタ参照を解除する必要はありません。したがって、プロパティノードよりも高速です。
短所
  • メモリ集約プロセス。これらは、制御器/表示器と同じフロントパネルの更新ロジックを持ちますが、作成するローカル変数ごとにメモリ内でデータの完全コピーを作成する必要があります。
  • クラスタ/配列内の単一項目に書き込むことはできないため、変数全体を更新する必要があります
  • 同じローカル変数に異なるレートで書き込みをしたり、読み込んだりする場合、競合状態が発生することがあります。
C言語の例 
(C言語と同一ではありませんが、対応するフロントパネルにある制御器/表示器の更新に必要な手順を示すのに役立ちます)。

int x; // フロントパネルの表示器
int y; // ローカル変数
y=10;  // ローカル変数に書き込む
x=y;   // LabVIEWはフロントパネルを更新する際にこれを行います。



プロパティノード
長所
  • ローカル変数とは異なり、メモリにデータコピーを作成しません。
  • 厳密ではない制御器への参照を使用すると、値のデータタイプは制御器と同じデータタイプではなく、バリアントになる場合があります。
  • クラスタ内にある単一制御器の読み書きが可能です。
  • サブVI内からフロントパネルの制御器を更新するために使用できます。
短所
  • フロントパネルの項目を呼び出すたびに更新する必要があります。 
  • これらは、値渡し関数ではなく、参照渡し関数です。つまり、それらは本質的に特定のメモリ位置へのポインタです。ポインタは、参照を解除し、メモリ内の値を更新する必要があります。変数の参照を解除するプロセスは、制御器/表示器、またはローカル変数より遅くなります。
  • プロパティノードを使用すると、サブVIのフロントパネルがメモリに残り、メモリ使用量が増加します。サブVIのフロントパネルが表示されない場合は、プロパティノードを削除してメモリ使用量を減らしてください。
C言語の例 
(C言語と同一ではありませんが、対応するフロントパネルにある制御器/表示器の更新に必要な手順を示すのに役立ちます)。

int x;                  // フロントパネルの表示器
int *x_pointer = &x;    // フロントパネルの表示器のポインタを作成
// (プロパティノード)

*x_pointer = 1;  // *は、ポインタを逆参照して更新するために使用されます
                 // 変数Xを返します。これがプロパティノードが実行されるたびに発生する操作です。

この記事はお役に立ちましたか?

いいえ