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_count0] 的计算结果必须为 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输入或输出等。