ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

MATLAB 式を使用したイベント ドリブン システムのモデル化

アクション言語として MATLAB を使用する Stateflow チャートを使用する場合

アクション言語として MATLAB® を使用する Stateflow® チャートでは、次のことが実行できます。

  • 遷移条件やステート アクションなど、チャート内で MATLAB 構文を使用する。

  • モデル エクスプローラーで明示的に宣言する代わりに、シンボル ウィザードを利用して、使用方法に基づいてチャート内のデータのサイズ、型、実数/複素数を推測する。

  • 個別のグラフィカル関数を使用して制御フロー ロジックを定義する代わりに、ステート アクションに if-else 表現などの制御フロー ロジックを追加する。

チャートのプログラミングに対する一般的なアプローチ

チャートをプログラミングするには、一般的に次の 2 つのアプローチがあります。

  • システムの動作モードを特定

  • イベントなどの、システムが応答するシステム インターフェイスを特定

このチュートリアルでは最初のアプローチを使用します。つまり、まずシステムの動作モードを特定して、チャートをプログラムします。

設計要件

この例では、アクション言語として MATLAB を使用して Stateflow チャートを作成する方法を示します。モデルは、原料を組立ラインの別の部分に供給する、組立ライン上の機械を表現しています。この供給装置は次のように動作します。

  • システムが初期化された時点で、3 つのセンサーの値が正常であることを確認します。

    正の値は、センサーが適切に動作していることを示します。値がゼロの場合は、センサーは機能していません。

  • すべてのセンサーの値が正常の場合は "System initialization" から "On" に遷移します。

  • 5 秒経っても供給装置が初期化モードから遷移しない場合は、強制的に "Failure" ステートに遷移させます。

  • システムの電源が入ると、供給された部品の数のカウントを始めます。

  • 各タイム ステップにおいて、いずれかのセンサーの値が 2 以上になった場合は、部品は次の作業場に移動したことを示します。

  • アラーム信号が発生した場合は、システムは強制的に "Failure state" に遷移します。

    アラーム信号が発生するのは、オペレーターが供給装置の安全扉の 1 つを開いた場合または組立ラインの下流で上流の供給装置を停止するような問題が発生した場合です。

  • アラーム解除信号が発生すると、通常の動作が再開され、供給した部品の数がゼロにリセットされます。

  • 供給装置の LED の色はシステムの動作モードに合わせて変わります。"System initialization" はオレンジ色、"On" は緑色、"Failure state" は赤色です。

システム属性の特定

供給装置の動作の記述に基づいて、重要なシステム属性を特定できます。

属性特性
動作モード
  • System initialization: 機械の電源を入れる前にシステム チェックを実行

  • On: 通常の動作

  • System failure: アラームによってフラグが設定された、回復可能な機械の故障

遷移
  • "System initialization" から "On"

  • "System initialization" から "Failure state"

  • "On" から "Failure state"

  • "Failure state" から "System initialization"

並列モード並列で実行可能な動作モードはありません。一度に 1 つのモードのみアクティブにできます。
既定のモードSystem initialization
入力
  • 部品が下流の組立作業場に移動したかどうかを検出する、3 つのセンサーからの値

  • 次の 2 つの値のうちいずれかを取ることができるアラーム信号。オンが 1、オフが 0

出力
  • 下流の組立作業場に供給済みであることが検出された部品の数

  • 供給装置の LED の色

モデルを自分で作成するか、提供されているモデルを使用するかを選択

この演習では、センサーと供給装置へのアラーム入力信号を含む Simulink® モデルに Stateflow チャートを追加します。

モデルを自分で実装する場合は、以下の演習を実行してください。それ以外の場合は、MATLAB コマンド プロンプトで次のコマンドを入力して、付属のモデルを開きます。

addpath(fullfile(docroot,'toolbox','stateflow','examples'))
ex_feeder

