[simulink] --- simulink中stateflow的使用

1 simulink基本语法

1.1 状态层次结构

要管理多级状态复杂性,可以在 Stateflow 图中使用层次结构。借助层次结构,可以表示系统中多个层级的子组件。

状态层次结构示例
在下例中,图中显示了三个层级。在一个状态的边界内绘制另一个状态表示内部状态是外部状态(或父状态)的子状态(或子级)。外部状态是内部状态的父级。
在这里插入图片描述
在本例中,图是状态 Car_done 的父级。状态 Car_done 是 Car_made 和 Car_shipped 状态的父状态。状态 Car_made 也是 Parts_assembled 和 Painted 状态的父状态。
也可以说状态 Parts_assembled 和 Painted 是 Car_made 状态的子级。
要以文本形式表示 Stateflow 层次结构,可以使用斜杠字符 (/) 表示图,使用句点 (.) 分隔状态层次结构中的每一级。下表提供了上例中对象层次结构的文本表示形式:

/Car_done
/Car_done.Car_made
/Car_done.Car_shipped
/Car_done.Car_made.Parts_assembled
/Car_done.Car_made.Painted

1.2 状态分解

每个状态(或图)都有分解,表示该状态(或图)可以包含哪些类型的子状态。父状态的所有子状态必须与父状态分解是同一类型。状态分解可以是互斥 (OR) 形式或并行 (AND) 形式。
互斥 (OR) 状态分解
带有实线边框的子状态表示互斥 (OR) 状态分解。此分解可用于描述互斥工作模式。当状态拥有互斥 (OR) 分解时,一次只能有一个子状态激活。
在下例中,状态 A 或状态 B 中的一个可以是已激活。如果状态 A 已激活,则状态 A1 或状态 A2 可以在给定时间激活。
在这里插入图片描述
并行 (AND) 状态分解
带有虚线边框的子状态表示并行 (AND) 状态分解。使用此分解可以描述并行工作模式。当状态拥有并行 (AND) 分解时,所有子状态同时激活。
在下例中,当状态 A 激活时,A1 和 A2 两者可以同时激活。
在这里插入图片描述

1.3 状态标签

状态标签显示在状态的长方形框的左上角,一般为以下格式:

name/
entry:entry actions
during:during actions
exit:exit actions
on event_name:on event_name actions
on message_name:on message_name actions
bind:events

下例显示了状态标签的构成。
在这里插入图片描述

1.4 状态名称

状态标签开头为状态名称,其后可接 / 字符。在前面的示例中,状态名称是 On 和 Off。有效的状态名称由字母数字字符组成,可以包含下划线字符 (_)。有关详细信息,请参阅Rules for Naming Stateflow Objects。
下例展示了状态的唯一命名机制。
在这里插入图片描述
以下每个状态因其在图中的位置而拥有一个唯一名称。状态在 FAN1 和 FAN2 中的完整名称为:

PowerOn.FAN1.On
PowerOn.FAN1.Off
PowerOn.FAN2.On
PowerOn.FAN2.Off

1.5 转移

转移是一条将多个图形对象连接在一起的带箭头的直线。在大多数情况下,转移表示系统在不同模式(状态)间转移的通道。转移通常连接来源和目标对象。源对象是转移开始的位置,目标对象是转移结束的位置。

1.5.1 转移层次结构

转移不能像状态那样包含其他对象。但是转移包含在状态中。转移的层次结构通过其父级、源状态和目标状态几个方面来描述。父级是最低层级,包含转移的源对象和目标对象。考虑下例中转移的父级:
在这里插入图片描述
下表分析了上例中每个转移的父级关系。/ 字符表示图。状态层次结构的每一级使用句点字符 (.) 分隔。

转移标签 转移父级 转移源 转移目标
switch_off / /Power_on.Low.Heat /Power_off
switch_high /Power_on /Power_on.Low.Heat /Power_on.High
switch_cold /Power_on.Low /Power_on.Low.Heat /Power_on.Low.Cold

1.5.2 转移标签表示法

