我正在实现几个c s功能。它们必须依赖于相同的指针和变量,依赖于当前的s函数。
基本上,我想在一个“setup”s函数中实例化所有变量和指针(在mdlInitialize中),然后能够在它们的mdlOutputs函数中使用这些变量和不同s函数中的指针。每个s函数都将用c语言编写。
我在mathworks的帮助中找不到任何有用的提示。你知道吗?谢谢。

最佳答案

有几种方法可以做到这一点,但显然没有一种是最好的方法。
一种方法是定义dll中的所有内容,并让每个S函数加载这些内容。这在问题How to share a C struct among C S-Functions?中有概述。
另一种(也是我首选的)方法是创建一个自定义数据类型,它是一个包含所有共享数据的C-struct,并将其作为模型中S函数之间的信号传递。这在docConfigure Custom Data TypesUsing Opaque Data Types in C S-Functions部分中有概述。
文档显示了需要在创建自定义结构的S函数中完成的各种(相对简单的)事情。在这个S-FunctionsMdlOutputs方法中,定制结构只会以通常的方式作为块的输出。例如,如果包含数据的自定义结构定义为,

typedef struct{
    real_T sig0;
    real_T sig1;
}myStruct;

然后在mdlInitializeSizes中你需要一些东西,
myStruct tmp;

/* Register the user-defined data types */
id = ssRegisterDataType(S, "customDataType");
if(id == INVALID_DTYPE_ID) return;

/* Set the size of the user-defined data type */
status = ssSetDataTypeSize(S, id, sizeof(tmp));
if(status == 0) return;

/* Set the zero representation */
tmp.sig0 = 0;
tmp.sig1 = 0;
status = ssSetDataTypeZero(S, id, &tmp);

要将其作为信号输出,在mdlOutputs方法中
myStruct *pY0 = (myStruct *)ssGetOutputPortSignal(S, 0);

pY0[0].sig0 = 'value of this param';
pY0[0].sig1 = 'value of this param';

然后在需要使用这个信号的S函数的mdlInitializeSizes
DTypeId  id;
id = ssRegisterDataType(S, "customDataType");
if(id == INVALID_DTYPE_ID) return;

然后通过使用,您可以访问任何其他方法中的自定义结构,
myStruct **uPtrs = (myStruct **) ssGetInputPortSignalPtrs(S,0);

然后以通常的方式访问结构的元素,
firstVar = uPtrs[0]->sig0;
secondVar = uPtrs[0]->sig1;

这种方法的主要缺点是模型不能用于代码生成(使用Simulink编码器)。

09-10 14:42