マスター/スレーブアプリケーションを構築する
マスター/スレーブのデザインパターンは、複数の並列ループで構成されています。他のすべてを制御するループはマスターであり、残りのループはスレーブです。 1つのマスターループは常に1つ以上のスレーブループを駆動します。これらのループ間で直接データ通信を行うとデータフローが途切れるため、LabVIEWのローカル変数またはグローバル変数、オカーレンス、ノーティファイア、またはキューなどのメッセージングアーキテクチャで書き込みおよび読み取りを行う必要があります。図1は、共有データを使用してさまざまなループが相互に接続される方法を示しています。
図1:マスター/スレーブの概要
例-ループの同期
このアプリケーションには、次の要件があります。
最初のステップは、どのプロセスがマスターになり、どのプロセスがスレーブになるかを決定することです。この例では、ユーザーインターフェイスはマスターループ内に配置され、2つの点滅するLEDプロセスが2つのスレーブループになります。ユーザーインターフェイスは、ローカル変数を使用して各スレーブループの動作を制御します。
これで、LabVIEWマスター/スレーブアプリケーションを開始する準備が整いました。最終的なマスター/スレーブアプリケーションを表示するには、添付のVI(masterslave.zip)を開いてください。
メッセージングアーキテクチャ(共有データ)
問題:複数のループが同時に共有変数にデータを書き込もうとすると、最終的にどの値が書き込まれるかを判断する方法がありません。これは競合状態として知られています。
解決策:グローバル変数に書き込むコードの周囲に「取得/解放セマフォ」のペアを配置します。これにより、複数のループが同時にグローバルに書き込もうとしないことが保証されます。 LabVIEWに含まれているサンプルの中には、セマフォの使用法を示すものがいくつかあります。セマフォは、競合状態を回避するために、書き込み中にグローバルデータをロックします。
同期
問題:マスター/スレーブのデザインパターンは同期に基づいていないため、スレーブループがマスターループの前に実行を開始する可能性があります。そのため、スレーブループが実行を開始する前にマスターループを初期化することが問題になる可能性があります。
解決策:オカレンスを使用して、この種の同期の問題を解決できます。
オカレンスの使用法を示すサンプルを見つけるには、LabVIEW付属のサンプルを参照してください。図2は、オカレンスの使用方法の例を示しています。
図2:オカーレンスの使用例