9

我想在仿真期间从 simulink 检索数据,并使用串行网络功能将这些数据发送到另一个程序。因为我需要使用另一个程序来做一些技巧并将命令发送回 simulink,所以我必须在运行时从 simulink 获取数据,以便另一个程序可以发出正确的命令。

我尝试使用 To Workspace 块导出数据。

在此处输入图像描述

但是,我只能在模拟的一开始就获得价值。

而且我还尝试使用范围并更改一些属性:选中 Save Data To Workspace 和 Uncheck Limite data to Last。

在此处输入图像描述

在此处输入图像描述

首先,我开始模拟,我发现 ScopeData 没有出现在 Workspace 中。只有当我停止模拟时,ScopeData 才会出现在工作区中。

在此处输入图像描述

之后,我可以使用 ScopeData.signals.values 来获取值。

但我想要的是:当我开始模拟时,ScopeData 会出现在工作区中,以便我可以将这些数据发送到其他程序。

有谁知道如何实现这一目标?

我发现这个页面可能会有所帮助,但我仍然不知道如何在模拟过程中不断导出数据。

4

3 回答 3

12

用于get_param从当前时间读取数据。set_param还可以使用增益或其他模块将数据发送回 Simulink 。

一个例子get_param

首先加载启动模拟:

load_system('myModel')
set_param('myModel','SimulationCommand','Start');

要读取 simulink 模型的任何行上的数据:

  1. 获取一个 simulink 块对象(让我们尝试一个名为Clock的时钟):

    block = 'myModel/Clock';
    rto = get_param(block, 'RuntimeObject');
    
  2. 然后在该块的第一个(或任何)输出端口(或输入)上获取数据。

    time = rto.OutputPort(1).Data;
    

您可以在计时器回调中进行阅读。

这也可能有帮助:Simulink 的命令行功能

于 2013-06-09T04:28:42.060 回答
3

在仿真期间,Simulink 将记录的数据存储在内部缓冲区中,并且仅在仿真暂停或停止时将数据写入工作区。听起来好像您真的需要编写一个 S-Function(它将在时间步的基础上获取信号值)并以这种方式与 Proteus 通信。

当然,Simulink 是一个非实时模拟器,所以如果您正在谈论做任何类似于实时控制的事情,那么您很可能完全采用了错误的方法。

于 2013-06-09T03:42:53.080 回答
3

在仿真期间的任何时候,您都可以强制 Simulink 将仿真输出数据写入工作区:

set_param(bdroot,'SimulationCommand','WriteDataLogs');

我发现这个命令在我的 Matlab 2010a for Win64 中非常不稳定。特别是当模拟停止时我必须避免它(即第一次检查 get_param(bdroot,'SimulationStatus')),否则Matlab会显示错误并要求重新启动。

于 2014-09-30T07:35:26.797 回答