我有一个Simulink模型,它使用嵌入式MATLAB函数作为块,我无法弄清楚如何在嵌入式MATLAB块和GUI之间实时移动数据(即模型是运行)。我试图在我的模型中实现“to workspace”块,但我不知道如何正确使用它。
有谁知道如何将数据从Simulink块实时移动到GUI中?
答案 0 :(得分: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
返回空 处理。当你停止或暂停时 model,所有现有句柄 运行时对象变空。
因此,循环或计时器例程必须首先检查RuntimeObject是否存在,然后停止(如果不存在)或从中获取数据(如果存在)。我不确定完全如何检查是否存在RuntimeObject,但我相信你会检查对象是否为空或者对象的BlockHandle属性是否为空: / p>
isempty(rto) % Check if the RuntimeObject is empty
%OR
isempty(rto.BlockHandle) % Check if the BlockHandle property is empty
答案 1 :(得分:0)
从你的回答中,我猜你想在模拟运行时看到结果,这是正确的吗? blinkdagger.com教程允许您在模拟完成后查看模拟结果,但不能在模拟运行时查看模拟结果。你基本上想要在你的GUI中嵌入类似于范围块的东西吗?
有几种方法可以做到这一点,最好的方法是使用EML块的runtime object。如果使用它,您应该能够在运行时查看EML块的输出。