转移标签可以包含事件或消息、条件、条件动作和转移动作。标签的每部分均为可选。? 字符是默认的转移标签。转移标签的完整格式如下:

event_or_message[condition]{
    
    condition_action}/transition_action

注意:
组成转移标签的四个部分不一定完整地出现,但是不论出现哪几个部分,标签的内容必须按照上面指定的顺序书写。

触发事件或消息
指定在条件为 true 时导致转移发生的事件或消息。使用 OR 逻辑运算符 (|) 可指定多个事件。指定事件或消息是可选项。未指定事件或消息表示在发生任意事件时都会产生该转移。有关详细信息,请参阅通过广播事件同步模型组件和通过发送消息与 Stateflow 图通信。

在前面的示例中,只要条件 [off_count0] 为 true,事件 E 的广播就会触发从 On 到 Off 的转移。
条件
指定一个布尔表达式,当其计算结果为 true 时,会对指定的触发事件或消息所关联转移的有效性进行验证。条件需括在方括号 ([]) 内。如果未指定任何条件,则隐含的条件会计算为 true。有关详细信息,请参阅条件。
在前面的示例中,发生事件 E 时,条件 [off_count
0] 的计算结果必须为 true,从 On 到 Off 的转移才能生效。
条件动作
发生在转移条件的计算结果为 true 之后,到目标的转移被确定为有效之前。将条件动作括在花括号 ({}) 中并放在条件后。有关详细信息,请参阅条件动作行为。
在前面的示例中,如果事件 E 发生且条件 [off_count==0] 为 true,则立即执行条件动作 {off_count = off_count + 1}。

转移动作
在到目标的转移被确定为有效之后执行。如果转移包含多个段,则在到达最终目标的整个转移路径被确定为有效时,才会执行转移动作。转移动作发生在源状态的 exit 动作之后、目标状态的 entry 动作之前。转移动作前面要接 /。有关详细信息,请参阅条件和转移动作行为。

1.5.3 转移连接

互斥 (OR) 状态的出向/入向转移
此示例说明互斥 (OR) 状态的简单出向/入向转移。
在这里插入图片描述

以下转移… 在以下情况下有效…
从 B 到 A 状态 B 处于激活状态,且事件 E1 发生。
从 A1 到 A2 状态 A1 处于激活状态,且事件 E2 发生

2 stateflow的使用

2.1 在Simulink中添加Stateflow模块

在Simulink Library Browser中,可将Stateflow中常用的Chart模块拖拽到Simulink中在这里插入图片描述
在这里插入图片描述

2.2 Chart模块的编辑

双击Chart模块,可进入Chart模块编辑界面。
在这里插入图片描述
在Chart模块编辑界面左栏中,可拖入表示状态的框。
在这里插入图片描述
指向状态的箭头表示进入Chart后第一个进入的状态,框中“?”部分可输入表示状态的标识名称,输入名称按Enter换行即可输入状态中执行的动作。需要注意的是,进入Chart的箭头并不一定指向某个状态,也可指向某个分支点,用于处理不同情况的输入。
在这里插入图片描述
在表示动作的行中,首先键入上述三种类型的关键字entry、during和exit及“:”,然后在“:”后输入动作内容。也可在表示动作的行中直接输入动作内容,Simulink会自动默认补全关键字entry。
在这里插入图片描述
而在两个不同状态之间添加连线,表示状态的转移。
在这里插入图片描述
在编辑Chart内部状态的过程中,部分状态涉及到Chart作为一个整体在Simulink中的输入与输出,因此,在编辑Chart内部模型时,可通过Chart → Add Inputs & Outputs菜单添加Chart的输入与输出。
在这里插入图片描述
在Name一栏中输入由Simulink输入Chart的变量名称即可。可在Scope一栏选择Output从而设置由Chart输出Simulink的变量名称。而在Port一栏中可以设置输入或输出在Chart块上显示的位置。

在Model Explorer中,可以通过左侧的树状结构查看Simulink模型中的各部分内容,当然也可以对Chart模块进行编辑,如删除某Chart输入或输出等。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42445727/article/details/129525871