再現が困難なチャート構成のテスト
この例では、操作点を使用して、シミュレーション時の再現が困難なアクティブ ステートとデータ値の組み合わせに対し、チャートがどのように応答するかをテストする方法を説明します。"操作点" とは、シミュレーション中の Simulink® モデルの状態のスナップショットです。モデルに Stateflow® チャートが含まれている場合、操作点にはアクティブ ステート、出力データとローカル データ、および永続変数についての情報が含まれます。詳細については、Stateflow チャートの操作点の保存と復元を参照してください。
モデル old_sf_car
は、自動車の 4 速オートマチック トランスミッション システムを示します。
このモデルでは、Stateflow チャート shift_logic
は、4 つのギア間のシフトのロジックを実装します。このパラレル ステートのサブステート gear_shift
は、トランスミッション システムのギアを表します。これらのサブステートの entry アクションにより、チャート出力 gear
の値が設定されます。結果として、ノーマル シミュレーション中に、どのサブステートがアクティブであるかが gear
の値に反映されます。
既定では、モデルのシミュレーション時間は 30 秒です。
チャート出力 gear
の値が急激に変化した場合に何が起こるのかを確認するため、モデルをシミュレートし、t = 10 における操作点を保存し、チャート出力の変化を反映するようにその操作点を変更してから、t = 10 ~ t = 30 の範囲で再びシミュレートします。
初期セグメントの操作点の定義
モデル
old_sf_car
を開きます。openExample("stateflow/AutomaticTransmissionLegacyExample")
最終の操作点を保存するようにモデルを設定します。[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[データのインポート/エクスポート] ペインで次を行います。
[最終状態] を選択し、操作点の名前を入力します。この例では、
xSteadyState
を使用します。[最終の操作点を保存] を選択します。
[OK] をクリックします。
このシミュレーション セグメントの終了時間を設定します。[シミュレーション] タブで、[終了時間] を
10
に設定します。シミュレーションを実行します。
このモデルをシミュレートするときに、t = 10 における最終操作点を MATLAB® ベース ワークスペース内の変数
xSteadyState
に保存します。t = 10 の時点では、エンジンは定常値 2500 RPM で動作しています。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[最終の操作点を保存] パラメーターと [最終状態] パラメーターをクリアします。こうしておけば、前の手順で保存した操作点が上書きされることはありません。
操作点の変更によるデータ値の変更
shift_logic
チャートの操作点情報を含むStateflow.op.BlockOperatingPoint
オブジェクトにアクセスします。blockpath = "old_sf_car/shift_logic"; op = get(xSteadyState,blockpath)
op = Block: "shift_logic" (handle) (active) Path: old_sf_car/shift_logic Contains: + gear_state "State (AND)" (active) + selection_state "State (AND)" (active) gear "Block output data" double [1, 1]
操作点には、ステートとデータのリストが階層順に含まれています。
チャートの t = 10 でアクティブになっているステートを強調表示します。
highlightActiveStates(op)
アクティブなステートが強調表示されます。トランスミッション システムは、定常状態で 4 速に入っています。
チャート出力
gear
の操作点情報を含むStateflow.op.OperatingPointData
オブジェクトにアクセスします。op.gear
ans = Description: 'Block output data' DataType: 'double' Size: '[1, 1]' Range: [1x1 struct] InitialValue: [1x0 double] Value: 4
gear
の値を1
に変更します。op.gear.Value = 1;
変更した操作点を保存します。
xModified = set(xSteadyState,blockpath,op);
データ値の変更後のモデル動作のテスト
モデルの初期状態として操作点を読み込みます。[コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[初期状態] を選択し、チャートの変更された操作点を含む変数
xModified
を入力します。その後、[OK] をクリックします。テストするシミュレーション セグメントの終了時間を定義します。[シミュレーション] タブで、[終了時間] を
30
に設定します。シミュレーションを実行します。
チャートのアニメーションを見ると、チャート出力
gear
に対して車両速度が高速であるため、システムはシフト アップによって補正しようと試行し続けますが、システムのギアは既に 4 速に入っているため、補正できないことが分かります。結果として、エンジン RPM は 6000 RPM に上昇します。
参考
モデル設定
オブジェクト
Stateflow.op.BlockOperatingPoint
|Stateflow.op.OperatingPointContainer
|Stateflow.op.OperatingPointData
関数
highlightActiveStates
|get
(Simulink) |set
(Simulink)