こんにちは、1つのステートで人生を乗り切ろうとしている氷河期の住人だよ。
前回のストラクチャ関数で、だいたい基本的な関数は全て紹介しました。
ここからは実際のプログラムのように、組み合わせて使うことを中心に書いていきます。
ステートマシンって何?
目次(クリックできるよ!)
ネットで調べると専門用語だらけでワケわからなかったので、LabVIEWで使うためだけに簡単に説明します。
ステート=状態 、つまり「状態」をいろいろ切り替えながら制御をするというものです。
例えばこんな風に、私のステート(状態)を3つに表したとします。
- 平日の朝が来ると、「家」から「会社」に状態(あくまで例なので)が変わります。
- 仕事が終わると、「会社」から「家」に状態が変わります。
- 休日になると「家」から「アウトレットモール」に状態が変わります。
- アウトレットモールで散財しきってしまうと、「アウトレットモール」から「家」に状態が変わります。

・・・かなり無理矢理な説明ですが、こんな感じで入力などによって状態を切り替えられるようなプログラムを「ステートマシン」って言います。
ステートマシンの作りかた
構成要素
今まで説明してきた関数の組み合わせでステートマシンは構成されます。
- Whileループ
- ケースストラクチャ
- シフトレジスタ
全部前回の記事「ストラクチャ関数の使い方とは?」で説明をしたものばかりです。
これにもう一つ、「列挙体」をくわえないとステートが増やせません。
列挙体とは?
簡単に言うと、「数字と名前を紐づけたリスト」です。

状態を「0」「2」とか言われてもよくわかりませんが、「動作中」「非常停止時」とか書くと状態ってわかりやすいですよね。でもプログラム的に文字列というのは厄介なので、数字を紐づけたリストを作っておくとわかりやすいということです。
コントロールパネルの「Ring&Enum」→「Enum」にあります。配置できるのですが、最初は中身が空っぽで全く使えません。なので列挙体を右クリック「プロパティ」を選択。
開いた画面「Edit Items」のタブをクリック、「Insert」で中のリストを作っていきます。
・・さっきの例をそのままあてはめてみます。
こんな感じで、文字と数字が紐づけられました。では順番にステートマシンを組んでいきます。
①ケースストラクチャに列挙体を接続
ケースストラクチャとは、例えばTrueかFalseといったケースによって中身を入れ替えるストラクチャでしたね。
このケースストラクチャに列挙体をつなげてみましょう。

そうなんです、列挙体が接続できるから、ステートマシンが組めるのです。(ブールか整数なら繋げます)
ではさっそく先ほどの列挙体にケースストラクチャをつないでみます。ケースストラクチャ左にある「?」に列挙体を結線すると・・
ケースストラクチャのケース名が「家」になりました!

・・本当です。「会社」と「アウトレットモール」がありませんね。でも落ち着いてください。
ケース選択の矢印を右クリックすると、「Add Case for Every Value」というのが出てきます。「すべての値にケースを追加する」ということ・・かな?
これで全ケースが表示されるようになります。
これで、さっき作った列挙体のアイテム4つのステートができました。あとはシフトレジスタにステートを記憶させつつループさせます。
②Whileループを作る
先ほど作ったケースストラクチャをWhileループで囲みます。
ここでは停止条件に定数「F」をつないでいます。停止条件がないので、実行すると無限にループを繰り返します。(画面上の停止ボタンで止められますが)
③シフトレジスタを設置する
ケースストラクチャをWhileループで囲んだだけではステートマシンになりません。前のループのときのステートを記憶して呼び出せるようにしないといけませんね。
下の状態で、Whileループ左の青いトンネルを右クリックすると、「Replace with Shift Register」ってのが出てきます。「シフトレジスタに置き換える」ですね。
これを選択すると、シフトレジスタがWhileループの左右に出てきます。
これで所望のステートに切り替えられるようにプログラムを組めば、ステートマシンの完成です!
実際に組んでみる
ではせっかくなので、平日は会社に行って休日はアウトレットに行く日常をステートマシンで組んでみましょう。
・・・サブVIを使わず全て平書きですが、こんな感じでございます。これで実行すると、平日8時に出勤して17時に帰宅、休日はアウトレットモールで散財します。

次回はこれの詳細を説明しつつ、細かいテクニックをご紹介します。
おわりに
ここまで見て頂き、ありがとうございました。
ステートマシン、作れそうですか?
他の言語、Cとかでもcase文使えばできますが、LabVIEWだと全体のイメージがわかりやすくていいですよね。
実機がなくてもシミュレーションで楽しめるので、よほどヒマだったらぜひ上のステートマシンを試してみてください。