LabVIEWでプログラムを組むときに必要になるデザインパターンの案を紹介しています。本ブログで紹介している具体的なプログラム例のベースとなる組み方を説明しています。
この記事ではストレートフローを紹介しています。
このデザインに必要な知識
LabVIEWで書ける最もシンプルなプログラムは、「一直線にプログラムが進んでいく」ようなプログラムです。LabVIEWチックに言うと、「左から右に実行される」プログラム、ということになります。
ステートマシンなどの他のプログラムテンプレート(デザインパターン)と区別するために、ここでは「ストレートフロー」と表現します。(ただし、この表現は私オリジナルなので、ネットで調べてもこの表現では情報見つからないと思います。)
他のプログラムテンプレートよりも単純で、実装も簡単なので、もしこのストレートフローデザインでプログラムが書けるのであれば、それに越したことはないと思います(効率がいいプログラムになるかどうかは別問題で、あくまで手早くプログラムを構築したいという場合に限ります)。
このストレートフローデザインを書くのにあたって必要な知識は
- LabVIEWのデータフロー(実行順番)の考え方
- 繰り返しの方法(Whileループ、Forループ)
- 条件分岐(ケースストラクチャ)
などが挙げられます。
もしこれらの内容について不安があるという方は、これらをキーワードにネットや書籍を調べたり、以下の記事を参考にしてみてください。
結局は、他のプログラムテンプレートも突き詰めればこのストレートフローの組み合わせになるので、LabVIEWで一通りのことは学んだけれどプログラムが書けない、という方はまずはこのデザインに慣れる事から始めるといいと思います。
ストレートフローのパターン
では、ストレートフローのプログラムのいくつかのパターンを紹介します。
紹介、と言っても、繰り返しや条件分岐を組み合わせた単純な構造ばかりなので、知っている人にとっては退屈な内容だと思います。
なお、ここでは便宜上、A、B、C、Dなどといったアイコンで記述します。これらのアイコンは、何か特定の関数の代わりだと思ってください。
(なお、関数パレット上にあるものは、厳密には「関数」ばかりではなく「ノード」と呼ぶべきものも含まれますが、ここでは全て「関数」と呼ぶことにしています)

もっとも単純なプログラム
もっとも単純なプログラムは、各関数が並んでいるだけの、文字通り「一直線」な構造を持ったプログラムとなります。

このプログラムは、以下のプログラムと同じです。が、フラットシーケンスストラクチャを、「プログラムの実行の順番を指定するためだけ」に使用することは可能な限り避けるべきです。
理由を説明すると少し主題を外れるのでここでは深くは書きませんが、「エラー配線による実行順番付けのクセを付けた方が良いから」というのが主な理由です。

一方で、例えば以下のように途中の処理でどうしても一定時間、間隔を開ける必要がある、という場合もあるかと思います。しかし、一定時間待機をさせるための待機関数はエラーの入出力もないため、シーケンスストラクチャを用いざるを得ない、と思うかもしれません。

こんな時には、待機するという機能をもったサブviを用意して、このサブviによって指定した時間の間隔を開けるという組み方をすると、フラットシーケンスストラクチャの使用を回避できます。(また、最近のLabVIEWバージョンではこの目的専用の関数である「データフローを一時停止」がデフォルトで存在しています)

ここまでの説明で、さもフラットシーケンスストラクチャが悪かのように書いていますが、LabVIEWのプログラムでは一部を除いて基本的にはフラットシーケンスストラクチャを使わなくてもプログラムが書けるはずです(一部、フラットシーケンスストラクチャを使わないと期待した結果を得られない場合が存在しますが、画像処理やFPGAのプログラムなど使用が限定されます)
条件分岐を行う場合
プログラム実行時にあらかじめ決めた設定、あるいはプログラムを実行中に得られた値、これらによって特定の処理をする/しないということを決めるために条件分岐を使用します。
例えばユーザーがフロントパネル上にあるボタンを押しているかどうかで実行する内容を切り替える場合には以下のような形となります。

実行した結果得られた値によって条件を決める場合には、例えば以下のような形となります。

