ブロックダイアグラムのデータフロー
- 更新日2025-08-27
- 5分で読める
LabVIEWは、データフローモデルに従ってVIを実行します。ブロックダイアグラムノードは、そのすべての入力を受信すると実行されます。ノードを実行すると、出力データを生成し、そのデータをデータフローパスの次のノードに渡します。ノードを介したデータの移動は、ブロックダイアグラム上のVIおよび関数の実行順序を決定します。
Visual Basic、C++、JAVA、その他のほとんどのテキストベースのプログラミング言語は、プログラム実行の制御フローモデルに従います。制御フローでは、プログラム要素の順序によってプログラムの実行順序が決まります。
LabVIEWでは、コマンドの順序ではなく、データフローによってブロックダイアグラムの要素の実行順序が決まります。このため、並列処理されるブロックダイアグラムを作成することができます。たとえば、以下のブロックダイアグラムのように、同時に2つのForループを実行して、フロントパネルにその結果を表示することができます。
LabVIEWはマルチタスクおよびマルチスレッドシステムであるため、複数の実行スレッドと複数のVIを同時に実行します。
データ依存と人工データ依存
実行の制御フローモデルは命令駆動です。データフローの実行はデータ駆動、つまりデータに依存しています。他のノードからデータを受け取るノードは、常に他のノードの実行が終了した後で実行されます。
ワイヤで接続されていないブロックダイアグラムのノードは、任意の順序で実行できます。フロースルーパラメータを使用して、自然なデータ依存が存在しない場合の実行順序を制御します。シーケンスストラクチャを使用して、フロースルーパラメータが存在しない場合の実行順序を制御します。
データ依存が存在しない場合
データ依存が存在しない場合は、左から右または上から下へ実行されるとは限りません。必要なときは必ず、データフローを配線することによってイベントのシーケンスを明示的に定義してください。
以下のブロックダイアグラムでは、「バイナリファイルから読み取る」関数が「ファイルを閉じる」関数に配線されていないため、「バイナリファイルから読み取る」関数と「ファイルを閉じる」関数との間にはデータ依存がありません。この例では、最初に実行される関数が決定できないため、期待どおりに機能しない場合があります。「ファイルを閉じる」関数が最初に実行された場合、「バイナリファイルから読み取る」関数は機能しません。
以下のブロックダイアグラムでは、「バイナリファイルから読み取る」関数の出力を「ファイルを閉じる」関数に配線することによってデータ依存を確立します。「ファイルを閉じる」関数は、「バイナリファイルから読み取る」関数の出力を受け取るまで実行されません。
フロースルーパラメータ
フロースルーパラメータ (通常はRefnumまたはエラークラスタ) は、対応する入力パラメータと同じ値を返します。これらのパラメータを使用して、自然なデータ依存が存在しない場合の実行順序を制御します。最初に実行するノードのフロースルー出力を、次に実行するノードの対応する入力に接続することによって、人工データ依存を確立します。このフロースルーパラメータを使用しない場合は、シーケンスストラクチャを使用して、希望の順序でデータ操作が実行されるように確認する必要があります。
データフローとメモリ管理
データフロー実行モデルでは、制御フロー実行モデルよりも簡単にメモリを管理できます。LabVIEWでは、変数のメモリを割り当てたり、値を変数に割り当てることはありません。その代わりに、データの移動を表すワイヤを使用してブロックダイアグラムを作成します。
データを生成するVIと関数が、そのデータのメモリを自動的に割り当てます。VIや関数がそのデータを使用しなくなると、関連付けられているメモリの割り当てが解除されます。新しいデータを配列や文字列に追加すると、新しいデータを管理するために十分なメモリが割り当てられます。
LabVIEWではメモリ管理が自動的に処理されるため、メモリの割り当てまたは解放は制御能力は低くなります。ただし、VIが大量のデータセットを処理する場合は、メモリの割り当てがいつ行われるかを認識する必要があります。関連する規則を理解することで、極めて小さいメモリの使用量でVIを作成することができます。開発する際にメモリ使用を最小限に抑えると、VIの実行速度の向上に役立ちます。