0

我需要以下情况的帮助。

我的项目是使用simulink来模拟机器人。simulink模型的输出是机器人在每个时间步的位置和扭矩。我的问题出在数据收集部分。我计划使用缓冲区来存储 simulink 输出,并使用 antoher matalb 函数访问同一缓冲区以将数据从缓冲区中取出以进行在线数据分析。要求是simulink模型和matlab数据分析功能需要同时运行。而 matalb 数据分析函数决定何时将数据从缓冲区中取出。这就像一个生产者-消费者问题,其中 simulink 是生产者,数据分析 matlab 函数充当消费者。

我的问题是如何保护缓冲区以实现互斥。我不想使用 To 工作区块,因为它仅在 simulink 暂停或停止时更新数据。我没有找到 matalb 或 simulink 提供的任何类似 smeaphore 或 mutex 的结构。我已经尝试了以下方法来解决问题,但它们都不起作用:

  1. 我曾尝试使用 DSP 工具箱中的队列和缓冲区块,这两个块提供互斥,但在模拟过程中输出数据的大小会发生变化。基本上当matlab函数采集数据的时候,它会把此刻存储在缓冲区中的所有数据都取走。然后缓冲区块似乎在每个 simulink 时间步上一个一个地输出。

  2. 我试图通过嵌入式函数中的持久变量来实现队列。当 matalb 函数要收集数据时,它会翻转一个信号标志来告诉 simulink 将数据输出到工作区。但是在这种方法中,matalb 函数必须通过两次调用来获取数据。第一次调用翻转标志然后返回。接下来,第二次调用用于搜索工作空间以查找 simulink 输出的数据。我的顾问拒绝了这种方法,因为它不优雅。

我认为RTW可能会解决这个问题,但是simulink模型和matalb分析功能代码经常更改,所以出于调试目的,我打算不将simulink更改为C/C++。但我想知道我是否可以使用 C 来实现互斥锁并通过 simulink 和 Matlab 调用。如果答案是肯定的,那么该怎么做呢?

我真的希望有人可以帮助我。任何建议表示赞赏。顺便说一句,我使用的是Linux系统。

4

1 回答 1

0

查看Simulink 文档中的在仿真期间访问模块数据,以及使用事件侦听器和文件交换上的MATLAB UI 查看 Simulink 信号。我认为这会做你想要的。

于 2013-04-10T08:39:49.380 回答