Main Content

モデルの分割

モデル分割によってシミュレーションの計算コストを複数のプロセッサ間に分割することで、モデルをリアルタイム対応にすることができます。計算コストは、シミュレーション時に中央演算装置 (CPU) が実行する、タイム ステップあたりのタスクの数と複雑度を測定したものです。単一の CPU でリアルタイムのシミュレーションを実行する場合、計算コストが高いとシミュレーションの実行速度が低下し、オーバーランの原因となることがあります。

通常は、リアルタイム モデルの準備のワークフローで説明されているメソッドを使用してモデルの忠実度とソルバー設定を調整することで、単一プロセッサでのリアルタイム シミュレーションに十分な程度に計算コストを抑えることができます。ただし、ターゲット マシンの単一の CPU 上でモデルをリアルタイム対応にできるような、モデルの複雑度とソルバー設定の組み合わせは存在しない可能性があります。単一の CPU を使用したリアルタイム シミュレーションが最後まで実行されない場合、あるいはシミュレーションの結果が許容できない場合には、モデルを分割してください。分割したモデルは、単一のマルチコア ターゲット マシンまたは複数のシングルコア ターゲット マシンを使用して実行できます。

この例では、個々のリアルタイム CPU 上で並列処理することを目的として、2 つの離散サブシステム (プラントを含むものとコントローラーを含むもの) にモデルを分割する方法を説明します。

  1. モデルを開きます。MATLAB® コマンド プロンプトで、次のように入力します。

    model = 'ssc_hydraulic_actuator_digital_control';
    open_system(model)

    モデルには、信号の経路指定ブロックと監視ブロックのほかに以下のブロックが含まれています。

    • Command Signal — 入力の基準信号 r を生成するマスク サブシステム。

    • Sum — Command Signal ブロックからの基準信号 r を Hydraulic Actuator からの出力信号 y と比較して誤差 x を生成する、すなわち、r - y = x を求めるブロック。

    • Controller — 連続 Transfer Fcn ブロック。このブロックの [分子係数] パラメーターと [分母係数] パラメーターは、変数 num と変数 den で指定されます。

    • Transport Delay — 連続入力信号の時間遅延をシミュレートするブロック。

      メモ

      Simulink® エディターでは、モデルのブロック線図内の自動生成ブロック名は既定で非表示になっています。非表示になっているブロック名を学習用に表示するには、[自動ブロック名の非表示] チェック ボックスをオフにします。詳細については、Configure Model Element Names and Labelsを参照してください。

    • Linearization I/O — 操作点近辺でモデルを線形化するサブシステム。

    • Hydraulic Actuator — Simscape™ プラント モデルを含むサブシステム。

  2. ワークスペース内の各変数を順にクリックして確認します。

    • サンプル時間の変数 ts = 0.001

    • [分子係数] パラメーター num = -0.5

    • [分母係数] パラメーター den = [0.001 1]

    • 変数 ClosedLoop = 1

  3. モデルをシミュレートし、Load Position スコープを開いて結果を調べます。

    sim(model)
    open_system([model, '/Load Position'])

    油圧アクチュエータからの出力は、コマンド信号と一致しています。

  4. 計算コストを増大させる一方でリアルタイム シミュレーションの結果には影響しない項目を排除します。モデル例では、閉ループ ゲインが 1 であるため、こうした項目には Linearization I/O points ブロック、In1 ブロック、In2 ブロックが含まれます。これら 3 つのブロックとそれらを相互接続するラインを削除します。

  5. モデルを可視化のために構成します。

    1. Mux ブロックを削除します。

    2. Cmd という名前が付けられた、Goto ブロックおよび From ブロックを削除します。

    3. Load Position Scope ブロックを Hydraulic Actuator からの出力信号に接続します。

    4. 2 番目の Scope ブロックを追加します。

    5. 新しい Scope ブロックを、Command Signal からの未接続の接続ラインに接続します。

    6. 新しい Scope ブロックの名前を Reference に変更します。

  6. Transport Delay ブロックを Unit Delay ブロックに置き換えます。

    1. Transport Delay ブロックと、このブロックの出力端子に接続された、開放端をもつ接続ラインを削除します。

    2. Simulink Discrete ライブラリから Unit Delay ブロックを追加し、Hydraulic Actuator Subsystem の入力端子に接続します。

    3. Unit Delay ブロックの [サンプル時間 (継承は -1)] パラメーターに ts を指定します。

  7. Controller ブロックを Simulink Discrete ライブラリの Discrete Transfer Fcn ブロックに置き換えます。

    1. Controller ブロックを削除します。

    2. モデル ウィンドウをクリックし、「discrete transfer fcn」と入力します。ブロックを含むドロップダウン メニューが表示されたら、[Discrete Transfer Fcn] をクリックします。

    3. 新しいブロックを、Sum ブロックからの、開放端をもつ接続ラインに接続します。

    4. 新しいブロックの出力端子を Unit Delay ブロックの入力端子に接続します。

    5. 元の連続伝達関数の双一次変換を使用して、離散コントローラーのパラメーターを指定します。

      1. MATLAB コマンド ラインで、元の係数に基づいて新しい変数を保存します。

        k = num;
        alpha = den(1,1);

      2. Discrete Transfer Fcn ブロックの [分子係数] パラメーターに [k*ts k*ts] を指定します。

      3. [分母係数] パラメーターに [2*alpha+ts ts-2*alpha] を指定します。

      4. [サンプル時間 (継承は -1)] パラメーターに ts を指定します。

  8. Zero-Order Hold ブロックを使用して、連続時間測定のためのデジタル サンプリングを提供します。

    1. Sum ブロックへの入力である信号の両方に Zero-Order Hold ブロックを追加します。

    2. 両方の Zero-Order Hold ブロックの [サンプル時間 (継承は -1)] パラメーターに ts を指定します。

  9. 次の図のようにブロックを接続します。

  10. モデルをシミュレートし、Load Position スコープを開いて、変更が結果にどう影響しているかを確認します。

    sim(model)
    open_system([model, '/Load Position'])

    油圧アクチュエータからの出力は、元の結果と一致しています。

  11. ソルバーを構成します。

    1. グローバル ソルバーを構成するには、モデル コンフィギュレーション パラメーターを開き、[ソルバー] ペインで以下を行います。

      • ソルバーの [タイプ][固定ステップ] に設定します。

      • [ソルバー][離散 (連続状態なし)] に設定します。

      • [固定ステップ サイズ (基本サンプル時間)] パラメーターに ts を指定します。

      • [OK] をクリックします。

    2. ローカル ソルバーを構成するには、Hydraulic Actuator サブシステムを開き、Solver Configuration ブロックの次のパラメーターを更新します。

      • [ローカル ソルバーを使用] のオプションを選択します。

      • [Sample time]ts を指定します。

      • [固定コストでの実行時整合性の反復を使用] のオプションを選択します。

      • [OK] をクリックします。

  12. モデルを 2 つのサブシステムに分割します。

    1. 次のブロックを含むサブシステムを作成します。

      • Command Signal

      • Reference

      • Zero-Order Hold

      • Sum

      • Discrete Transfer Fcn

      • Unit Delay

    2. このサブシステムに Controller Subsystem というラベルを付けます。

    3. Controller Subsystem を開きます。

    4. Out1 Outport ブロックの名前を u に変更します。

    5. In1 Inport ブロックの名前を y に変更します。

    6. 最上位モデルに移動します。

    7. 次のブロックを含む 2 番目のサブシステムを作成します。

      • Hydraulic Actuator

      • Zero-Order Hold1

      • Load Position

    8. このサブシステムに Plant Subsystem というラベルを付けます。

    9. Plant Subsystem を開きます。

    10. Out1 Outport ブロックの名前を u_plant に変更します。

    11. In1 Inport ブロックの名前を y_plant に変更します。

    12. 分割されたモデルを確認するため、最上位モデルに移動します。

    このモデルは同時実行用に分割されています。タスクを追加する方法および個々のタスクをパーティションにマッピングする方法については、明示的な分割を使用したモデルの分割を参照してください。

参考

| |

関連する例

詳細

外部の Web サイト