【初心者向け】LabVIEWのデータフローとは?【解説・注意点】

2020年11月21日LabVIEW,プログラミング

本記事では、初心者向けにLabVIEWを使用してプログラム開発するときに注意をしたいことをLabVIEWの画面を掲載しながら解説を行っていきます。

特にLabVIEWでプログラミンを始めたばかりの時、どこに気をつけながらプログラミングを行えば良いのか判らないことが多々あると思います。

とりあえず、動けば問題ないとの考えでプログラミングを行うと後で修正が発生をした場合に苦労します。最低限の注意事項は守った方が良いと考えます。

複数の項目をまとめて書くと覚えるのが大変になるため、項目数は少ないかもしれませんが3つとしています。
他に注意をした方が良いことについては別記事で掲載をします。

LabVIEWのデータフローについて理解する

Labviewはグラフィカル言語を使用し、データフローという形式でプログラムが実行されます。

データフローについて理解をせずにプログラムを組むと、想定外の処理が行われ、異常動作の原因になります。データフローを理解して楽しくLabVIEWでプログラム開発を行いましょう

テキスト言語の処理順番

C言語やPythonなどのテキスト言語だとメイン関数から記載されてる順番で処理をされていきますが、LabVIEWの場合は先頭にある定数や関数から順番に処理されていきます。
※ここでは処理速度について解説しているのではなく、処理をされる順番についての解説をしています。

「LabVIEWの先頭にある定数や関数とは?とは何を指しているのか疑問が出てくると思いますので、図を用いながら解説していきます。

C言語で、四則演算を行い、画面に数字を表示するプログラムを作成しました。

include<stdio.h>

int main(void){
   //定数を作成する
     int a = 5;
     int b = 10;
     int c = 15;
     int d = 20;
   
     int total_plus;
     int total_minus;

     //定数を用いて計算する
     total_plus = a + b;
     total_minus = d - c;
     
     //画面に計算結果を出力する
     printf("%d\n", total_plus);
     printf("%d\n", total_minus);

     return 0;
}

テキスト言語(画像はC言語)だと通常は行番号の順番で順次処理がされていきます。
最初に変数を用意して、一部の変数には初期値を入力しています。
次に減算処理した結果を2つの変数に入力を行い、画面に出力をするといったプログラムを組んでいます。

行番号5~11は整数型の変数を用意しています。行番号13~14で先ほど用意した変数を用いて四則演算を行っています。

最後に行番号16~17で画面に出力をする処理を行っています。

LabVIEWでの処理順番

次にLabVIEWで同じ結果が得られるプログラムを組むと上記のようになります。処理される順番は①②③になります。

LabVIEWでは基本的に左から右に流れるようにプログラムを組みます。

実行される順序が①②③になる理由

  • ①は出力のみを行い、入力される項目がありません。他の処理を待つ必要がないので、すぐに処理(出力)を行うことが出来ます。
  • ②は接続されている①からの入力が全てこないと処理を行うことが出来ません。①からの出力結果が全て入力されるまで待った後に実行(出力)されます。
  • ③は②から出力された結果を受け取って、表示器に表示されるため、最後の処理となります。

入力の必要な関数はデータが全て入力されるのを待つ必要がある点に注意が必要です

次に①②③を個別に解説していきます。

①②③について個別説明

  • ①では制御器から値が出力されますが、この時、上から順に制御器の値が出力されているわけではありません。
    制御器「d」「b」「c」「a」の順で出力されていたり、「b」「a」「c」「d」と出力されていたりします。
  • 同様に②の四則演算も加算が先に処理されたり減算が先に処理されたりします。
  • ③も同様に「Total_plus」または「Total_minus」のどちらかが先に表示されています。

上記のプログラムでは加算と減算の処理にデータフローによる順番付けを行っていないため、どちらも平行に処理が走っています。

もう理解されているかもしれませんが、「LabVIEWの先頭にある定数や関数とは」、入力される必要のない処理がLabVIEWのプログラムにとっての先頭になります。

ブロックダイアグラム上で通常はワイヤーを駆使して処理の順番付けを行っていきます。

データフローによる処理の順番付けが行われていないと、間違った処理が行われたりします。

ローカル変数を用いる場合の注意点

データフローを理解せずに「ローカル変数」を用いると下記のような計算ミスが発生する可能性があります。
※ローカル変数とは制御器や表示器の値を同じVI内であれば使用することが出来る変数です。制御器、表示器の値を読み込んだり書き換えたりすることが可能です。Whileループを並列で2つ動かしているときにデータをループ間で共有させたい場合に使用します。

データフローによる順番付けが行われていないため、先にローカル変数の値が読み込まれてしまう可能性があります。

加算と積の処理は平行して別々に処理をされているので加算の処理が先にローカル変数の値を読み込むより先に終わっていれば想定した計算処理が行われます。しかし、プログラムとしては想定した処理がされない場合もあるため不安定な状態となっています。

加算の処理の後に積の処理をしたい場合は、加算の結果をワイヤーで積に入力するように修正をすることで常にどんな場合でもプログラムとして安定した動作をしてくれるようになります。

どうしても、前後のある処理を上手く繋げられない場合は、フラットシーケンスストラクチャを使用することで強制的に順番通りの動作をさせることができます。

左の処理順番1から処理が行われ、処理順番1の処理が終わるまで、処理順番2は実行されません。そのため、確実に加算の処理結果が合計値に入力された後に、処理順番2が実行されるためローカル変数から値が読み込まれます。


データフローの処理になれていない場合は一旦、フラットシーケンスストラクチャに処理したい内容を順番に全て入れてから、プログラムを整理していく手法があります。
一度書き出すことで、何をしたいかはっきりするため、平行して処理できる内容や、前後関係のある処理を分類分けしやすくなります。

また、別の方法としてエラーワイヤーを使用することによって本来は並列に走ってしまうようなプログラムでもデータフローの処理に基づいて順番を付けて処理を行うことが出来ます。

可読性が悪いプログラム

可読性の悪い手法

  • 制御器がどこにも繋がっていない
  • 同じローカル変数が複数の箇所に点在している(ケースストラクチャ内に複数ある)

データフローは順番に処理をしていくだけではなく、データがどのように流れているのかを視覚的に見ることが出来る処理でもあるので、安易にローカル変数などに頼って、データを処理してしまわないように注意が必要です。

何度か、プログラムを作成していくと徐々に慣れてくると思います。色々とプログラムを作成してみましょう。