주요 콘텐츠

Level-1 MATLAB S-Function 유지 관리하기

Level-1 MATLAB S-Function 유지 관리 정보

참고

이 섹션에 제공된 정보는 기존 Level-1 MATLAB® S-Function을 유지 관리하는 용도로만 사용할 수 있습니다. 새로운 MATLAB S-Function을 개발하려면 보다 강력한 Level-2 API를 사용하십시오(Write Level-2 MATLAB S-Functions 참조). Level-1 MATLAB S-Function은 Level-2 MATLAB S-Function보다 훨씬 작은 S-Function API의 일부만 지원하며, 내장 블록에 비해 기능이 제한적입니다.

Level-1 MATLAB S-Function은 다음과 같은 형식의 MATLAB 함수입니다.

[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,...)

여기서 f는 S-Function의 이름입니다. 모델 시뮬레이션 중 Simulink® 엔진은 특정 호출에 대해 수행할 태스크를 나타내는 flag 인수를 사용하여 f를 반복적으로 호출합니다. S-Function은 태스크를 수행하고 결과를 출력 벡터로 반환합니다.

Level-1 MATLAB S-Function 인수

Simulink 엔진은 Level-1 MATLAB S-Function에 다음 인수를 전달합니다.

t현재 시간
x상태 벡터
u입력 벡터
flagS-Function이 수행할 태스크를 나타내는 정수 값

다음 표에서는 flag가 가정할 수 있는 값을 설명하고 각 값에 해당하는 Level-2 MATLAB S-Function 메서드를 나열합니다.

플래그 인수

Level-1 플래그Level-2 콜백 메서드설명
0setup기본 S-Function 블록 특성을 정의합니다. 여기에는 샘플 시간, 연속 상태와 이산 상태의 초기 조건, sizes 배열이 포함됩니다(sizes 배열에 대한 설명은 S-Function 블록 특성 정의하기 참조).
1mdlDerivatives연속 상태 변수의 도함수를 계산합니다.
2mdlUpdate이산 상태, 샘플 시간 및 주 시간 스텝 요구 사항을 업데이트합니다.
3mdlOutputsS-Function의 출력을 계산합니다.
4mdlOutputs 메서드가 런타임 객체 NextTimeHit 속성을 업데이트함다음 적중 시간을 절대 시간으로 계산합니다. 이 루틴은 setup 메서드에서 가변 이산시간 샘플 시간을 지정할 때만 사용됩니다.
9mdlTerminate필요한 시뮬레이션 종료 태스크를 수행합니다.

Level-1 MATLAB S-Function 출력

Level-1 MATLAB S-Function은 다음 요소를 포함하는 출력 벡터를 반환합니다.

  • sys: 일반 반환 인수입니다. 반환되는 값은 flag 값에 따라 달라집니다. 예를 들어 flag = 3인 경우 sys에는 S-Function 출력이 포함됩니다.

  • x0: 초기 상태 값(시스템에 상태가 없는 경우 빈 벡터)입니다. flag = 0인 경우를 제외하고, x0은 무시됩니다.

  • str: 원래는 향후 사용을 위한 용도입니다. Level-1 MATLAB S-Function은 이를 빈 행렬 []으로 설정해야 합니다.

  • ts: 블록의 샘플 시간과 오프셋을 포함하는 2열 행렬입니다(샘플 시간과 오프셋을 지정하는 방법에 대한 정보는 Simulink 사용샘플 시간 지정하기 참조).

    예를 들어, S-Function이 모든 시간 스텝에서 실행되도록 하려면(연속 샘플 시간) ts[0 0]으로 설정하십시오. 연결된 블록과 동일한 레이트로 S-Function을 실행하려면(상속된 샘플 시간) ts[-1 0]으로 설정하십시오. 시뮬레이션 시작 시간 0.1초 후부터 0.25초마다 실행하려면(이산 샘플 시간) ts[0.25 0.1]로 설정하십시오.

    서로 다른 샘플 레이트로 여러 태스크를 수행하는 S-Function(즉, 멀티레이트 S-Function)을 만들 수 있습니다. 이 경우 ts는 S-Function이 사용하는 모든 샘플 레이트를 샘플 시간 순으로 오름차순으로 지정해야 합니다. 예를 들어, 시뮬레이션 시작 시간부터 0.25초마다 한 태스크를 수행하고 시뮬레이션 시작 시간 0.1초 후부터 1초마다 다른 태스크를 수행하는 S-Function이 있다고 가정하겠습니다. 이 경우 S-Function은 ts[.25 0; 1.0 .1]로 설정해야 합니다. 이렇게 하면 Simulink 엔진이 시간 [0 0.1 0.25 0.5 0.75 1 1.1 ...]에 S-Function을 실행합니다. S-Function은 각 샘플 시간마다 해당 샘플 시간에 수행할 태스크를 결정해야 합니다.

    또한 일부 태스크는 지속적으로(즉, 매 시간 스텝마다) 수행하고 다른 태스크는 이산 간격으로 수행하는 S-Function을 만들 수도 있습니다.