繰り返しを行う場合
特定の処理を繰り返したいという場合には、その繰り返しをどのように終わらせるかという、繰り返し終了の条件を決めることが大切です。
予め繰り返す回数が決まっている場合にはForループで回数を指定したり、繰り返したい回数分の要素が入った配列を入力することで処理することができます。
単純に回数を指定するのはForループの左上にある「N」の部分にその繰り返したい回数である数字を配線すればいいので特に説明することもない一方で、配列を入力して繰り返しの回数を決める書き方も重要なので、プログラムが書けるようになるには確実にマスターしておきたいポイントになります。

一方、事前に繰り返す回数が決まっておらず、例えばユーザーが「停止」というボタンを押したり、繰り返している処理の中でエラーが発生した場合に繰り返しをやめるという場合にはWhileループを使用します。

条件分岐と繰り返しの組み合わせ
条件分岐と繰り返しを組み合わせることで、もう少し複雑なことができるようになります。
例えば、ある処理を複数回行うとして、その処理一回一回で得られた値の大小によって、その次に別の処理を行うかどうかを決めることができます。

また、ボタンが押されたらそれぞれの処理を行う、という状態を、停止ボタンを押すまで繰り返させたい場合にも、以下の図のような組み方が考えられます。

イベントストラクチャを知っている方は、もっと効率がいいプログラムを書けると思います。
ですが、ある程度自力で組めて自力でデバッグできることが大切ですし、プログラムの効率(実行速度など)はそこまで重視していないという場合には変に難しい組み方を行う必要はないと思います。
ストレートフローの実装例
抽象的な表現ばかりでもイメージが湧きづらいかもしれないので、具体的なプログラム例を紹介します。
プログラムの機能としては、以下の要件を満たすようにします。
- 信号(正弦波+ノイズ)を測定していることを想定
- プログラム実行後、開始ボタンが押されるまでは測定は行われない
- 測定中はグラフに測定データが表示され、サンプリングレートと表示サンプル数から計算されるレートでグラフ表示が更新される
- 保存ボタンが押されると、指定したファイルパスに測定した信号のデータが保存される
- 一時停止のボタンが押されるとデータの取得およびデータ保存が一時的に止まり、また一時停止のボタンが押されると測定を再開する
- 停止ボタンを押すとプログラムが終了する
フロントパネルは以下のような状態であるとしています。
ここで、データ取得開始のボタンと停止ボタンの機械的動作はラッチで、他の一時停止だったりデータ保存のボタンはスイッチ動作です。

プログラムを実行してから取得開始のボタンを押す前にサンプル数(一度にグラフに表示するデータ点の数)とサンプリングレートを決めておきます。
データ取得を開始してから一時停止ボタンを押して止めたり、あるいはファイルパスを.txtで指定してデータ保存のボタンを押すことでデータを保存できるようになります。
なお、下の図で保存されたデータの中身のタイムスタンプが1904年になっているのは、ダミーで生成した波形(正弦波+ノイズ)が持つタイムスタンプデータだからであり、特に意味はありません。

効率を重視しなければ、このようなプログラムは以下のように書くことができます。
見てわかる通り、Whileループとケースストラクチャで「条件分岐+繰り返し」の応用になっています。

データ取得のボタンが押されるまで測定(メインのループ)が始まらない状態を、「データ取得のボタンが押されるまで抜け出さないループがある」ことで表現しています。
このループの中に、サンプル数やサンプリングレートの設定値を入れておくことで、このループを抜けたときにそれぞれに入力された値が次のループにクラスタとして渡されることになります。

メインのループでは、一時停止のボタンの状態によって処理を変えています。
もしこのボタンが押されてTrueになった場合には何もしません。
もしこのボタンがFalseになっていた場合には正弦波+ノイズのデータを波形グラフに表示させたり、データ保存のボタンが押されたらデータをスプレッドシートファイルに保存するようにしています。

LabVIEWに慣れていない場合には実際に真似て作ってみるのがいいと思います。
ちなみに、正弦波だったりノイズだったりあるいは波形データを保存する関数は、以下の図の位置の関数パレットにそれぞれあるので参考にしてみてください。

この記事では、LabVIEWでプログラムを書く上で最も基本的な形となるストレートフローのパターンを紹介しました。
他のプログラムパターンであっても、このストレートフローの組み合わせになっていることが多いので、LabVIEWでプログラムを書けるようになるためには少なくともこの記事で紹介した内容は必須の知識だと思ってください。
ここまで読んでいただきありがとうございました。




コメント