人在仿真软件万博1manbetx

万博1manbetx仿真软件和基于模型的设计

Simulink.findBlocks创建一个匹配滤波器万博1manbetx

一段时间以前,我出版了一本 帖子 鼓励你使用 万博1manbetxSimulink.findBlocks 而不是 find_system 。本周,我将把这一点进一步展示了如何创建一个自定义匹配滤波器来完成高级搜索。

介绍

如果您不熟悉创建匹配过滤器 万博1manbetxSimulink.findBlock ,我建议第一次经历这些文档链接得到基本的:
简而言之,一个匹配滤波器是一个函数作为输入 块处理 并返回一个正确或错误的值指示如果块应该被包括在搜索结果。

这个问题

最近,我有一个请求比例子稍微复杂的东西在上面的链接中,我认为这将是有趣的分享。我收到的问题是比这更复杂,但是可以近似:
如何找到的所有块内部活跃的变种,而不是类型的轮廓尺寸,外港或子系统?
为了说明这一点,让我们使用的模型包括在航运的例子 使用变体子系统实现变化在不同的层次结构 ,您可以打开在MATLAB通过执行:
openExample ('万博1manbetx仿真软件/ VariantSubsystemsExample ')
模型是什么样子:

解决方案

这里我想强调的技术相结合是一个内置的过滤器 万博1manbetxSimulink.match.activeVariants 使用自定义的逻辑。更具体地说:
  • 使用修剪内置过滤器的输出万博1manbetxSimulink.match.activeVariants消除所有的块内不活跃的变体
  • 过滤掉不受欢迎的类型的块
这个结果在这场比赛中过滤功能:
函数(匹配,修剪)= myFilter(黑色)
% %步骤1:
%如果块在一个活跃的变体,如果它修剪
(匹配,修剪)= Simulink万博1manbetx.match.activeVariants(黑色);
如果(修剪)| |不是(匹配)
%不过程块在不活跃的变体。“删除”
%标志会告诉仿真软件。万博1manbetxfindBlocks跳过所有块内部子系统不活跃的变体
返回;
结束
% %步骤2:
%还真只有指定的块类型不匹配任何non-desired类型
匹配= false;
unwantedBlocktypes = {“尺寸”,“输出港”,“子系统”};
blkType = get_param(黑色,“BlockType”);
如果没有(任何(strcmp (blkType unwantedBlocktypes)))
匹配= true;
结束
我们可以测试匹配过滤功能:
选择= Sim万博1manbetxulink.FindOptions;
选择。MatchFilter = @myFilter;
VSS_MODE = 1;
set_param (“sldemo_variant_subsystems”,“SimulationCommand”,“更新”);
黑色= Sim万博1manbetxulink.findBlocks (“sldemo_variant_subsystems /控制器”、选择);
getfullname(黑色)
ans = 2×1细胞
“sldemo_variant_subsystems /控制器/线性控制器/添加”
“sldemo_variant_subsystems /控制器/线性控制器/ DiscreteTransfer…
让我们改变积极的变异和确认它返回不同的块:
VSS_MODE = 2;
set_param (“sldemo_variant_subsystems”,“SimulationCommand”,“更新”);
黑色= Sim万博1manbetxulink.findBlocks (“sldemo_variant_subsystems /控制器”、选择);
getfullname(黑色)
ans = 2×1细胞
“sldemo_variant_subsystems /控制器/非线性控制器/一维查找表的
“sldemo_variant_subsystems /控制器/非线性控制器/添加”

现在轮到你了

使用类似的方法,可以产生任何复杂的逻辑。
你创建自定义为Simulink.findBlocks匹配过滤器吗?万博1manbetx如果有,让我们知道你是什么样的搜索在下面评论。
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。