首页 > 解决方案 > 在多个 c mex s-function 之间共享数据

问题描述

我正在实现几个 c s-functions。它们必须依赖于相同的指针和变量,与当前的 s-function 无关。

基本上,我想在一个“设置” s-function(在 mdlInitialize 内部)中实例化所有变量和指针,然后能够在它们的 mdlOutputs 函数中使用这些变量和不同 s-function 中的指针。每个 s-function 都将用 c 编写。

我在 mathworks 帮助中找不到任何有用的提示。你有什么主意吗?谢谢。

标签: csimulinkmexs-function

解决方案


有几种方法可以做到这一点,尽管它们都不是最好的方法。

一种方法是在 dll 中定义所有内容,并由每个 S-Function 加载。问题如何在 C S-Functions 之间共享 C 结构?.

另一种(也是我首选的)方法是创建一个自定义数据类型,它是一个包含所有共享数据的 C 结构,并将其作为模型中 S-Function 之间的信号传递。Using Opaque Data Types in C S-Functions这在文档配置自定义数据类型部分中进行了概述。

该文档显示了需要在创建自定义结构的 S-Function 中完成的各种(相对简单的)事情。在这个 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';

然后在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)。


推荐阅读