Main Content

시뮬레이션 중 블록 데이터에 액세스하기

블록 런타임 객체 소개

Simulink®는 블록 런타임 인터페이스라고 하는 애플리케이션 프로그래밍 인터페이스를 제공합니다. 이 인터페이스는 시뮬레이션이 실행되는 동안 블록 입력 및 출력, 파라미터, 상태 및 작업 벡터와 같은 블록 데이터에 프로그래밍 방식으로 액세스할 수 있도록 합니다. 이 인터페이스를 사용하면 MATLAB® 명령줄, Simulink 디버거 및 Level-2 MATLAB S-Function(Write Level-2 MATLAB S-Functions 항목 참조)에서 블록 런타임 데이터에 액세스할 수 있습니다.

참고

모델이 일시 중지된 경우 또는 디버거에서 실행 중이거나 일시 중지된 경우에도 이 인터페이스를 사용할 수 있습니다.

블록 런타임 인터페이스는 Simulink 데이터 객체 클래스의 집합(Data Objects 항목 참조)으로 구성되며, 이 인터페이스의 인스턴스는 실행 중인 모델의 블록에 대한 데이터를 제공합니다. 구체적으로 설명하자면, 인터페이스가 블록의 런타임 객체라 불리는 Simulink.RunTimeBlock 인스턴스를 실행 중인 모델의 각 비가상 블록과 연결합니다. 런타임 객체의 메서드와 속성을 통해 블록의 I/O 포트, 파라미터, 샘플 시간 및 상태에 대한 런타임 데이터에 액세스할 수 있습니다.

런타임 객체에 액세스하기

실행 중인 모델의 비가상 블록은 각각 RuntimeObject 파라미터를 가지는데, 시뮬레이션이 실행되는 동안에는 이 파라미터의 값이 블록의 런타임 객체의 핸들이 됩니다. 따라서 get_param을 사용하여 블록의 런타임 객체를 가져올 수 있습니다. 예를 들어, 다음 명령문은

rto = get_param(gcb,'RuntimeObject');

현재 선택된 블록의 런타임 객체를 반환합니다. 런타임 객체 데이터는 읽기 전용입니다. 블록의 파라미터, 입력, 출력 및 상태 데이터를 변경하는 데 런타임 객체를 사용할 수 없습니다

참고

가상 블록(비가상 블록 및 가상 블록 항목 참조)에는 런타임 객체가 없습니다. 모델 컴파일 도중 최적화의 일환으로 제거된 블록 역시 런타임 객체를 갖지 않습니다(Block reduction 항목 참조). 런타임 객체는 해당 블록을 포함한 모델이 실행 중이거나 일시 중지된 상태일 때만 존재합니다. 모델이 중지되면 get_param은 빈 핸들을 반환합니다. 모델을 중지하면 런타임 객체에 대한 기존 핸들이 모두 비워집니다.

메서드 실행 이벤트 수신 대기하기

블록 런타임 API의 한 응용 사례는 시뮬레이션 동안 주요 점에서 진단 데이터를 수집하는 것입니다. 예를 들어, 블록이 출력이나 도함수를 계산하기 전 또는 계산한 후의 블록 상태 값을 데이터로 수집할 수 있습니다. 블록 런타임 API는 이러한 작업을 손쉽게 수행할 수 있도록 지원하는 이벤트-리스너 메커니즘을 제공합니다. 자세한 내용은 add_exec_event_listener 명령에 대한 문서를 참조하십시오. 메서드 실행 이벤트를 사용하는 방법에 대한 예제를 보려면 sldemo_msfcn_lms를 여십시오. 이 Simulink 모델에는 FIR 필터의 계수를 결정하기 위해 시스템 식별을 수행하는 S-Function adapt_lms.m이 포함되어 있습니다. S-Function의 PostPropagationSetup 메서드는 두 번째 벡터가 각 시간 스텝에서 계산된 필터 계수를 저장하도록 블록 런타임 객체의 DWork 벡터를 초기화합니다.

Simulink 모델에서 S-Function 블록 아래 주석을 더블 클릭하면 OpenFcn이 실행됩니다. 이 함수는 먼저 FIR 필터 계수를 플로팅할 Figure를 엽니다. 그런 다음, 함수를 실행하여 PostOutputs 메서드 실행 이벤트를 S-Function의 블록 런타임 객체에 추가합니다. 예를 들면 다음과 같습니다.

% Add a callback for PostOutputs event
blk = 'sldemo_msfcn_lms/LMS Adaptive';

h   = add_exec_event_listener(blk, ...
         'PostOutputs', @plot_adapt_coefs);

함수 plot_adapt_coefs.m이 S-Function의 Outputs 메서드를 호출한 후에 항상 실행되는 이벤트 리스너로 등록됩니다. 이 함수는 블록 런타임 객체의 DWork 벡터에 액세스하고 Outputs 메서드에서 계산된 필터 계수를 플로팅합니다. plot_adapt_coefs.m에 사용되는 호출 구문은 모든 리스너에 필요한 표준을 따릅니다. 아래 표시된 것처럼 첫 번째 입력 인수는 S-Function의 블록 런타임 객체이고 두 번째 인수는 이벤트 데이터로 구성된 구조체입니다.

function plot_adapt_coefs(block, ei) %#ok<INUSD>
% 
% Callback function for plotting the current adaptive filtering
% coefficients.

stemPlot  = get_param(block.BlockHandle,'UserData');

est = block.Dwork(2).Data;
set(stemPlot(2),'YData',est);
drawnow('expose');

런타임 객체와 Simulink 실행 동기화하기

다음 명령을 입력하면 런타임 객체를 사용하여 블록 출력의 값을 가져와 MATLAB 명령 창에 표시할 수 있습니다.

rto = get_param(gcb,'RuntimeObject')
rto.OutputPort(1).Data

하지만 런타임 객체가 Simulink 실행과 동기화되지 않았다면 표시된 데이터가 실제 블록 출력이 아닐 수 있습니다. Simulink는 런타임 객체가 Level-2 MATLAB S-Function 내에서 사용되거나 이벤트 리스너 콜백에서 사용되었을 때만 런타임 객체와 Simulink 실행의 동기화를 보장합니다. 모델의 다른 블록이 메모리를 공유하도록 허용된 경우, MATLAB 명령 창에서 호출될 때 런타임 객체가 잘못된 출력 데이터를 반환할 수 있습니다.

Data 필드에 올바른 블록 출력이 포함되도록 하려면 구성 파라미터 대화 상자를 열어서 신호 저장공간 재사용 체크박스 선택을 해제하십시오(Signal storage reuse (Simulink Coder) 항목 참조).

관련 항목