Simulink® モデルの Stateflow® チャートをプログラミングするには、一般的に次の 2 つのアプローチがあります。
システムの動作モードを特定
イベントなどの、システムが応答するシステム インターフェイスを特定
このチュートリアルでは最初のアプローチを使用します。つまり、まずシステムの動作モードを特定して、チャートをプログラムします。
この例では、アクション言語として MATLAB® を使用して Stateflow チャートを作成する方法を示します。モデルは、原料を組み立てラインの別の部分に供給する、組み立てライン上の機械を表現しています。この供給装置は次のように動作します。
システムが初期化された時点で、3 つのセンサーの値が正常であることを確認します。
正の値は、センサーが適切に動作していることを示します。値がゼロの場合は、センサーは機能していません。
すべてのセンサーの値が正常の場合は "System initialization" から "On" に遷移します。
5 秒経っても供給装置が初期化モードから遷移しない場合は、強制的に "Failure" ステートに遷移させます。
システムの電源が入ると、供給された部品の数のカウントを始めます。
各タイム ステップにおいて、いずれかのセンサーの値が 2 以上になった場合は、部品は次の作業場に移動したことを示します。
アラーム信号が発生した場合は、システムは強制的に "Failure state" に遷移します。
アラーム信号が発生するのは、オペレーターが供給装置の安全扉の 1 つを開いた場合または組み立てラインの下流で上流の供給装置を停止するような問題が発生した場合です。
アラーム解除信号が発生すると、通常の動作が再開され、供給した部品の数がゼロにリセットされます。
供給装置の LED の色はシステムの動作モードに合わせて変わります。"System initialization" はオレンジ色、"On" は緑色、"Failure state" は赤色です。
供給装置の動作の記述に基づいて、重要なシステム属性を特定できます。
属性 | 特性 |
---|---|
動作モード |
|
遷移 |
|
並列モード | 並列で実行可能な動作モードはありません。一度に 1 つのモードのみアクティブにできます。 |
既定のモード | System initialization |
入力 |
|
出力 |
|
この演習では、センサーと供給装置へのアラーム入力信号を含む Simulink モデルに Stateflow チャートを追加します。
モデルを自分で実装する場合は、以下の演習を実行してください。それ以外の場合は、完成したモデルを開くことができます。
部分的に作成されたモデルを開きます。
SensorSignals
ブロックをダブルクリックし、Pulse Generator ブロックで表現されている 3 つのセンサーを表示します。
sensors
の信号は、組立部品が次の作業場に移動できるタイミングを示します。
AlarmSignal
ブロックをダブルクリックし、アラーム信号を表現している Step ブロックを表示します。
ALARM
信号がアクティブの場合、機械はオフになります。
モデルを実行して、Scope ブロックのセンサー出力とアラーム信号を確認します。
上の軸はセンサー信号を示しています。2 つのセンサーの信号は同じであるため、2 つのセンサー信号のみが表示されています。下の軸はシミュレーション時間の 45 秒から 80 秒まで供給装置をオフにするアラーム信号を示しています。
MATLAB コマンド プロンプトで sflib
を実行して、Stateflow ライブラリを開きます。
Chart
を選択して、モデルにドラッグします。
ヒント
アクション言語として MATLAB を使用する空の Stateflow チャートで新しいモデルを作成するには、関数 sfnew
を使用します。
SensorSignals サブシステムからスコープへの接続と、AlarmSignal サブシステムからスコープへの接続を削除します。
Stateflow チャートの下にあるラベル Chart
の名前を Feeder
に変更します。モデルはこの時点で以下のようになります。
前述のシステム属性に基づく、次の 3 つの動作モードがあります。
System initialization
On
Failure state
これらの動作モードの動作をモデル化するステートを追加するには、次の手順に従います。
Feeder チャートをダブルクリックして、ステートの追加を開始します。
メモ
チャートの左下にある MATLAB アイコンは、Stateflow チャートで MATLAB 構文を使用していることを示しています。
ステート ツールのアイコンをクリックして、チャートにステートを追加します。
ステートの左上隅をクリックし、「InitializeSystem
」という名前を入力します。
手順 2 ~ 3 を繰り返して、On
と FailState
という名前の 2 つのステートを追加します。
ステートでは、アクティブになったときから非アクティブになるまで、実行サイクルのさまざまな段階でアクションが実行されます。3 つの基本ステート アクションは以下のとおりです。
アクションのタイプ | いつ実行されるか | ステートがアクティブなときの実行頻度 |
---|---|---|
Entry | 対象ステートに移行した (対象ステートがアクティブになった) とき | 1 回 |
During | ステートがアクティブで、別のステートへの有効な遷移が利用できない間 | タイム ステップごと |
Exit | 別のステートへの遷移が実行される前 | 1 回 |
たとえば、entry
アクションでデータを初期化し、during
アクションでデータを更新して、exit
アクションで次の遷移用にデータを構成できます。他のタイプのステート アクションの詳細は、ステートと遷移の構文を参照してください。
ステート名の InitializeSystem
の後で Return キーを押し、ステートの entry アクションを定義する以下のテキストを追加します。
entry: Light = ORANGE;
InitializeSystem
ステートに入ることを示します。ステート名 FailState
の後に以下のコードを追加して、entry アクションを定義します。
entry: Light = RED;
赤色の LED は、FailState
に入ることを示します。
ステート名 On
の後に以下のコードを追加して、entry アクションを定義します。
entry: Light = GREEN; partsFed = 0;
On
ステートに入ることを示します。On
ステートに入るたびに、供給された部品の数は 0 に初期化されます。On
ステートの entry アクションの後に以下のコードを追加して、強いセンサー信号がないかどうかをチェックし、次の作業場に供給した部品の数をインクリメントします。
during: if(any(sensors >= 2)) partsFed = partsFed + 1; end
On
ステートはセンサー信号をチェックして、部品を次の作業場に移動する準備ができたかどうかを決定します。センサー信号が強い場合 (オンであるセンサーの数が 2 以上の場合)、チャートではこの部品が次の作業場に移動したものとしてカウントされます。
チャートはこの時点で以下の図のようになります。
遷移条件は、ある動作モードから別の動作モードに移行するタイミングを指定します。条件が真の場合、チャートは次のステートに遷移します。真でない場合は、現在のステートが引き続きアクティブとなります。詳細については、遷移を参照してください。
供給装置の動作の記述に基づいて、ステート間の遷移のルールを指定します。
デフォルト遷移を InitializeSystem
ステートに接続して、チャートのエントリ ポイントを示します。
デフォルト遷移では、シミュレーションの開始場所が指定されます。
InitializeSystem
ステートから On
ステートへの遷移を描きます。
InitializeSystem
ステートの下端にマウスを移動して、ポインターの形状が十字に変わったことを確認します。
マウスをクリックして、On
ステートの上端にドラッグします。InitializeSystem
ステートから On
ステートへの遷移が表示されます。
遷移をダブルクリックして、次の条件を追加します。
[all(sensors>0)]
この遷移条件は、すべてのセンサーの値が 0 より大きいかどうかを確認します。
上記の手順を繰り返して、以下に示す残りの遷移条件を作成します。
遷移 | 条件 |
---|---|
On から FailState | [Alarm == 1] |
FailState から InitializeSystem | [Alarm == 0] |
InitializeSystem
から FailState
にもう 1 つの遷移を描きます。この遷移では、次のように入力して遷移イベントを作成します。
after(5,sec)
InitializeSystem
から FailState
への遷移が指定されます。メモ
この遷移の構文は、遷移条件ではなくイベントです。詳細については、時相論理を使用したチャート実行の制御を参照してください。
チャートはこの時点で以下の図のようになります。
メモ
InitializeSystem
からの出力遷移では、1 と 2 という小さなラベルによって遷移セグメントの評価順序が示されています。図の番号がモデルと一致しない場合は、遷移を右クリックし、Execution Order
をクリックして番号を変更します。詳細は、遷移の評価順序を参照してください。
モデルのシミュレーションを開始します。未解決シンボルに関するエラーと、シンボル ウィザードが表示されます。
シンボル ウィザードでは、データがチャートに自動的に追加されることはありません。未解決データが特定され、Stateflow アクションでの MATLAB 式の推論規則を使用して、このデータのクラスおよびスコープが推測されます。チャートでは、データのスコープは次のように推測されます。
チャートで読み取られるけれども、書き込みはされないデータは "入力" データと推測されます。ただし、データ名がすべて大文字の場合は、データは "パラメーター" であると推測されます。
チャートで書き込まれ、読み取りはされないデータは "出力" データと推測されます。
チャートで読み書きされるデータは "ローカル" データと推測されます。
シンボル ウィザードでは、チャートの入力データのスコープが推測されます。ただし、partsFed
出力のデータ スコープを固定しなければなりません。以下の手順に従います。
partsFed データに対し、[スコープ] 列でリストから [出力] を選択します。
シンボル ウィザードはこの時点で以下の図のようになります。
シンボル ウィザードが提示したデータを追加するには、[OK] をクリックします。
パラメーターの初期値を追加します。MATLAB コマンド プロンプトで、次のように入力します。
RED = 0;
同様に、MATLAB コマンド プロンプトで残りのパラメーターに以下の初期値を追加します。
パラメーター | 値 |
---|---|
RED | 0 |
ORANGE | 1 |
GREEN | 2 |
モデルに戻り、入力と出力をそれぞれ対応する端子に接続します。
シミュレーションを開始します。
Scope ブロックをダブルクリックして、モデルが予想どおりの供給装置の動作を表現していることを検証します。
上の軸は、オレンジ色 (1)、緑色 (2)、赤色 (0) の間で変化して現在の動作モード を示す LED 信号を示しています。下の軸は、次の組み立て作業場に供給された部品の数を示しています。この数はアラーム信号によって供給装置が停止されるまでインクリメントし、供給装置が停止するとリセットされます。
チャートをプログラミングする別のアプローチとして、システムの反応を引き起こすイベントなどの、システム インターフェイスの部分の特定から始める方法があります。
前述の例では、イベントを表すために入力データを使用した場合、チャートが定期的に起動して、遷移の条件が有効かどうかの確認が行われます。この場合、ALARM == 1 になると次のタイム ステップで "Failure" ステートへの遷移が行われます。一方、入力イベントに反応する Stateflow チャートを作成すると、イベントがトリガーされた時点でアラーム信号に対応できます。
イベントベースのチャート使用についての詳細は、イベントのブロードキャストによるモデル コンポーネントの同期を参照してください。
イベントベースのアプローチで最初に考慮すべきシステム属性は、イベント、入力および出力です。
次の表では、遷移条件に基づくシステムとは異なる、イベントドリブンの Feeder モデルの特性を考察しています。
属性 | 特性 |
---|---|
イベント | 2 つの非同期イベント: アラーム信号とアラーム解除信号 |
入力 | 部品が下流の組み立て作業場に移動したかどうかを検出する、3 つのセンサーからの値 |
この例では、Feeder モデルはトリガーされたチャートを使用して入力イベントに反応します。
この時点でチャートには、左側に 1 つの入力端子、上部にイベントによってトリガーされた入力があります。イベントによってアクティブにされる Stateflow チャートを作成する方法についての詳細は、入力イベントの送信による Stateflow チャートのアクティブ化を参照してください。
ALARM
信号でチャートがトリガーされると、チャートはそのタイム ステップでトリガーに反応します。アラームがトリガーされた際に現在のステートが On
の場合、現在のステートは FailState
に遷移します。
イベントでトリガーされたチャートのスコープ出力を次の図に示します。
上の軸は、赤色 (0)、オレンジ色 (1)、緑色 (2) の間で変化して現在の動作モード を示す LED 信号を示しています。下の軸は、次の組み立て作業場に供給された部品の数を示しています。この数はアラーム信号によって供給装置が停止されるまでインクリメントし、供給装置が停止するとリセットされます。ただし、クロックとソルバーが異なるため、イベントベースのシミュレーションの方が次の組み立て作業場に供給する部品の数が多くなります。