供給装置モデルへの Stateflow チャートの追加

  1. MATLAB コマンド プロンプトで以下を実行して、部分的に作成されたモデルを開きます。

    addpath(fullfile(docroot,'toolbox','stateflow','examples'))
    ex_feeder_exercise
  2. モデルを作業フォルダーに保存します。

  3. SensorSignals ブロックをダブルクリックし、Pulse Generator ブロックで表現されている 3 つのセンサーを表示します。

    sensors の信号は、組立部品が次の作業場に移動できるタイミングを示します。

  4. AlarmSignal ブロックをダブルクリックし、アラーム信号を表現している Step ブロックを表示します。

    ALARM 信号がアクティブの場合、機械はオフになります。

  5. モデルを実行して、Scope ブロックのセンサー出力とアラーム信号を確認します。

    上の軸はセンサー信号を示しています。2 つのセンサーの信号は同じであるため、2 つのセンサー信号のみが表示されています。下の軸はシミュレーション時間の 45 秒から 80 秒まで供給装置をオフにするアラーム信号を示しています。

  6. MATLAB コマンド プロンプトで sflib を実行して、Stateflow ライブラリを開きます。

  7. Chart(MATLAB) を選択して、モデルにドラッグします。

      ヒント:   アクション言語として MATLAB を使用する空の Stateflow チャートで新しいモデルを作成するには、 sfnew('-MATLAB') コマンドを使用します。

  8. SensorSignals サブシステムからスコープへの接続と、AlarmSignal サブシステムからスコープへの接続を削除します。

  9. Stateflow チャートの下にあるラベル Chart (MATLAB) の名前を Feeder に変更します。モデルはこの時点で以下のようになります。

動作モードを表すステートの追加

前述のシステム属性に基づく、次の 3 つの動作モードがあります。

  • System initialization

  • On

  • Failure state

これらの動作モードの動作をモデル化するステートを追加するには、次の手順に従います。

  1. Feeder チャートをダブルクリックして、ステートの追加します。

      メモ:   チャートの左下にある MATLAB アイコンは、Stateflow チャートで MATLAB 構文を使用していることを示しています。アクション言語として C 言語を使用する Stateflow チャートでは、このアイコンは表示されません。

  2. ステート ツールのアイコンをクリックして、チャートにステートを追加します。

  3. ステートの左上隅をクリックし、「InitializeSystem」という名前を入力します。

  4. 手順 2 ~ 3 を繰り返して、OnFailState という名前の 2 つのステートを追加します。

ステート アクションの実装

ステート アクションのタイプの決定

ステートでは、アクティブになったときから非アクティブになるまで、実行サイクルのさまざまな段階でアクションが実行されます。3 つの基本ステート アクションは以下のとおりです。

アクションのタイプいつ実行されるかステートがアクティブなときの実行頻度
Entry対象ステートに移行した (対象ステートがアクティブになった) とき 1 回
Duringステートがアクティブで、別のステートへの有効な遷移が利用できない間タイム ステップごと
Exit別のステートへの遷移が実行される前1 回

たとえば、entry アクションでデータを初期化し、during アクションでデータを更新して、exit アクションで次の遷移用にデータを構成できます 他のタイプのステート アクションの詳細は、「ステートと遷移の構文」を参照してください。

  1. ステート名の InitializeSystem の後で Return キーを押し、ステートの entry アクションを定義する以下のテキストを追加します。

    entry:
    Light = ORANGE;

    オレンジ色の LED は、InitializeSystem ステートに入ることを示します。

     entry アクションの構文

  2. ステート名 FailState の後に以下のコードを追加して、entry アクションを定義します。

    entry:
    Light = RED;

    赤色の LED は、FailState に入ることを示します。

  3. ステート名 On の後に以下のコードを追加して、entry アクションを定義します。

    entry:
    Light = GREEN;
    partsFed = 0;

    緑色の LED は、On ステートに入ることを示します。On ステートに入るたびに、供給された部品の数は 0 に初期化されます。

  4. On ステートの entry アクションの後に以下のコードを追加して、強いセンサー信号がないかどうかをチェックし、次の作業場に供給した部品の数をインクリメントします。

    during:
    if(any(sensors >= 2))
    	partsFed = partsFed + 1;
    end

    On ステートはセンサー信号をチェックして、部品を次の作業場に移動する準備ができたかどうかを決定します。センサー信号が強い場合 (オンであるセンサーの数が 2 以上の場合)、チャートではこの部品が次の作業場に移動したものとしてカウントされます。

     during アクションの構文

    チャートはこの時点で以下の図のようになります。

