概述
Simulink模型内的系统、模块、信号线、端口和注释可以通过find_system()函数检索到,但是无法检索到Chart内创建的Stateflow对象,比如State、Junction、Transition等对象,Stateflow对象可以通过find()函数进行检索,find()函数的语法请查看Identify specified objects in hierarchy - MATLAB find- MathWorks 中国
当find(location,Name,Value)的location参数是sfroot时,返回的检索结果有时会有sflib/…、eml_lib/…的对象。造成这种结果的原因是: find()的location参数是sfroot时表示检索范围是所有加载的模型和Library,sflib、eml_lib表明这些对象存在于library中,通常情况下这些对象并不是我们需要的,或者说是不需要进行操作的对象,如何规避这类问题的发生呢,有以下三种方法可以解决:
1.重新启动Matlab
检索结果中有sflib/…、eml_lib/…发生于从Library中拖Chart模块到Simulink模型中、或者拖state等对象至Chart中时,在创建Chart模块和Stateflow对象时,Library被加载,此时find()也将检索library中的对象,通过重启Matlab工具关闭library,重新加载模型后,find()的检索范围就只有加载的模型了。
2.关闭Library
既然已知检索结果中有sflib/…、eml_lib/…是因为加载了library导致的,所以只需要在find()执行前执行close_system(‘sflib’)或者close_system(‘eml_lib’)关闭library,检索结果中就不会有sflib/…、eml_lib/…,与重启Matlab的原理相同。
3.缩小检索范围
前文已经提到,find(sfroot,…)是在已加载的模型和library范围内进行检索的,所以第三种方法是把find()检索范围缩小至要检索的模型。
在加载包含状态流图的模型时会自动创建Stateflow.Machine对象,Stateflow.Machine包含模型中所有的Chart及Chart内的对象,从Stateflow的角度来看,Machine对象等效于 Simulink 模型。从下图可以看出模型中的Chart和library中的Chart分属不同的Machine。
所以可以将location指定为Machine对象,缩小检索范围,代码如下:
machine = find(sfroot,'-isa','Stateflow.Machine','Name','<modelName>')
Chart = find(machine,’-isa’,’Stateflow.Chart’)
从结果来看,以上三种方法都能达到期望的效果。
以上是自己在工作中发现的问题,整理出来与大家分享,如果有理解不正确的地方,欢迎大家交流、指正。
最后
以上就是细腻保温杯为你收集整理的检索Stateflow对象时检索到sflib/...、eml_lib/...的解决方法的全部内容,希望文章能够帮你解决检索Stateflow对象时检索到sflib/...、eml_lib/...的解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复