LabVIEWでプログラムを組むときに必要になるデザインテンプレートの案を紹介しています。本ブログで紹介している具体的なプログラム例のベースとなる組み方を説明しています。
この記事では実行順序をiniファイルで指定できるステートマシンを紹介しています。
デザインテンプレートの重要性については以下の記事を参考にしてください。
実行順序をiniファイルで指定できるステートマシンに必要な知識
実行順序をiniファイルで指定できるステートマシンは、プログラムで実施する複数種の処理の順番をiniファイル、つまり外部ファイルによって指定できるタイプのステートマシンです。
これにより、一つのプログラムに対して用途ごとに開発者がiniファイルを用意すれば、プログラムを動かすユーザーはiniファイルを選ぶだけで様々な組み合わせの処理を行うことができます。
必要な知識としては
- 基本的なイベント駆動型ステートマシンの作り方
- iniファイルの扱い方
になります。
イベント駆動型ステートマシンについては、単純なステートマシンの知識以外に、ステートの一部にイベントストラクチャを用いて、イベントが発生すると特定のステートに移行するといった処理を組めれば十分と思います。

とはいえ一応記事前半ではイベントストラクチャを使用しないプログラムの紹介となるので、とにかくステートマシンの基本的な構造さえ覚えておけば大丈夫です。
Iniファイルについては、ファイルIOの関数の中でも少し特殊なので特別な関数群となっています。
ただ、特別難しいことはなく、セクションやキーの指定が必要でその仕組みさえわかってしまえば実装は楽な方だと思います。
iniファイルの扱いについて不安があるよという方は以下の記事が参考になるかもしれません。
また、便宜上iniファイルを用いて処理の順番を規定するようにしていますが、別にiniファイルである必要はなく、要はLabVIEW外のテキストファイルにあるルールで順番を記述して置き、LabVIEWでそのルールに従って順番を読み取ってしまえればいいだけの話です。
実行順序をiniファイルで指定できるステートマシンの基本的な形
実行順序をiniファイルで指定できるステートマシンは、iniファイルからの読み取りと、読み取った順番を覚えそれらを一つずつ「消費」することで実現できます。
大まかに、基本的な構造としては以下のような流れを実装することになります。

単純な例として紹介するために、フロントパネルにはiniファイルを指定する、ファイルパス制御器しかない状態とします。

iniファイルには、「最初はstateA」などといった具合で、どの順番でどのステートを実行するかを書いておきます。
iniファイルの中身の形式は何でもいいのですが、簡単なのは下の図で示したような書き方です。
プログラムが実行されると、その順番通りにステートが進み、各ステートが終われば次に進み、全て終えたら終了させます。

実装は特に難しくなく、要はファイルから読みだしたステートの名前とその順番さえわかればいいので、この目的に適した配列で管理するだけで実現できます。

初期化のステートでは文字列配列をひとまず用意しておきます。
実際のプログラムでも何かしら初期化したいことがあればこのステートに記述しておきます。

次にfile readステートに進みます。
ここでiniファイルから順番を呼び出します。
iniファイルに何個のステートの順番が記述されているかあらかじめわかっていない場合でも対応できるように、Get Key Names.viでキーの数(=ステートの数)分だけキーの名前を取得し、ForループでRead Key.viを使用することで各キーの要素を取得しておきます。

executeステートで配列の要素からまず一番上の要素のみを取り出しますが、単に指標配列を使うのではなく「配列から削除」をすることで、配列を「消費」するようにし、その配列の要素数が0になるまでexecuteステートを繰り返すようにします。

当然、executeステート内のケースストラクチャにはそれぞれのステートとして異なる処理(今回の例ではどのステートを実行しているかをポップアップ表示するという処理)を書いていきます。

最後に終了処理をして終わりです。

連続的に様々なiniファイルを読み込ませる場合
上で紹介したプログラムでは、プログラムを実行する前にiniファイルのパスを指定しており、その順番に従って処理が実行され、全部終わればプログラムごと終了します。
そうではなく、iniファイルが複数あってそれらをプログラムを終了させずに実行させるような場合には、イベントストラクチャを使用してプログラムを組むのが有効です。

プログラムとしてはeventステートを追加しており、file readで行っていた処理は、eventステートのイベントストラクチャの中に移しています。

イベントとしては2種類用意すればよく、プログラム終了のためのボタンに対するイベントと、file readに対応する処理を行うイベントをそれぞれ書きます。
ファイル選択決定のイベントの中に、このボタンの無効プロパティの設定を入れていますが、これはexecuteステートに移行後にファイル選択決定のボタンを押すことで意図しない動作をすることを防ぐ目的で入れています。

executeステートの実装もほぼ変わりませんが、配列の要素が0になったらファイル選択決定ボタンの無効プロパティとしてEnabledを指定するようにします。(下の図には書いていませんがFalseケースには何もしていません)

本記事では、実行順序をiniファイルで指定できるステートマシンについて紹介しました。
プログラムを動かすユーザーはとにかくプログラムを動かすことに専念し、どのようなテストや処理が必要かは別途プログラムを作った人あるいは管理者が決めてファイルで管理する、というときに有用かと思うので参考になればうれしいです。
ここまで読んでいただきありがとうございました。


コメント