设置为动态大小时,Matlab S函数崩溃

时间:2018-06-20 20:55:52

标签: matlab simulink

我有以下问题。我创建了一个S函数,该函数应该从文本文件中读取矩阵,其中输出端口的输出大小未知,因此应设置为动态大小。 Matlab然后崩溃了。设置为固定大小时,没有问题。我希望有人可以帮助我

#define S_FUNCTION_NAME Data_Input
#define S_FUNCTION_LEVEL 2

/*---- Define size of input ports ---------------------------------------------------*/
#define OUTPUTSIZE     50                         
/*-----------------------------------------------------------------------------------*/

#include <stdio.h>
#include "simstruc.h"

int_T in;
/*---- Define data types ------------------------------------------------------------*/
typedef struct SBufferData
{
    real32_T   data[50];
    int32_T    number;
} SBuffer;

/*==== mdlCheckParameters ===========================================================*/
#undef MDL_CHECK_PARAMETERS                   /* Change to #undef to remove function */
#if defined(MDL_CHECK_PARAMETERS) && defined(MATLAB_MEX_FILE)

static void mdlCheckParameters(SimStruct *S)
{ 
}
#endif /* MDL_CHECK_PARAMETERS */
/*===================================================================================*/

/*=== mdlInitializeSizes ============================================================*/
static void mdlInitializeSizes(SimStruct *S)
{  
    ssSetNumSFcnParams(S,1);                   /* number of expected parameters      */

    ssSetSFcnParamTunable(S, 0, 0);            /* sets parameter 1 to be non-tunable */
    ssSetSFcnParamTunable(S, 1, 0);            /* sets parameter 2 to be non-tunable */

    ssSetNumContStates(S,0);                   /* number of continuous states        */
    ssSetNumDiscStates(S,0);                   /* number of discrete states          */

    ssSetNumInputPorts(S,0);                    /* number of input ports              */
    ssSetNumOutputPorts(S,1);                   /* number of output ports             */

    ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);               /* first output port width            */
    ssSetOutputPortDataType(S,0,SS_SINGLE);    /* first output port data type        */


    ssSetNumSampleTimes(S,0);                  /* number of sample times             */

    ssSetNumRWork(S,0);                        /* number real work vector elements   */
    ssSetNumIWork(S,0);                        /* number int_T work vector elements  */
    ssSetNumPWork(S,1);                        /* number ptr work vector elements    */
    ssSetNumModes(S,0);                        /* number mode work vector elements   */
    ssSetNumNonsampledZCs(S,0);                /* number of nonsampled zero crossing */

    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
        return; /* Parameter mismatch reported by the Simulink engine*/
    }
}
/*===================================================================================*/

/*==== mdlInitializeSampleTimes =====================================================*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
    real_T dSampleTime=(mxGetPr(ssGetSFcnParam(S,0))[0]);

    ssSetSampleTime(S, 0, dSampleTime);
    ssSetOffsetTime(S, 0, 0.0);
}
/*===================================================================================*/

/*==== mdlStart =====================================================================*/
#define MDL_START                             /* Change to #undef to remove function */
#if defined(MDL_START)

static void mdlStart(SimStruct *S)
{
    FILE *fp;
    int_T i, index=0;

    SBuffer *buffer;
    float temp;
/*---- Retrieve pointer to pointers work vector -------------------------------------*/
    void **PWork = ssGetPWork(S);

    buffer = (SBuffer *)malloc(OUTPUTSIZE * sizeof(SBuffer));
    PWork[0] = (void *)buffer;

/*---- Read from text-file ----------------------------------------------------------*/
    fp = fopen("myfile.txt", "r");

    while(feof(fp)==0)
    {
        fscanf(fp,"%f",&temp);
        buffer -> data[index] = temp;
        index++;
    }

    buffer -> number = (int32_T) index;

    fclose(fp);
}
#endif /*  MDL_START */
/*===================================================================================*/

/*==== mdlOutputs ===================================================================*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
/*---- Get input ports --------------------------------------------------------------*/
    real_T *y1=(real_T *)ssGetOutputPortSignal(S,0);

    int_T i;
    SBuffer *buffer;

/*---- Retrieve pointer to pointers work vector -------------------------------------*/
    void **PWork = ssGetPWork(S);

    buffer = PWork[0];

    for (i = 0; i < buffer->number; i++)
    {
        y1[i] = buffer->data[i];
    }

}
/*===================================================================================*/

/*==== mdlTerminate =================================================================*/
static void mdlTerminate(SimStruct *S) 
{
    SBuffer *buffer;

/*---- Retrieve pointer to pointers work vector -------------------------------------*/    
    void **PWork = ssGetPWork(S);

    buffer = PWork[0];

/*---- Deallocate structure 'info' and 'buffer' -------------------------------------*/
    free(buffer);
}
/*===================================================================================*/

/*==== Required S-function trailer ==================================================*/
#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
/*===================================================================================*/

0 个答案:

没有答案