アプリケーションデザインパターン:マスター/スレーブ

更新しました Apr 25, 2021

マスター/スレーブデザインパターンは、LabVIEW開発者が使用するもう1つの基本的なアーキテクチャです。これは、2つ以上のプロセスを同時に継続的に、それでいて異なるレートで実行する必要がある場合に使用されます。これらのプロセスが単一のループで実行される場合、重大なタイミングの問題が発生する可能性があります。これらのタイミングの問題は、ループの一部の実行に対して予想よりも時間がかかる場合に発生します。これが発生すると、ループ内の残りの部分が遅延します。マスター/スレーブパターンは、複数の並列ループで構成されています。各ループは、異なるレートでタスクを実行します。これらの並列ループのうち、1つのループはマスターとして機能し、他のループはスレーブとして機能します。マスターループはすべてのスレーブループを制御し、メッセージングアーキテクチャを使用してそれらと通信します。

マスター/スレーブパターンは、データを収集しながら同時にユーザーインターフェイスに応答するときに最も一般的に使用されます。ゆっくりと変化する電圧を5秒に1回測定して記録するアプリケーションを作成するとします。伝送ラインから波形を取得し、100msごとにグラフに表示します。また、取得ごとにパラメータを変更できるユーザーインターフェイスも用意します。
マスター/スレーブのデザインパターンは、このアプリケーションに最適です。このアプリケーションでは、マスターループにユーザーインターフェイスが含まれます。電圧の取得とロギングは1つのスレーブループで行われ、伝送ラインの取得とグラフ化は別のスレーブループで行われます。

制御を伴うアプリケーションも、マスター/スレーブデザインパターンを使用することでメリットが得られます。例えば、フリーモーションのロボットアームとのユーザーの相互のやり取りを伴う場合です。このタイプのアプリケーションは、制御が誤って処理された場合に発生する可能性のある腕または周囲への物理的損傷のため、非常に制御指向となります。たとえば、ユーザーがアームに下向きの動きを停止するように指示したが、プログラムがアームの回転制御で占有されている場合、ロボットアームはサポートプラットフォームに衝突する可能性があります。この状況は、マスター/スレーブデザインパターンをアプリケーションに適用することで回避できます。この場合、ユーザーインターフェイスはマスターループによって処理され、ロボットアームのすべての制御可能な動作には独自のスレーブループがあります。この方法を使用すると、アームの制御可能な各動作に独自のループがあり、したがって、独自の処理時間があります。
これにより、ユーザーインターフェイスを介してロボットアームをより応答性の高い方法で制御できるようになります。

なぜマスター/スレーブを使用するのですか?

マスター/スレーブのデザインパターンは、マルチタスクアプリケーションを作成するときに非常に有利です。このデザインパターンは、マルチループ機能によりアプリケーション開発へのよりモジュール化されたアプローチを提供しますが、最も重要なことは、アプリケーションの時間管理をより細かく制御できることです。 LabVIEWでは、各並列ループは個別のタスクまたはスレッドとして扱われます。スレッドは、他の部分から独立して実行できるプログラムの一部として定義されます。個別のスレッドを使用しないアプリケーションである場合、そのアプリケーションはシステムによって1つのスレッドとして解釈されます。アプリケーションを複数のスレッドに分割すると、それぞれが処理時間を等しく共有します。

これにより、アプリケーションのタイミングをより細かく制御でき、ユーザーがアプリケーションをより細かく制御できるようになります。 LabVIEWの並列性は、マスター/スレーブデザインパターンの実装に役立ちます。

上記のデータ収集の例では、電圧測定と波形収集の両方を1つのループにまとめ、ループの50回の反復ごとにのみ電圧測定を実行することが考えられます。ただし、電圧測定とデータのディスクへの記録は、波形を単一で取得および表示するよりも完了するまでに時間がかかる場合があります。この場合、前の反復のすべてのコードが完了する前に波形取得を開始できないため、次の反復での波形取得の次の反復は遅延します。さらに、このアーキテクチャでは、電圧をディスクに記録する速度を変更せずに、波形を取得する速度を変更することは困難です。

このアプリケーションの標準的なマスター/スレーブデザインパターンによるアプローチは、取得プロセスを2つの別々のループ(スレーブループ)に配置することです。どちらも、パラメーターが変更されているかどうかを確認するためにユーザーインターフェイス(UI)コントロールをポーリングするマスターループによって駆動されます。スレーブループと通信するために、マスターループはローカル変数に書き込みます。これにより、各取得プロセスが他のプロセスに影響を与えず、ユーザーインターフェイスによって引き起こされる遅延(ダイアログの表示など)によって取得プロセスの反復が遅延することはありません。

マスター/スレーブアプリケーションを構築する

マスター/スレーブのデザインパターンは、複数の並列ループで構成されています。他のすべてを制御するループはマスターであり、残りのループはスレーブです。 1つのマスターループは常に1つ以上のスレーブループを駆動します。これらのループ間で直接データ通信を行うとデータフローが途切れるため、LabVIEWのローカル変数またはグローバル変数、オカーレンス、ノーティファイア、またはキューなどのメッセージングアーキテクチャで書き込みおよび読み取りを行う必要があります。図1は、共有データを使用してさまざまなループが相互に接続される方法を示しています。

overview.png

図1:マスター/スレーブの概要

例-ループの同期

このアプリケーションには、次の要件があります。

  • ユーザーインターフェイスを処理するためのキューメッセージハンドラを作成します。ユーザーインターフェイスには、LED付きの2つのトグルプロセスボタンと終了ボタンが含まれている必要があります。

  • 個々のLEDを異なるレート(100ミリ秒と200ミリ秒の間隔)でオンとオフに切り替える2つの別々のプロセスを作成します。これらの2つのプロセスは、ユーザーインターフェイスを使用して制御されます。


最初のステップは、どのプロセスがマスターになり、どのプロセスがスレーブになるかを決定することです。この例では、ユーザーインターフェイスはマスターループ内に配置され、2つの点滅するLEDプロセスが2つのスレーブループになります。ユーザーインターフェイスは、ローカル変数を使用して各スレーブループの動作を制御します。

これで、LabVIEWマスター/スレーブアプリケーションを開始する準備が整いました。最終的なマスター/スレーブアプリケーションを表示するには、添付のVI(masterslave.zip)を開いてください。

メッセージングアーキテクチャ(共有データ)

問題:複数のループが同時に共有変数にデータを書き込もうとすると、最終的にどの値が書き込まれるかを判断する方法がありません。これは競合状態として知られています。

解決策:グローバル変数に書き込むコードの周囲に「取得/解放セマフォ」のペアを配置します。これにより、複数のループが同時にグローバルに書き込もうとしないことが保証されます。 LabVIEWに含まれているサンプルの中には、セマフォの使用法を示すものがいくつかあります。セマフォは、競合状態を回避するために、書き込み中にグローバルデータをロックします。

同期

問題:マスター/スレーブのデザインパターンは同期に基づいていないため、スレーブループがマスターループの前に実行を開始する可能性があります。そのため、スレーブループが実行を開始する前にマスターループを初期化することが問題になる可能性があります。

解決策:オカレンスを使用して、この種の同期の問題を解決できます。


オカレンスの使用法を示すサンプルを見つけるには、LabVIEW付属のサンプルを参照してください。図2は、オカレンスの使用方法の例を示しています。

occurrence.png
図2:オカーレンスの使用例

Attachments