再入可能: 同じサブVIへの同時呼び出しを可能にする



LabVIEW 2018ヘルプ


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

ダウンロード (Windowsのみ)


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

LabVIEWは、デフォルトでVIを非再入可能実行として構成します。非再入可能実行では、1つのVIが他の複数のVIからサブVIとして同時に呼び出された場合、これらの呼び出しの1つのみだけがこのサブVIを実行することができます。非再入可サブVIのすべての発呼者は交代で順番にこのサブVIを使用できます。非再入可VIでは、発呼者のパラメータ、実行中に計算された一時的な値、呼び出し間に非再入可VIが保持する状態を保管するデータスペースが1つしかありません。しかし、VIを再入可能実行として構成すれば、LabVIEWはすべての発呼者からの再入可能VIを同時に実行することができます。再入可能実行では、LabVIEWが複数のインスタンスを割り当てる、またはデータスペースのクローンを作成するため、各呼び出しサイトまたは発呼者のブロックダイアグラム上のサブVIの使用は同時に並列して実行することが可能になり、各呼び出しサイトは個別のクローンを使用します。

メモ  (FPGAモジュール) FPGA VIはデフォルトで再入可能です。

再入実行のタイプ

LabVIEWは、以下のタイプの再入可能VIを提供します。

  • 非再入可能実行―LabVIEWは、サブVIのすべてのインスタンスが使用するデータスぺースを1つ割り当てます。
  • クローン共有による再入実行―LabVIEWは、最初は1つのクローンからクローンプールを割り当てて発呼者間で共有します。発呼者が共有クローンVIを呼び出すと、VIはクローンをプールから引き出して呼び出しの実行が完了したときにクローンを返します。発呼者が共有クローンVIを呼び出したときにプールが空の場合、LabVIEWはその呼び出しのために新しいクローンを作成し、実行が終了したときにこのクローンをプール内に配置します。これによりクローンプールが拡張されます。
  • クローンの事前割り当てによる再入実行―LabVIEWは、サブVIの使用ごとに別々のクローンを割り当てます。

VIの再入可能設定を構成するには、VIプロパティダイアログボックスの実行ページを参照してください。

使用する再入可能実行タイプを選択する

使用時の考慮点 再入不可 共有クローン再入 クローンの事前割り当てによる再入
初期化していないシフトレジスタのような状態を保持する能力 1つのインスタンスのデータを保持してその状態をすべての呼び出しサイトで使用します。 状態を保持しない―各呼び出しサイトはクローンプールからランダムにクローンのデータスペースを引き出します。呼び出しサイトは状態を共有する結果になります。 呼び出しサイトごとに状態を保持―各呼び出しサイトには個別の特有クローンがあります。
複数の同時発呼者VIの確定性 呼び出しサイトは他の同時発呼者の後に待機中―サブVIのインスタンスが実行を開始するのに必要な時間は、その前に実行が予約されている他のインスタンスがいくつあるかにより異なります。 待機可能性あり―呼び出しサイトはクローンプールが空の場合に、LabVIEWが新しいクローンを作成するまで待機する必要があります。プールが空でない場合は、クローンを引き出してプールに返す動作のため、非確定的な遅延が発生することがあります。 待機なし―LabVIEWは実行の前に各呼び出しサイトにクローンを割り当てます。これによりメモリ使用と実行速度が確定的になります。
オーバーヘッド呼び出し(同時に呼び出しているVIがない場合) 中―LabVIEWは同時発呼者を確認する必要があります。 最大―LabVIEWは自動的にクローンをクローンプールから引き出してクローンプールに返す必要があります。呼び出しはプールにクローンが追加されるまで待機する必要がある場合があります。 最小―LabVIEWは、クローンを各呼び出しサイトに事前に割り当てています。
メモリ使用 最小―LabVIEWはサブVIに対して1つのデータスぺースだけを割り当てます。 中―LabVIEWは同時に実行するインスタンスの最大数分だけ割り当てる必要があります。 最大―LabVIEWはサブVIのインスタンスごとにクローンを割り当てる必要があります。
メモ  (FPGAモジュール) 共有クローンの再入可能VIと事前割り当てクローンの再入可能VIは、FPGA VI内で使用されたときには同じように動作します。

再入可能VIの複数のインスタンスを非同期で呼び出す

再入可能VIの非同期呼び出しについては、複数のVIインスタンスを非同期で呼び出して並列実行するトピックを参照してください。

再入可能VIのクローンのフロントパネルを表示する

各クローンにはそれぞれフロントパネルが存在します。クローンが実行されていないときにフロントパネルを表示するには、パネルを表示したいサブVIのインスタンスをダブルクリックします。再入可能VIを設定して実行中にフロントパネルを開くこともできます。VIのタイトルバーには、それが元のVIではなく、クローンであることを示すために、(クローン)と表示されます。クローンから元のVIにアクセスするには、表示→関係を参照→再入可能項目を選択します。また、サブVI内のフロントパネル:開くメソッドを使用することで、各クローンの実行時にそのフロントパネルをプログラム的に開くこともできます。VIのタイトルバーには、それがソースVIのクローンであることを示すために、(クローン)と表示されます。

再入可能VIのフロントパネルとは、非再入可能VIのフロントパネルと対話するのと同様に、特に以下のような方法で対話することができます。

再入実行の例

以下の2つのセクションでは、待機してデータを共有しない再入可能VIについて例を挙げて説明します。

