本文摘要:
主要介绍find_system()这个函数,包括函数的搜索原理,函数详细的参数介绍和常用的使用场景实例。
一个简单的例子
我们先来看一个简单的模型,然后我想找出这个模型中所有输入端口的名称。
![17716179fa5c1abb81ef10f51e035981.png](https://i-blog.csdnimg.cn/blog_migrate/1170edc5b5382a9fac4df0699e5c9f29.png)
那可以执行如下的命令:
obj_inport = find_system('first_order_filter_demo','BlockType','Inport')
运行结果如下:
![96f9b06f50ee613aa06922dc208d443c.png](https://i-blog.csdnimg.cn/blog_migrate/0453252c7cd986f3d0dd1ae4c239d459.png)
其中,参数'first_order_filter_demo'是我们想要在哪个系统中去寻找,这里可以是模型名或子系统名都可以,也可以是模型或子系统的句柄。这个参数是必须的,也永远是作为第一个参数的。后两个参数是成对出现的,'BlockType' 表示想要按照模块类型这个参数来寻找,'Inport' 表示想要寻找的模块类型为 Inport。
模块属性的介绍
这里需要大家理解模块属性这一个概念,一般模型简单来说是由模块(block)和信号线(line)组成的。每一个模块以及信号线都是一个对象,会有自己的属性,我们就可以根据各个模块的属性的不同,来找出具有相同属性的某一类的元素。比如选中模型中某个模块,然后在matlab的命令窗口输入如下的命令,就能看到这个模块的所有属性以及属性得到值。
get(gcbh)
gcbh是get current block handler的缩写,get就是获取这个handler的所有属性,可以看到,就把这个模块的所有属性列出来了。
![ecd5527bd293f2d00210c9a1db117a90.png](https://i-blog.csdnimg.cn/blog_migrate/6125e139fd6c75c6e2100d831fb923e7.png)
![6a708bad25872501406fd445d3e98253.png](https://i-blog.csdnimg.cn/blog_migrate/3067ce972f453e4fb02841d9954d7af7.jpeg)
比较常用的一些属性有:
Name:这个模块的名称
Type:表示是一个模块(block)还是信号线(line)
BlockType:这个模块的类型
Port:这个是输入输出端口模块才有的属性,表示是第几个端口
PortName:端口的名称
OutDataTypeStr:模块输出的数据类型
了解了这个之后,就明白了find_system这个函数的基本原理,我们需要提炼出我们想要找的元素的共通属性,然后作为这个函数的参数,这样就可以把我们想要找的内容都找出来了。
条件组合搜索
我们把模型修改一下,最外层封装一层子系统。
![ebdf8b54a944931fb05cddd59efd62cc.png](https://i-blog.csdnimg.cn/blog_migrate/71f4c65b03456852ac6ebe422820f8cb.png)
假设我们想把输入端口x的名字都改成signal_in,这时就有两个条件了,一个是模块类型是Inport,另一个是模块名叫x。find_system这个函数支持任意多个条件的组合搜索,所以我们就可以运行如下指令:
obj_inport = find_system('first_order_filter_demo','BlockType','Inport','Name','x')
运行结果如下,可以看出就只找出了名字叫x的Inport模块。
![cfa3078f6eb3b55148c31f613a7d0662.png](https://i-blog.csdnimg.cn/blog_migrate/b4ca7ab462539f268529cdcabea32a4f.png)
如果想要改名字的话,就可以使用set_param这个函数,把模块的属性改为我们想要的内容
set_param(obj_inport{1},'Name','signal_in');
set_param(obj_inport{2},'Name','signal_in');
这样输入端口名就改好了,这时可以看到信号线的名字还没改,后面会介绍如何找信号线。
![394399bd4cc5ef1e34774e96a08da424.png](https://i-blog.csdnimg.cn/blog_migrate/9e24ff62cd40531141e23d91d6518419.png)
我们可以组合任意多的条件,来达到搜索我们想要的元素的目的。
搜索深度
由上一个例子可以看到,搜索默认是搜索我们指定系统内部所有的内容,但是有时我们只想搜索当前层级的内容,这时就可以加上'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的内容
![26a616722988e89f12eea812a21830b5.png](https://i-blog.csdnimg.cn/blog_migrate/4cdaa13b8b08455a5bf9b1fe95e8e4cb.png)
搜索信号线
搜索信号线的话,需要把参数'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')
可以看到,信号名也被修改好了
![7a2bb99e98f0b3f4d61e2c13f2b792ed.png](https://i-blog.csdnimg.cn/blog_migrate/0d4db93f4bace9cc52fe49c9a0db129a.png)
利用正则表达式进行搜索
![0e46f02e17d45e969e69f15946283996.png](https://i-blog.csdnimg.cn/blog_migrate/20dc21a3b55526f386270060b63daf4d.png)
搜索的时候还可以引入正则表达式,来帮我们提高搜索的效率。要使用正则表达式的话,需要把参数'RegExp'设为on。比如我想找到这个模型中,参数为数字的常数模块。我们知道常数模块的类型是Constant,直接找的话,就会把模型中两个常数模块都找出来。
find_system('first_order_filter_demo','BlockType','Constant')
寻找结果如下:
![40ece7991ac5cdf5e093c001980346d7.png](https://i-blog.csdnimg.cn/blog_migrate/a185eee70d991988d0a844c7fb8e3f98.png)
我们加入正则表达式,其中Value是常数模块的值,"d"表示0-9的数字,"+" 表示数字至少有一个(正则表达式对于搜索和替换文本非常强大,后面会专门针对正则表达式写一篇文章)。所以这里的搜索条件就是常数模块的值是由至少一个数字构成。
find_system('first_order_filter_demo','RegExp','on','BlockType','Constant','Value','d+')
Version:1.0 StartHTML:000000293 EndHTML:000040492 StartFragment:000005480 EndFragment:000040400 StartSelection:000005480 EndSelection:000040400 SourceURL:https://mp.weixin.qq.com/cgi-bin/masssendmodify?action=edit&appmsgid=2247484037&idx=1&msgid=1000000013&token=1882564164&lang=zh_CN window._points = [+new Date()]; function wx_main(mod) { window._points && (window._points[3] = +new Date()); }; window.wx = { uin: "3288627608" || "0", lang: "zh_CN" }; window.wx_loaderror = function(ele) { var _img = new Image(); var key = 63; if (ele && ele.tagName && ele.tagName.toLowerCase() == "script") { key = 64; } _img.src = "https://badjs.weixinbridge.com/badjs?id=11&uin=" + (wx && wx.uin) + "&msg=" + encodeURIComponent("link_error:" + (ele && (ele.href || ele.src))) + "|link&from=" + encodeURIComponent(location.href) + "&level=4&_t=" + (+new Date); var key_img = new Image(); key_img.src = "https://mp.weixin.qq.com/misc/jslog?id=" + key + "&content=link_error&level=error"; if (typeof WX_BJ_REPORT != "undefined" && WX_BJ_REPORT.BadJs && typeof WX_BJ_REPORT.BadJs.report == "function") { if (ele && ele.tagName && ele.tagName.toLowerCase() == "script") { WX_BJ_REPORT.BadJs.report("jsLoadedError", ele.href || ele.src, { mid: "mpResourceMonitor" }) } else { WX_BJ_REPORT.BadJs.report("cssLoadedError", ele.href || ele.src, { mid: "mpResourceMonitor" }) } } }; if(/(registermidpage|readtemplate|findacct|resetpwd|announce|opshowpage)/.test(window.location.href)) { document.title = '微信公众平台' document.getElementById('shortcut').href = 'https://res.wx.qq.com/a/wx_fed/assets/res/NTI4MWU5.ico'; } else { document.title = '公众号' document.getElementById('shortcut').href = 'https://res.wx.qq.com/a/fed_upload/9300e7ac-cec5-4454-b75c-f92260dd5b47/logo-mp.ico'; }
这样,搜索的结果就只有一个了
![50aa7aaf04698ae32f23cc6f721f007e.png](https://i-blog.csdnimg.cn/blog_migrate/a486a434a77125a7f2a13f86e17c6823.png)
其他参数简介
上面详细介绍了一些需要说明的参数的用法,还有还有一些比较简单的参数,在这里说明一下:
- 'CaseSensitive':表示是否对搜索内容的大小写敏感。可以设为on或off,默认是on,表示是对大小写敏感的。
- 'FollowLinks':表示是否要对link的模块进行搜索。可以设为on或off,默认是off,表示不会对link的模块进行搜索
- 'LookUnderMasks':表示是否要对mask模块内部进行搜索。需要的话就设为on,不需要的话就设为off。
后记
find_system函数是自动化修改模型和统计模型内容的基础函数,配合set_param函数,以及了解模块属性后,就可以通过脚本来实现对模型的脚本化批量修改,可以大大的提高日常的工作效率。