2014-07-18 4 views
0

나는 Simulink S-function (Level 2)을 C로 작성했다. 결과 블록은 하나의 출력과 하나의 매개 변수를 갖는다. 내가 mdlInitializeSizes 내에서 할당Simulink : 레벨 2 s- 함수에서 로컬 변수를 사용하는 방법?

#define NUM_PARAMS 1 
#define NUM_INPORTS 0 
#define NUM_OUTPORTS 1 

unsigned short int MASK_INDEX; 

, 그 값에 대한 몇 가지 작업을 수행합니다 :이 매개 변수는 바로 블록을 설정 한 후, 파일 범위에서 정의 된 변수에 저장됩니다

static void mdlInitializeSizes(SimStruct *S) { 
    // Check Parameters 
    ssSetNumSFcnParams(S, NUM_PARAMS); 
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) { 
      return; 
    } 

    MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0)); 

    (...) operations 
} 

내 문제는 변수 MASK_INDEX가 전역으로 보이고 같은 유형의 모든 블록에서 공유된다는 것입니다. 따라서 모든 블록에 대해 동일한 값을 유지합니다. 예를 들어, 해결 방법으로

, 나는 모든 시간을 다시로드하고, 작업을 다시 수행합니다

static void mdlOutputs(SimStruct *S, int_T tid) { 
    MASK_INDEX = *mxGetPr(ssGetSFcnParam(S, 0)); 

    (...) operations 
} 

가 어떻게 진정한 "지역 변수"를 얻을 수있다, 나는 할 필요가 없도록 매번이 모든 것을 반복합니까?

+0

정확히 [Work Vectors] (http://www.mathworks.com/help/simulink/state-and-work-vector.html)가 있습니다. –

답변

2

당신은 당신이 MASK_INDEX을 선언 한 곳 언급하지만,이 파일 범위에서처럼 당신의 묘사에서 소리하지 않았습니다. 그렇다면이 변수는 모든 인스턴스에서 공유됩니다. 이것은 S-Functions와 분리 된 것이 아닙니다. 모든 플랫폼이 아니라면 대부분의 플랫폼에서 공유 라이브러리가 작동하는 방식입니다. 공유 라이브러리의 단일 인스턴스는 응용 프로그램 (이 경우 MATLAB)에 의해로드됩니다. 결과적으로 전역 변수 사본은 하나뿐입니다.

가장 쉬운 옵션은 매개 변수에 액세스 할 때마다 ssGetSFcnParam을 사용하는 것입니다. S-Function 매크로를 살펴 본다면 SimStruct의 필드에 액세스하는 것일 뿐이므로 반복되는 액세스로 인해 성능이 저하 될 가능성은 거의 없습니다. 매크로 같은 일반적인 사용 사례를 래핑하는 데 사용되는 매크로를 보았습니다. 아마 ssSetUserData를 사용하는

당신이 정말로 대화 매개 변수를 캐싱에 대해 가고 싶은 경우

는 가장 쉬운입니다. structMASK_INDEX 회원 (그렇게하지 struct를 사용하는을 가지고 있지만이 방법이 더 확장 가능)를 포함 선언합니다. mxMalloc을 사용하여 인스턴스를 mdlStart에 동적으로 할당하고이를 블록의 사용자 데이터에 할당합니다. ssSetOptions 전화에서 SS_OPTION_CALL_TERMINATE_ON_EXITmdlInitializeSizes으로 설정했는지 확인하십시오. 그런 다음 함수를 정의하여 에 액세스하고 ssGetUserDatamxFree을 사용합니다. 이제 ssGetUserData을 사용하여 mdlOutputs에 속한 struct 회원에 액세스 할 수 있습니다.

아마,뿐만 아니라 PWork vector 같은 work vectors 다른 고급 옵션이 있습니다. 당신의 매개 변수를 조정할 경우

또 다른 옵션은,,, 블록의 대화 매개 변수를 변환 선택적으로 당신은 캐시하자, 어느, runtime parameters을 사용하고 있습니다.

귀하의 경우, 매번 mdlOutputs 내에 ssGetSFcnParam을 사용하는 것으로 고수하고 있습니다.

+0

내 잘못 ... 네가 맞아, 나는'#define NUM_OUTPORTS 1' (나는 내 ​​질문을 편집 할 것이다) 직후에 어떤 방법이든 그것을 정의했다. 나는'ssSetUserData' 접근법을 시도하고 돌아올 것이다.이 값을 캐시하려는 이유는 매번 한 번 더 작업 (배열 조회)을해야한다는 것입니다. – Flo

+0

작동합니다 :-) 감사합니다. – Flo

관련 문제