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

rryofs0p  于 6个月前  发布在  Matlab
关注(0)|答案(1)|浏览(83)

Simulink中的显示块在仿真过程中根据输入信号动态更改其图标(它显示输入信号值)。我想创建一个自己的块,它做同样的事情。当输入信号变为非零时,从红色切换到绿色背景就足够了。编程图标是微不足道的,问题是如何强制重新绘制图标,比如说,每隔0.1s或当输入改变时。
我试过...

  • 看 Jmeter 板块。但我没有找到如何写我自己的。那些有是不够的。它似乎也不能有输入。
  • 我屏蔽了一个Display块,并在屏蔽图标脚本中根据输入更改了图标。旧的Display图标在我的屏蔽图标上绘制,并在信号更改时更新。屏蔽图标不会更新/重绘。
  • 我注意到当你改变块参数时,块图标似乎会更新/重绘。目前,我正在考虑以编程方式将人工参数设置为输入值以强制更新,但我不确定如何最好地做到这一点/如果这将工作。

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

liwlm1x9

liwlm1x91#

注解中指出的MultiStateImage块没有灵活性,无法对块图标执行任何操作。
我不知道一个MATLAB命令来触发Simulink界面的重绘,包括图标。然而,有一个技巧可以让你实现你想要的:创建一个MATLAB函数,将块的名称设置为当前名称。您可能需要coder.extrinsic('set_param');coder.extrinsic('get_param');。此外,您需要知道块ID(如MyModel/MyBlock。根据我的经验,更改函数的名称会触发图标的重绘,因此在每个时间戳/采样时间执行此操作可以刷新显示的图标。我在Simulink 2023 b上测试了这种方法。

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。x1c 0d1x
提示:如果你只是想显示,你的MATLAB函数也可以被屏蔽,这样你就可以避免不必要的块。
我还记得在每个模拟步骤中添加回调的可能性;这可以避免需要MATLAB函数。然而,我在新版本中找不到回调,所以要么他们删除了它,要么我记错了。

相关问题