2013-07-31 17 views
2

有几种C S函数之间共享C结构(仅实例化一次)的方法吗?这就是我的意思:我有一个Simulink模型,包含很多以C S函数实现的模块。这些块中需要很多模型参数,我想创建一个保存所有模型参数的单个对象,并且在开始模拟时仅实例化一次。现在我为每个S函数实例化这个对象,以便访问这些参数,但是在S函数中共享这个对象会很好。如何在C S函数中共享C结构?

只是一个纯粹的猜测:我可以将我的模型参数结构放置在一个单独的DLL中,然后从每个C S函数中访问它吗?你有没有做过这个?

回答

1

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

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

更新(从MathWorks公司一些回复):

模拟部分从Simulink中始终是单线程的。因此,共享DLL没有线程安全问题。

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

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

1

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

更简单的方法 - 具有一个S-功能分配结构在其DWork向量:

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

则指针值存储到一些工作空间/全局变量,在那里他们可以通过稍后访问其他的s功能。

也许最简单的方式来写,以工作区/全局变量使用mexEvalString,并使用mexGetVariable(Mathworks公司的文件是伟大的这些和其他功能)

+0

谢谢。我会试一试。但首先:一个Simulink模型中的所有S函数是否共享内存?我可以简单地实例化块中的结构,并将其地址作为输入(或参数)传递给其他块(也是S函数,但不同于持有结构的函数)? – remus

+0

是的,我认为他们使用相同的内存空间,问题是找到一个很好的机制来传递它们之间的地址。将它们作为参数传递将很困难--Simulink期望在开始之前设置所有s函数的参数 –

+0

写入工作区变量/从工作区变量读取是传递地址的一种机制。我猜你也可以将它们作为数据输入传递给它们......虽然它们不会在模拟长度上发生变化,但在每个模拟刻度上传递相同的值似乎有点奇怪 –