1つの停止ボタンで並列Whileループを停止する

更新しました Nov 3, 2023

環境

ソフトウェア

  • LabVIEW Full

LabVIEWで複数の並列whileループがあり、1つの停止ボタンを使用してすべてのループを停止したいと考えています。 どうすればいいですか?また、停止ボタンを初期状態に戻すことができますか? 

使用しているLabVIEWのバージョンに応じて、以下の方法から選択して、1つの停止ボタンを使用して複数の並列Whileループを停止します。

メモ: 以下にリストされている方法は、並列Whileループを停止する方法の完全な説明ではありません。これらの方法は最も一般的な方法です。

 

チャンネルワイヤ

LabVIEW 2016以降を使用している場合、チャンネルワイヤを使用して1つの停止ボタンで複数の並列Whileループを停止できます。これは、チャンネルワイヤが実行順序を強制することなく2つの並列Whileループを接続する非同期ワイヤであるため可能となります。したがって、2つの並列Whileループ間のデータ依存性はありません。


メモ: チャンネルワイヤはLabVIEW Real-Timeモジュールでサポートされていますが、LabVIEW FPGAモジュールではサポートされていません。


次のブロックダイアグラムは、タグチャンネルを使用して並列Whileループを停止する方法を示しています。



上記のブロックダイアグラムの重要な詳細は、以下の通りです。

 

  1. ループAには、値をタグチャンネルに書き込むタグ書き込みエンドポイントが含まれています。
  2. チャンネルワイヤは、タグ書き込みエンドポイントのチャンネル出力をタグ読み取りエンドポイントに接続します。
  3. ループBには、タグチャンネルから値を読み取るタグ読み取りエンドポイントが含まれています。
  4. ループAにある書き込みエンドポイントの要素端子に接続された停止ボタンは、ループBと通信します。ループAの停止ボタンをクリックすると、ループBも停止します。


次のブロックダイアグラムは、ストリームチャンネルを使用して並列Whileループを停止する方法を示しています。
 


ストリームチャンネルを使用する場合、ループAにある書き込みエンドポイントの最後の要素端子に接続された停止ボタンはループBと通信します。


タグチャンネルとストリームチャンネルでは、並列Whileループを停止するのに使用すると大きな違いがあります。

  • タグチャンネルを使用して並列Whileループを停止するには、ループAからの停止ボタンの値がループBと直接通信するため、すべてのループをできるだけ早く停止させます。ストリームチャンネルを使用して並列Whileループを停止するには、Loop Aからの停止ボタンの値が要素端子に渡した最後の値を介してLoop Bと通信するので、最後の要素を書き込むためにループBがループAより数回の反復後を停止させる可能性があります。しかし、ループBはチャンネル内の残りの要素を読み取り続けて、最後の要素を読み取るまで停止しません。ストリームチャンネルは、ループBが停止する前に、チャンネルを介して通信されるすべてのデータ要素が処理されることを保証します。
     
  • タグチャンネルは、複数の書き込みと読み取りに分岐することができるため、2つ以上の並列Whileループを停止することができます。ストリームチャンネルでは、2つの並列Whileループのみを停止できます。これは、ストリームチャンネルが1つの書き込みと1つの読み取りしか許可しないためです。


次のブロックダイアグラムは、タグチャネルを使用して3つの並列Whileループを停止する方法を示しています。


 

警告

上記のタグアーキテクチャを拡張して、複数の停止ボタンを持つことはできません。ただし、labview\vi.lib\ ChannelSupportにある「停止信号を共有(Share Stop Signal)」VIを使用すると、複数の並列Whileループを停止ボタンのいずれかで停止することができます。

次のVIスニペットは、2つの停止ボタンのいずれかを使用して複数の並列Whileループを停止する方法を示しています。停止ボタンを追加するには、同じアーキテクチャにする必要があります。
 

 

ローカル変数

1つの停止ボタンで複数の並列Whileループを停止するには、最初のループの制御器から停止ボタンのブール値を、追加のループごとにローカル変数を使用して他のすべてのループに渡します。次のブロックダイアグラムは、ローカル変数を使用して2つの並列Whileループを停止する方法を示しています。
 



