ローカル変数とグローバル変数を慎重に使用する



LabVIEW 2018ヘルプ


発行年月: 2018年3月
製品番号: 371361R-0112
製品情報を参照

ダウンロード (Windowsのみ)


LabVIEW 2016ヘルプ
LabVIEW 2017ヘルプ
LabVIEW 2018ヘルプ
LabVIEW 2019ヘルプ
LabVIEW 2020ヘルプ

ローカル変数とグローバル変数は高度なLabVIEWの概念です。これらの変数は本来、LabVIEWデータフロー実行モデルの一部ではありません。ローカル変数およびグローバル変数を使用するとブロックダイアグラムの読み取りが困難になる可能性があるので、使用する際には注意が必要です。ローカル変数やグローバル変数をコネクタペーンの代わりに使用したり、シーケンスストラクチャの各フレームの値にアクセスするために使用するなど、変数の使用法を誤ると、VIが予期しない動作をする可能性があります。ブロックダイアグラム上に長いワイヤを配線するのを避けるためや、データフローの代わりに使用するなど、ローカル変数やグローバル変数を多用しすぎると、パフォーマンスが低下します。

ローカル変数およびグローバル変数を初期化する

ローカル変数またはグローバル変数を初期化するには、VIが実行される前に既知の値を変数に書き込みます。確認を行わない場合、VIが正しく動作しない原因となるデータが変数に含まれる可能性があります。変数が初期値の計算結果に依存する場合、別の動作でこの変数にアクセスが行われる前に、この変数に対して値が書き込まれたかどうかを確認してください。VIの残りの部分で並行して書き込み動作に配線が行われると、競合状態が発生する可能性があります。

VIの残りの部分が実行される前に必ず変数が初期化するようにするには、シーケンスストラクチャの最初のフレームまたはサブVIに変数の初期値を書き込むコードを分離し、ブロックダイアグラムのデータフローで最初の実行にこのサブVIを配線します。

VIが最初に変数を読み取る前に変数を初期化しないと、変数には関連付けられているフロントパネルオブジェクトのデフォルト値が含まれます。

競合状態

競合状態は、複数のコードが並列実行されれ、メモリの共通部分にアクセスする場合に発生します。各コードが独立している場合、共有リソースにアクセスする順序を区別する方法はありません。

競合状態によって、不測の結果が引き起こされる可能性があります。たとえば、2つの独立したコードが1つのキューにアクセスする場合に、キューへのアクセス順序を制御しないと競合状態が発生する可能性があります。

競合状態は、プログラムのタイミングが変化すると発生したり解消されたりするため、大きな問題となる可能性があります。たとえば、異なるオペレーティングシステムやLabVIEWのバージョンに切り替えたとき、またシステム上で別のソフトウェアが実行されていると発生する場合があります。

オペレーティングシステムやLVのバージョンのアップデートなど、VI内でのタイミングが変化するような操作を行う場合は、同一データにアクセスする並列コードを探して動作の実行順序を制御するタイミング条件を設定してください。

ローカル変数およびグローバル変数使用時の競合状態

競合状態は、1つの保存データの値が複数の動作によって更新される場合、いつでも起こり得ますが、とりわけローカル変数やグローバル変数、または外部ファイルを使用する場合によく発生します。以下のブロックダイアグラムはローカル変数を使用した際の競合状態の例を示します。

このVIの出力(ローカル変数の値x)は、どの操作を最初に実行するかによって異なります。各操作でxに異なる値が書き込まれるため、出力が7または3のどちらになるかは判断できません。一部のプログラミング言語は、トップダウンデータフローのパラダイムにより実行順序が保証されます。LabVIEWでは、競合状態を回避すると同時に、ワイヤを使用して変数に複数の操作を実行することができます。以下のブロックダイアグラムでは、ローカル変数の代わりにワイヤを使用して追加操作を実行しています。

ヒント  ローカル変数またはグローバル変数で複数の動作を実行する必要がある場合、実行順序を決めているかどうか確認してください。

また、競合状態は、2つの操作が並行してグローバル変数を更新しようとする場合にも発生します。グローバル変数を更新するには、操作時に値を読み取り、それを変更して、元の場所に変更後の値を書き込みます。最初の操作が読み取り-変更-書き込みの動作を実行し、2番目の操作がその後に続けて行われる場合、結果は正しく予期できるものになります。最初の操作が読み取りを行い、次に2番目の操作も読み取りを行うと、両方の操作で値を変更して書き込みます。この動作は読み取り-変更-書き込みの競合状態を発生させ、無効な値または値がない状態になります。

グローバル変数に関する競合を回避するには、機能的グローバル変数を使用して変数の動作にアクセスするコードのクリティカルセクションを保護することができます。複数のローカル変数やグローバル変数の代わりに機能的にグローバル変数を使用する場合、一度に1つの操作のみを実行するように確認してください。これにより、競合している操作が実行されたり、保存されているデータに競合している値が割り当てたりすることがなくなります。

ローカル変数を使用する場合のメモリに関する注意事項

ローカル変数がデータバッファのコピーを作成します。ローカル変数から読み取る際、関連された制御器からデータ用に新規のバッファが作成されます。

ローカル変数を使用して大量のデータをブロックダイアグラムのある場所から別の場所に転送する場合、通常よりも多くのメモリが使用されるため、その結果ワイヤを介したデータ転送よりも速度が遅くなります。実行中にデータを維持する必要がある場合、シフトレジスタを使用することを考慮してください。

グローバル変数を使用する際に考慮すべきメモリに関する注意事項

グローバル変数から読み取りを行う際、LabVIEWはそのグローバル変数内に格納されたデータのコピーを作成します。

サイズの大きい配列および文字列を操作する場合、グローバル変数の操作に必要な時間とメモリ使用量を考慮する必要があります。1つの配列要素のみを変更する場合、LabVIEWは配列全体を保存および変更するため、特に配列を扱う際グローバル変数を操作すると効率が悪くなります。アプリケーションの複数の場所でグローバル変数からの読み取りを実行すると、複数のメモリバッファが作成され、効率と処理速度が低下します。

LabVIEWでのパフォーマンスとメモリに関する注意事項の詳細については「パフォーマンスおよびメモリを管理する」ブックを参照してください。



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

役に立たなかった