Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

プログラムによるシミュレーションの実行

関数 sim でさまざまな手法を使用してパラメーター値を指定し、プログラムによりモデルをシミュレートできます。モデルのシミュレーションに加えて、sim を使用して、シミュレーション タイムアウトの有効化、シミュレーション エラーの取得、およびシミュレーション完了時のシミュレーション メタデータへのアクセスを実行できます。

対話型のシミュレーションでは、set_param および get_param を使用できます。set_param および get_param を使用して、実行中のシミュレーションのステータスを確認し、ブロック コールバックを使用してシミュレーションの動作を制御できます。

パラメーターの名前と値のペアの指定

この例では、パラメーターを名前と値のペアとして指定し、モデルをプログラムによってシュミレートする方法を示します。

連続する名前と値のペアとして指定したパラメーター値を使用して vdp モデルをシミュレートします。

simOut = sim('vdp','SimulationMode','normal','AbsTol','1e-5',...
            'SaveState','on','StateSaveName','xout',...
            'SaveOutput','on','OutputSaveName','yout',...
 'SaveFormat', 'Dataset');
outputs = simOut.get('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 を返します。これには、シミュレーションのすべての出力 (ログが作成された時間、状態および信号) が含まれています。関数 sim は、シミュレーション値をワークスペースに "返しません"

出力信号値を時間に対してプロットします。

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 はエラーが発生するまでのシミュレーション出力オブジェクトのシミュレーション データを取得し、エラーを返さずにシミュレーションのデバッグを実行できます。この機能を有効にするには、関数 simCaptureErrors パラメーターを使用します。

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]

このアプローチのもう 1 つのメリットは、シミュレーション エラーによって sim が停止しないことです。したがって、for ループで sim を使用している場合などでも、ループの以降の反復が実行されます。

シミュレーション メタデータへのアクセス

この例では、シミュレーションの完了時にシミュレーション メタデータにアクセスする方法を示します。任意の種類のシミュレーションを実行して、そのメタデータにアクセスできます。

この例では、名前と値のペアで指定したパラメーター値を使用してモデルをシミュレーションします。シミュレーションを実行します。

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 を使用してシミュレーションのステータスを制御および確認する方法を示します。set_param を使用すると、変数を動的に更新し、データ ログ変数をワークスペースに書き込むことができます。

シミュレーションを開始します。

set_param('vdp','SimulationCommand','start')

set_param 引数および 'start' 引数を使用してシミュレーションを開始した場合は、'stop' 引数を使用してシミュレーションを停止しなければなりません。

シミュレーションを一時停止、続行および停止します。

set_param('vdp','SimulationCommand','pause')
set_param('vdp','SimulationCommand','continue')
set_param('vdp','SimulationCommand','stop')

set_param を使用してシミュレーションの一時停止または停止を行う場合、コマンドはこのようなアクションに対する要求であり、即時に実行されません。停止コマンドの後でシミュレーションを開始するため、および一時停止コマンドの後でシミュレーションを続行するために、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')

参考

| | | |

関連するトピック