Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Stateflow チャートを使用したヒューマンマシン インターフェイスのロジックの設計

この例では、スタンドアロンの Stateflow® チャートでグラフィカル ユーザー インターフェイスのロジックをモデル化する方法を説明します。スタンドアロンのチャートは、MATLAB® をアクション言語として Classic チャートのセマンティクスを実装します。Simulink® でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用してチャートをプログラミングできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。

スタンドアロンの Stateflow チャートは、その入力イベントを呼び出して、時相演算子を使用することによって実行できます。イベントドリブンおよびタイマードリブンの実行ワークフローは、ヒューマンマシン インターフェイス (HMI) およびグラフィカル ユーザー インターフェイス (UI) の基となるロジックの設計に適しています。

  • MATLAB App Designer を使用する場合は、インターフェイス ウィジェットからのコールバック関数がチャート内のイベントを呼び出します。

  • Stateflow チャートでは、時相演算子とローカル データがユーザー インターフェイスのプロパティを制御します。

MATLAB を使用してグラフィカル ユーザー インターフェイスを作成する方法の詳細については、App Designer を使用したアプリ開発を参照してください。

App Designer ユーザー インターフェイスの制御

このユーザー インターフェイスには、ランプを制御するオンとオフのスイッチが含まれています。スイッチが [On] の位置にある場合は、[Mode] オプション ボタンの位置によって、点灯 (Solid) または点滅 (Blinking) のいずれかのモードでランプが光ります。点滅の速さは、[Blink Rate] スライダーを動かして制御します。

ファイル sf_lamp_logic.sfx は、ユーザー インターフェイスのロジックを実装するスタンドアロンの Stateflow チャートを定義します。チャートには、入力イベント (ONOFFBLINKING および SOLID) とローカル データ (delay および app) が含まれています。チャート内のアクションは、各ステートからどのウィジェットにアクセス可能かを制御します。たとえば、Off ステートのアクションでは、ユーザー インターフェイスのランプ ウィジェット、[Mode] オプション ボタン、[Blink Rate] スライダーがグレー表示になります。

On ステートでは、サブステート SolidBlinking が 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

ユーザー インターフェイスを実行すると、チャート キャンバス上およびランプ ウィジェット上での制御ウィジェットの調整の効果を観察できます。

参考

関連するトピック