stateflow使用


实验环境

matlab2012a

步骤

  • 打开simulink,新建,拖入stateflow库中的chart
  • 双击,得到打开之后添加基本的元素即可

注意

  • 数据传输
    1. 在stateflow窗口中点击”view->model explorer”,可以配置自己的输入输出以及其他相关
    2. 也可以点击菜单栏的”add”添加输入输出以及事件
    3. 在当需要传输的数据是数组时,需要用C语言的数组格式去调用该函数的值,下面举几个例子
      • 定义test和test_o,都是2X2数组,则下面调用是正确的
        1. test_o = test;(可以对数组整体赋值)
        2. test_o[0][0] = test[1][1](注意下标从0开始,不能越界!)
      • 而下面的是错误的
        1.test_o(1,1) = test(1,1)(matlab经典用法在此处行不通=。=)
      • example:state_chart_test3.mdl->third状态图
  • 基本配置
    1. 单击”simulation->configuration parameters”,将仿真步长设置为固定长度(fixed step),其size为auto或者自己给定的值均可
  • 每个父状态都要有一个迁移,一般为默认迁移,父状态里的某一个子状态也需要有一个默认迁移
  • 状态转移有有优先级,需要设置,也可以通过”file->chart properties”取消勾选”user specified state…”,启用隐性模式,让软件自动设置

状态工具

整体格式

name    %状态名
entry(en):  %进入状态时的动作
during(du): %处于该状态时的动作
exit(ex):   %退出该状态时的动作
on event_name:%某某事件发生时的动作
bind:       %指定需要限制作用范围的时间与数据

状态迁移

  1. 缺省状态迁移

    系统进入初始状态时,常采用该种结点,表示系统最先从哪个地方开始执行;对应一个父系统或者子系统,只能有一个缺省状态迁移结点,

  2. 时间结点迁移

    • 格式

      after(time,event)%time是迁移时间

    • 常用event:
      • tick:只有当系统没有外部事件时才能用该时钟,和仿真设置的步长相同
      • sec:表示1s,当仿真步长小于1s时,它就表示1s,当仿真步长大于1s时,它和仿真步长相同(上次亲测出来的。。)
    • 迁移过程中父状态的优先级大于子状态,即父状态的迁移时间到了之后一定会立刻发生迁移,而不会考虑子状态进行到哪
    • 如果在父状态中加入历史结点,则在状态转移之后又回到该父状态时,系统会自动进入上次退出时保留的子状态,且重新开始计数;如果没有加入历史结点,则每次进入该状态都会从父状态开始一步步默认执行
  3. 条件迁移(迁移标签)

    • 格式

      event[condition]{condition_action}/transition_action

      • event可选,如果加上,则表明当事件发生且满足触发条件时,状态迁移
      • condition:发生迁移的条件(如果有触发事件,则需要2者同时满足才迁移)
      • condtion_action,表达式中用逗号连接,不需要分号(当然,用了是最好=。=)
      • 状态转移时产生的动作:因为有时候条件满足了不一定就发生状态转移,因此有了上面2种动作

并行机制

  • 在空白处右键->decomposition->AND即可让该层级的所有转状态改为并行机制,即同时运行

事件(event)

定义

  • 有local、input from simulink等多种类型,当选择local时,可以直接定义给它起个名字比如lakers,但是要看你在哪个层级上定义的,一般默认是全局变量

本地事件广播

  • 在哪个地方驱动该事件,直接调用(写上该事件的名称加上逗号=。=)即可,当该事件被驱动时,将该事件驱动作为条件的转移也会发生相应的转移(如果没有其他限制条件的话)

直接事件广播

  • 使用直接事件广播可以在仿真过程中避免出现不必要的循环或递归,并能有效地提高生成代码的效率
  • 几种广播的方式

    1. send函数

      send(event_name,state_name)

      可以针对某个状态发送广播或事件

      send(event_name)

      可以发送某个全局的事件

      send(state_name.event_name)

      可以发送针对某个状态框图建立的事件,即局部事件,

    2. 用事件名直接事件广播

      需要在状态框图下面定义事件名称,然后在状态转移时直接/state_name.event_name(/是状态转移中的格式=。=)即可,当然如果定义的是全局变量,则可以直接/event_name

隐含事件和条件

  • 当状态图执行的时候会自动发生,有几下几种
    • change(data_name):对变量写进数据时会产生本地信号
    • enter(state_name):进入指定状态时,隐含地产生一个本地信号
    • exit(state_name):离开状态时,隐含地产生一个本地信号
    • tick:评估状态所在的状态图被唤醒时,产生一个本地事件(参考after(num,tick))
    • wakeup:与tick相同
    • [in(state_name)]:当指定状态为激活状态,为真

stateflow其他常用对象

真值表(truth table)

  • 首先建立table,如下

真值表
* 在空白处填写zz=xortable(xx,yy),在该真值表里创建xx、yy、zz三个变量,2个为输入、1个为输出(好像不添加也可以在运行报错后自动生成=。=),在该状态框图,之后调用的时候就可以直接调用函数result=xortable(in1,in2),result、in1、in2都是其他的变量

  • 注意:在真值表的父状态之外调用它都是耍流氓

图形函数(graphical function)

注:拖出来之后是function ?而不是 matlab function ? !!!!

  • 格式
    function [n1,n2···]=func_name(a1,a2,···)
  • 可以在里面添加真值表或者其他状态过程,在其他地方可以直接调用该函数,但是调用的地方不能是它的父状态之外
  • example:state_chart_test3.mdl->first状态框图

图形盒(BOX)

  • 要引用图形盒里面的变量或者函数,需要加上该图形盒的路径,如调用一个函数box_name.func_name()

Simulink函数调用

  • 它与simulink有以下区别
行为调用simulink子系统simulink
执行中是否需要函数调用输出事件
是否需要信号线
是否支持基于帧的输出信号


  • 在一个状态图里创建的simulink函数只能在这个框图里面调用,在其他地方调用非法
  • 添加simulink子函数后,最好先写好函数模型,之后系统会自动生成输入、输出变量;双击进去编辑时有一个f()的框,可以先不管它
  • example:

example:state_chart_test3.mdl->fourth状态框图

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页