检索Stateflow对象时检索到sflib/...、eml_lib/...的解决方法

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’)

        从结果来看,以上三种方法都能达到期望的效果。

        以上是自己在工作中发现的问题,整理出来与大家分享,如果有理解不正确的地方,欢迎大家交流、指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值