S-Function 블록 특성 정의하기

Simulink 엔진이 Level-1 MATLAB S-Function을 인식하려면 S-Function에 대한 특정 정보를 제공해야 합니다. 이 정보에는 입력 개수, 출력 개수, 상태 개수 및 기타 블록 특성이 포함됩니다.

이 정보를 제공하려면 S-Function 시작 시 simsizes 함수를 호출합니다.

sizes = simsizes;

이 함수는 초기화되지 않은 sizes 구조체를 반환합니다. sizes 구조체에 S-Function에 대한 정보를 불러와야 합니다. 아래 표는 sizes 구조체의 필드를 나열하고 각 필드에 포함된 정보를 설명합니다.

sizes 구조체의 필드

필드 이름설명
sizes.NumContStates연속 상태 개수
sizes.NumDiscStates이산 상태 개수
sizes.NumOutputs출력 개수
sizes.NumInputs입력 개수
sizes.DirFeedthrough직접 피드스루를 나타내는 플래그
sizes.NumSampleTimes샘플 시간 개수

sizes 구조체를 초기화한 후 simsizes를 다시 호출합니다.

sys = simsizes(sizes);

이렇게 하면 sizes 구조체의 정보가 sys로 전달되며, 이는 Simulink 엔진이 사용할 정보가 들어 있는 벡터입니다.

S-Function 파라미터 처리

Level-1 MATLAB S-Function을 호출할 때, Simulink 엔진은 항상 표준 블록 파라미터인 t, x, u, flag를 함수 인수로 S-Function에 전달합니다. 엔진은 사용자가 추가적으로 지정한 블록별 파라미터를 S-Function에 전달할 수 있습니다. 사용자는 S-Function 블록 파라미터 대화 상자의 S-Function 파라미터 필드에서 파라미터를 지정합니다(S-Function에 파라미터 전달하기 참조). 블록 대화 상자에서 추가 파라미터를 지정하는 경우, 엔진은 이러한 파라미터를 추가 함수 인수로 S-Function에 전달합니다. 추가 인수는 S-Function 인수 목록의 표준 인수 뒤에, 블록 대화 상자에서 해당 파라미터가 표시되는 순서대로 나열됩니다. 이 블록별 S-Function 파라미터 기능을 사용하면 동일한 S-Function으로 다양한 처리 옵션을 구현할 수 있습니다.

Level-1 MATLAB S-Function을 Level-2로 변환하기

각 Level-1 S-Function 플래그와 연결된 코드를 적절한 Level-2 S-Function 콜백 메서드에 매핑하여, Level-1 MATLAB S-Function을 Level-2 MATLAB S-Function으로 변환할 수 있습니다. Level-1 플래그를 Level-2 콜백 메서드에 매핑하는 것은 플래그 인수 표를 참조하십시오. 또한 다음과 같이 하십시오.

  • Level-2 MATLAB S-Function의 이산 상태 정보를 PostPropagationSetup 메서드에서 초기화한 DWork 벡터에 저장하십시오.

  • Level-2 MATLAB S-Function 대화 상자 파라미터에 액세스할 때는 S-Function에 함수 인수로 전달하는 대신 DialogPrm 런타임 객체 속성을 사용하십시오.

  • 가변 샘플 시간을 갖는 S-Function의 경우, Outputs 메서드의 NextTimeHit 런타임 객체 속성을 업데이트하여 Level-2 MATLAB S-Function의 다음 샘플 시간 적중을 설정하십시오.

