Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在CS函数之间共享C结构?_C_Simulink - Fatal编程技术网

如何在CS函数之间共享C结构?

如何在CS函数之间共享C结构?,c,simulink,C,Simulink,有没有办法在几个C-S函数之间共享一个C结构(只实例化一次)?我的意思是:我有一个Simulink模型,其中有许多块是作为CS函数实现的。在这些块中需要许多模型参数,我想创建一个包含所有模型参数的对象,并且在开始模拟时只实例化一次。现在我为每个S函数实例化这个对象,以便访问参数,但是在S函数之间共享这个对象会很好 纯粹的猜测:我能把我的模型参数结构放在一个单独的DLL中,然后从每个C-S函数访问它吗?以前有人这样做过吗?您可以在单独的DLL中分配和存储这些值,尽管这看起来很复杂。几年前,在s函数

有没有办法在几个C-S函数之间共享一个C结构(只实例化一次)?我的意思是:我有一个Simulink模型,其中有许多块是作为CS函数实现的。在这些块中需要许多模型参数,我想创建一个包含所有模型参数的对象,并且在开始模拟时只实例化一次。现在我为每个S函数实例化这个对象,以便访问参数,但是在S函数之间共享这个对象会很好


纯粹的猜测:我能把我的模型参数结构放在一个单独的DLL中,然后从每个C-S函数访问它吗?以前有人这样做过吗?

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

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

然后将指针值存储到一些工作区/全局变量,稍后其他s函数可以访问这些变量


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

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

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

更新(mathworks的部分回复):

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

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


可选地,您也可以考虑使用数据存储块来实现全局变量。这将需要从每个S-函数到适当的数据存储块的信号连接。但是不需要S-函数之间的连接。谢谢。我会尝试一下。但是首先,从一个Simulink模型共享所有的S-函数。内存?我可以简单地实例化一个块中的结构,并将其地址作为输入(或参数)传递给其他块(也是S函数,但不同于保存结构的块)吗?是的,我认为它们使用相同的内存空间,问题在于找到一种很好的机制在它们之间传递地址。将它们作为参数传递将很困难-Simulink希望在开始写入工作区变量/读取工作区变量之前设置所有s函数的参数是传递地址的一种机制s、 我猜你也可以将它们作为数据输入传递…虽然它们不会随着模拟的长度而改变,但在每个模拟上传递相同的值似乎有点奇怪。我建议使用DWork向量来存储结构-如果你只是在一个块中分配内存,我不确定Simulink将如何处理/尊重它文档建议使用DWork向量存储您希望在连续调用模型之间保持的任何内容。