サブVIインスタンスが同時に実行されるようにする

以下のブロックダイアグラムは、昼食時間休憩時間になったらアラートを出します。しかし、正確な結果を得るためには、Alarm Timer VIの再入設定が重要です。

ユーザは昼食時間休憩時間を指定します。このサンプルでは、昼食時間を正午、休憩時間を午前10:00と仮定します。
Alarm Timer VIは指定の入力時間まで待機します。Alarm Timer VIのインスタンスはダイアグラムの並列部分に現れるので、どのインスタンスが最初に実行されるのかを予測することは不可能です。このサンプルでは、昼食時間タイマーが先に実行されると仮定します。

Alarm Timer VIが非再入可能実行として構成されている場合、休憩時間タイマーは昼食時間タイマーが実行を完了するまで待機しなければならないので、正午まで実行を開始することができません。このため、休憩時間は午前10:00にアラームを出すことができません。このため、サブVIの両インスタンスの同時実行を可能にし、それぞれのアラームが正しい時間に出るようにするには、Alarm Timer VIが以下のいずれかの再入実行タイプを使用するように構成する必要があります。

サブVIの各インスタンスの複数呼び出し間でデータを保持する

特定の呼び出しサイトからサブVIへの呼び出し間で状態を保持するには、クローンの事前割り当てによる再入実行を使用する必要があります。たとえば、VIに渡された最小4つのデータポイントの指数移動平均を計算するExpAvgというVIを作成するとします。LabVIEWは、単一反復Whileループ内の初期化されていないシフトレジスタで、最近の4つデータポイントを状態として保持することができます。

もう一つのVIは、ExpAvgサブVIを使用して2つのデータ集録チャンネルの移動平均を計算します。VIはプロセスの2箇所で電圧を監視し、指数移動平均をストリップチャートに表示します。VIのブロックダイアグラムには、ExpAvgサブVIの2つのインスタンスがあります。呼び出しは、チャンネル0、チャンネル1の間で切り替わります。チャンネル0が最初に実行されると仮定します。ExpAvgサブVIが再入可能でない場合、チャンネル1の呼び出しにはチャンネル0に対する呼び出しによって計算された平均が使用され、チャンネル0にはチャンネル1に対する呼び出しによって計算された平均が使用されます。ExpAvgサブVIを再入可能とすることで、それぞれの呼び出しはデータの共有を行わずに別々に実行されます。

タイミングストラクチャ内でサブVIの再入設定をオーバーライドする

(Real-Time、Windows) タイミングループまたはタイミングシーケンスストラクチャの内側でクローンを共有する再入可能VIを事前に割り当てるか、そのクローンを共有するようにLabVIEWを構成できます。タイミングループまたはタイミングシーケンスストラクチャにクローンを共有する再入可能VIを配置する場合、ストラクチャ内で呼び出す再入可能VIのインスタンスに対してクローンを事前に割り当てるようにストラクチャを設定できます。ストラクチャの外側で呼び出す再入可能VIのインスタンスは、クローンを共有し続けます。タイミングループまたはタイミングシーケンスストラクチャの内側でVIの割り当てを設定するには、ストラクチャを右クリックして、共有クローン割り当てを選択して、以下の1つを選択します。

  • 自動―LabVIEWはストラクチャの内容に基づいてストラクチャを事前割り当てまたは必要に応じて割り当てとして設定します。LabVIEWは、LabVIEWが選択する設定を示すテキストでショートカットメニュー項目を追加します。たとえば、LabVIEWが事前に割り当てを選択した場合、メニュー項目は自動(事前割り当て)になります。
  • 事前割り当て―LabVIEWはストラクチャ内の各再入可能VIを呼び出すたびにクローンVIを作成します。タイミングループまたはタイミングシーケンスストラクチャにが表示されて、LabVIEWがストラクチャ内の再入可能VIのすべてに対してクローンを事前に割り当てていることを示します。
  • 必要に応じて割り当て―LabVIEWは、ストラクチャ内の各再入可能VIへの呼び出しが実行されるまで、クローンVIを作成しません。タイミングループまたはタイミングシーケンスストラクチャにが表示されて、LabVIEWがストラクチャ内の再入可能VIのすべてに対してクローンを共有していることを示します。

再入可能VIをデバッグする

再入可能VIのデバッグを許可するには、ファイル→VIプロパティを選択してVIプロパティダイアログボックスを表示し、プルダウンメニューから実行を選択して、デバッグを許可チェックボックスをオンにします。

事前にクローンを割り当てるVIの特定インスタンスをデバッグするには、サブVIのそのインスタンスを開きます。クローンVIを編集することはできませんが、クローンのブロックダイアグラムをデバッグ目的に使用することができます。たとえば、ブレークポイントの設定、プローブの使用、実行ハイライトシングルステップデバッグの実行などが可能です。

クローンを共有するVIのインスタンスをデバッグするには、ブレークポイント、プローブ、実行ハイライトをクローンVI内ではなく、ソースVI内で適用します。クローンVIはこれらの設定を呼び出し間で保持しません。

メモ  アプリケーションおよび共有ライブラリをデバッグする場合、「VIリファレンスを開く」関数により作成される再入可能パネルをデバッグすることはできません。また、LabVIEWでビルドした共有ライブラリへのエントリポイントとなる再入可能パネルをデバッグすることもできません。


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

役に立たなかった