2

int32 として定義することで、ブール値データを C s-function に入力できます (以下のコードを参照)。SS_BOOLEAN または SS_UINT8 型のブール データを入力するにはどうすればよいですか? Simulink モデルと S-Function で信号のデータ型を明示的に指定しましたが、データを boolean または uint8 として定義すると、1 または 0 ではなく奇妙な数値が得られました。

 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 日): MikeT が提案した解決策を試してみましたが、役に立ちませんでした。出力として [10 20 30] を期待していましたが、[1 2 3] になりました。以下は、Simulink モデル、コマンド ウィンドウの出力、および s-function コードです。

 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 );
 }
4

1 に答える 1

6

入力と出力のデータ型を設定する方法を示す sfun_dtype_io.c と呼ばれる Simulink のデモ S-Function があります。そのデモから、ブール入力を処理する方法を次に示しますが、これが唯一の方法ではありません。

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);
...
}
于 2011-05-06T01:21:53.693 に答える