モデルの階層構造からの可変ステップ入力を表すデータの読み込み
モデルの階層構造には、異なるダイナミクスで動作する離散コンポーネントと連続コンポーネントを含めることができます。そのようなシステムを設計するときは、通常、可変ステップ ソルバーを使用してハイブリッド システムで離散ダイナミクスと連続ダイナミクスの両方を取得して、モデルの階層構造をシミュレートします。
各コンポーネントを開発する際、そのコンポーネントを最上位モデルとして実装する参照モデルをシミュレートすることで、単一のコンポーネントの設計に焦点を合わせることができます。親モデルからの入力データの代わりに、[入力] モデル コンフィギュレーション パラメーターを使用して指定する外部入力データをモデル インターフェイスの入力端子で読み込みます。
この例では、そのようなシミュレーションで [出力時間] モデル コンフィギュレーション パラメーターを使用することで、可変ステップ シミュレーションからログ記録された連続入力信号のダイナミクスを確実に取得できるようにする方法を示します。
最上位モデルを開く
この例のモデルには、連続プラント、および値が 1.5
以上に達する振動の回数をプラント ステップ応答でカウントする離散アルゴリズムが含まれています。最上位モデルで可変ステップ ソルバーを使用してプラントの連続ダイナミクスを取得します。
Transfer Fcn ブロックを使用して実装される連続プラントのステップ入力は Step ブロックから提供されます。連続プラントの出力信号は Outport ブロック、および離散カウント アルゴリズムを実装する参照モデルに接続されます。離散アルゴリズムからの振動カウント出力は、最上位モデルの 2 番目の Outport ブロックに接続されます。
モデル ContinuousPlant
を開きます。
mdl = "ContinuousPlant";
open_system(mdl)
最上位モデルのシミュレーション
モデル CountOscillations
を単独でテストして改良するとします。参照モデルを最上位モデルとしてシミュレートする場合、最上位モデルのシミュレーションからログ記録されたデータを入力データとして使用できます。
最上位モデルをシミュレートします。Simulink® ツールストリップの [シミュレーション] タブで [実行] をクリックします。または、関数 sim
を使用します。
out = sim(mdl);
Step Response
と Oscillation Count
の 2 つの出力のログ データを取得します。
yout = out.yout; stepResp = getElement(yout,"Step Response"); oscCount = getElement(yout,"Oscillation Count");
プラントのステップ応答をプロットします。プロットから、ステップ応答が不足減衰となることがわかります。値が 1.5
を上回る振動がアルゴリズムで 7
回カウントされています。
figure(1) subplot(2,1,1) plot(stepResp.Values) subplot(2,1,2) plot(oscCount.Values)
最上位モデルとしての参照モデルのシミュレーション
モデル CountOscillations
を最上位モデルとして開きます。
mdl2 = "CountOscillations";
open_system(mdl2)
変数 stepResp
のデータをシミュレーションの入力として読み込むようにモデルを構成します。
Simulink ツールストリップの [モデル化] タブで [モデル設定] をクリックします。
[データのインポート/エクスポート] ペインを選択します。
[入力] を選択します。
[入力] フィールドに「
stepResp
」と入力します。[OK] をクリックします。
あるいは、参照モデルの Simulink.SimulationInput
オブジェクトを作成します。次に、関数 setExternalInput
を使用して、シミュレーションの外部入力を変数 stepResp
として指定します。
simIn = Simulink.SimulationInput(mdl2);
simIn = setExternalInput(simIn,"stepResp");
モデルで入力データがどのように読み込まれるかを確認するには、入力信号をログ記録するようにマークします。信号 Step Response
を選択します。その後、[シミュレーション] タブで、[信号のログ] をクリックします。
あるいは、関数 Simulink.sdi.markSignalsForStreaming
を使用してログ記録対象の信号をマークできます。
blkPth = strcat(mdl2,"/Signal"); Simulink.sdi.markSignalForStreaming(blkPth,1,"on")
モデルをシミュレートします。
out2 = sim(simIn);
ログ記録された入力信号と振動回数のデータを取得します。
logsout = out2.logsout; stepRespInput = getElement(logsout,"Step Response"); yout2 = out2.yout; oscCount2 = getElement(yout2,"Oscillation Count");
入力信号と振動回数をプロットします。応答の減衰不足が解消され、シミュレーションでステップ応答のデータを読み込んだ方法に起因してアルゴリズムでカウントされる振動はゼロになります。
figure(2) subplot(2,1,1) plot(stepRespInput.Values) subplot(2,1,2) plot(oscCount2.Values)
参照モデルを最上位モデルとしてシミュレートする場合、Inport ブロックで入力データをモデルに読み込んだ後にしか、ソルバーでステップ応答のダイナミクスが認識されません。この信号には可変ステップ シミュレーションにおいて連続サンプル時間があったため、サンプルが等間隔になっていません。ステップ応答を正確に反映するようにデータを読み込むには、ステップ応答のデータからさらに多くの入力値を Inport ブロックで読み込む必要があります。
シミュレーションの出力時間の追加指定
[出力時間] モデル コンフィギュレーション パラメーターを使用すると、可変ステップ ソルバーに対して、ソルバーで決定される時点に加えて指定した値の時点でもタイム ステップを取るように強制できます。最初のシミュレーションからのログ データの時間値を使用して [出力時間] パラメーターの値を指定できます。
この例では、シミュレーション全体でステップ応答の振動が続くため、[出力時間] パラメーターの値を入力データの時間ベクトル全体として指定します。
時間値のベクトルを取得します。
outTimes = stepResp.Values.Time;
[出力時間] パラメーターの値を変数 outTimes
として指定します。
Simulink ツールストリップの [モデル化] タブで [モデル設定] をクリックします。
[データのインポート/エクスポート] タブを選択します。
[追加パラメーター] を展開します。
[出力オプション] を
[Produce additional output]
に設定します。[出力時間] フィールドに「
outTimes
」と入力します。[OK] をクリックします。
あるいは、SimulationInput
オブジェクトを使用してシミュレーションのパラメーターの値を構成できます。
simIn = setModelParameter(simIn,... "OutputOption","AdditionalOutputTimes",... "OutputTimes","outTimes");
モデルを再度シミュレートします。
out3 = sim(simIn);
ログ記録された入力信号と振動回数のデータを取得します。
logsout2 = out3.logsout; stepRespInput2 = getElement(logsout2,"Step Response"); yout3 = out3.yout; oscCount3 = getElement(yout3,"Oscillation Count");
ログ記録された入力信号と振動回数をプロットします。ここでは、モデルの階層構造全体の最初のシミュレーションと同じようなプロットになります。
figure(3) subplot(2,1,1) plot(stepRespInput2.Values) subplot(2,1,2) plot(oscCount3.Values)
[出力時間] パラメーターの値は、システムの要件に応じて、入力信号全体の時間ベクトルを使用して指定することも、入力信号の時間データの 1 つ以上の関連部分を使用して指定することもできます。
参考
ブロック
モデル設定
関数
Simulink.sdi.markSignalForStreaming
|timeseries
|tsdata.event
|gettsbeforeevent
|gettsafterevent