根据2级C-mex S-Function中的导入数据类型,设置Simulink会阻止多个输出端口

时间:2012-12-06 12:58:19

标签: c matlab mex simulink

我正在尝试创建一个用C语言编写的2级S-Function,它具有不同数量的输出端口,具体取决于连接到信号的信号数据类型 inports。

实际背景是我有一些其他的S函数通过调用ssRegisterDataType来定义自定义数据类型。这些数据类型描述了指向某些数据的指针。

我现在想要另一个可以使用这些自定义数据类型(指针)的S函数,并根据输入到它们的指针类型输出某些数据。

我尝试通过

设置输出端口的数量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中我将inport的数据类型设置为DYNAMICALLY_TYPED

但Simulink一直告诉我,我应该在调用mdlSetInputPortDataType时在ssSetNumOutputPorts中设置输入数据类型。我假设在这个函数中只有inports的数据类型可能会改变。

有人知道这个问题的解决方案吗?我能想到的唯一解决方法是屏蔽S-Function并让用户手动选择他希望处理的指针类型。对于数据类型传播,这看起来很麻烦且不必要。

1 个答案:

答案 0 :(得分:2)

您需要在mdlInitializeSizes中设置端口数。在该功能之后你无法改变它。唯一的解决方法是你提到的那个。