入力ポートに接続されている信号のデータ型に応じて出力ポートの数が異なる、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をマスクし、ユーザーが処理したいポインターの種類を手動で選択できるようにすることです。ただし、データ型の伝播では、これは面倒で不要に思えます。