我正在尝试创建一个用 C 编写的 2 级 S-Function,它具有不同数量的输出端口,具体取决于连接到进口。
实际背景是我有一些其他 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
。
但 Simulink 一直告诉我应该在调用 ssSetNumOutputPorts
时在 mdlSetInputPortDataType
中设置输入端口数据类型。我假设在这个函数中只有输入端口的数据类型可以改变。
有人知道解决这个问题的方法吗?我能想到的唯一解决方法是屏蔽 S-Function 并让用户手动选择他希望处理的指针类型。但是,对于数据类型传播,这看起来很困惑且没有必要。
最佳答案
您需要在 mdlInitializeSizes 中设置端口数。你不能在那个函数之后改变它。唯一的解决方法是您提到的那个。
关于c - 根据 2 级 C-mex S-Function 中的导入数据类型设置输出端口的 Simulink block 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744112/