チャンネルワイヤを使用して並列したコードセクションの間でデータを通信する
- 更新日2025-08-27
- 7分で読める
LabVIEWのチャンネルワイヤは、並列した2つのコードセクションの間における、実行順序を強制しない非同期通信を表現します。チャンネルワイヤは、各ループが読み書きを行うRefnumまたは変数と似た働きをします。Refnumや変数を使用する代わりに、データ通信をワイヤとして視覚的に表現します。
以下の図は、キューRefnumを使用した場合と同じ機能をもつブロックダイアグラムを、チャンネルワイヤを使用して作成する方法を示しています。
各チャンネルワイヤには、最低2つのエンドポイント (書き込みおよび読み取り) が必要です。エンドポイントは、データのやり取りが行われるコードの部分です。書き込みエンドポイントは、チャンネルにデータを書き込みます。読み取りエンドポイントは、チャンネルからデータを読み取ります。チャンネルワイヤを使用して書き込みエンドポイントを読み取りエンドポイントに接続すると、並列したコードセクションの間で非同期なデータ通信が可能になります。
LabVIEWには、アプリケーション開発に使用できる、以下のチャンネルテンプレートが含まれています。通信プロトコルは、各テンプレートにおいて異なります。通信やアプリケーションの必要性に基づき、以下のテンプレートから選択できます。
| LabVIEW | Real-Timeモジュール | FPGAモジュール* |
|---|---|---|
| ストリーム タグ メッセンジャー アキュムレータタグ イベントメッセンジャー 高速ストリーム ロッシーストリーム 単一要素ストリーム | ストリーム タグ メッセンジャー アキュムレータタグ イベントメッセンジャー 高速ストリーム ロッシーストリーム 単一要素ストリーム リアルタイムストリーム | ストリーム タグ アキュムレータタグ ロッシーストリーム 単一要素ストリーム |
| *サポートされている各チャンネルテンプレートに対して、FPGAモジュールはエンドポイントの一部のみをサポートします。 |
チャンネル書き込みエンドポイントまたはチャンネル読み取りエンドポイントを作成するには、端子またはワイヤを右クリックし、作成»チャンネル書き込みまたは作成»チャンネル読み取りを選択します。表示された「チャンネルエンドポイントを選択」ダイアログボックスで読み取り/書き込みを切り替えをクリックすると、エンドポイントを書き込みまたは読み取りに切り替えることができます。端子からエンドポイントを作成すると、その通信タイプがデータタイプであるチャンネルテンプレートのインスタンスが作成されます。
ストリームチャンネルは、すべて分岐不可能であり、単一の書き込みエンドポイントと単一の読み取りエンドポイントを接続します。その他のすべてのチャンネルは、分岐可能であり、同じチャンネルに複数の書き込みまたは読み取りを接続できます。
チャンネルの寿命を理解する
チャンネルの実行は、そのチャンネルの発呼者ブロックダイアグラムにより制御されます。発呼者ブロックダイアグラムとは、チャンネルのすべてのエンドポイント、またはそれらのエンドポイントを呼び出すすべてのノードが含まれた最下位ブロックダイアグラムを指します。
チャンネルは、その発呼者ブロックダイアグラムが実行開始した時点で初期化されます。チャンネルは、そのエンドポイントの1つの最後の要素?入力または中断入力がTRUEになると閉じます。チャンネルが閉じると、その後のチャンネルへの書き込みは無視されます。発呼者ブロックダイアグラムが再度実行を開始すると、チャンネルは再度初期化されます。発呼者ブロックダイアグラムとして使用できるのは、ストラクチャノード、VIの最上位ブロックダイアグラム、または現在の最上位VIを呼び出す上位ブロックダイアグラムです。
以下の図では、チャンネルの発呼者ブロックダイアグラムはこのVIの最上位ダイアグラムです。チャンネルは発呼者ブロックダイアグラムが実行開始すると初期化されるため、最上位VIが実行開始するたび、または最上位VIがサブVIとして呼び出されるたびに初期化されます。
以下の図では、チャンネルの発呼者ブロックダイアグラムはWhileループです。チャンネルは、Whileループが実行開始すると初期化されるため、Whileループが反復するたびに初期化されます。
以下の図では、チャンネルの発呼者ブロックダイアグラムは最上位VIでなく、現在の最上位ブロックダイアグラムよりも上位のダイアグラムです。チャンネルはそのさらに上位のブロックダイアグラムが実行開始すると初期化されるため、さらに上位のブロックダイアグラムが実行開始するたび、またはそのブロックダイアグラムがサブVIとして呼び出されるたびに初期化されます。Whileループにはチャンネルのすべてのエンドポイントが含まれていないため、Whileループの反復ではチャンネルは初期化されません。
上記のすべてのチャンネルインスタンスにおいて、書き込まれていない配列要素の数が2の時に最後の要素?入力がTRUEになるため、書き込みエンドポイントは最初の3つの値をチャンネルに書き込み、最後の2つの値は無視します。
複製エンドポイントを停止する
チャンネルリーダまたはライタを作成するときに、中断付きを選択すると、中断ブール入力のあるエンドポイントが作成されます。TRUEの場合、中断は、すべてのエンドポイントに、中断?出力を生成するようにアラートを送信します。どのエンドポイントも中断信号を送信することができます。チャンネルワイヤを使用するループがある場合、エンドポイントが中断信号を送信したときにループを停止するには、すべてのループをエンドポイントの中断?出力に配線します。この仕組みにローカルは必要ありません。複製エンドポイントを使用する場合、元のチャンネルで中断値を指定する必要があります。中断エンドポイントはその内部ループを停止し、中断値を複製されたチャンネルに伝播します。
Refnumおよび変数と比較した場合のチャンネルワイヤの利点
チャンネルワイヤには以下の利点があります。
- チャンネルワイヤを使用すると、キューを使用した場合のようにRefnumを作成および破棄する必要がない。
- チャンネルワイヤを使用した場合、キューを使用した場合よりも必要なブロックダイアグラムノードが少ない。
- チャンネルワイヤは、データフローの発端と終端を表すため、Refnumおよび変数を使用した場合よりもデバッグしやすい。
- チャンネルワイヤを使用すると、停止信号および中断信号をデータと統合できるため、Refnumおよび変数を使用した場合よりも、アプリケーションでエラーが発生しにくい。
- チャンネルワイヤを使用すると、他のプログラミング言語におけるクロージャの役割を果たすコルーチンを作成できる。チャンネルワイヤを使用したコルーチンの作成方法のサンプルについては、labview\examples\Channels\Replacing The Function At The Heart Of An Algorithm At Run Time\Replacing The Function At The Heart Of An Algorithm At Run Time.lvprojを参照してください。