このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
Simulink® は、ローカル ソルバーをもつコンポーネント間のコシミュレーションをサポートするか、外部シミュレーション ツールを含めます。たとえば、コシミュレーションには、Simulink とサードパーティ製のツールまたはカスタム コードの間にコシミュレーション ゲートウェイとして実装される S-Function を含めることができます。コシミュレーション コンポーネントは Simulink にインポートされるコシミュレーション モードの Functional Mockup Unit (FMU) であることがあります。
Simulink シミュレーションでは、ソルバー ステップ サイズは、各周期的な離散型ブロックのサンプル時間の整数の約数でなければなりません。つまり、コシミュレーション コンポーネントがその独自のサンプル時間を定義する場合、Simulink はそれらのタイム ステップでコンポーネントと通信しなければなりません。コシミュレーションには、タイム ステップが内部的に決定され、Simulink に既知ではないコンポーネントを含めることができます。Simulink で利用可能な情報は、FMU ブロックの通信ステップ サイズ パラメーターまたは S-Function 実装のサンプル時間の定義を介するブロック サンプル時間のみです。ブロックのサンプル時間は、Simulink がコシミュレーション コンポーネントと通信しなければならないタイム ステップを決定します。ソルバー ステップ サイズが自動ではない場合、通信ステップ サイズはソルバー ステップ サイズの整数倍でなければなりません。
コシミュレーション コンポーネントがローカル ソルバーを内部的に使用する場合、ブロックの通信ステップ サイズを決定する際に、このローカル ソルバーも考慮される必要があります。ローカル ソルバーのステップ サイズは Simulink に公開されず、通信ステップ サイズを正しく設定するには実装の知識が必要です。非互換性の可能性がある場合のコシミュレーションの動作も、この内部ソルバーの実装により異なります。
通常、コシミュレーション信号は、コシミュレーションにより離散化された連続的な物理量を表します。C MEX S-Function やコシミュレーション FMU ブロックなどのコシミュレーション コンポーネント間のデータ交換では、信号遅延による数値誤差が発生することがあります。数値補償を使用して、独自のソルバーを使用するコンポーネントを伴うシミュレーションの数値的動作を改善します。モデル アドバイザーには、コシミュレーション コンポーネントを検出し、数値補償を指示するチェックが含まれます。
Simulink は、コシミュレーション コンポーネント間のコシミュレーション信号について、数値補償を自動的に実行します。Simulink は、宛先ブロックの入力時に数値補償を実行します。信号は、そのソース端子と接続先端子が以下の条件を満たす場合、数値補償の条件を自動的に満たします。
信号のソース端子は以下の要件を満たしていなければなりません。
S-Function
出力端子のデータ型が double であること
出力端子のサンプル時間が周期的かつ離散であること
出力端子の実数/複素数が実数であること
端子に対して ssSetOutputPortIsContinuousQuantity()
が true
に設定されていること
FMU
出力端子のデータ型が double であること
FMU がコシミュレーション モードであること
ブロックのサンプル時間が周期的かつ離散であること
出力端子が modelDescription.xml
で variability='continuous'
を使用して変数にマッピングされていること
信号の接続先端子は以下の要件を満たしていなければなりません。
S-Function
入力端子のデータ型が double であること
入力端子のサンプル時間が周期的かつ離散であること
入力端子の実数/複素数が実数であること
この端子に対して ssSetInputPortIsContinuousQuantity()
が true
に設定されていること
この端子に対して ssSetInputPortDirectFeedThrough()
が false
に設定されていること
FMU
入力端子のデータ型が double であること
FMU がコシミュレーション モードであること
ブロックのサンプル時間が周期的かつ離散であること
入力端子が modelDescription.xml
で variability='continuous'
を使用して変数にマッピングされていること
数値補償の対象とするコシミュレーション信号を特定する例については、slexCoSimTripleMassSpringExample
モデルを参照してください。
Simulink で数値補償が可能な信号が検出されると、対応する入力端子が アイコンでマークされます。
以下のモデルには、数値補償が可能なコシミュレーション信号が含まれます。
モデルを開きます。
slexCoSimTripleMassSpringExample
ブロック線図を更新します。Simulink で数値補償が可能な信号が検出され、対応する端子が アイコンでマークされます。
補償精度に関するパラメーターを調整します。アイコンを右クリックして [コシミュレーション信号補償の構成] を選択し、次の計算パラメーターを調整します。
外挿法 — このメソッドは、それまでのタイム ステップで生成されたシミュレーション信号値に外挿を使用することにより、現在のシミュレーション タイム ステップに対して補償された信号値を計算します。外挿は 3 種類から選択できます。
[線形]
は既定の設定です。前の 2 つのタイム ステップで生成された信号値を使用して、シミュレーションの現在のタイム ステップで使用する信号値を線形的に推定します。
[2 次]
は、前の 3 つのタイム ステップの信号値を使用して、データを 2 次多項式に当てはめます。
[3 次]
は、前の 4 つのタイム ステップの信号値を使用して、データを 3 次多項式に当てはめます。
シミュレーションを開始したばかりで前の信号値の数が十分にないときは、次数の低い外挿法が自動的に使用されます。外挿法の次数が高ければ高いほど、過去の信号値をより多く使用して現在の信号値を予測するため、予測精度を向上できます。ただし、次数の高い外挿法では、数値的に安定した結果が得られないことがあります[1]。最適な外挿法は、信号の特性によって異なります。
信号補正係数 — このメソッドは、過去のシミュレーション結果と過去に推定された信号値に基づいて、外挿された信号値をさらに調整します。補正係数は 0
~ 1
の間で選択できます。ここで、0
は外挿された信号値に調整を行わないことを意味します。補正係数の既定の設定は 1
です。任意のタイム ステップにおける任意の外挿された信号について、信号補正係数を大きくすればするほど、外挿された信号が調整される度合いが高まります。
数値補償の効果が低い場合、 アイコンを左クリックしてこれを無効にします。無効のとき、アイコンは赤い斜線付きで表示されます。
自動補償ができない場合は、CoSimSignalCompensationMode
プロパティを使用して数値補償を手動で有効にできます。
CoSimSignalCompensationMode
プロパティには以下の値があります。
アイコン | 設定 | 動作 |
---|---|---|
|
| 自動数値補償を有効にします。端子に数値補償の対象となる信号があるかどうか Simulink が検出できるようになります。 |
|
| 自動数値補償を無効にします。アイコンは赤い斜線付きで表示されます。 |
|
| 信号が数値補償の対象でなかったとしても、端子を強制的に数値補償対応とみなします。この設定にすると補償を連続として宣言せずに追加できます。 |
|
| 端子への数値補償対応の強制を無効にします。 |
たとえば、前のモデルからの 1 番目の入力端子について数値補償を無効にするには、以下のようにします。
数値補償の対象として選択する端子が含まれるブロックを選択します。たとえば、現在選択されているブロック gcb
のすべての端子ハンドルを取得します。
p = get_param(gcb, 'PortHandles')
この関数は、現在選択されているブロックのすべての端子を返します。以下に例を示します。
p = struct with fields: Inport: [22.0001 20.0001] Outport: [23.0001 25.0001] Enable: [] Trigger: [] State: [] LConn: [] RConn: [] Ifaction: [] Reset: []
1 番目の端子について数値補償を無効にするには、以下のようにします。
set_param(p.Inport(1), 'CoSimSignalCompensationMode', 'Auto_Off')
関連する端子が赤い斜線付きで表示されます。
信号補償のパラメーターをコマンド ラインから設定することもできます。最初の手順で、再度端子ハンドルを取得します。
p = get_param(block, 'PortHandles')
CoSimSignalCompensationConfig
パラメーターを次の形式で使用して、補償パラメーターを設定します。
set_param(p.Inport,'CoSimSignalCompensationConfig','{<CompensationParam>:<ParamValue>}' )
補償パラメーターの名前と可能な値を次の表に示します。
補償パラメーター | パラメーター名 | パラメーター値 |
---|---|---|
ExtrapolationMethod | 外挿法 | 'LinearExtrapolation' 、'QuadraticExtrapolation' 、または 'CubicExtrapolation' |
CompensationCoefficient | 補正係数 | 0 と 1 の間のスカラー |
たとえば、次の端子の外挿方法を設定します。
set_param( p.Inport, 'CoSimSignalCompensationConfig', '{"ExtrapolationMethod":"LinearExtrapolation"}' ))
外挿方法と補償係数の両方を設定します。
set_param(p.Inport,'CoSimSignalCompensationConfig', '{"ExtrapolationMethod":"QuadraticExtrapolation", "CompensationCoefficient":"0.7"}' ))
[1] Runge, Carl. "Uber empirische Funktionen und die Interpolation zwischen aquidistanten Ordinaten", Zeitschrift für Mathematik und Physik. Vol. 46, 1901, pp. 224–243.
FMU | S-Function | ssGetInputPortIsContinuousQuantity
| ssGetOutputPortIsContinuousQuantity
| ssSetInputPortIsContinuousQuantity
| ssSetOutputPortIsContinuousQuantity