遷移条件の指定

遷移条件は、ある動作モードから別の動作モードに移行するタイミングを指定します。条件が真の場合、チャートは次のステートに遷移します。真でない場合は、現在のステートが引き続きアクティブとなります。詳細は、「遷移」を参照してください。

供給装置の動作の記述に基づいて、ステート間の遷移のルールを指定します。

  1. デフォルト遷移を InitializeSystem ステートに接続して、チャートのエントリ ポイントを示します。

    「デフォルト遷移」では、シミュレーションの開始場所が指定されます。

  2. InitializeSystem ステートから On ステートへの遷移を描きます。

    1. InitializeSystem ステートの下端にマウスを移動して、ポインターの形状が十字に変わったことを確認します。

    2. マウスをクリックして、On ステートの上端にドラッグします。InitializeSystem ステートから On ステートへの遷移が表示されます。

    3. 遷移をダブルクリックして、次の条件を追加します。

      [all(sensors>0)]

    この遷移条件は、すべてのセンサーの値が 0 より大きいかどうかを確認します。

  3. 上記の手順を繰り返して、以下に示す残りの遷移条件を作成します。

    遷移条件
    On から FailState[Alarm == 1]
    FailState から InitializeSystem[Alarm == 0]

  4. InitializeSystem から FailState にもう 1 つの遷移を描きます。この遷移では、次のように入力して遷移イベントを作成します。

    after(5,sec)

    5 秒経過してもセンサーの電源が入らない場合は、この構文によって InitializeSystem から FailState への遷移が指定されます。

    チャートはこの時点で以下の図のようになります。

    メモ:   InitializeSystem からの出力遷移では、1 と 2 という小さなラベルによって遷移セグメントの評価順序が示されています。図の番号がモデルと一致しない場合は、遷移を右クリックし、Execution Order をクリックして番号を変更します。詳細は、「出力遷移の評価順序」を参照してください。

システムのデータの定義

チャート データ プロパティの確認

モデルのシミュレーションを開始します。未解決シンボルに関するエラーと、シンボル ウィザードが表示されます。

シンボル ウィザードでは、データがチャートに自動的に追加されることはありません。未解決データが識別され、Stateflow アクションでの MATLAB 式の推論規則を使用して、このデータのスコープが推測されます。チャートでは、データのスコープは次のように推測されます。

  • チャートで読み取られるけれども、書き込みはされないデータは "入力" データと推測されます。ただし、データ名がすべて大文字の場合は、データは "パラメーター" であると推測されます。

  • チャートで書き込まれ、読み取りはされないデータは "出力" データと推測されます。

  • チャートで読み書きされるデータは "ローカル" データと推測されます。

シンボル ウィザードでは、チャートの入力データのスコープが推測されます。ただし、partsFed 出力のデータ スコープを固定しなければなりません。以下の手順に従います。

  1. partsFed データに対し、[データ スコープ] 列でリストから [出力] を選択します。

    シンボル ウィザードはこの時点で以下の図のようになります。

  2. シンボル ウィザードが提示したデータを追加するには、[OK] をクリックします。

  3. パラメーターの初期値を追加します。MATLAB コマンド プロンプトで、次のように入力します。

    RED = 0;
  4. 同様に、MATLAB コマンド プロンプトで残りのパラメーターに以下の初期値を追加します。

    パラメーター
    RED0
    ORANGE1
    GREEN2

  5. モデルに戻り、入力と出力をそれぞれ対応する端子に接続します。

システム表現の検証

  1. シミュレーションを開始します。

Scope ブロックをダブルクリックして、モデルが予想どおりの供給装置の動作を表現していることを検証します。

