我有一个Simulink模型,它使用嵌入式MATLAB函数作为块,我无法弄清楚如何在嵌入式MATLAB块和GUI之间实时移动数据(即在模型运行时) . 我试图在我的模型中实现“to workspace”块,但我不知道如何正确使用它 .
有谁知道如何将数据从Simulink块实时移动到GUI中?
Non-real-time solution:
如果要在GUI中设置参数,使用这些参数模拟模型,然后在GUI中显示模拟输出,那么blinkdagger.com上有一个很好的教程 . 他们描述的一种解决方案是使用SIMSET函数来定义Simulink模型与之交互的工作空间 . 您应该能够supersede the base workspace,以便将数据发送到调用Simulink模型的GUI函数的工作空间 .
Real-time solution
根据MikeT的建议,您可以使用RuntimeObject . 首先必须使用get_param函数从块中获取RuntimeObject:
rto = get_param(obj,'RuntimeObject');
其中 obj 是块路径名或块对象句柄 . 您可以使用GCB函数获取最近选择的块的路径名(在这种情况下,您可以将 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
从你的回答中,我猜你想在模拟运行时看到结果,这是正确的吗? blinkdagger.com教程允许您在模拟完成后查看模拟结果,但不能在模拟运行时查看模拟结果 . 你基本上想要在你的GUI中嵌入类似于范围块的东西吗?
那里's a few ways to do this, the best is probably using the EML block' s runtime object . 如果使用它,您应该能够在运行时查看EML块的输出 .
2 回答
Non-real-time solution:
如果要在GUI中设置参数,使用这些参数模拟模型,然后在GUI中显示模拟输出,那么blinkdagger.com上有一个很好的教程 . 他们描述的一种解决方案是使用SIMSET函数来定义Simulink模型与之交互的工作空间 . 您应该能够supersede the base workspace,以便将数据发送到调用Simulink模型的GUI函数的工作空间 .
Real-time solution
根据MikeT的建议,您可以使用RuntimeObject . 首先必须使用get_param函数从块中获取RuntimeObject:
其中
obj
是块路径名或块对象句柄 . 您可以使用GCB函数获取最近选择的块的路径名(在这种情况下,您可以将obj
替换为gcb
) . 然后,您可以使用以下内容获取块的输出:文档中的另一个警告:
您可能最终会在GUI中运行循环或计时器例程,只要模拟正在运行,就会连续从RuntimeObject获取输出数据 . 文件还说明:
因此,您的循环或计时器例程必须首先检查RuntimeObject是否存在,并且要么停止(如果它不确定如何检查是否存在RuntimeObject,但我相信您要么检查对象是否为空或者如果对象的BlockHandle属性为空:
从你的回答中,我猜你想在模拟运行时看到结果,这是正确的吗? blinkdagger.com教程允许您在模拟完成后查看模拟结果,但不能在模拟运行时查看模拟结果 . 你基本上想要在你的GUI中嵌入类似于范围块的东西吗?
那里's a few ways to do this, the best is probably using the EML block' s runtime object . 如果使用它,您应该能够在运行时查看EML块的输出 .