zoukankan      html  css  js  c++  java
  • 第五日:Stateflow的并行状态和复杂逻辑判断

    外出游玩了几天,早上6点多回到了成都,在租的房子里稍微整理洗漱了下继续去教研室自学。

    上午一直在看并行状态的创建。由于MATLAB2008的Stateflow工具箱创建并行进程后并不是根据拖动即时调整状态的序号,而是需要取消并行再次选择使用并行,额外耗费了点时间。这个序号可以在仿真的时候直观地看到它的作用:两个并行状态,确认先进入哪一个。

    p.s.所用的资料(基于MATLAB7.x+SIMULINK_STATEFLOW系统仿真、分析及设计)有点小问题,12.8例子里面双风扇打开后,当temp调节至28以下时,Fan2的关闭会导致speed=0,算是个bug了。如果要解决,Fan2的操作改成speed=speed-1就行了。

    这样便开始学习资料里最后一小节:利用Stateflow的完成复杂的状态逻辑判断,在此梳理一下相关知识以便备忘(大部分摘自《基于MATLAB7.x+SIMULINK_STATEFLOW系统仿真、分析及设计》)。

    1.Stateflow的动作

    ⑴条件动作和迁移动作

    一般形式

    触发事件[迁移条件关系式]{条件动作}/迁移动作

    ⑵状态动作

    一般格式如下,第一行规定状态名称,其余各行规定状态的动作,每个状态的动作必须单独另起一行。

    name/
    
    entry:entry actions
    
    during:during actions
    
    exit:exit actions
    
    bind:data and events
    
    on event_name:on event_name actions
    

    关键词

    输入内容

    描述

    name

    在name处输入状态名,随后紧跟“/”

    entry或en

    entry actions

    状态进入动作,表示发生状态迁移,激活了该状态时需要执行的动作。

    during或du

    during actions

    状态仍然激活动作,表示原处于激活的状态受到一个事件的触发,不存在从这个状态发出的状态迁移时,此状态仍处于激活状态需要执行的动作。

    exit or ex

    exit actions

    状态退出动作。表示存在由此状态发出的有效状态迁移时,该状态退出时执行的动作。

    bind

    data and events

    数据事件绑定动作。将数据data和事件events绑定在此状态上。绑定的数据只能在此状态或其子状态内被改写,其他状态只能读取此数据。绑定的事件由此状态或其子状态广播。

    on

    event_name;

    on event_name atcions

    特定事件发生动作。 event_name规定一个特定的事件;on event_name actions表示当该状态是激活状态且event_name规定的事件发生时需要执行的动作。

    2.Stateflow的隐含事件

      当Stateflow图被唤醒时或进入到某个状态或从某个状态退出或某个内部数据(非输入数据)赋值时,Stateflow会定义并触发某种事件。这些事件是Stateflow自动定义触发的,非用户定义、添加的,故称为隐含事件。

    隐含事件

    含义

    change(data_name)

    chg(data_name)

    当变量data_name的数值发生变化时,定义或产生一个局部事件

    enter(state_name)

    en(state_name)

    进入状态state_name时,定义或产生一个局部事件

    exit(state_name)

    ex(state_name)

    退出状态state_name时,定义或产生一个局部事件

    wakeup

    动作图刚刚唤醒时,定义或产生一个局部事件

    tick

    同wakeup

    隐含事件是瞬时逻辑操作的内容之一。

    3.动作中的瞬时逻辑操作

    ⑴after瞬时逻辑操作

    一般格式   after(n,E)

    其中n是正整数或结果为正整数的表达式,E是基事件(可以是隐含事件),E发生n次后逻辑操作为真,反之为假。对于没有输入的stateflow图,表示当该图被唤醒n次后,瞬时逻辑操作为真。

    需要指出的是after瞬时逻辑操作的项链状态每次激活时,基事件E的计数器都被复位为0。

    ⑵before瞬时逻辑操作

    一般格式   before(n,E)

    类似于after,当E发生小于n次时,逻辑操作为真,反之为假。同样在相连事件每次激活时,基事件E的计数器被复位为0。

    ⑶at瞬时逻辑操作

    一般格式   at(n,E)

    类似于after,当E事件第n次发生时,逻辑操作为真,反之为假。对于没有输入的stateflow图,表示当该图第n次被唤醒时,瞬时逻辑操作为真。同样在相连事件每次激活时,基事件E的计数器被复位为0。

    ⑷every瞬时逻辑操作

    一般格式   every(n,E)

    类似于after,当E事件每发生n次时,逻辑操作为真,反之为假。对于没有输入的stateflow图,表示当该图被唤醒次数小于n时,瞬时逻辑操作为真。同样在相连事件每次激活时,基事件E的计数器被复位为0。

    4.事件广播

    广播是一个非常有效的同步并行状态的方法。

    ⑴通过迁移动作进行直接事件广播。

    直接广播的格式

        send(事件名,状态名)

    利用有效事件名直接进行事件广播的格式

        状态名.事件名

    ⑵通过条件动作进行事件广播。

    ⑶通过状态动作进行事件广播。

     

    至此,对Stateflow的简单学习就结束了,以后需要在实例的接触和具体应用中提高自己的实战能力。

  • 相关阅读:
    【杭电】[2071]无限的路
    【杭电】[1161]Eddy's mistakes
    【杭电】[1859]最小长方形
    【杭电】[2083]简易版之最短距离
    【CodeForces】[614A]Link/Cut Tree
    【杭电】[2076]夹角有多大
    【杭电】[2055]An easy problem
    【杭电】[2036]改革春风吹满地
    【杭电 】[2040]亲和数
    【杭电】[2044]一只小蜜蜂...
  • 原文地址:https://www.cnblogs.com/wuyuegb2312/p/2104010.html
Copyright © 2011-2022 走看看