【问题标题】:How do I get data from a Simulink block into a MATLAB GUI?如何将 Simulink 模块中的数据导入 MATLAB GUI?
【发布时间】:2010-10-08 03:35:38
【问题描述】:

我有一个 Simulink 模型,该模型将嵌入式 MATLAB 函数用于模块,但我无法弄清楚如何在嵌入式 MATLAB 模块和 GUI 之间实时移动数据(即当模型处于跑步)。我试图在我的模型中实现“到工作区”块,但我不知道如何正确使用它。

有人知道如何将数据从 Simulink 模块实时移动到 GUI 中吗?

【问题讨论】:

  • 请澄清...您尝试从 .m 文件中的模型读取参数,或者您尝试从 .m 文件中的模型设置参数是什么数据、什么值、什么参数。 m 文件,或者您是否尝试在模型中使用工作区变量? (或其他)
  • 非常感谢 jason 的快速回答...看,我有一个 simulink 模型,没有多少块,在这个模型中我使用嵌入式 matlab 函数...这对我来说是不可能的在我的 gui 中实时使用这个嵌入式 matlab 块的输入或输出。我试图在我的模型中实现一个“到工作区”块,并且我已经在模型中实时显示,但我不知道如何使用它,如何在我的 gui 中实现它,我可以使用这个值我的嵌入式功能的输入或输出。

标签: user-interface matlab simulink


【解决方案1】:

非实时解决方案:

如果您想在 GUI 中设置参数,使用这些参数模拟模型,然后在 GUI 中显示模拟输出,blinkdagger.com 上有一个很好的教程。他们描述的一种解决方案是使用SIMSET 函数来定义 Simulink 模型与之交互的工作区。您应该能够supersede the base workspace,以便将数据发送到和从调用 Simulink 模型的 GUI 函数的工作区。

实时解决方案

根据MikeT 的建议,您可以使用RuntimeObject。您首先必须使用 get_param 函数从块中获取 RuntimeObject:

rto = get_param(obj,'RuntimeObject');

其中obj 是块路径名或块对象句柄。您可以使用GCB 函数获取最近选择的块的路径名(在这种情况下,您可以将obj 替换为gcb)。然后,您可以使用以下内容获取块的输出:

blockData = rto.OutputPort(1).Data

文档中的另一个警告:

为了确保数据字段包含 正确的块输出,关闭 信号存储重用选项(请参阅 信号存储重用)上 配置参数对话框中的优化窗格。

您可能最终会在您的 GUI 中运行一个循环或一个计时器例程,只要模拟正在运行,它就会不断地从 RuntimeObject 获取输出数据。该文档还指出:

一个运行时对象只存在于 包含块的模型是 运行或暂停。如果模型是 停止,get_param 返回一个空 处理。当您停止或暂停一个 模型,所有现有的句柄 运行时对象变为空。

因此,您的循环或计时器例程必须首先检查 RuntimeObject 是否存在,然后停止(如果不存在)或从中获取数据(如果存在)。我不确定确切如何检查 RuntimeObject 是否存在,但我相信您要么检查对象是否为空,要么检查对象的 BlockHandle 属性是否为空:

isempty(rto)  % Check if the RuntimeObject is empty
%OR
isempty(rto.BlockHandle)  % Check if the BlockHandle property is empty

【讨论】:

  • 好的,但是不使用工作区就不能设置参数吗?我已经可以从我的 gui 设置“增益”块......我的意思是我可以使用滑块从我的 gui 设置块的常数。但我不知道如何从我的嵌入式 matlab 函数中获取值。一定有不使用工作空间的东西
  • 我认为这里发生了通信故障。你看过我在blinkdagger上链接的例子吗?这是您想要做的事情吗(在 GUI 中设置参数,使用这些参数模拟模型,然后在 GUI 中显示模拟输出)?
  • 我猜是这样,但我无法打开这个或者我只是不知道如何,我只能看到 52 cmets :s
  • 链接很容易错过。本教程有 4 页。在介绍之后和 cmets 之前,您应该会看到“Pages: 1 2 3 4”,每个数字都是指向教程页面的链接。
【解决方案2】:

根据您的回复,我猜您想在模拟运行时查看结果,对吗? blinkdagger.com 教程可让您在模拟完成后查看模拟结果,但不能在运行时查看。您基本上想在您的 GUI 中嵌入类似范围块的东西吗?

有几种方法可以做到这一点,最好的方法可能是使用 EML 块的runtime object。如果您使用它,您应该能够在 EML 块运行时查看它的输出。

【讨论】:

  • 是的,我想在模拟运行时使用 EML 的结果。有一个调用示例 ... rto = get_param(gcb,'RuntimeObject') ... 所以在我的例子中的语法只是 rto = get_param(gcb,'name_simulink_block') 其中 name_simulink_block 是我的 EML 的名称? ??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2013-05-06
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多