주요 콘텐츠

MATLAB 함수에서 영속 변수 초기화하기

영속 변수는 MATLAB® 함수의 지역 변수로 함수에 대한 호출 간에 변수 값이 메모리에 유지됩니다. persistent 항목을 참조하십시오. 영속 변수를 MATLAB Function 블록과 Stateflow® 차트 내의 MATLAB 함수에서 초기화할 수 있습니다. 그러나 일부 코딩 방식은 영속 변수를 사용할 때 오류를 발생시킬 수 있습니다.

coder.opaque에서 영속 변수 사용 피하기

coder.opaque (MATLAB Coder) 함수로 선언된 변수를 영속 변수로 사용하면, 모델을 시뮬레이션했을 때 오류가 발생합니다. 예를 들어, 아래 함수는 영속 변수 pp를 사용하며, 이 변수는 coder.opaque를 사용하여 처음 선언되었습니다. 이 함수를 모델에서 시뮬레이션하면, 다음 코드는 오류를 생성합니다.

function y = fcn(u)
%#codegen
persistent pp;
if isempty(pp)
    pp = eml.opaque("int","0");
end
q = 0;
q = eml.ceval("(int)",pp);
q = q + 1;

pp = eml.ceval("(int)",q);
y = 0;
y = eml.ceval("(int)",pp);

오류 방지를 위해 모범 사례 사용하기

영속 변수로 인한 초기화 오류를 방지하려면 다음 모범 사례를 따르십시오.

  • 영속 변수는 함수에서 상수에 액세스하는 방법으로만 초기화해야 합니다.

  • 함수의 제어 흐름이 초기화가 발생하는지 여부에 의존하지 않도록 해야 합니다.

이러한 지침을 따르지 않으면 다음 조건에서 초기화 오류가 발생합니다.

  • 직접 피드스루 허용 속성이 선택 해제된 상태에서 영속 변수를 사용하는 MATLAB Function 블록

  • 모델에 State Control 블록이 포함되어 있고 이 블록의 상태 제어동기식으로 설정된 상태에서 영속 변수를 사용하는 MATLAB Function 블록

  • 무어 머신 의미 체계가 구현되어 있고 영속 변수를 사용하는 MATLAB 함수가 포함되어 있는 Stateflow 차트

예를 들어, 아래와 같이 구현된 fcn은 영속 변수 n을 사용합니다. n의 초기값은 입력 u에 의존하며, return 문이 함수의 정상적인 제어 흐름을 중단합니다. 이 코드는 위에 설명된 조건 중 하나라도 해당하는 모델에서 사용하면 오류가 발생합니다.

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end

직접 피드스루가 없는 MATLAB Function 블록

이 예제 모델에는 MATLAB 함수에서 영속 변수를 사용할 때의 모범 사례를 따르지 않는 MATLAB Function 블록이 포함되어 있습니다. MATLAB Function 블록 입력은 구형파이며, 이는 Sign 블록과 Sine Wave 블록에서 제공됩니다. MATLAB Function 블록은 매 시간 스텝마다 u 값을 영속 변수 n에 더합니다.

모델을 시뮬레이션합니다. 시뮬레이션은 다음과 같은 이유로 오류를 반환합니다.

  • 영속 변수 n의 초기값이 입력 u에 의존합니다.

  • return 문이 함수의 정상적인 제어 흐름을 중단합니다.

  • MATLAB Function 블록의 직접 피드스루 허용이 선택 해제되어 있습니다.

MATLAB Function 블록에서, 영속 변수에 상수 값을 설정하여 초기화되도록 하고 return 문을 제거합니다. 다음 코드를 사용하여 함수를 재정의합니다.

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

모델을 다시 시뮬레이션합니다.

동기식 모드의 State Control 블록

이 예제 모델에는 MATLAB 함수에서 영속 변수를 사용할 때의 모범 사례를 따르지 않는 MATLAB Function 블록이 포함되어 있습니다. MATLAB Function 블록 입력은 구형파이며, 이는 Sign 블록과 Sine Wave 블록에서 제공됩니다. MATLAB Function 블록은 매 시간 스텝마다 u 값을 영속 변수 n에 더합니다. 이 모델에는 상태 제어Synchronous로 설정된 State Control 블록이 포함되어 있습니다.

모델을 시뮬레이션합니다. 시뮬레이션은 다음과 같은 이유로 오류를 반환합니다.

  • 영속 변수 n의 초기값이 입력 u에 의존합니다.

  • return 문이 함수의 정상적인 제어 흐름을 중단합니다.

  • 이 모델에는 상태 제어Synchronous로 설정된 State Control 블록이 포함되어 있습니다.

MATLAB Function 블록에서, 영속 변수에 상수 값을 설정하여 초기화되도록 하고 return 문을 제거합니다. 다음 코드를 사용하여 함수를 재정의합니다.

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

모델을 다시 시뮬레이션합니다.

무어 의미 체계를 구현하는 Stateflow 차트

이 예제 모델에는 MATLAB 함수가 있는 Stateflow 차트가 포함되어 있으며, 이 함수는 영속 변수를 사용하기 위한 모범 사례를 따르지 않습니다.

이 MATLAB 함수는 활성 상태에 따라 영속 변수 n1 또는 -1을 더합니다.

모델을 시뮬레이션합니다. 시뮬레이션은 다음과 같은 이유로 오류를 반환합니다.

  • 영속 변수 n의 초기값이 입력 u에 의존합니다.

  • return 문이 함수의 정상적인 제어 흐름을 중단합니다.

  • 차트가 무어 의미 체계를 구현합니다.

MATLAB 함수에서, 영속 변수에 상수 값을 설정하여 초기화되도록 하고 return 문을 제거합니다. 다음 코드를 사용하여 함수를 재정의합니다.

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

모델을 다시 시뮬레이션합니다.

참고 항목

블록

함수

도움말 항목