具有动态变化图标的类似显示的 Simulink 模块

问题描述 投票:0回答:1

Simulink 中的 Display 模块会在仿真过程中根据输入信号动态更改其图标(显示输入信号值)。我想创建一个自己的块来执行相同的操作。当输入信号变为非零时,从红色背景切换到绿色背景就足够了。对图标进行编程很简单,问题是如何强制重新绘制图标,例如每 0.1 秒或当输入更改时。

我尝试过...

  • 查看仪表板块。但我没有找到如何写自己的。现有的还不够。他们似乎也无法提供意见。
  • 我屏蔽了一个显示块,并根据输入在屏蔽图标脚本中更改了图标。旧的显示图标会覆盖我的遮罩图标,并在信号发生变化时更新。蒙版图标不会更新/重新绘制。
  • 我注意到当您更改块参数时,块图标似乎会更新/重新绘制。目前,我正在考虑以编程方式为输入值设置一个人工参数以强制更新,但我不确定如何最好地做到这一点/是否可行。

最好知道这是如何在 Display 中完成的,因为这个块(以及该功能)可能会永远存在。

matlab simulink mex
1个回答
0
投票

注释中指出的 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,所以要么他们删除了它,要么我记错了。

© www.soinside.com 2019 - 2024. All rights reserved.