Main Content

ステートとしての Simulink サブシステム

Simulink® サブシステムを Stateflow® ステート内で使用することにより、ハイブリッド動的システム、または周期的ダイナミクスと連続時間ダイナミクスの間で切り替わるシステムをモデル化できます。Stateflow チャート内で Simulink ベースのステートを使用して、周期的または連続的な動的システムを、遷移を使用したスイッチ ロジックと組み合わせてモデル化できます。Simulink ベースの各ステート内のチャートから入出力にアクセスできます。Simulink ベースのステートは、Simulink モデルの Stateflow チャートでのみサポートされます。

Simulink ベースのステートを切り替える際に Simulink ブロックを初期化するには、Stateflow のテキスト表記か、Simulink の State Reader ブロックと State Writer ブロックを使用します。

リンクされた Simulink ベースのステートを作成するには、ライブラリを使用してアクション サブシステムを保存します。アクション サブシステムをライブラリ モデルから Stateflow チャートに保存すると、リンクされた Simulink ベースのステートとして表示されます。ライブラリ ブロックを更新すると、そのブロックを含むすべての Stateflow チャートに変更内容が反映されます。

Simulink ベースのステートを使用すると、ハイブリッド システムをモデル化するために Stateflow で複雑なテキスト構文を使用する必要がなくなります。

Simulink ベースのステートを使用する場合

次の場合に Simulink ベースのステートを使用します。

  • 連続ダイナミクスまたは周期的ダイナミクスを含むハイブリッド動的システムをモデル化する場合。

  • さまざまな動作モード間で、システム ダイナミクスの構造が大きく変わる場合 (PID コントローラーのモデル化など)。

ロジックを断続的に呼び出すシステムでは、Simulink 関数を使用します。

Simulink アルゴリズムの構造にはほとんど変化がなくても、特定のゲインやパラメーターがさまざまなモデル間で切り替わる場合は、Stateflow 外部の Simulink ロジックを使用します。このようなアルゴリズムの例として、ゲイン スケジュールがあります。Simulink でのゲイン スケジュール制御システムのモデル化 (Simulink Control Design)を参照してください。

Simulink ベースのステートを使用した棒高跳び選手のモデル化

次の Stateflow チャートは、Simulink ベースのステートを使用して、棒高跳びの各段階の動作を順に実行する人物をモデル化します。最初の段階は棒高跳び選手の助走で、これは Simulink ベースのステート Run_up でモデル化されています。2 番目の段階では、選手は地面にポールを突いて踏み切ります。これは、Simulink ベースのステート Take_off でモデル化されています。最後の段階では、選手がバーを跳び越え、ポールを手放します。これは Simulink ベースのステート Fly でモデル化されています。

Stateflow チャートには次のロジックが含まれます。

ステート Run_up および Fly は、直交座標を使用するとより簡単にモデル化できます。ステート Take_off は、極座標を使用するとより簡単にモデル化できます。座標系を別の座標系に切り替えるには、Simulink 関数の InitTakeOff および InitFly を使用します。

棒高跳び選手の助走のモデル化

Simulink ベースのステート Run_up には、次のロジックが含まれます。

チャート PoleVaulter のデフォルト ステートは Run_up です。このステートは、跳躍に向けて地面を助走する棒高跳び選手をモデル化します。棒高跳び選手は、x 軸上の -10 から開始し、0 へ向かって走ります。棒高跳び選手が地面を移動するにつれて、xy 平面上の棒高跳び選手の位置は常に変化しますが、走っている状態は維持されます。このモデルでは、積分器ブロックである PositionVelocity は、Simulink 関数 InitTakeOff 内の State Reader ブロックの状態オーナー ブロックです。このサブシステムは棒高跳び選手の直交座標を出力します。

直交座標から極座標への変換

Simulink 関数 InitTakeOff には次のロジックが含まれます。

x 軸上の棒高跳び選手の位置 Run_up.p(1)-4 より大きくなると、Run_up から Take_off への遷移が発生します。この遷移中に InitTakeOff が初期化され、State Reader ブロックがそのオーナー ブロックに接続されて、この関数が実行されます。この関数により、PositionVelocity の直交座標が rthetardot、および theta_dot という極座標に変換されます。これらの座標は、ステート Take_off のオーナー ブロックに接続された State Writer ブロックとして出力されます。

棒高跳び選手の踏み切りのモデル化

Simulink ベースのステート Take_off には、次のロジックが含まれます。

x 軸上の棒高跳び選手の位置 Run_up.p(1)-4 より大きくなると、アクティブ ステートが Take_off になります。この Simulink サブシステムは、跳躍の踏み切りの段階における棒高跳び選手をモデル化します。このサブシステムは棒高跳び選手の直交座標を出力します。

極座標から直交座標への変換

Simulink 関数 InitFly には次のロジックが含まれます。

棒高跳び選手の角度 thetapi/2 未満になると、Take_off から Fly への遷移が発生します。この遷移中に InitFly が初期化され、State Reader ブロックがそのオーナー ブロックに接続されて、この関数が実行されます。この関数により、rtheta、および theta_dot の極座標が xy_integ および xydot という直交座標に変換されます。これらの座標は、ステート Fly のオーナー ブロックに接続された State Writer ブロックとして出力されます。

棒高跳び選手の自由落下のモデル化

Simulink ベースのステート Fly には、次のロジックが含まれます。

棒高跳び選手の角度 thetapi/2 未満になると、アクティブ ステートが Fly になります。このステートでは、棒高跳び選手が跳躍してバーを飛び越えて、地面に落下するところをモデル化します。棒高跳び選手が落下するにつれて、xy 平面上の選手の位置は常に変化しますが、落下している状態は維持されます。このモデルにおいて、積分器ブロック xydot および xy_integ は、Simulink 関数 InitFly 内の State Writer ブロックの状態オーナー ブロックです。このサブシステムは棒高跳び選手の直交座標を出力します。

このシミュレーションの結果を XY グラフで示します。

制限

Simulink ベースのステートは、以下と併用できません。

  • Moore チャート

  • 離散イベント チャート

  • HDL Coder

  • PLC Coder

  • Simulink Code Inspector

  • スーパー ステップ遷移

Simulink ベースのステートではデバッグはサポートされていません。

関連するトピック