2011-05-05 300 views
0

我可以通过将它定义为int32(参见下面的代码)将布尔数据输入到C s函数中。如何用SS_BOOLEAN或SS_UINT8类型输入布尔数据?我明确指定的信号数据类型在我的Simulink模型和S-功能,但是当我定义的数据作为布尔或UINT8,我得到了陌生号码,而不是1或0如何输入布尔值到Simulink C s函数

static void mdlInitializeSizes(SimStruct *S) 
{ 
    ... 
    ssSetInputPortRequiredContiguous(S, 0, true); 
    ssSetInputPortDataType(S, 0, SS_INT32); 
    ... 
} 
static void mdlOutputs(SimStruct *S, int_T tid) 
{ 
    const int *myBoolean = (const int*) ssGetInputPortSignal(S, 0); 
    ... 
} 

更新(2011年5月20日) :我试过solution proposed by MikeT无济于事。作为输出,我期待[10 20 30],但得到[1 2 3]。下面是Simulink模型,在命令窗口和S-功能代码的输出中:

static void mdlOutputs(SimStruct *S, int_T tid) 
{ 
    InputBooleanPtrsType useData1 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs(S, 0); 
    InputBooleanPtrsType useData2 = (InputBooleanPtrsType) ssGetInputPortSignalPtrs(S, 1); 
    const double *data1 = (const double*) ssGetInputPortSignal(S, 2); 
    const double *data2 = (const double*) ssGetInputPortSignal(S, 3); 


    double *outputs = (double *) ssGetOutputPortRealSignal(S, 0); 

    double *data; 
    int i; 

    if (*useData1){data = data1;} 
    else if (*useData2){data = data2;} 

    //assign outputs: 
    for (i=0; i<3; i++){outputs[i] = data[i];} 

    printf("useData1 = %d\n", *useData1); 
    printf("useData2 = %d\n", *useData2); 
} 

static void mdlInitializeSizes(SimStruct *S) 
{ 
    int iPort; 
    if (!ssSetNumInputPorts(S, 4)) 
    { 
     return; 
    } 

    ssSetInputPortDataType(S, 0, SS_BOOLEAN); 
    ssSetInputPortDataType(S, 1, SS_BOOLEAN); 
    ssSetInputPortDataType(S, 2, SS_DOUBLE); 
    ssSetInputPortDataType(S, 3, SS_DOUBLE); 

    ssSetInputPortWidth(S, 0, 1); 
    ssSetInputPortWidth(S, 1, 1); 
    ssSetInputPortWidth(S, 2, 3); 
    ssSetInputPortWidth(S, 3, 3); 

    for (iPort = 0; iPort < 4 ; iPort++) 
    {  
     ssSetInputPortRequiredContiguous(S, iPort, true); /*direct input signal access*/ 
     ssSetInputPortDirectFeedThrough(S, iPort, 1); 
    } 

    if (!ssSetNumOutputPorts(S, 1)) 
    { 
     return; 
    } 
    ssSetOutputPortDataType(S, 0, SS_DOUBLE); 
    ssSetOutputPortWidth(S, 0, 3); 

    ssSetNumSampleTimes(S, 1); 
    ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE); 
} 

回答

3

有在Simulink演示S函数称为sfun_dtype_io.c,说明如何设置数据类型的投入和产出。从该演示中,下面是它如何处理布尔输入,尽管这不是唯一的方法,

static void mdlInitializeSizes(SimStruct *S) { 
... 
/* input 2 is a boolean scalar signal. */ 
ssSetInputPortWidth(   S, 2, 1); 
ssSetInputPortDataType(   S, 2, SS_BOOLEAN); 
ssSetInputPortDirectFeedThrough(S, 2, TRUE); 
... 
} 

static void mdlOutputs (SimStruct *S, int_T tid) { 
... 
/* The control port is a boolean signal */ 
InputBooleanPtrsType u2Ptr = (InputBooleanPtrsType) 
             ssGetInputPortSignalPtrs(S,2); 
... 
}