本文摘要:
主要介绍find_system()这个函数,包括函数的搜索原理,函数详细的参数介绍和常用的使用场景实例。
一个简单的例子
我们先来看一个简单的模型,然后我想找出这个模型中所有输入端口的名称。
那可以执行如下的命令:
obj_inport = find_system('first_order_filter_demo','BlockType','Inport')
运行结果如下:
其中,参数'first_order_filter_demo'是我们想要在哪个系统中去寻找,这里可以是模型名或子系统名都可以,也可以是模型或子系统的句柄。这个参数是必须的,也永远是作为第一个参数的。后两个参数是成对出现的,'BlockType' 表示想要按照模块类型这个参数来寻找,'Inport' 表示想要寻找的模块类型为 Inport。
模块属性的介绍
这里需要大家理解模块属性这一个概念,一般模型简单来说是由模块(block)和信号线(line)组成的。每一个模块以及信号线都是一个对象,会有自己的属性,我们就可以根据各个模块的属性的不同,来找出具有相同属性的某一类的元素。比如选中模型中某个模块,然后在matlab的命令窗口输入如下的命令,就能看到这个模块的所有属性以及属性得到值。
get(gcbh)
gcbh是get current block handler的缩写,get就是获取这个handler的所有属性,可以看到,就把这个模块的所有属性列出来了。
比较常用的一些属性有:
Name:这个模块的名称
Type:表示是一个模块(block)还是信号线(line)
BlockType:这个模块的类型
Port:这个是输入输出端口模块才有的属性,表示是第几个端口
PortName:端口的名称
OutDataTypeStr:模块输出的数据类型
了解了这个之后,就明白了find_system这个函数的基本原理,我们需要提炼出我们想要找的元素的共通属性,然后作为这个函数的参数,这样就可以把我们想要找的内容都找出来了。
条件组合搜索
我们把模型修改一下,最外层封装一层子系统。
假设我们想把输入端口x的名字都改成signal_in,这时就有两个条件了,一个是模块类型是Inport,另一个是模块名叫x。find_system这个函数支持任意多个条件的组合搜索,所以我们就可以运行如下指令:
obj_inport = find_system('first_order_filter_demo','BlockType','Inport','Name','x')
运行结果如下,可以看出就只找出了名字叫x的Inport模块。
如果想要改名字的话,就可以使用set_param这个函数,把模块的属性改为我们想要的内容
set_param(obj_inport{1},'Name','signal_in');set_param(obj_inport{2},'Name','signal_in');
这样输入端口名就改好了,这时可以看到信号线的名字还没改,后面会介绍如何找信号线。
我们可以组合任意多的条件,来达到搜索我们想要的元素的目的。
搜索深度
由上一个例子可以看到,搜索默认是搜索我们指定系统内部所有的内容,但是有时我们只想搜索当前层级的内容,这时就可以加上'SearchDepth'这个参数。'SearchDepth'为1的话,就表示只搜索当前层级中的内容,如果为2的话,就是搜索当前层级以及当前层级下一个层级的内容。
比如我们想要知道模型的有哪些输入和输出,那么可以执行如下的指令:
obj_inport = find_system('first_order_filter_demo','SearchDepth','1','BlockType','Inport')obj_outport = find_system('first_order_filter_demo','SearchDepth','1','BlockType','Outport')
可以看到,这时就只找出的模型top level的内容
搜索信号线
搜索信号线的话,需要把参数'FindAll'设为on,'FindAll'默认是off,表示只会搜索模块,设为on后,就会搜索信号线以及注释的内容了。然后对于信号线,type应该是line。之前我们把输入端口名都改为了signal_in,但信号线的名还没改,于是我们可以搜索信号线名为x的信号线,然后将其名字改为signal_in
obj_line = find_system('first_order_filter_demo','FindAll','on','type','line','name','x')set_param(obj_line,'Name','signal_in')
可以看到,信号名也被修改好了
利用正则表达式进行搜索
搜索的时候还可以引入正则表达式,来帮我们提高搜索的效率。要使用正则表达式的话,需要把参数'RegExp'设为on。比如我想找到这个模型中,参数为数字的常数模块。我们知道常数模块的类型是Constant,直接找的话,就会把模型中两个常数模块都找出来。
find_system('first_order_filter_demo','BlockType','Constant')
寻找结果如下:
我们加入正则表达式,其中Value是常数模块的值,"\d"表示0-9的数字,"+" 表示数字至少有一个(正则表达式对于搜索和替换文本非常强大,后面会专门针对正则表达式写一篇文章)。所以这里的搜索条件就是常数模块的值是由至少一个数字构成。
find_system('first_order_filter_demo','RegExp','on','BlockType','Constant','Value','\d+')
这样,搜索的结果就只有一个了
其他参数简介
上面详细介绍了一些需要说明的参数的用法,还有还有一些比较简单的参数,在这里说明一下:
- 'CaseSensitive':表示是否对搜索内容的大小写敏感。可以设为on或off,默认是on,表示是对大小写敏感的。
- 'FollowLinks':表示是否要对link的模块进行搜索。可以设为on或off,默认是off,表示不会对link的模块进行搜索
- 'LookUnderMasks':表示是否要对mask模块内部进行搜索。需要的话就设为on,不需要的话就设为off。
后记
find_system函数是自动化修改模型和统计模型内容的基础函数,配合set_param函数,以及了解模块属性后,就可以通过脚本来实现对模型的脚本化批量修改,可以大大的提高日常的工作效率。