stateflow生成代码步骤 (stateflow时序调用)

流程图当中没有状态,一般也不顶用事件或者使用事件来控制转移的执行。这样在创建流程图时,主要用到的图形对象就是连接节点和转移,用到的非图形对象就是数据对象。

1.常见逻辑结构模型

结构化的程序主要有三种基本的程序结构,顺序结构、选择结构和循环结构。

顺序结构:就是程序语句按照由上至下的次序依次执行,直到程序的最后一个语句。

选择结构:就是根据不同的判断条件进行判断,然后根据判断的结果选择其中一种方法来解决一个问题。

循环结构:就是在程序中的某一语句或者多条语句可以重复多次地运行。

其中顺序结构比较好理解,就不进行展开。

1.1 选择结构

在一般的高级语言中,选择结构通常是使用if语句、if-else语句和switch语句等实现。

1.1.1 if(条件){动作}

在Stateflow中,默认转移连接的节点成为了判决节点,这里的Stateflow根据默认的转移检测优先权,将优先检测具有条件的分支,如果条件满足,则执行动作Action,否则执行判决节点的无条件转移分支,哪里没有任何动作。最后,所有的转移都汇合到一个只有入口而没有出口的连接节点上,这个节点被称为终止节点。在利用Stateflow创建流程图时,一定要创建一个终止节点。

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

1.1.2 if(条件){动作A} else {动作B}

如图所示的无条件分支增加必要的动作,则构成了if-else语句。

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

1.1.3 if(条件1){动作A} else if(条件2){动作B} else{动作C}

这种选择分支结构相当于多条件分支,是上面两种选择分支结构的组合和扩充,具有结如下图所示:

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

1.1.4 if(条件1){动作A if(条件2){动作B}}

这种选择分支结构是由if-else语句嵌套组成的,具体结果如下图所示:

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

如果嵌套的层数进一步增加,则可以扩充流程图的包含层次,构成更复杂的逻辑流程分支。

1.1.5 switch-case结构

如果编写程序时遇到较多根据单一变量进行判断的分支,则可以考虑使用switch-case语句来处理,具体结构如下图所示:

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

在默认转移的条件动作中,对变val进行赋值,然后分别在不同的分支中进行判断,并执行不同的动作。

为了使开发出来的流程图简洁明了,建议大家在开发流程图的过程中,将条件置于水平的转移线上,而将所有的动作都定义在垂直的转移线上。

1.2 循环结构

尽管循环结构中分为“当型循环”和“直到型循环”,但是在很多高级语言中,都存在三种可以创建的循环结构的语句,分别是for循环语句、do-while循环语句和while循环语句。

1.2.1 for循环

一般地,for循环用来处理循环次数确定的循环结构,通常在c语言中都按照如下结构来表示:

for(index=0;index< nloops;index++)
{
    Action;
 }

for循环对应的Stateflow流程图如图所示:

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

1.2.2 while循环

语句while可以创建“当”型循环结构,通常在c语言中,它和do-while循环语句用来处理循环次数不确定的问题。当while后面的语句满足条件时,循环就一直持续下去,直到在相应的语句中修改while的条件。一般的,在高级语言中,while循环语句通常表示如下:

while(Condition)
{
  Action;
}

在使用while循环结构时,切记相应的动作Action要能够影响相应的条件,以免出现死循环,while循环的Stateflow结构如下图所示。

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

1.2.3 do-while循环

do-while循环与while循环之间的区别就在于相应的动作在do-while循环中无论如何都要执行一次。在高级语言中,do-while循环通常表示如下:

do{
  Action;
}while(Condition)

do-while循环对应的Statefolw流程图如图所示:

stateflow的简单使用,stateflow如何添加输入输出

stateflow的简单使用,stateflow如何添加输入输出

2.流程图的回溯现象

什么是流程图的回溯现象?可以对比分析流程图A和B:

stateflow的简单使用,stateflow如何添加输入输出

流程图 A

stateflow的简单使用,stateflow如何添加输入输出

流程图B

这两个流程图的唯一区别就在于条件c3的分支。流程图A中,c3的条件分支具有无条件的转移通路,而流程图B中,没有无条件的转移通路。若把这两个流程图改成成编程语言,那么两个流程图表示的选择分支结构是一样的:

if(c1)
{
  act1;
  if(c2)
  {
    act2;
    }
    else if(c3)
    {
      act3;
      }
      }
      else{
      act4;
      }
     }

同样的分支结构对应的两个流程图,运行结果是不一样的。假设,条件c1为真,条件c2和条件c3为假,从语言表达式上看应该仅执行act1动作,而在对应的流程图中,流程图A能够正确的处理这种情况。

但是流程图B执行情况不同。当该流程图开始执行时,首先条件c1为真,因此在第一个判决节点处流程图执行了act1动作分支。根据流程图的特点,流程图一旦开始执行就一直要执行到没有出口的终止节点为止,因此流程图B还需要继续向下判断执行。由于条件c2和c3都为假,因此这两个连接节点处不存在有效的转移通路。特别是条件c3,由于没有无条件的转移通路,因此流程图认为此条转移通路整体上无效(局部有效),于是就会退回到条件c1的判决节点处,那么这个时候就不得不去执行动作act4的转移分支了。很显然,这是明显错误的,而这种现象就是流程图中的回溯现象。

有人可能会想到,既然这样,就在流程图的转移上使用转移动作不就可以了。其实也不可以,因为流程图中并不存在状态,也就没有转移,而转移动作只有在状态转移执行时才能够执行。在流程图中,仅存在转移的检测,而不存在转移真正的执行。所以,在流程图中,所有的动作都需要在条件动作中完成,即使定义了转移动作,在执行流程图的时候,转移的动作也不会发挥任何作用。

因此,在创建流程图的时候,要注意和牢记以下几点:

  • 在流程图中,存在且仅存在一个终止节点,流程图的更新执行最终终止在流程图的终止节点上。
  • 所有转移通路必须最终汇合到终止节点。
  • 为每一个分支节点提供无条件转移的通路,用于控制一些异常情况或者未预料到的情况。
  • 流程图不能出现回溯现象。
  • 如果流程图位于Stateflow的Chart层次,则在连续两次更新之间,整个Stateflow框图处于非活动的状态。

参考内容

[1] 张威.Stateflow逻辑系统建模[M].西安:西安电子科技大学出版社,2007.

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

作 者 | 郭志龙编 辑 | 郭志龙校 对 | 郭志龙