예를 들어, 다음 표는 Level-1 MATLAB S-Function sfundsc2.m을 Level-2 MATLAB S-Function으로 변환하는 방법을 보여줍니다. 이 예시에서는 Level-1 MATLAB S-Function을 변환할 때 Level-2 MATLAB S-Function 템플릿 msfuntmpl_basic.m을 시작점으로 사용합니다. 표의 라인 번호는 sfundsc2.m의 코드 라인에 해당합니다.

 sfundsc2_level2.m

라인 번호sfundsc2.m의 코드Level-2 MATLAB 파일(sfundsc2_level2.m)의 코드
1
function [sys,x0,str,ts]= ...
  sfundsc2(t,x,u,flag)
function sfundsc2(block)
  setup(block);
function 라인의 구문이 하나의 입력 인수 block을 받도록 변경되며, 이 인수는 Level-2 MATLAB S-Function 블록의 런타임 객체입니다. Level-2 MATLAB S-Function의 본문에는 로컬 setup 함수를 호출하는 하나의 라인을 포함합니다.
13 - 19
switch flag,

case 0,
[sys,x0,str,ts] = ...
   mdlInitializeSizes;
function setup(block)
flag 값 0은 setup 메서드 호출에 해당합니다. Level-2 MATLAB S-Function은 콜백 메서드를 호출하기 위해 switch 문을 사용하지 않습니다. 대신 로컬 setup 함수가 시뮬레이션 중에 직접 호출되는 콜백 메서드를 등록합니다.
24 - 31
case 2,
   sys = mdlUpdate(t,x,u);

case 3,
   sys = mdlOutputs(t,x,u);
setup 함수는 flag23과 연결된 두 개의 로컬 함수를 등록합니다.
block.RegBlockMethod('Outputs' ,@Output);
block.RegBlockMethod('Update'  ,@Update);
53 - 66
sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 1;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;

sys = simsizes(sizes);

x0  = 0;
str = [];
ts  = [.1 0];
setup 함수는 또한 Level-2 MATLAB S-Function의 특성을 초기화합니다.
block.NumInputPorts  = 1;
block.NumOutputPorts = 1;
block.InputPort(1).Dimensions        = 1;
block.InputPort(1).DirectFeedthrough = false;
block.OutputPort(1).Dimensions       = 1;
block.NumDialogPrms     = 0;
block.SampleTimes = [0.1 0];
이 S-Function은 이산 상태를 가지므로, setup 메서드는 PostPropagationSetup 콜백 메서드를 등록하여 DWork 벡터를 초기화하고 InitializeConditions 콜백 메서드를 등록하여 초기 상태 값을 설정합니다.
block.RegBlockMethod('PostPropagationSetup',...
 @DoPostPropSetup);
block.RegBlockMethod('InitializeConditions', ...
 @InitConditions);
56
sizes.NumDiscStates  = 1;
PostPropagationSetup 메서드는 단일 이산 상태를 저장하는 DWork 벡터를 초기화합니다.
function DoPostPropSetup(block)

  %% Setup Dwork
  block.NumDworks = 1;
  block.Dwork(1).Name = 'x0'; 
  block.Dwork(1).Dimensions      = 1;
  block.Dwork(1).DatatypeID      = 0;
  block.Dwork(1).Complexity      = 'Real';
  block.Dwork(1).UsedAsDiscState = true;
64
x0  = 0;
InitializeConditions 메서드는 이산 상태 값을 초기화합니다.
function InitConditions(block)

%% Initialize Dwork 
block.Dwork(1).Data = 0
77 - 78
function sys = ...
   mdlUpdate(t,x,u)

sys = u;    
Update 메서드는 이산 상태의 다음 값을 계산합니다.
function Update(block)
block.Dwork(1).Data = block.InputPort(1).Data;
88 - 89
function sys = ...
   mdlOutputs(t,x,u)
sys = x;
Outputs 메서드는 S-Function의 출력을 계산합니다.
function Outputs(block)
block.OutputPort(1).Data = block.Dwork(1).Data;