有几种方法可以做到这一点,尽管它们都不是明显最好的方法。
一种方法是在 dll 中定义所有内容并由每个 S-Function 加载。问题How to share a C struct among C S-Functions? 中对此进行了概述。
另一种(也是我首选的)方法是创建一个自定义数据类型,它是一个包含所有共享数据的 C 结构,并将其作为模型中 S-Function 之间的信号传递。这在文档Configure Custom Data Types 的Using Opaque Data Types in C S-Functions 部分进行了概述。
该文档显示了需要在创建自定义结构的 S-Function 中完成的各种(相对简单的)事情。在这个 S-Functions MdlOutputs 方法中,自定义结构将按照通常的方式作为块的输出。例如,如果包含您的数据的自定义结构定义为,
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';
然后在mdlInitializeSizes的任何需要使用这个信号的S-Function@你需要
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 Coder)。