上記のブロックダイアグラムの重要な詳細は、以下の通りです。
 

  1. 上部ループには停止ボタンの制御器が含まれています。フロントパネルの停止ボタン制御器を右クリックし、機械的動作>>押されたらスイッチを選択して、機械動作を変更します。これにより、すべてのループが停止ブール値を読み取ることができます。ラッチ設定の場合は、値が読み取られるとTrueにリセットされ、他のループが実行し続ける可能性があります。
  2. 下の2つのループには、停止ボタン制御器のローカル変数が含まれています。ローカル変数は、停止ボタン制御器を右クリックし、作成>>ローカル変数を選択することによって作成できます。ローカル変数を右クリックして読み取りに変更を選択することで、値を読み取るようにローカル変数を設定します。
  3. 停止ボタンを暗示的に参照している「デフォルトに戻す(Reinit To Default)」インボーグノードに注目することが重要です。これは、次の実行の開始時に値をデフォルト値にリセットします。
  4. .これらのループには、それぞれ異なる実行時間に関係なく、すべてのループが停止することを強調する待機(ms)関数が含まれています。

4つ以上の並列Whileループを停止するには、同じアーキテクチャを使用して停止ボタン制御器から読み取るためのローカル変数を追加します。


 

プロパティノード

プロパティノードを使用して、停止ボタンのブール値を最初のループの制御器から他のすべてのループに渡すことができます。次のブロックダイアグラムは、プロパティノードを使用して2つの並列Whileループを停止する方法を示しています。
 


上記のブロックダイアグラムの重要な詳細は、以下の通りです。
 

  1. 上部ループには停止ボタン制御が含まれています。フロントパネルの停止ボタン制御器を右クリックし、機械的動作>>押されたらスイッチを選択して、機械的動作を変更します。これにより、すべてのループが停止ブール値を読み取ることができます。ラッチ設定の場合は、値が読み取られるとTrueにリセットされ、他のループが実行し続ける可能性があります。
  2. 下のループには、停止ボタン制御器のプロパティノードが含まれています。プロパティノードは、停止ボタン制御器を右クリックし、作成>>プロパティノード>>値を選択することによって作成できます。
    値プロパティノードを右クリックして読み取りに変更を選択することで、値を読み取るように値プロパティノードを構成します。
  3. 停止ボタンを暗示的に参照している「デフォルトに戻す(Reinit To Default)」インボーグノードに注目することが重要です。これは、次の実行の開始時に値をデフォルト値にリセットします。
  4. .これらのループには、それぞれ異なる実行時間に関係なく、すべてのループが停止することを強調する待機(ms)関数が含まれています。


2つ以上の並列Whileループを停止するには、同じアーキテクチャを使用して停止ボタン制御器から読み取るための値プロパティノードを追加します。

ローカル変数とプロパティノードのどちらを使用するかの詳細については、制御器/表示器、ローカル変数、値プロパティノードの相違点 を参照してください。


 

ノーティファイア

複雑な動作を伴うアプリケーションの場合、複数の並列Whileループを停止するためにノーティファイアを使用することができます。通知機能は、プログラミング>>同期>>ノーティファイア操作パレットからアクセスできます。


メモ: ノーティファイアの使用は容易に複数のスレッドへ拡張させられますが、既存のプログラムアーキテクチャとは必ずしも統合されません。


次のVIスニペットは、複数のWhileループを停止するためにノーティファイアを使用する方法を示しています。
 


上記のブロックダイアグラムの重要な詳細は、以下の通りです。
 

  • 上部ループの各反復は、停止ボタンのステータスをノーティファイアに書き込みます。
  • 他の2つのループは、各反復でノーティファイアのステータスをチェックします。

    メモ: ノーティファイアが停止を監視しているすべてのスレッドが停止するまで、ノーティファイアが解放されていないことを確認してください。上記のVIスニペットでは、「エラー結合」VIは、すべてのループが停止するまで「ノーティファイア解放」VIが実行されないことを保証します。

  • 停止ボタンをクリックすると、ステータスがノーティファイアに送信されます。これにより、すべてのループが停止します。


 

キュー

キューを使用すると、より複雑な動作を伴うアプリケーションに対して複数のループを並行して実行するのを停止できます。キュー関数は、プログラミング>>同期>>キュー操作パレットからアクセスできます。


メモ: 大規模アプリケーションでは、すでに並列ループ間でデータをやりとりするためのキューシステムが用意されていることが多いです。この場合は、既存のキューを変更または拡張して、並列ループの停止命令を含めることができます。


次のVIスニペットは、複数のWhileループを停止するためにキューを使用する方法を示しています。
 


マスタ/スレーブアーキテクチャを利用するアプリケーションの中には、スレーブスレッドが終了する前にキューを解放するものがあります。破棄されたリファレンスからデキューすることによって発生したエラーは、スレーブループを停止するために使用されます。スレーブループを停止するエラー条件に頼る代わりに、前のVIスニペットにはマスターループからスレーブループに渡される別々の停止命令があります。