1

入力ポートに接続されている信号のデータ型に応じて出力ポートの数が異なる、Cで記述されたレベル2のS関数を作成しようとしています。

実用的な背景は、を呼び出すことによってカスタムデータ型を定義する他のS-FunctionがあることssRegisterDataTypeです。これらのデータ型は、特定のデータへのポインターを記述します。

ここで、これらのカスタムデータ型(ポインター)を使用し、それらに供給されるポインター型に応じて、特定のデータを出力できる別のS-Functionが必要です。

ssSetNumOutputPorts通過する出力ポートの数を設定してみました

static void mdlSetInputPortDataType(SimStruct *S, int portIndex,DTypeId dType)
{
    if( portIndex == 0 )
    {
        if(      dType == ssGetDataTypeId(S, "ptrtype1" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr1)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype2" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr2)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype3" ) )
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr3)) return;
        }
        else if( dType == ssGetDataTypeId(S, "ptrtype4" ) ) 
        {
            if (!ssSetNumOutputPorts(S, nOutportsPtr4)) return;
        }
        else
        {
            ssSetErrorStatus(S, "Input data type is not supported."); return;
        }


        if (!ssSetInputPortDataType(S, portIndex, dType)) return;
    }
} /* mdlSetInputPortDataType */

中にmdlInitializeSizes、インポートのデータ型をに設定しましたDYNAMICALLY_TYPED

mdlSetInputPortDataTypeしかし、Simulinkは、への呼び出しでinportデータ型を設定する必要があると言い続けssSetNumOutputPortsます。この関数内では、入力ポートのデータ型のみを変更できると思います。

誰かがこの問題の解決策を知っていますか?私が考えることができる唯一の回避策は、S-Functionをマスクし、ユーザーが処理したいポインターの種類を手動で選択できるようにすることです。ただし、データ型の伝播では、これは面倒で不要に思えます。

4

1 に答える 1

2

mdlInitializeSizes でポート数を設定する必要があります。その関数の後でそれを変更することはできません。唯一の回避策は、あなたが言及したものです。

于 2012-12-06T14:40:40.173 に答える