3

Is there a way to share a C structure (instantiated only once) among several C S-functions? Here's what I mean: I have a Simulink model with many blocks that are implemented as C S-functions. There are many model parameters that are needed in those blocks and I would like to create a single object that holds all model parameters and is instantiated only once when I start the simulation. Right now I instantiate this object for each S-function in order to access the parameters but it would be nice to share this object among the S-functions.

Just a pure guess: Could I place my model parameters structure in a separate DLL and access it afterwards from each C S-function? Has any of you done this before?

4

2 回答 2

2

我已经成功地实现并测试了 DLL 的想法(即在 DLL 内的结构中收集所有模型参数 - 加上任何必要的计算 - 并将其链接到其他 C S 函数)。Simulink 是一个单一的进程,我相信模拟是一个单一的线程(如果没有的话,有办法使它成为线程安全的)。

具有来自 DLL 的模型参数的结构充当单例(每次模拟仅实例化一次并在其他 S-Function 之间共享)。

更新(来自 mathworks 的一些回复):

Simulink 的仿真部分始终是单线程的。因此,共享 DLL 没有线程安全问题。

不同 S-Function 模块的全局变量将共享相同的内存位置。这意味着将为所有 Simulink 加载共享库的单个实例。因此,所有加载共享库的 S-Function 实例都将引用相同的共享库和数据。

或者,您也可以考虑使用数据存储块来实现全局变量。这将需要从每个 S-Function 到适当的数据存储块的信号连接。但是不需要 S-Function 之间的连接。

于 2013-07-31T13:54:05.983 回答
1

尽管看起来很复杂,但您可以在单独的 DLL 中分配和存储这些值。几年前,在 s-function 之间共享 DLL,我发现 Matlab/Simulink 的 DLL 加载不透明且难以管理(例如加载依赖的 DLL)。

一种更简单的方法 - 让一个 s 函数在其 DWork 向量中分配结构:

http://www.mathworks.com/help/simulink/sfg/about-dwork-vectors.html

然后将指针值存储到一些工作区/全局变量中,稍后其他 s-function 可以在其中访问它们。

可能是使用 mexEvalString 写入工作区/全局变量并使用 mexGetVariable 读取它们的最简单方法(Mathworks 文档非常适合这些函数和其他函数)

于 2013-07-31T09:57:50.317 回答