状態遷移図を作成する
1. ここでは下記の様にユーザに電源がオンの状態であるか確認するポップアップを発生させるプログラムを作成します。このポップアップは「はい」を選択するまで、5秒ごとに発生します。
2. プログラムを作成する前に、実行する必要のあるタスク、評価すべき項目、それらの実行順序を検討し、状態遷移図を作成します。上記の処理を状態遷移図で記述すると下記の様になります。「開始」、「電源確認」、「待機」、「終了」の状態は次に進む状態が決まっている事がわかります。ただし、「電源確認」の状態の直後には「電源on?」の条件分岐があります。状態遷移図は複雑な自動処理を行うプログラムを作成する際に、処理内容・条件分岐を可視化し、目的の処理を行うことが出来るか検証する際に必要不可欠です。
LabVIEWでステートマシンのプログラムを作成する
1. LabVIEWを起動し、ファイル>新規VIを選択します。ブロックダイアグラムにおいて、関数パレットからWhileループを選択し、下記の図のように配置します。Whileループの中にケースストラクチャを作成します。ブロックダイアグラムが表示されていない場合、Ctrl + Eで表示する事ができます。関数パレットはブロックダイアグラム上で右クリックする事で表示できます。また、Ctrl + Hで詳細ヘルプを表示する事でLabVIEWの関数についての説明、使用時に必要な入力とそのデータタイプを確認する事ができます。
2. 関数パレットから列挙定数を選択し、ブロックダイアグラムに配置します。列挙定数を右クリックし、「項目を編集」を選択すると、項目の入力・変更・削除を行えます。状態遷移図を確認し、状態遷移図で定義されている「開始」、「電源確認」、「待機」、「終了」の4つの状態を下記の様に作成します。
3. 列挙定数をケースストラクチャに配線し、ケースストラクチャのセレクタラベルを右クリックし、「すべての値にケースを追加」を選択すると、2で設定した4つの状態がセレクタラベルに読み込まれ、「開始」、「電源確認」、「待機」、「終了」の4つのケースが作成されます。
4. 列挙定数をタイプ定義に変更し、*.ctlファイルを保存します。下記の様に、列挙定数を右クリックし、タイプ定義に指定した後、タイプ定義を開き、表示される*.ctlファイルをファイル>保存で名前を付けて保存します。ここでは状態.ctlとして保存しました。列挙定数をタイプ定義にすることにより、ステートマシンに状態の追加・削除・変更を効率よく行うことができます。状態の追加・削除・変更の手順は後述します。
5. 列挙定数のループトンネルをシフトレジスタに変更します。ループトンネルを右クリックし、「シフトレジスタと置換」を選択し、ループトンネルをシフトレジスタに変更します。シフトレジスタはループの初回実行時にはループに入力されている値(ここでは「開始」の列挙定数)を初期値として保持します。ループの左側のシフトレジスタから出力される値は、最後にループの右側のシフトレジスタに入力された値となります。ループの1周目の実行時にはシフトレジスタから初期値が出力され、2周目以降はその前の周にループの右側のシフトレジスタに書き込まれた値が出力されます。
6. 「開始」のケースストラクチャの内容を作成します。まず、「開始」の状態では「プログラムを開始します。」という1ボタンダイアログを表示します。状態遷移図を確認すると「開始」の状態は「電源確認」の状態に遷移する事が分かります。この遷移は列挙定数をコピーし、下記の様に張り付け、列挙定数の中から「電源確認」を選択し、シフトレジスタに入力する事で実現します。シフトレジスタで次の状態を受け渡す事で、このWhileループの初回実行時は「開始」のケースが実行され、「開始」のケースが実行された後、2周目の実行が開始された際に「電源確認」のケースが実行されます。
上記の1ボタンダイアログの入力は文字列定数で行われています。関数への入出力の定数、制御器、表示機の作成は下記の図のように関数の入力もしくは出力の端子にマウスカーソルを合わせた状態で右クリックし、「定数を作成」、「制御器を作成」、「表示器を作成」で行う事ができます。
7. 「電源確認」のケースストラクチャは下記の様に作成します。電源確認のケースでは電源のオン、オフを確認します。この結果によって次に遷移する状態が変わります。2ボタンダイアグラムで「はい」(True)または「いいえ」(False)を選択する事でTrue/Falseが出力され、選択.viによりTrueの場合は「終了」、Falseの場合は「待機」が出力されます。
8. 「待機」の状態を作成します。この状態では下記の様にループカウンタが5以上になった時に停止するWhileループを作成します。このWhileループは待機関数により、1秒に1回転で実行されます。状態遷移図を確認するとこの状態は「電源確認」に遷移するので、シフトレジスタには「電源確認」の列挙定数を入力します。
9. 「終了」のケースストラクチャを作成します。この状態でプログラムが終了するのでWhileループのループ条件にTrueを入力します。
10. この状態でVIの実行ボタンを確認すると矢印が壊れている事が確認できます。この状態で実行すると、修正する必要のあるエラーがリストされます。エラー内容をダブルクリックすると修正する必要のある場所に飛ぶことができます。今回のプログラムでは下記の2点のトンネルに入力値の設定されていないケースが存在する事が問題となっています。
今回のエラーは各トンネルに値を入力するか、下記の手順で配線されていないケースにはデフォルト値を入力するように設定する事で解決できます。列挙定数を受け渡しているトンネルについても同様に対処し、VIの実行ボタンを実行可能な状態にします。
全てのエラーを修正後、プログラムを実行すると、状態遷移図で予定した挙動を確認できます。