プログラムによるシミュレーションの実行
モデルは次の 2 つの方法で、プログラムによってシミュレートできます。
sim
コマンド経由[実行] ボタン経由
sim
コマンドでシミュレーションを実行する場合、コマンド ラインを使用してシミュレーションで操作を実行します。[実行] ボタンを使用してシミュレーションを実行する場合、Simulink® UI を使用してシミュレーションを操作し、その他の追加操作を実行できることを意味します。次の表は、2 つの方法の違いを詳しく説明しています。
操作 | 非対話型シミュレーション (sim コマンドによるシミュレーション) | 対話型シミュレーション ([実行] ボタンによるシミュレーション) |
許可される相互作用レベル | 低 | 高 |
シミュレーションの開始 | sim コマンド | [実行]/set_param(mdl,'SimulationCommand','Start') |
シミュレーションの停止 | コマンド ラインでの Ctrl - C |
|
シミュレーションの一時停止 | なし | あり。set_param(mdl,'SimulationCommand','Pause') /[一時停止] |
シミュレーション実行中に利用可能な MATLAB プロンプト | なし | あり |
シミュレーション実行中のスコープの更新 | ラピッド アクセラレータ モードを除いて、あり | あり |
シミュレーション ステッパー | なし | ラピッド アクセラレータ モードを除いて、あり |
条件付き一時停止 | なし | ラピッド アクセラレータ モードを除いて、あり |
シミュレーション実行中に表示可能な端子の値 | なし | あり |
シミュレーションのペーシングのサポート | あり | あり |
TimeOut オプションのサポート | あり | なし |
エラーの処理 | CaptureErrors がオンの場合を除いて、MATLAB 例外 | 診断ビューアーにレポートされる |
sim
コマンドによるシミュレーション
関数 sim
で指定された手法を使用してパラメーター値を指定し、プログラムによりモデルをシミュレートできます。モデルのシミュレーションに加えて、sim
コマンドを使用して、シミュレーション タイムアウトの有効化、シミュレーション エラーの取得、およびシミュレーション完了時のシミュレーション メタデータへのアクセスを実行できます。
パラメーターの名前と値のペアの指定
この例では、モデルのパラメーターを名前と値のペアとして指定し、モデルをプログラムによってシミュレートする方法を示します。
連続する名前と値のペアとして指定したパラメーター値を使用して vdp
モデルをシミュレートします。
simOut = sim('vdp','SimulationMode','normal',... 'SaveState','on','StateSaveName','xout',... 'SaveOutput','on','OutputSaveName','yout',... 'SaveFormat', 'Dataset'); outputs = simOut.yout
outputs = Simulink.SimulationData.Dataset Package: Simulink.SimulationData Characteristics: Name: 'yout' Total Elements: 2 Elements: 1 : 'x1' 2 : 'x2' -Use get or getElement to access elements by index or name. -Use addElement or setElement to add or modify elements.
ソルバー エラーの絶対許容誤差を指定して、モデルを Normal
モードでシミュレートします。関数 sim
は、単一の Simulink.SimulationOutput
オブジェクトである SimOut
を返します。これには、シミュレーションのすべての出力 (ログが作成された時間、状態および信号) が含まれています。
出力信号値を時間に対してプロットします。
x1 = (outputs.get('x1').Values); x2 = (outputs.get('x2').Values); plot(x1); hold on; plot(x2); title('VDP States') xlabel('Time'); legend('x1','x2')
シミュレーション タイムアウトの有効化
複数のシミュレーションを 1 つのループで実行し、可変ステップ ソルバーを使用している場合は、timeout
パラメーターで sim
を使用することを検討してください。何らかの理由で、シミュレーションが停止したり、予期しない小さいタイム ステップの実行を開始した場合、シミュレーションはタイム アウトします。その後、次のシミュレーションを実行できます。
N = 100; simOut = repmat(Simulink.SimulationOutput, N, 1); for i = 1:N simOut(i) = sim('vdp', 'timeout', 1000); end
シミュレーション エラーの取得
エラーによってシミュレーションが停止した場合は、シミュレーション メタデータでエラーを確認できます。この例では、sim
はエラーが発生するまでのシミュレーション出力オブジェクトのシミュレーション データを取得し、エラーを返さずにシミュレーションのデバッグを実行できます。この機能を有効にするには、関数 sim
で CaptureErrors
パラメーターを使用します。
このアプローチのもう 1 つのメリットは、シミュレーション エラーによって sim
が停止しないことです。したがって、for
ループで sim
を使用している場合などでも、ループの以降の反復が実行されます。
simOut = sim('my_model', 'CaptureErrors', 'on'); simOut.getSimulationMetadata.ExecutionInfo
ans = struct with fields: StopEvent: 'DiagnosticError' StopEventSource: [] StopEventDescription: 'Division by zero in 'my_model/Divide'' ErrorDiagnostic: [1×1 struct] WarningDiagnostics: [0×1 struct]
シミュレーション メタデータへのアクセス
この例では、シミュレーションの完了時にシミュレーション メタデータにアクセスする方法を示します。任意の種類のシミュレーションを実行して、そのメタデータにアクセスできます。
この例では、名前と値のペアで指定したパラメーター値を使用してモデルをシミュレーションします。シミュレーションを実行します。
simOut = sim('vdp','SimulationMode','normal','AbsTol','1e-5',... 'SaveState','on','StateSaveName','xoutNew',... 'SaveOutput','on','OutputSaveName','youtNew',... 'SaveFormat', 'StructureWithTime');
ModelInfo
プロパティにアクセスします。このプロパティは、モデルおよびソルバーに関する基本情報をもちます。
simOut.getSimulationMetadata.ModelInfo
ans = struct with fields: ModelName: 'vdp' ModelVersion: '1.6' ModelFilePath: 'C:\MyWork' UserID: 'User' MachineName: 'MyMachine' Platform: 'PCWIN64' ModelStructuralChecksum: [4×1 uint32] SimulationMode: 'normal' StartTime: 0 StopTime: 20 SolverInfo: [1×1 struct] SimulinkVersion: [1×1 struct] LoggingInfo: [1×1 struct]
ソルバー情報を検証します。
simOut.getSimulationMetadata.ModelInfo.SolverInfo
ans = struct with fields: Type: 'Variable-Step' Solver: 'ode45' MaxStepSize: 0.4000
シュミレーションが起動および終了したタイミング、シミュレーションの初期化、実行、終了にかかった時間など、シミュレーションに関するタイミング情報を確認します。
simOut.getSimulationMetadata.TimingInfo
ans = struct with fields: WallClockTimestampStart: '2016-06-17 10:26:58.433686' WallClockTimestampStop: '2016-06-17 10:26:58.620687' InitializationElapsedWallTime: 0.1830 ExecutionElapsedWallTime: 1.0000e-03 TerminationElapsedWallTime: 0.0030 TotalElapsedWallTime: 0.1870
シミュレーションにメモを追加します。
simOut=simOut.setUserString('Results from simulation 1 of 10');
simOut.getSimulationMetadata
ans = SimulationMetadata with properties: ModelInfo: [1×1 struct] TimingInfo: [1×1 struct] ExecutionInfo: [1×1 struct] UserString: 'Results from simulation 1 of 10' UserData: []
UserData
プロパティを使用して独自のカスタム データを追加することもできます。
[実行] ボタンによるシミュレーション
対話型のシミュレーションでは、set_param
および get_param
を使用できます。set_param
および get_param
を使用して、実行中のシミュレーションのステータスを確認し、ブロック コールバックを使用してシミュレーションの動作を制御できます。
シミュレーションのステータスの制御と確認
この例では、set_param
を使用してシミュレーションのステータスを制御する方法を示します。set_param
を使用すると、変数を動的に更新し、データ ログ変数をワークスペースに書き込むことができます。
シミュレーションを開始します。
set_param('vdp','SimulationCommand','start')
set_param
引数および 'start'
引数を使用してシミュレーションを開始した場合は、'stop'
引数を使用してシミュレーションを停止しなければなりません。'stop'
引数を使用しないと、シミュレーションは終了後にのみ停止します。
シミュレーションを一時停止、続行および停止します。
set_param('vdp','SimulationCommand','pause') set_param('vdp','SimulationCommand','continue') set_param('vdp','SimulationCommand','stop')
set_param
を使用してシミュレーションの一時停止または停止を行う場合、シミュレーションはコマンドを即時に実行しません。stop
コマンドの後でシミュレーションを開始するため、および pause コマンドの後でシミュレーションを続行するために、set_param
を使用できます。Simulink はまず、set_param
コマンドより前にあるソルバー ステップやその他のコマンドなどの割り込みできない作業を完了します。それから set_param
コマンドによって指定されたシミュレーションの開始、一時停止、続行または停止が行われます。
シミュレーションのステータスをチェックします。
get_param('vdp','SimulationStatus')
ソフトウェアから 'stopped'
、'initializing'
、'running'
、'paused'
、'compiled'
、'updating'
、'terminating'
または 'external'
(Simulink Coder™ 製品で使用) が返されます。
シミュレーションの実行中に変更されたワークスペース変数を動的に更新するには、update
コマンドを使用します。
set_param('vdp','SimulationCommand','update')
すべてのデータ ログ変数をベース ワークスペースに書き込みます。
set_param('vdp','SimulationCommand','WriteDataLogs')
コールバックを使用したシミュレーション タスクの自動化
シミュレーションの開始、一時停止、停止など、モデルでさまざまなアクションを実行すると、コールバックが実行されます。コールバックを使って MATLAB® スクリプトやその他の MATLAB コマンドを実行できます。詳細については、コールバックを使用したモデル動作のカスタマイズおよびブロックのコールバックを参照してください。
この例では、モデルの StartFcn
コールバックを使用して、シミュレーションの開始前に MATLAB コードを自動で実行する方法を示します。
モデルのシミュレーション時にモデル内の Scope ブロックを検出してフォアグラウンドで開く MATLAB スクリプトを作成します。スクリプトを現在のフォルダーに保存します。
% openscopes.m % Brings scopes to forefront at beginning of simulation. blocks = find_system(bdroot,'BlockType','Scope'); % Finds all of the scope blocks in the top level of your % model. To find scopes in subsystems, provide the subsystem % names. Type help find_system for more on this command. for i = 1:length(blocks) set_param(blocks{i},'Open','on') end % Loops through all of the scope blocks and brings them % to the forefront.
モデルが openscopes
スクリプトを呼び出すように StartFcn
パラメーターを設定します。
set_param('my_model','StartFcn','openscopes')
参考
Simulink.SimulationOutput
| Simulink.SimulationMetadata
| getSimulationMetadata
| setUserString
| setUserData