Stateflow チャートの操作点の保存と復元
"操作点" とは、シミュレーション中の Simulink® モデルのスナップショットです。モデルに Stateflow® チャートが含まれている場合、操作点には以下についての情報が含まれます。
アクティブ ステート
チャートの出力データ
チャート、ステート、および関数のローカル データ
MATLAB® 関数の永続変数と真理値表
特定のタイム ステップにおけるモデルの状態を操作点として保存した後、その操作点をシミュレーションの初期状態として使用できます。たとえば、シミュレーションが初期化フェーズで開始するとします。モデルが初期化フェーズを完了した後に操作点を保存すると、その操作点をモデルの初期状態として使用でき、時間 t = 0 から開始せずに連続シミュレーションの結果を取得できます。詳細については、操作点を使用したシミュレーションの初期状態の指定を参照してください。
また、操作点を使用して、シミュレーションで到達することが困難な構成を含めた様々な設定に対する Stateflow チャートの応答をテストできます。ローカル、出力、または永続データの値、現在アクティブなステート、およびシミュレーション中にヒストリ ジャンクションにより記録された以前のステート アクティビティを変更することにより、操作点を変更できます。その後、変更した操作点をシミュレーションの開始点として使用して、行った変更に対してチャートがどのように応答するかをテストできます。詳細については、再現が困難なチャート構成のテストと故障検出ロジックと冗長ロジックをもつチャートのテストを参照してください。
変更した操作点の保存
Simulink モデルの最終の操作点を保存するには、コンフィギュレーション パラメーターの [最終状態] (Simulink) と [最終の操作点を保存] (Simulink) を選択し、モデルの操作点の変数を指定して、シミュレーションを実行します。その後、モデルの操作点とチャートのブロック パスを使用して関数 get
(Simulink) を呼び出すことにより、Stateflow チャートの操作点情報にアクセスします。
たとえば、xFinal
はモデル sf_car
の操作点で、これにはチャート shift_logic
が含まれているとします。
このチャートの操作点情報にアクセスするには、次を入力します。
op = get(xFinal,"sf_car/shift_logic")
op = Block: "shift_logic" (handle) (active) Path: sf_car/shift_logic Contains: + gear_state "State (AND)" (active) + selection_state "State (AND)" (active) gear "State output data" gearType [1, 1] down_th "Local scope data" double [1, 1] up_th "Local scope data" double [1, 1]
操作点は、チャート内のステート、ボックス、関数、およびデータを階層順にリストします。名前の競合が存在する場合は、1 つ以上のアンダースコアが名前の最後に表示されています。こうして、すべてのオブジェクトに、一意の識別子が与えられています。
チャート内のオブジェクトの操作点情報にアクセスするには、ドット表記を使用します。たとえば、最上位のステート gear_state
の操作点情報にアクセスするには、次のように入力します。
op.gear_state
ans = State: "gear_state" (handle) (active) Path: sf_car/shift_logic/gear_state Contains: + first "State (OR)" + fourth "State (OR)" + second "State (OR)" + third "State (OR)" (active)
同様に、チャートの出力 gear
の操作点情報にアクセスするには、次のように入力します。
op.gear
ans = Description: 'State output data' DataType: 'gearType' Size: '[1, 1]' Range: [1×1 struct] InitialValue: [] Value: third
この例の詳細については、ローカル イベントを使用して Simulink ブロックとしてチャートをシミュレートを参照してください。
メモ
ステートのないフロー チャートにはステートや永続データが含まれていないため、ステートのないフロー チャートの操作点は空です。
操作点のコピー
Stateflow チャートの操作点のコピーを作成するには、関数 clone
を呼び出します。たとえば、次のように入力して、操作点 op
をコピーするとします。
op1 = op; op2 = clone(op);
この場合、op1
は op
と同じ操作点を参照するため、op1
を変更すると op
も変更されます。一方、op2
は異なる操作点を参照するため、op
を変更せずに、これを変更することができます。
メモ
関数 clone
は、Stateflow チャート全体についての操作点情報をコピーします。ステートまたはデータ オブジェクトについての操作点情報をコピーすることはできません。
操作点の値の変更
様々な設定に対する Stateflow チャートの応答をテストするために、ローカル、出力、または永続データの値、現在アクティブなステート、およびシミュレーション中にヒストリ ジャンクションにより記録された以前のステート アクティビティを変更して、操作点を変更できます。
データ値の変更
ローカル、出力、または永続データの値を変更するには、操作点の Value
プロパティを変更します。たとえば、op
にはチャートの操作点が含まれているとします。output
というチャート出力の値を変更するには、次のように入力します。
op.output.Value = newValue;
データ値を変更する場合は、以下に従います。
データ型やサイズを変更することはできません。
チャートがアクション言語として C を使用する場合でも、かっこおよびコンマで区切られた 1 ベースのインデックスを使用して、ベクトルまたは行列の要素を参照します。
数値データの新しい値は、[最小値] および [最大値] パラメーターで指定した範囲内でなければなりません。詳細については、制限範囲を参照してください。
列挙データ型の場合、型定義から選択できるのは列挙値のみです。
カスタム C コードまたは外部 MATLAB コード内の永続データの値は変更できません。
現在のステート アクティビティの変更
操作点において現在アクティブなステートを変更するには、リーフ ステートを引数として使用して、関数 setActive
を呼び出します。この関数は、以下によってステートの整合性を維持します。
適切なステートの出入り
新たにアクティブになったステートのテンポラル カウンターのリセット
アクティブ ステート データの値の更新
ステートにバインドされている Function-Call Subsystem および Simulink 関数の有効化または無効化
しかし、チャートは、前にアクティブであったステートに対する exit
アクション、または新たにアクティブになったステートに対する entry
アクションは実行しません。さらに、ステートは、ステートを親とするいずれのローカル データも再初期化しません。このようなアクションを発生させる場合は、これらを個別に実行する必要があります。たとえば、ステート アクションによって値がデータに代入される場合は、データ値の変更で説明されているように、その値を明示的に代入する必要があります。
前のステート アクティビティの変更
ヒストリ ジャンクションにより記録されている以前にアクティブであったステートを変更するには、ヒストリ ジャンクションを含むステートを引数に使用して関数 setPrevActiveChild
を呼び出します。この関数の呼び出し時に、このステートがアクティブであってはなりません。
変更した操作点情報の読み込み
Stateflow チャートの変更された操作点情報を Simulink モデルの操作点に読み込むには、関数 set
(Simulink) を呼び出します。たとえば、xFinal
がモデル sf_car
の操作点で、op
にチャート shift_logic
の変更された操作点情報が含まれる場合、以下を入力することにより、変更された操作点 xModified
を保存できます。
xModified = set(xFinal,"sf_car/shift_logic",op);
メモ
関数 set
は、Stateflow チャート全体についての操作点情報を読み込みます。ステートまたはデータ オブジェクトについての操作点情報を読み込むことはできません。
操作点の復元
操作点をシミュレーションの初期状態として使用するには、コンフィギュレーション パラメーター [初期状態] (Simulink) を設定し、モデルの操作点の変数名を指定します。モデルをシミュレートすると、操作点の時間からシミュレーションが開始します。詳細については、モデル操作点を使用したシミュレーション ワークフローの高速化 (Simulink)を参照してください。
操作点に関する制限
連続時間チャート
連続時間チャートの操作点は読み取り専用です。連続時間チャートの操作点を保存して、シミュレーションの初期状態として使用することができます。ただし、操作点のステート アクティビティやデータ値を変更することはできません。連続時間チャートの詳細については、Stateflow の連続時間モデルを参照してください。
エッジ検出を使用するチャート
エッジ検出演算子を使用する Stateflow チャートは、操作点をサポートしません。エッジ検出を使用するチャートがモデルに含まれている場合、最終の操作点を保存しようとすると、コンパイル時エラーが発生します。エッジ検出演算子の詳細については、データと式の値の変化の検出を参照してください。
参考
モデル設定
オブジェクト
Stateflow.op.BlockOperatingPoint
|Stateflow.op.OperatingPointContainer
|Stateflow.op.OperatingPointData
関数
setActive
|setPrevActiveChild
|clone
|get
(Simulink) |set
(Simulink)