この例では、スタンドアロンの Stateflow® チャートでグラフィカル ユーザー インターフェイスのロジックをモデル化する方法を説明します。スタンドアロンのチャートは、MATLAB® をアクション言語として Classic チャートのセマンティクスを実装します。Simulink® でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用してチャートをプログラミングできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
スタンドアロンの Stateflow チャートは、その入力イベントを呼び出して、時相演算子を使用することによって実行できます。イベントドリブンおよびタイマードリブンの実行ワークフローは、ヒューマンマシン インターフェイス (HMI) およびグラフィカル ユーザー インターフェイス (UI) の基となるロジックの設計に適しています。
MATLAB App Designer を使用する場合は、インターフェイス ウィジェットからのコールバック関数がチャート内のイベントを呼び出します。
Stateflow チャートでは、時相演算子とローカル データがユーザー インターフェイスのプロパティを制御します。
MATLAB を使用してグラフィカル ユーザー インターフェイスを作成する方法の詳細については、App Designer を使用したアプリ開発を参照してください。
このユーザー インターフェイスには、ランプを制御するオンとオフのスイッチが含まれています。スイッチが [On] の位置にある場合は、[Mode] オプション ボタンの位置によって、点灯 (Solid) または点滅 (Blinking) のいずれかのモードでランプが光ります。点滅の速さは、[Blink Rate] スライダーを動かして制御します。
ファイル sf_lamp_logic.sfx
は、ユーザー インターフェイスのロジックを実装するスタンドアロンの Stateflow チャートを定義します。チャートには、入力イベント (ON
、OFF
、BLINKING
および SOLID
) とローカル データ (delay
および app
) が含まれています。チャート内のアクションは、各ステートからどのウィジェットにアクセス可能かを制御します。たとえば、Off
ステートのアクションでは、ユーザー インターフェイスのランプ ウィジェット、[Mode] オプション ボタン、[Blink Rate] スライダーがグレー表示になります。
On
ステートでは、サブステート Solid
と Blinking
が 2 つの動作モードを示します。点滅するランプを実装するために、チャートは時相論理演算子 after
に依存します。チャートがステート Blinking.Off
に入ると、出力遷移上の式 after(delay,sec)
は、数秒後にチャートを実行する MATLAB タイマー オブジェクトを作成します。その後チャートはステート Blinking.On
に遷移し、Blinking.Off
に戻る遷移をトリガーする別のタイマー オブジェクトを作成します。チャートが 2 つのステートの間で遷移を続ける間、ローカル データ遅延の値を変更して点滅の速さを調整したり、入力イベント SOLID
または OFF
を呼び出して点滅モードから出る遷移を実行したりできます。
On
ステートのヒストリ ジャンクションは、直近でアクティブだったサブステートに関する情報を保持して、ランプをオンにしたときにユーザー インターフェイスが前の動作モードに戻るようにします。
MATLAB コマンド ウィンドウで入力イベント関数を呼び出すことにより、スタンドアロンのチャートを実行できます。Stateflow エディターには、チャート アニメーションを使用してアクティブ ステートと遷移を強調表示することにより、これらの各コマンドの効果が表示されます。
1. Stateflow エディターでスタンドアロンのチャートを開きます。
edit sf_lamp_logic.sfx
2.チャート オブジェクト L
を作成して delay
の値を 0.5 に初期化します。この値は 1 秒あたり 1 回の点滅速度に対応します。
L = sf_lamp_logic('delay',0.5);
3. ランプをオンにします。
ON(L)
4. 点滅モードに切り替えます。
BLINKING(L)
5. delay
の値を 0.25 に設定します。この値は 1 秒あたり 2 回の点滅速度に対応します。
L.delay = 0.25;
6. 点灯モードに切り替えます。
SOLID(L)
7. ランプをオフにします。
OFF(L)
8. チャート オブジェクト L
を MATLAB ワークスペースから削除します。
delete(L)
ユーザー インターフェイスとスタンドアロンの Stateflow チャートの間に双方向接続を確立するには、App Designer ウィンドウを開いて [コード ビュー] を選択します。
1. App Designer ウィンドウで、Stateflow チャート オブジェクトへのハンドルを保存するためのプライベート プロパティ lampLogic
を作成します。
properties (Access = private)
lampLogic
end
2.チャート オブジェクトを作成してそのローカル データ app
をユーザー インターフェイス ハンドルに設定するコールバック関数 StartupFcn
を作成します。チャート オブジェクト ハンドルを lampLogic
プライベート プロパティに割り当てます。
% Code that executes after component creation function StartupFcn(app) app.lampLogic = sf_lamp_logic('delay',0.5,'app',app); end
3. ユーザー インターフェイスを閉じたときにチャート オブジェクトを削除するコールバック関数 CloseRequestFcn
を作成します。
% Close request function: UIFigure function UIFigureCloseRequest(app, event) delete(app.lampLogic); delete(app); end
4. ユーザー インターフェイスのウィジェットごとに、スタンドアロンのチャートで適切なイベントを呼び出すコールバック関数を追加します。
Switch ウィジェットのコールバック関数 ValueChangedFcn
:
function SwitchValueChanged(app,event) value = app.Switch.Value; switch lower(value) case 'off' OFF(app.lampLogic); case 'on' ON(app.lampLogic); end end
Mode Button ウィジェットのコールバック関数 SelectionChangedFcn
:
function ModeButtonGroupSelectionChanged(app,event) selectedButton = app.ModeButtonGroup.SelectedObject; if app.SolidButton == selectedButton SOLID(app.lampLogic); else BLINKING(app.lampLogic); end end
Blink Rate Slider ウィジェットのコールバック関数 ValueChangedFcn
:
function BlinkRateSliderValueChanged(app,event) app.lampLogic.delay = round(0.5/app.BlinkRateSlider.Value,2); end
ユーザー インターフェイスを実行すると、チャート キャンバス上およびランプ ウィジェット上での制御ウィジェットの調整の効果を観察できます。