Main Content

프로그래밍 방식으로 시뮬레이션 실행하기

다음 두 방법을 사용하여 모델을 프로그래밍 방식으로 시뮬레이션할 수 있습니다.

  • sim 명령을 통해

  • 실행 버튼을 통해

sim 명령으로 시뮬레이션을 수행할 때는 명령줄을 사용하여 시뮬레이션 작업을 수행합니다. 실행 버튼으로 시뮬레이션을 수행하면 Simulink® UI를 사용하여 다른 추가 작업도 수행할 수 있습니다. 다음 표는 이러한 두 가지 접근 방식의 차이를 자세히 설명합니다.

동작비대화형 방식 시뮬레이션(sim 명령 시뮬레이션)대화형 방식 시뮬레이션(실행 버튼 시뮬레이션)
허용되는 상호 작용 수준낮음높음
시뮬레이션 시작sim 명령 실행/set_param(mdl,'SimulationCommand','Start')
시뮬레이션 중지명령줄에서 Ctrl+C

set_param(mdl,'SimulationCommand','Stop')/중지

시뮬레이션 일시 중지아니요예. set_param(mdl,'SimulationCommand','Pause') / 일시 중지
시뮬레이션 실행 중에 MATLAB 프롬프트 사용 가능 여부아니요
시뮬레이션 실행 중에 스코프 업데이트예, 고속 액셀러레이터 모드에서는 제외
시뮬레이션 스텝 지정기아니요예, 고속 액셀러레이터 모드에서는 제외
조건부 일시 중지아니요예, 고속 액셀러레이터 모드에서는 제외
시뮬레이션 실행 중에 포트 값 표시 여부아니요
시뮬레이션 속도 조절 지원
TimeOut 옵션 지원아니요
오류 처리MATLAB 예외(CaptureErrors가 켜져 있지 않은 한)진단 뷰어에 보고됨

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')

Plot of the vdp simulation

시뮬레이션 제한 시간 활성화하기

루프에서 여러 시뮬레이션을 실행 중이고 가변 스텝 솔버를 사용 중인 경우 simtimeout 파라미터와 함께 사용해 보십시오. 여러 이유로 시뮬레이션이 중단되거나 예기치 않게 작은 시간 스텝을 수행하기 시작한다면 제한 시간 후에 자동으로 중단됩니다. 그런 다음, 다음 시뮬레이션을 실행할 수 있습니다.

N = 100;
simOut = repmat(Simulink.SimulationOutput, N, 1);
for i = 1:N
		simOut(i) = sim('vdp', 'timeout', 1000);
end

시뮬레이션 오류 캡처하기

오류로 인해 시뮬레이션이 중지되면 시뮬레이션 메타데이터에서 오류를 확인할 수 있습니다. 이 경우 sim은 오류가 발생할 때까지 시뮬레이션 데이터를 simulation output 객체에 캡처하므로, 사용자는 시뮬레이션을 다시 실행하지 않고도 시뮬레이션에 대해 일부 디버그를 수행할 수 있습니다. 이 기능을 활성화하려면 sim 함수와 함께 CaptureErrors 파라미터를 사용하십시오.

이러한 접근 방식의 또 다른 장점은 시뮬레이션 오류로 인해 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_paramget_param을 사용할 수 있습니다. set_paramget_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 명령 후에 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 명령을 실행할 수 있습니다. 자세한 내용은 콜백으로 모델 동작 사용자 지정하기Block Callbacks 항목을 참조하십시오.

이 예제에서는 시뮬레이션이 시작되기 전에 모델의 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.

모델의 StartFcn 파라미터를 설정하여 openscopes 스크립트를 호출합니다.

set_param('my_model','StartFcn','openscopes')

참고 항목

| | | |

관련 항목