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 | 입력 벡터 |
flag | S-Function이 수행할 태스크를 나타내는 정수 값 |
다음 표에서는 flag가 가정할 수 있는 값을 설명하고 각 값에 해당하는 Level-2 MATLAB S-Function 메서드를 나열합니다.
플래그 인수
| Level-1 플래그 | Level-2 콜백 메서드 | 설명 |
|---|---|---|
| 0 | setup | 기본 S-Function 블록 특성을 정의합니다. 여기에는 샘플 시간, 연속 상태와 이산 상태의 초기 조건, sizes 배열이 포함됩니다(sizes 배열에 대한 설명은 S-Function 블록 특성 정의하기 참조). |
| 1 | mdlDerivatives | 연속 상태 변수의 도함수를 계산합니다. |
| 2 | mdlUpdate | 이산 상태, 샘플 시간 및 주 시간 스텝 요구 사항을 업데이트합니다. |
| 3 | mdlOutputs | S-Function의 출력을 계산합니다. |
| 4 | mdlOutputs 메서드가 런타임 객체 NextTimeHit 속성을 업데이트함 | 다음 적중 시간을 절대 시간으로 계산합니다. 이 루틴은 setup 메서드에서 가변 이산시간 샘플 시간을 지정할 때만 사용됩니다. |
| 9 | mdlTerminate | 필요한 시뮬레이션 종료 태스크를 수행합니다. |
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.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 함수는 flag 값 2 및 3과 연결된 두 개의 로컬 함수를 등록합니다.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]; 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; |
