Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Matlab 如何在模拟期间将simulink数据导出到工作空间?_Matlab_Simulink - Fatal编程技术网

Matlab 如何在模拟期间将simulink数据导出到工作空间?

Matlab 如何在模拟期间将simulink数据导出到工作空间?,matlab,simulink,Matlab,Simulink,我想在模拟期间从simulink检索数据,并使用串行网络功能将这些数据发送到另一个程序。因为我需要使用另一个程序来执行一些技巧,并将命令发送回simulink,所以我必须在运行时从simulink获取数据,以便另一个程序可以生成正确的命令 我尝试使用工作区块导出数据 然而,我只能在模拟的一开始就得到值 我还尝试了使用scope并更改了一些属性:选中savedatatoworkspace,取消选中limitedatatolast 首先,我开始模拟,发现ScopeData没有出现在工作区中。只

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

我尝试使用工作区块导出数据

然而,我只能在模拟的一开始就得到值

我还尝试了使用scope并更改了一些属性:选中savedatatoworkspace,取消选中limitedatatolast

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

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

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

有人知道如何做到这一点吗


我发现这可能会有所帮助,但我仍然不知道如何在模拟期间连续导出数据。

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

当然,Simulink是一个非实时模拟器,因此,如果你说的是做任何类似于实时控制的事情,那么你很可能采取了完全错误的方法。

用于仅在当前时间读取数据。还可将数据发送回Simulink,并带有增益或其他块的值

一个例子

首先加载并启动模拟:

load_system('myModel')
set_param('myModel','SimulationCommand','Start');
要读取simulink模型任意行上的数据:

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

  • 然后获取该块的第一个(或任何)输出端口(或输入)上的数据

    time = rto.OutputPort(1).Data;
    
  • 您可以在计时器回调中进行读取


    这也可能有帮助:

    在模拟过程中的任何时候,您都可以强制Simulink将模拟输出数据写入工作区:

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

    您是否将数据发送到Matlab程序或其他程序,如Excel或其他程序?如果是的话,还有什么程序?我正在向Proteus发送数据,因为我想在微芯片上写一些命令来控制simulink中的块。我知道,在模拟过程中,当simulink设置为外部模式(不确定其他模式)时,可以使用cammand在simulink线路上获取数据。您可以设置一个计时器(与simulink的频率相同),并在其
    回调中执行此操作
    @pm89谢谢~这是我可以尝试的方法!我想在simulink(实际上是simmechanics)中使用Porteus中的微芯片作为控制器来控制机器人手臂。那么,这是不可能实现的吗?我不理解Simulink是一个非实时模拟器的含义~运行MATLAB/Simulink的操作系统都不是实时的。除其他外,这意味着1个模拟时间单位(几乎可以肯定)不等于1个实时单位。Simulink中的时钟可能会说它已经运行了10秒,但墙上的时钟可能会说小于10秒或大于10秒(取决于模型的复杂性)。除非您只需要较慢的采样率,并且不关心性能保证,否则对于实时控制,您需要将模型转换为C(使用Simulink编码器),然后在实时操作系统上编译并运行该代码。您可以始终使用Simulink将实时数据流传输到控制器来测试逻辑,只要考虑一下,这不是实时的。可以测试主逻辑,但不可能执行关键计时任务(例如,中断期间发生的事件的反应时间(以微秒为单位)尽管这会获得一些数据,但计时器在MATLAB中工作,与Simulink模拟时间无关,因此,无法保证在您可能需要的模拟时间获取数据。我确实同意您的观点@PhilGoddard,但我发现这是唯一的方法。但是,有一些解决方法和肮脏的技巧可以防止丢失任何数据,例如增加计时器频率(以减少丢失任何数据的机会)和在simulink中设置计数器(以防止两次获取相同的数据并在任何数据丢失或未丢失时进行扫描)。这些解决方法不会防止丢失数据。他们可能会帮助减少数据丢失,但他们不能保证您不会丢失任何数据。这就是我要找的!也可以在实时模拟期间工作。
    set_param(bdroot,'SimulationCommand','WriteDataLogs');