find_mdlrefs
在模型层次结构中查找引用模型和 Model 模块
说明
[
使用一个或多个名称-值对组提供其他搜索选项。例如,要保持模型处于已加载状态而不是临时加载,请将 models
,blocks
] = find_mdlrefs(system
,Name,Value
)KeepModelsLoaded
设置为 true
。
示例
在模型层次结构中查找引用模型
查找指定的模型所引用的所有模型的引用模型和 Model 模块。
load_system('sldemo_mdlref_basic'); [myModels,myModelBlks] = find_mdlrefs('sldemo_mdlref_basic')
myModels = 2x1 cell
{'sldemo_mdlref_counter'}
{'sldemo_mdlref_basic' }
myModelBlks = 3x1 cell
{'sldemo_mdlref_basic/CounterA'}
{'sldemo_mdlref_basic/CounterB'}
{'sldemo_mdlref_basic/CounterC'}
在模型层次结构中查找并加载所有模型
默认情况下,find_mdlrefs
函数加载并关闭尚未加载的模型。
打开包含 sldemo_mdlref_depgraph
模型的工程。
openProject('ModelReferenceHierarchy');
此工程打开 sldemo_mdlref_depgraph
模型。
要识别加载的模型,请使用 find_system
函数。
find_system('type','block_diagram')
ans = 2x1 cell
{'simulink_extras' }
{'sldemo_mdlref_depgraph'}
要查找模型层次结构中的所有模型,请使用 find_mdlrefs
函数。
find_mdlrefs('sldemo_mdlref_depgraph')
ans = 7x1 cell
{'sldemo_mdlref_heat2cost' }
{'sldemo_mdlref_house' }
{'sldemo_mdlref_F2C' }
{'sldemo_mdlref_outdoor_temp'}
{'sldemo_mdlref_thermostat' }
{'sldemo_mdlref_heater' }
{'sldemo_mdlref_depgraph' }
要识别保持加载状态的模型,请使用 find_system
函数。
find_system('type','block_diagram')
ans = 2x1 cell
{'simulink_extras' }
{'sldemo_mdlref_depgraph'}
只有先前加载的模型保持加载状态。
要查找并加载模型层次结构中的所有模型,请使用 find_mdlrefs
函数,并将 KeepModelsLoaded
设置为 true
。
find_mdlrefs('sldemo_mdlref_depgraph','KeepModelsLoaded',true); find_system('type','block_diagram')
ans = 8x1 cell
{'sldemo_mdlref_thermostat' }
{'sldemo_mdlref_heater' }
{'sldemo_mdlref_F2C' }
{'sldemo_mdlref_outdoor_temp'}
{'sldemo_mdlref_house' }
{'sldemo_mdlref_heat2cost' }
{'simulink_extras' }
{'sldemo_mdlref_depgraph' }
顶层模型和所有引用模型保持加载状态。加载所有引用模型后,您可以在模型层次结构中导航,而无需在打开时等待加载每个引用模型。
使用自定义函数过滤引用模型搜索
结合使用 MatchFilter 参量和自定义过滤器函数来查找为其定义 InitFcn
回调的所有 Model 模块。
自定义函数是在文件 initFcnMdlBlocks.m
中定义的。
function match = initFcnMdlBlocks(handle) match = ~isempty(get_param(handle,'InitFcn')); end
提供函数句柄作为 MatchFilter
参量的值。
load_system('slexVariantMdlRefCondProp'); [models,blocks] = find_mdlrefs('slexVariantMdlRefCondProp','MatchFilter',@initFcnMdlBlocks);
使用变体的内置过滤器函数过滤引用模型搜索
Simulink.match.activeVariants
查找模型编译后在仿真中活动的变体模块。
model1='slexVariantMdlRefCondProp'; load_system(model1); set_param(model1,'SimulationCommand','update'); [models,blocks] = find_mdlrefs(model1,'MatchFilter',@Simulink.match.activeVariants);
Simulink.match.codeCompileVariants
查找模型编译后生成的 C 代码中的变体选择项。
assignin('base','VSS_MODE',2); slexVariantMdlRefCondProp([],[],[],'compileForCodegen');
### Searching for referenced models in model 'slexVariantMdlRefCondProp'. ### Found 2 model reference targets to update. ### Starting serial model reference code generation build. ### Starting build procedure for: slexVariantMdlRefCondProp_sub1 ### Successful completion of build procedure for: slexVariantMdlRefCondProp_sub1 ### Starting build procedure for: slexVariantMdlRefCondProp_sub2 ### Successful completion of build procedure for: slexVariantMdlRefCondProp_sub2 Build Summary Model reference code generation targets: Model Build Reason Status Build Duration ====================================================================================================================================== slexVariantMdlRefCondProp_sub1 Target (slexVariantMdlRefCondProp_sub1.c) did not exist. Code generated and compiled. 0h 0m 19.027s slexVariantMdlRefCondProp_sub2 Target (slexVariantMdlRefCondProp_sub2.c) did not exist. Code generated and compiled. 0h 0m 10.335s 2 of 2 models built (0 models already up to date) Build duration: 0h 0m 32.347s
[models,blocks] = find_mdlrefs(model1,... 'MatchFilter',@Simulink.match.codeCompileVariants); slexVariantMdlRefCondProp([],[],[],'term');
Simulink.match.allVariants
查找所有模块,而不管该模块是否因变体而处于活动或非活动状态。
[models,blocks] = find_mdlrefs(model1,'MatchFilter',@Simulink.match.allVariants);
Simulink.match.legacy.filterOutCodeInactiveVariantSubsystemChoices
查找在仿真中处于活动状态或在编辑时作为生成代码一部分的可变子系统模块选择项。有关编辑时过滤器的限制的信息,请参阅 MatchFilter。
model2='sldemo_mdlref_variants'; load_system(model2); [models,blocks] = find_mdlrefs(model2, ... 'MatchFilter',@Simulink.match.legacy.filterOutCodeInactiveVariantSubsystemChoices)
Simulink.match.legacy.filterOutInactiveVariantSubsystemChoices
查找在编辑时处于活动状态的可变子系统模块选择项。有关编辑时过滤器的限制的信息,请参阅 MatchFilter。
[models,blocks] = find_mdlrefs(model2, ... 'MatchFilter',@Simulink.match.legacy.filterOutInactiveVariantSubsystemChoices)
输入参数
system
— 系统名称、模块路径或句柄
字符向量 | 字符串标量 | 数值标量
系统名称、模块路径或句柄,指定为字符向量、字符串标量或数值标量。
系统必须为 SLX 文件、MDL 文件、Model 模块或 Subsystem 模块。
如果指定文件名,请不要包含文件扩展名。
数据类型: double
| char
| string
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: refModels = find_mdlrefs(topmodel,'KeepModelsLoaded',true,'ReturnTopModelAsLastElement',false)
KeepModelsLoaded
— 保持模型处于已加载状态的选项
false
或 0
(默认) | true
或 1
保持模型处于已加载状态的选项,指定为以逗号分隔的对组,其中包含 'KeepModelsLoaded'
和数值或逻辑值 1
(true
) 或 0
(false
)。
默认情况下,该函数加载并关闭尚未加载的模型。要保持模型处于已加载状态,请将此参量设置为 true
。如果您计划在找到模型后与模型进行交互,则保持模型处于已加载状态会很有用。
数据类型: logical
AllLevels
— 要搜索的层级
true
或 1
(默认) | false
或 0
要搜索的级别,指定为由 'AllLevels'
和数值或逻辑值 1
(true
) 或 0
(false
) 组成的以逗号分隔的对组。
true
- 搜索指定system
的模型层次结构中的所有 Model 模块。false
- 仅搜索顶层系统。
数据类型: logical
IncludeProtectedModels
— 包含受保护模型的选项
false
或 0
(默认) | true
或 1
在搜索结果中包含受保护模型的选项,指定为以逗号分隔的对组,其中包含 'IncludeProtectedModels'
和数值或逻辑值 1
(true
) 或 0
(false
)。
此设置只影响返回的引用模型列表;它不影响返回的 Model 模块列表。
数据类型: logical
IncludeCommented
— 用于指示是否包含带注释的模块的选项
false
或 0
(默认) | true
或 1
在搜索结果中包含带注释的模块的选项,指定为以逗号分隔的对组,其中包含 'IncludeCommented'
和数值或逻辑值 1
(true
) 或 0
(false
)。
数据类型: logical
CaseSensitive
— 搜索时匹配大小写的选项
true
(默认) | false
搜索时匹配大小写的选项,对于区分大小写的搜索指定为 true
,对于不区分大小写的搜索指定为 false
。
数据类型: logical
FollowLinks
— 跟随库链接的搜索选项
true
(默认) | false
跟随库链接的搜索选项,指定为 true
或 false
。如果为 true
,搜索将跟随链接进入库模块。
数据类型: logical
LookUnderMasks
— 搜索封装模块的选项
'all'
(默认) | 'none'
| 'functional'
| 'graphical'
搜索封装模块的选项,指定为:
'all'
- 在所有封装模块中搜索。'none'
- 防止在封装系统中搜索。'functional'
- 包括没有对话框的封装子系统。'graphical'
- 包括没有工作区或对话框的封装子系统。
数据类型: char
| string
MatchFilter
— 在搜索中匹配和过滤元素的选项
函数句柄
用于在搜索中匹配和过滤元素(如模块、系统、信号线、端口和注释)的选项,指定为函数句柄。使用 MatchFilter
确定在搜索中应包括还是跳过元素。
参量:
允许您使用自定义过滤器函数过滤元素
在过滤器不匹配时避免处理元素
对模块、信号线或注释应用复杂过滤器,以在内部过滤结果
命名函数必须在 MATLAB® 程序文件中定义。该函数将元素的句柄作为输入,并返回两个输出。
function [match, prune] = func(element)
输入
element
是要处理的模块的句柄。第一个输出
match
是逻辑值。如果为false
,搜索将跳过该元素。第二个输出
prune
是可选的逻辑值,仅在element
是子系统时适用。默认值为false
。如果此值设置为true
,则搜索中将忽略整个子系统。
变体:Simulink® 提供这些内置的匹配过滤器函数来查找变体模块。
编译后过滤器函数:
Simulink.match.activeVariants
- 过滤器函数,用于查找模型编译后在仿真中处于活动状态的模块。Simulink.match.codeCompileVariants
- 过滤器函数,用于查找在模型编译后作为生成代码一部分的模块。Simulink.match.allVariants
- 用于查找所有模块的过滤器函数,而不管该模块是否因变体而处于活动或非活动状态。
注意
为了获得正确的结果,在使用 Simulink.match.activeVariants
和 Simulink.match.codeCompileVariants
过滤器之前,您必须编译模型。如果模型未编译,这些过滤器将返回模型中的所有模块。有关比较这些滤波器的编译前和编译后时间结果的示例,请参阅Compare Pre-Compile and Post-Compile Behavior of Match Filters for Variant Blocks。
Variant Subsystem 模块的编辑时过滤器函数:
Simulink.match.legacy.filterOutCodeInactiveVariantSubsystemChoices
- 用于查找 Variant Subsystem 模块选择项的过滤器函数,这些模块选择项在仿真中处于活动状态或者作为生成代码的一部分。此函数产生的结果与Variants
参量的'ActivePlusCodeVariants'
选项类似。Simulink.match.legacy.filterOutInactiveVariantSubsystemChoices
- 查找处于活动状态的 Variant Subsystem 模块选择项的过滤器函数。此函数产生的结果与Variants
参量的'ActiveVariants'
选项类似。
编辑时过滤器的限制:
过滤器不使用 CompiledVariantInfo 模块参数中的编译后模块活动性信息。
过滤器仅适用于具有以下模块参数设置的 Variant Subsystem 模块:
变体控制项模式设置为表达式或标签
将条件传播到可变子系统之外设置为
off
仅在
find_system
、find_mdlrefs
和Simulink.FindOptions
的上下文中使用时,过滤器才能识别模块句柄是否在 Variant Subsystem 的活动选择项内。
要对所有类型的变体模块进行操作,请在模型编译后使用 Simulink.match.codeCompileVariants
或 Simulink.match.activeVariants
过滤器。
Variants
— 包含变体模型的选项
'ActivePlusCodeVariants'
(默认) | 'ActiveVariants'
| 'AllVariants'
注意
Variants
参量将被删除。请改用 MatchFilter
。有关详细信息,请参阅 版本历史记录。
在搜索结果中包含变体模型的选项,指定为以逗号分隔的对组,其中包含 'Variants'
和 'ActivePlusCodeVariants'
、'ActiveVariants'
或 'AllVariants'
。
'ActivePlusCodeVariants'
- 包括 Variant Subsystem 中所有在仿真中处于活动状态并且是所生成代码一部分的变体模型。'ActiveVariants'
- 包括 Variant Subsystem 模块中的活动变体模型。'AllVariants'
- 包括 Variant Subsystem 模块中的所有变体模型。
此搜索约束仅适用于变体控制项模式设置为 expression
或 label
的 Variant Subsystem 模块。将 find_mdlrefs
函数与 MatchFilter
选项结合使用,可对所有类型的变体模块进行操作。
数据类型: char
| string
ReturnTopModelAsLastElement
— 包含指定系统的选项
true
或 1
(默认) | false
或 0
在搜索结果中包含指定系统的选项,指定为以逗号分隔的对组,其中包含 'ReturnTopModelAsLastElement'
和数值或逻辑值 1
(true
) 或 0
(false
)。
默认情况下,返回的引用模型列表中的最后一个元素是您用 system
参量指定的模型、库或子系统文件的名称。如果指定模块,最后一个元素是包含该模块的文件的名称。
数据类型: logical
输出参量
版本历史记录
在 R2006a 之前推出R2022b: 删除 Variants
参量时会发出警告
由于以后的版本中会删除 Variants
参量,因此引入了以下警告:
当您使用不带
Variants
参量的find_mdlrefs
函数时,如果该函数在搜索过程中跳过 Variant Subsystem 模块的非活动选择项,则会生成警告。以包含一个 Variant Model 模块的模型为例,该模型有两个变体选择项
Mdl_Linear_Controller
和Mdl_NonLinear_Controller
。Mdl_NonLinear_Controller
模块是活动选择项。此命令会跳过非活动的
Mdl_Linear_Controller
模块并生成警告。[myModels,myModelBlks] = find_mdlrefs... ('sldemo_variant_subsystems_modelblocks')
Warning: Using find_mdlrefs without the 'Variants' argument skips inactive Variant Subsystem blocks in the search. This behavior will change in a future release to look at all choices of the Variant Subsystem. To find blocks that are active in simulation or code generation, compile the model and use the built-in variant filters with the 'MatchFilter' option. myModels = 2×1 cell array {'mdlref_nonlinear_controller' } {'sldemo_variant_subsystems_modelblocks'} myModelBlks = 1×1 cell array {'sldemo_variant_subsystems_modelblocks/Controller/Mdl_NonLinear_Controller'}
当您使用
Variants
参量且其值设置为'AllVariants'
时,该函数会生成警告。[myModels,myModelBlks] = find_mdlrefs... ('sldemo_variant_subsystems_modelblocks','Variants','AllVariants')
Warning: 'Variants' will be removed. Instead of using 'Variants' with value set to 'AllVariants', use 'MatchFilter' with value set to @Simulink.match.allVariants. myModels = 3×1 cell array {'Linear_Controller' } {'Nonlinear_Controller' } {'sldemo_variant_subsystems_modelblocks'} myModelBlks = 2×1 cell array {'sldemo_variant_subsystems_modelblocks/Controller/Linear Controller' } {'sldemo_variant_subsystems_modelblocks/Controller/Nonlinear Controller'}
R2022a: 新的内置匹配过滤器可用于查找所有变体模块
您可以使用内置的匹配过滤器 Simulink.match.allVariants
来查找变体模型中的所有模块,而不管该模块由于变体而处于活动状态还是非活动状态。此滤波器是 AllVariants
选项的推荐替代项。
将删除 | 推荐的替代项 |
---|---|
find_mdlrefs(model,'Variants','AllVariants'); | find_mdlrefs(model,'MatchFilter', ... @Simulink.match.allVariants); |
R2021a: 在具有变体模块的模型中,Variants
和 MatchFilter
参量的默认行为已更改
Variants
:当您使用不带Variants
参量的find_mdlrefs
函数时,对于 Variant Subsystem 模块,默认情况下,该函数当前仅在搜索中包括那些在仿真或代码生成期间处于活动状态的选择项。对于 Variant Source、Variant Sink 或 Variant Subsystem 等其他变体模块,如果将条件传播到可变子系统之外参数设置为
on
,该函数将在搜索中包括所有选择项。以包含一个 Variant Model 模块的模型为例,该模型有两个变体选择项
Mdl_Linear_Controller
和Mdl_NonLinear_Controller
。此命令仅返回模型中的活动 Model 模块。
[myModels,myModelBlks] = find_mdlrefs... ('sldemo_variant_subsystems_modelblocks')
myModels = 2×1 cell array {'mdlref_nonlinear_controller' } {'sldemo_variant_subsystems_modelblocks'} myModelBlks = 1×1 cell array {'sldemo_variant_subsystems_modelblocks/Controller/Mdl_NonLinear_Controller'}
MatchFilter
:当您使用带MatchFilter
参量的find_mdlrefs
函数时,默认情况下,该函数会对活动和非活动变体选择项应用过滤器。以包含一个 Variant Model 模块的模型为例,该模型有两个变体选择项
Mdl_Linear_ Controller
和Mdl_NonLinear_Controller
。过滤器函数initFcnMdlBlocks
查找设置了InitFcn
回调的所有 Model 模块。function match = initFcnMdlBlocks(handle) match = ~isempty(get_param(handle, 'InitFcn')); end
以下命令返回模型中的活动和非活动 Model 模块。
[myModels,myModelBlks] = find_mdlrefs('sldemo_variant_subsystems_modelblocks',... 'MatchFilter', @initFcnMdlBlocks)
myModels = 3×1 cell array {'mdlref_linear_controller' } {'mdlref_nonlinear_controller' } {'sldemo_variant_subsystems_modelblocks'} myModelBlks = 2×1 cell array {'sldemo_variant_subsystems_modelblocks/Controller/Mdl_Linear_Controller' } {'sldemo_variant_subsystems_modelblocks/Controller/Mdl_NonLinear_Controller'}
R2021a: Variants
参量将被删除
在以后的版本中,将从 find_mdlrefs
中删除 Variants
参量。使用 Variants
参量的函数调用会继续工作,但会出现警告。
使用带 Variants
参量的 find_mdlrefs
函数会产生不一致的搜索结果。find_mdlrefs
函数在编辑时运行,但要确定模块在具有所有类型的变体模块的模型中是否处于活动状态,您需要编译该模型。
要查找在仿真或代码生成过程中处于活动状态的 Model 模块,请编译模型并使用带 MatchFilter
参量的 find_mdlrefs
函数。
下表列出了 Variants
参量的不同值的建议替代项。
将删除 | 推荐的替代项 |
---|---|
find_mdlrefs(model,'Variants', ... 'ActiveVariants'); | set_param(model,'SimulationCommand','update'); find_mdlrefs(model,'MatchFilter', ... @Simulink.match.activeVariants); |
find_mdlrefs(model,'Variants', ... 'ActivePlusCodeVariants'); | model([],[],[],'compileForCodegen'); [models,blocks] = find_mdlrefs(model,'MatchFilter', ... @Simulink.match.codeCompileVariants); model([],[],[],'term'); |
使用 find_system
函数时,不能同时指定 MatchFilter
和 Variants
参量。
以下命令会生成错误。
find_mdlrefs(bdroot,'MatchFilter',@Simulink.match.activeVariants,... 'Variants','ActiveVariants');
R2020b: 在搜索过程中使用 MatchFilter
过滤元素
要在搜索过程中匹配和过滤模型元素,您可以定义自定义过滤器函数,并将函数句柄作为值传递给 MatchFilter
名称-值参量。
要查找在仿真中处于活动状态或作为生成代码一部分的变体模块,您可以在编译模型后使用内置的匹配过滤器函数 Simulink.match.activeVariants
、Simulink.match.codeCompileVariants
和 Simulink.match.allVariants
。
R2020b: 不推荐将逻辑值指定为 find_mdlrefs
的第二个参量
find_mdlrefs
函数提供两种方法来指定是否搜索模型层次结构的所有级别。这两种方法给出相同的结果,但只有名称-值对组方法允许您指定附加选项。
使用 AllLevels
名称-值对组,而不是使用逻辑值作为第二个参量来指定是否搜索模型层次结构的所有级别。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)