2015-01-29 2 views
0

simulink에서 단일 입력 및 단일 출력으로 사용자 정의 블록을 만들었으므로 완벽하게 작동합니다. 그러나 입력이없는 사용자 정의 블록을 만들 때 시뮬 링크 모델에서이 블록을 실행하면 MATLAB이 충돌합니다. 아래는 C 함수의 코드입니다.simulink에서 사용자 정의 블록을 실행할 때 Matlab 충돌이 발생했습니다.

모든 정보는 감사하겠습니다.


#define S_FUNCTION_NAME My5times /* Defines and Includes */ 
#define S_FUNCTION_LEVEL 2 

#include "simstruc.h" 

static void mdlInitializeSizes(SimStruct *S) 
{ 
    ssSetNumSFcnParams(S, 2);  
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S))  
    {  
     return; /* Parameter mismatch reported by the Simulink engine*/  
    } 

    if (!ssSetNumInputPorts(S, 0)) 
     return;  
    ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED); 
    ssSetInputPortDirectFeedThrough(S, 0, 0); 

    if (!ssSetNumOutputPorts(S,1)) 
     return; 
    ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED); 
    ssSetNumSampleTimes(S, 1); 

    /* Take care when specifying exception free code - see sfuntmpl.doc */  
    ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);  
} 

static void mdlInitializeSampleTimes(SimStruct *S) 
{ 
    ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);  
    ssSetOffsetTime(S, 0, 0.0);  
}  

static void mdlOutputs(SimStruct *S, int_T tid)  
{  
    int_T i;  

    /*int_T param = mxGetScalar(ssGetSFcnParam(S,0));*/   
    int_T buflen = mxGetN(ssGetSFcnParam(S, 0)) * sizeof(mxChar) + 1;  
    char_T* StringParam = mxMalloc(buflen);  
    int_T status = mxGetString(ssGetSFcnParam(S, 0), StringParam, buflen); 

    /* mexPrintf("The string being passed as a Paramater is - %s\n ", String);*/ 
    /* InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S, 0);*/ 

    real_T *y = ssGetOutputPortRealSignal(S, 0); 
    int_T width = ssGetOutputPortWidth(S, 0);  
    for (i = 0 ; i < width ; i++)  
    {  
     *y++ = 1;  
    } 
} 

static void mdlTerminate(SimStruct *S){}  

#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */ 
#include "simulink.c" /* MEX-file interface mechanism */  
#else  
#include "cg_sfun.h" /* Code generation registration function */  
#endif 
+2

왜 사람이 코드를 이렇게 못생긴 방식으로 포맷합니까? 왜 그렇게 형식이 틀린 코드를 볼 때마다 울 것인가? 왜 각 줄 다음에 빈 줄을 추가합니까? –

+0

아마도'mxGetString'에는'\\ '종료가 포함되어 있으므로 추가 문자'1'을 요청하고 있습니까? –

+0

안녕하세요, 비록 코드를 포맷 주셔서 감사. 입력 포트의 수가 0이 아니면 전체 코드가 완벽하게 작동합니다. 입력 포트를 0으로 설정 한 경우에만 충돌이 발생합니다. 그래서 나는 'mxGetString'명령에 문제가 있다고 생각하지 않습니다. 이 문제는 입력 포트 지침과 관련이 있다고 생각합니다. –

답변

1

왜 0으로 입력의 수를 설정 한 후 다음과 같은 두 가지 함수를 호출 할 수 있습니까?

ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED); 
ssSetInputPortDirectFeedThrough(S, 0, 0); 

이 줄은 가지고 있지 않은 첫 번째 입력 포트를 설정합니다.

+0

안녕하세요. 도움을 주셔서 감사합니다. 그것은 행위상의 문제였습니다. –

관련 문제