Simulink 中的 Display 模块会在仿真过程中根据输入信号动态更改其图标(显示输入信号值)。我想创建一个自己的块来执行相同的操作。当输入信号变为非零时,从红色背景切换到绿色背景就足够了。对图标进行编程很简单,问题是如何强制重新绘制图标,例如每 0.1 秒或当输入更改时。
我尝试过...
最好知道这是如何在 Display 中完成的,因为这个块(以及该功能)可能会永远存在。
注释中指出的 MultiStateImage 块无法灵活地使用块图标执行任何您想要的操作。
我不知道 MATLAB 命令可以触发 Simulink 界面的重绘,包括图标。然而,有一个技巧可以让您实现您想要的目的:创建一个 MATLAB 函数,将块的名称设置为其当前名称。您可能需要
coder.extrinsic('set_param');
和 coder.extrinsic('get_param');
。此外,您需要知道块 ID(类似于 MyModel/MyBlock
)。根据我的经验,更改函数名称会触发图标的重新绘制,因此在每个时间戳/采样时间执行此操作可以让您刷新显示的图标。我在 Simulink 2023b 上测试了这种方法。
function updateBlocks()
coder.extrinsic('set_param');
coder.extrinsic('get_param');
blocks = {'untitled/Sin'};
for j=1:numel(blocks)
set_param(blocks{j}, 'Name', get_param(blocks{j}, 'Name'));
end
但是,为了根据输入信号实际更改图标,您应该将图标的代码设置为如下所示:
rto = get_param(gcb, 'RunTimeObject');
if numel(rto)>0
inputPort = rto.InputPort(1);
inputValue = inputPort.Data;
fprintf("Block value is %d", inputValue);
else
fprintf("Block uninitialized");
end
基本上,您获取模拟对象、其输入端口并检索值。 if 条件避免了模拟未运行时出现警告(因为还没有运行时对象与该模块关联)。
这是显示结果的 GIF。我使用了一个用蒙版图标伪装的正弦块。一开始我单步执行模拟,然后让它运行并且图标正在更新。我怀疑更新率有一定的限制,因为当前的模拟运行了大约 1000 步,但我只显示了一堆值。对于较慢的模拟,这不是问题,但我认为您无法以任何方式在更新时实现快速 FPS。
提示:如果您只想显示,您的 MATLABFunction 也可以被屏蔽,这样您就可以避免不必要的块。
我还记得可以在每个模拟步骤添加回调;这可以避免需要 MATLABFunction。但是,我在新版本中找不到 Callback,所以要么他们删除了它,要么我记错了。