c - 在多个 c mex s-function 之间共享数据
问题描述
我正在实现几个 c s-functions。它们必须依赖于相同的指针和变量,与当前的 s-function 无关。
基本上,我想在一个“设置” s-function(在 mdlInitialize 内部)中实例化所有变量和指针,然后能够在它们的 mdlOutputs 函数中使用这些变量和不同 s-function 中的指针。每个 s-function 都将用 c 编写。
我在 mathworks 帮助中找不到任何有用的提示。你有什么主意吗?谢谢。
解决方案
有几种方法可以做到这一点,尽管它们都不是最好的方法。
一种方法是在 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)。
推荐阅读
- typescript - 无法在 VSCode 中的 typescript react 文件中键入 css 属性
- flutter - 如何解决不同尺寸的 UI?Mediaquery 不能解决文本 UI
- sql - postgresql中如何处理json数据并放入数组
- reactjs - 世博会的问题,在项目中找不到工具
- r - 分隔数据的字符值(R 代码)
- mongodb - MongoRepository 无法通过 JPA @query 检查条件 NumberLong 字段
- outlook - 如何调试我的 *Outlook* 加载项?究竟是什么打开了 9222 端口?
- hosting - 您如何跟踪和过滤播客统计信息?
- snowflake-cloud-data-platform - 在雪花中使用联合子句更新视图
- javascript - 《Vuexy Admin Dashboard Template》中使用vue.js登录后如何接收用户信息