上の軸は、オレンジ色 (1)、緑色 (2)、赤色 (0) の間で変化して現在の動作モード を示す LED 信号を示しています。下の軸は、次の組立作業場に供給された部品の数を示しています。この数はアラーム信号によって供給装置が停止されるまでインクリメントし、供給装置が停止するとリセットされます。

コード生成エラーの解決

この演習では、チャートでコード生成エラーを発生させ、問題のトラブルシューティングを行います。

  1. Feeder モデルを開きます。これまでの演習で作成したものでも、付属のモデルでも構いません。

    付属のモデルを開くには、MATLAB プロンプトで次のように入力します。

    addpath(fullfile(docroot,'toolbox','stateflow','examples'))
    ex_feeder
  2. 作業ディレクトリにモデルを FeederDebug として保存します。

  3. InitializeSystem ステートのエントリの後に pause(3); を追加します。

  4. モデルを実行します。以下のエラーが発生します。

    Function 'pause' is not supported for code generation. Consider adding coder.extrinsic('pause') at the top of the function to bypass code generation.

    このエラーは、コード生成で pause がサポートされていないため、モデルからコードを生成できないことを示しています。

  5. InitializeSystem ステートで pause(3) を呼び出す前に coder.extrinsic('pause') を追加します。

    関数 coder.extrinsic は、指定した関数をコード生成から除外します。これにより、希望する機能をシミュレーションで使用できますが、この機能は生成コードには含まれません。

    サポートされている関数の一覧については、「C/C++ コード生成でサポートされている関数 — アルファベット順」を参照してください。

  6. モデルを再度シミュレートします。エラーは発生しません。

別のアプローチ:イベントベースのチャート

チャートをプログラミングする別のアプローチとして、システムの反応を引き起こすイベントなどの、システム インターフェイスの部分の特定から始める方法があります。

前述の例では、イベントを表すために入力データを使用した場合、チャートが定期的に起動して、遷移の条件が有効かどうかの確認が行われます。この場合、ALARM == 1 になると次のタイム ステップで "Failure" ステートへの遷移が行われます。一方、入力イベントに反応する Stateflow チャートを作成すると、イベントがトリガーされた時点でアラーム信号に対応できます。

イベントベースのチャート使用についての詳細は、「Stateflow チャートでのイベントの動作」を参照してください。

イベントドリブン システムのシステム属性の特定

イベントベースのアプローチで最初に考慮すべきシステム属性は、イベント、入力および出力です。

次の表では、遷移条件に基づくシステムとは異なる、イベントドリブン型の Feeder モデルの特性を考察しています。

属性特性
イベント2 つの非同期イベント: アラーム信号とアラーム解除信号
入力部品が下流の組立作業場に移動したかどうかを検出する、3 つのセンサーからの値

入力イベントで起動する Feeder チャート

この例では、Feeder モデルはトリガーされたチャートを使用して入力イベントに反応します。このモデルを開くには、MATLAB プロンプトで次のように入力します。

addpath(fullfile(docroot,'toolbox','stateflow','examples'))
ex_feeder_triggered

この時点でチャートには、左側に 1 つの入力端子、上部にイベントによってトリガーされた入力があります。イベントによってアクティブにされる Stateflow チャートを作成する方法についての詳細は、「入力イベントを使用した Stateflow チャートのアクティブ化」を参照してください。

ALARM 信号でチャートがトリガーされると、チャートはそのタイム ステップでトリガーに反応します。アラームがトリガーされた際に現在のステートが On の場合、現在のステートは FailState に遷移します。

イベントでトリガーされたチャートのスコープ出力を次の図に示します。

上の軸は、赤色 (0)、オレンジ色 (1)、緑色 (2) の間で変化して現在の動作モード を示す LED 信号を示しています。下の軸は、次の組立作業場に供給された部品の数を示しています。この数はアラーム信号によって供給装置が停止されるまでインクリメントし、供給装置が停止するとリセットされます。ただし、クロックとソルバーが異なるため、イベントベースのシミュレーションの方が次の組立作業場に供給する部品の数が多くなります。

この情報は役に立ちましたか?