我有一个 Simulink 模型,该模型将嵌入式 MATLAB 函数用于块,但我无法弄清楚如何在嵌入式 MATLAB 块和 GUI 之间实时移动数据(即在模型运行时)。我试图在我的模型中实现一个“到工作区”块,但我不知道如何正确使用它。
有谁知道如何将数据从 Simulink 模块实时移动到 GUI 中?
我有一个 Simulink 模型,该模型将嵌入式 MATLAB 函数用于块,但我无法弄清楚如何在嵌入式 MATLAB 块和 GUI 之间实时移动数据(即在模型运行时)。我试图在我的模型中实现一个“到工作区”块,但我不知道如何正确使用它。
有谁知道如何将数据从 Simulink 模块实时移动到 GUI 中?
非实时解决方案:
如果您想在 GUI 中设置参数,使用这些参数模拟模型,然后在 GUI 中显示模拟输出,blinkdagger.com上有一个很好的教程。他们描述的一种解决方案是使用SIMSET函数来定义 Simulink 模型与之交互的工作区。您应该能够取代基本工作区,以便将数据发送到和从调用 Simulink 模型的 GUI 函数的工作区发送。
实时解决方案
正如MikeT所建议的,您可以使用RuntimeObject。您首先必须使用get_param函数从块中获取 RuntimeObject:
rto = get_param(obj,'RuntimeObject');
whereobj
是块路径名或块对象句柄。您可以使用GCB函数获取最近选择的块的路径名(在这种情况下,您可以用 替换obj
)gcb
。然后,您可以使用以下内容获取块的输出:
blockData = rto.OutputPort(1).Data
文档中的另一个警告:
要确保 Data 字段包含正确的模块输出,请在Configuration Parameters对话框的Optimization窗格中关闭 Signal storage reuse选项(请参阅 Signal storage reuse) 。
您可能最终会在您的 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
根据您的回答,我猜您想在模拟运行时查看结果,对吗?blinkdagger.com 教程可让您在完成后查看模拟结果,但不能在运行时查看。您基本上想在您的 GUI 中嵌入类似范围块的东西吗?
有几种方法可以做到这一点,最好的可能是使用 EML 块的运行时对象。如果您使用它,您应该能够在 EML 块运行时查看它的输出。