《Stateflow教程》PPT课件.ppt
《《Stateflow教程》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Stateflow教程》PPT课件.ppt(68页珍藏版)》请在装配图网上搜索。
stateflow教程 Stateflow概述 Stateflow是集成于Simulink中的图形化设计与开发工具 主要用于针对控制系统中的复杂控制逻辑进行建模与仿真 Stateflow适用于针对事件响应系统 ReactiveSystem 进行建模和仿真 与事件响应系统相对应的就是动态变换系统 DynamicTransformationalSystem 动态变换系统通常可以利用数学表达式 方程等组成的输入 输出关系进行描述 像这样的系统利用Simulink进行建模是最为方便的 而事件响应系统通常利用一些自然语言或者逻辑表达式进行描述 这样的系统就需要利用Stateflow来进行建模 Stateflow与Simulink结合起来 可以创建确定性监管控制系统 利用Stateflow可视化的模型和直观的仿真能力 可以清晰 简洁地反映出复杂动态逻辑关系 Stateflow的基础是有限状态机理论 它通过对状态图 流程图的创建 对事件驱动系统进行建模和仿真 第一章创建状态图 Stateflow编辑器创建和编辑状态图 Stateflow编辑器 创建Simulink模型1 直接在MATLAB命令行窗体中键入指令sfnew2 打开Simulink库浏览器 在库浏览器中找到Stateflow的模块库 双击模型文件或者库文件中的Stateflow图块打开Stateflow编辑器 执行Stateflow编辑器File菜单下的ChartProperties命令 打开属性框 创建和编辑状态图 插入图形对象1 创建状态在图形对象面板的状态图标上按下鼠标左键并保持 将状态Stateflow编辑器的空白区域中 Keyword StateActions就是状态动作 为数据对象进行赋值或者进行数据对象的运算也可以通过状态动作进行事件广播以触发其他系统的变化状态动作的关键字主要有三种 entry 当状态被激活时执行相应的动作 exit 当状态退出活动状态时执行相应的动作during 当状态保持其活动状态时执行相应的动作 在状态上单击鼠标右键 在快捷菜单中选择Properties命令 可以通过状态的属性对话框进一步定义状态 2 创建连接节点 连接节点作为转移通路的判决点或汇合点 也是在状态图中常用的图形元素之一 特别是在流程图中 由于流程图不能包含任何状态 因此只有依靠连接节点完成通路的连接和判断分支 连接节点不是记忆元件 在图形对象面板的连接节点图标上按下鼠标左键并保持 将状态拖放到Stateflow编辑器的空白区域中 节点上单击鼠标右键 通过弹出的快捷菜单执行Properties命令 进入属性框 3 创建转移 转移是Stateflow框图中最常见的图形元素之一 无论是包含状态的状态图中还是没有状态的流程图中 几乎都存在转移 转移描述的是有限状态系统内的逻辑流 转移管理了当系统从当前状态改变时 这个系统可能发生的模式改变 当转移发生时 源状态变为非活动的状态 目标状态变为活动的状态 转移是带有箭头的线 这就使整个状态图或者流程图成为了 有向图 状态或者流程之间的转换 将直接受到转移方向的约束 创建转移的具体步骤是 1 当鼠标光标接近状态的边缘时 鼠标光标将变成十字形状 2 按下鼠标左键并保持 将引出的转移线拖放到目标状态的边缘即可 给转移添加标签的方法 1 左键单击选中相应的转移 此时转移将显示问号 2 左键单击出现的问号 则进入文本编辑状态 3 在光标处插入文本 4 单击Stateflow编辑器中任意一处 结束标签的插入 组成转移标签的四个部分不一定完整地出现 但是不论出现哪几个部分 标签的内容必须按照上面指定的顺序书写 条件动作与转移动作两者之间的区别 条件动作在条件满足的情况下就能够执行 而转移动作需要在整个转移通路都有效的情况下 在执行转移的时候才执行 Stateflow中都可以使用三类语法元素作为动作 1 数学运算表达式或者逻辑运算表达式 2 调用函数 3 事件广播 4 默认转移 默认转移是一类特殊的转移 可以把它看做是状态转移的特例 默认转移确定当有限状态机或者父层次状态处于活动状态的时候 在其所有的子状态中第一个被激活的状态 根据有限状态机的要求 当有限状态系统被激活时 必有相应的确定的某个状态被激活 而默认转移就定义了当状态机被激活或者层次模型中父层次状态被激活时 具体哪个子状态被激活 创建默认转移的方法如下 鼠标单击图形对象面板中的默认转移图标 然后将默认的转移 注意鼠标光标的变化 放置在状态或者连接节点的边缘 就可以完成默认转移的创建了说明 Stateflow的状态图中 同一层次上的状态只有两种工作模式 一种叫做异或 OR 模式 另一种叫做并行 AND 模式 在异或模式下 同一层次上的子状态必须有一个子状态具有默认的转移 同时该子状态被称为默认状态 由于Stateflow是一种事件驱动模型建模环境 不允许出现模型运行的二义性 因此 正确的使用默认转移就非常重要 因为默认转移就是用来改变状态机或者父层次状态被激活时 相应的子状态二义性的图形元素在默认转移上添加标签的方法和在一般的转移上添加标签的方法是一样的 可以在默认转移的标签上加上事件和条件来进行限制 也可以将动作和默认转移相关联 不过 一个有限状态系统必须确保能够正确地被激活 这一点在使用默认转移时非常重要 因为状态机的默认转移只有一次执行的机会 如果没有明确的子状态能够被激活 系统会报告二义性错误 5 添加注释 如果需要在Stateflow的框图中使用LaTex字符集 则需要按照下列步骤完成 1 在已经添加的文本上单击鼠标右键 这时将显示快捷菜单 2 选择快捷菜单中TextFormat子菜单中的LaTexInstructions复选项 3 用鼠标单击已经添加的文本注释 重新进入文本编辑模式 4 添加LaTex字符 例如键入y itAe alphax sin beta itt 5 在文本编辑区外单击鼠标完成注释的添加 此时的注释内容将变为y Aeaxsin bt 如图所示 编辑图形对象外观 改变尺寸和位置 单击右键 单击右键 在注释上单击鼠标右键而出现的快捷菜单 在菜单中 共计有三个子菜单可以用来修改注释文本的外观 分别为 FontSize 设置注释文本的尺寸 TextFormat 设置注释文本的基本格式 包括粗体 斜体和LaTex字符支持 TextAlignment 设置注释文本的对齐方式 包括左对齐 居中和右对齐 第二章状态图的仿真 状态图的基本概念事件数据对象状态图的更新模式stateflow模型查看器 状态图的基本概念 状态图管理和维护着当前模型中活动的状态 一旦包含了状态转移的状态图处于活动的状态 则状态图将一直处于这种活动状态 直到整个模型仿真计算结束 并且 只要状态图处于活动状态 则必定至少有一个状态处于激活状态 状态图从非活动状态到活动状态以及状态之间的切换 都要由事件触发 即在事件的驱动之下 状态图才能仿真运行 所谓Stateflow的事件触发 就是事件驱动的发生 触发可以由系统隐含发生 也可以按照要求显性地定义 在Simulink中 显性定义的事件就是某些过零信号的发生 也就是说 只有过零信号才能够触发状态转移的发生或者状态机的激活 由这种触发而引起的相应的动作执行 被称为事件驱动 事件 添加事件 执行Stateflow图形编辑器Add菜单下Event子菜单中的任何一个命令 例如执行Local命令 则Stateflow将弹出如图所示的对话框 Scope属性 该属性定义事件的作用类型 在Add菜单下的Event子菜单中具有三个菜单命令 分别为Local InputfromSimulink和OutputtoSimulink 通过这三个菜单命令定义事件 得到的Scope属性不一致 具有Local属性的事件是在状态图内部发挥作用 具有InputfromSimulink属性的事件是从Simulink框图输入到Stateflow中的 也就是Stateflow框图的外部触发事件 具有OutputtoSimulink属性的事件是从Stateflow框图输出到Simulink中的 即利用Stateflow定义的事件驱动或者触发其他Stateflow框图或者子系统动作 如果用户设置事件的Scope属性为InputfromSimulink或者OutputtoSimulink 则添加事件的对话框会发生变化 Trigger属性 Trigger属性总共有四个可能值 分别为Either Falling Rising和FunctionCall 在Simulink条件执行子系统中 特别是在使能或者触发子系统中 触发子系统工作的触发源就具有不同属性 触发子系统的触发源与这里的Trigger属性的意义完全一样 分别为双边沿触发 下降沿触发 上升沿触发 FunctionCall 函数调用 是一类比较特殊的触发属性 创建事件实例 运行过程中 单击ManualSwitch模块向Stateflow框图发出事件 使用多个输入事件 同一个Stateflow的图块可以使用多个输入事件 但是 不论用户为Stateflow的图块定义了多少个输入事件 每个Stateflow的图块都只能具有一个事件输入端口 因此 在向Stateflow的图块增加不止一个输入事件时 需要将不同的事件通过Mux块组合成为输入事件向量 然后将组合后的输入事件向量连接到Stateflow图块上 数据对象 Stateflow使用数据对象来管理维护Stateflow框图内部的数据信息 在Stateflow中 数据对象主要用于动作或者条件中 用户既可以限制数据对象在相应的图形对象内部使用 也可以将数据对象作为Stateflow与Simulink模型之间的接口来使用 执行Stateflow图形编辑器的Add菜单中Data子菜单下的任何一个命令 例如Local 则Stateflow会打开如图所示的对话框 Scope属性 Local Input Output与事件相同Constant 所定义的数据对象在Stateflow模型中为常量即保持静态 数据对象在Simulink Stateflow模型运行过程中其数值一般不发生变化 并且数据在模型中为只读 不可写的状态 Parameter 所定义的数据对象将通过Stateflow框图的上层Simulink子系统封装之后的参数获取初值 也就是说当Stateflow的框图位于某个封装子系统内部时 Stateflow的Parameter类型数据对象可以直接获取封装子系统设定的参数 具有Parameter属性的数据对象与具有Constant属性的数据对象类似 在整个仿真过程中 Stateflow不能修改其数值 DataStoreMemory 所定义的数据对象与Simulink数据空间共享 也就是说 该数据对象与Simulink工作空间中的某个数据对象相互绑定 此时该数据对象的名称必须与Simulink工作空间中数据对象的名称一致 数据类型模式 DataTypeMode Inherited类型的数据对象一般为Stateflow的输入或者输出数据对象 它能够通过与Simulink模块相连接的信号线来判断具体的数据类型对象 Built in类型是Stateflow数据对象默认的数据类型 通常情况下 都使用Simulink内建的数据类型作为数据对象的数据类型 Expression类型是指可以通过一个表达式来表示数据类型Fixedpoint类型用于模型的定点数据设置 若选择了该类型 则可以完成Stateflow模型数据的量化处理 状态图的更新模式 不是所有的有限状态系统都具有外部事件的定义 有些模型就没有针对Stateflow模型定义任何输入事件 可是Stateflow的模型依然能够正常地运行 那么对于这种没有定义任何输入事件的系统 它是如何运行的呢 这就是状态图的更新模式所发挥的作用 Stateflow的框图有三种更新模式 分别为Inherited Discrete和Continuous 系统默认使用Inherited更新模式 在这种更新模式下可能存在以下三种情况 1 有输入事件定义 如果Stateflow框图定义了输入事件 并且Simulink提供了相应输入事件 则整个框图就按照所定义的事件触发来更新 也就是说 在相应类型的事件发生时 Stateflow框图进行相应的工作 例如状态的转移 动作的执行等 2 未定义输入事件但定义了输入数据 如果Stateflow框图没有定义事件而定义了输入数据 则Stateflow框图按照其连接的Simulink输入信号中更新频率最高的信号更新周期来更新框图 这相当于输入数据的采样更新触发了Stateflow框图的执行 3 既未定义输入事件又未定义输入数据 如果Stateflow框图既没有定义输入事件 又没有定义输入数据 则Stateflow框图继承其父层次模型的更新周期 如果Stateflow框图位于系统模型的顶层 则Stateflow框图继承模型的仿真周期作为自己的更新周期 Discrete更新模式 是将Stateflow框图看做有固定周期的离散块 在设置该更新模式时 Stateflow框图属性对话框中的SampleTime属性需要设置具体的更新周期 单位为秒 Continuous更新模式 则Stateflow框图好比Simulink模型中的一个连续系统模块 此时Stateflow的框图将按照系统仿真步长完成更新 注意 如果为框图定义了输入事件 则框图的更新模式就只能设置为Inherited 此时Stateflow框图将严格按照事件的发生来驱动有限状态系统的运行 当使用外部事件进行触发更新状态图时 默认地 第一个事件的发生用来唤醒状态图 激活状态图 而不是进行状态转移的执行 如果需要改变此模式 则需要设置Stateflow框图属性中的Execute enter ChartAtInitialization选项 选择了该选项 则意味着当前的Stateflow框图将在模型初始化阶段就被激活 这样 在后续的事件触发过程中 就直接进行状态的转换了 第三章流程图 转移冲突流程图的创建图形函数stateflow模型调试器 概述 在Stateflow框图中 流程图是比较特殊的一种 流程图中不包含任何状态 它仅仅由连接节点和转移组成 由于流程图没有任何状态 因此流程图就不包含任何记忆元件 Stateflow中只有状态是记忆元件 所以 在一次更新之中 流程图从检测其默认转移开始 到检测完每一条有效的通路且到达不具备有效出口的转移为止 在连续的两次触发之间 一直处于非活动的状态 转移冲突 所谓转移冲突 就是在Stateflow框图运行的过程中可能在某一时刻同时存在几个有效的转移 那么此时Stateflow将根据一些原则来处理这些冲突 这就是转移冲突的处理原则 假设当前事件E发生并且条件C也满足 则四个转移通路都是有效的 即形成了转移冲突 那么Stateflow是如何处理这种情况呢 原则 当事件发生需要进行转移检测时 Stateflow总是首先检测具有最多限制的转移 如果能够满足则执行这个转移 其他的有效转移就统统忽略 1 如果此时发生的事件是E且条件C也满足 即该转移有效 则执行这个转移 其余的转移就不再进行检测和执行了 2 条件不满足则检测只有事件限制的转移 条件C不满足 此时发生的事件是E 即该转移有效 则执行这个转移 其余的转移就不再进行检测和执行了 3 此时发生的事件不满足 则接着检测具有条件的转移 如果此时条件C能够满足 即该转移有效 则执行这个转移 其余的转移就不再进行检测和执行了 4 如果条件和事件都不匹配 最后检测的转移就是那条无条件的转移 由于无条件的转移是肯定可以执行的总结 转移的检测次序就是由上至下分别检测 当系统发现一条有效的转移时 就立即执行 其他的转移即使有效 也都被忽略了 同限制级别的若干条转移同时有效 状态Standby向High状态 Medium状态和Low状态的转移都对使用条件进行了限制 根据前面的介绍 这三个转移由于都仅仅使用条件进行了限制 因此它们具有相同的转移检测优先级别 所以这个框图在进行仿真的时候 就会报告转移冲突错误 如果转移从状态出发 则从状态的左上角开始 按顺时针的方向决定转移的优先权 如果转移从连接节点出发 则从连接节点的12点方向开始 按顺时针的方向决定转移的优先权 几何原则 用户自定义检测次序 两个步骤 1 在Stateflow图形编辑器中单击右键 在弹出的菜单中选择ExecutionOrder子菜单下的Enable Userspecifiedexecutionorder forthischart 命令 2 用鼠标右键单击需要改变检测次序的转移 例如要修改上图所示模型的第一个转移检测次序 则用右键单击该转移 在出现的快捷菜单的ExecutionOrder子菜单下选择检测次序 由于这里从状态A到状态B具有四个转移 因此转移执行次序的选项为1 4 默认地 该转移检测次序为1 可以将其修改为其他数值 修改某一条转移的检测次序后 其他的转移可以根据用户指定的次序以及Stateflow默认的检测次序原则进行重新排序 常用逻辑结构模型 if 条件 动作 if 条件 动作A else 动作B if 条件1 动作A elseif 条件2 动作B else 动作C if 条件1 动作Aif 条件2 动作B switch case for循环for index 0 index nloops index Action while循环 while Condition Action do while循环 do Action while Condition 流程图回溯现象 if c1 act1 if c2 act2 elseif c3 act3 else act4 分析 假设 条件c1为真 条件c2和条件c3为假 注意 在流程图中 仅存在转移的检测 而不存在转移真正的执行 所以 在流程图中 所有的动作都需要在条件动作中完成 即使定义了转移动作 在执行流程图的时候 转移动作也不会发挥任何作用 在流程图中 存在且仅存在一个终止节点 流程图的更新执行最终终止在流程图的终止节点上 所有转移通路都必须最终汇合到终止节点 为每一个分支节点提供无条件的转移通路 用于控制一些异常情况或者未预料到的情况 流程图不能出现回溯现象 如果流程图位于Stateflow的Chart层次 则在连续两次更新之间 整个Stateflow框图处于非活动的状态 状态中的流程图 该Stateflow框图具有两个状态 状态Normal和状态Inverse 在这两个状态中都包含了流程图 它们包含的流程图十分简单 就是根据输入数据进行相应的逻辑判断 然后决定具体的输出 从框图上看 这两个流程图的体系结构完全一致 有所区别的就是参数 即处理的数据不同 这里可以通过图形函数的形式来完成模型的创建 创建图形函数 在Stateflow图形编辑器的图形对象工具栏上单击图形函数按钮 在Stateflow图形编辑器中任意的空白位置单击鼠标左键 即完成了向现有模型增加图形函数的工作 stateflow调试器 状态面板 StatusPane 控制面板 ControlPane 选项面板 ControlPane 显示面板 DisplayPane 状态断点 StateDuring 在执行状态的During动作之前进入调试模式StateEntry 在执行状态的Entry动作之前进入调试模式 StateExit 在执行状态的Exit动作之前进入调试模式转移断点 WhenTested 在转移被检测之前进入调试模式 WhenValid 转移经过检测是有效的 在执行前进入调试模式 事件的断点 StartofBroadcast 在事件被广播之前进入调试模式EndofBroadcast 在事件广播结束后进入调试模式图形函数的断点 FunctionCall 在函数被调用之前进入调试模式 第四章有限状态系统 层次化建模 状态动作层次化建模历史节点内部转移子状态图stateflow的查询工具 状态动作 entry 当事件发生 状态被激活时执行相应的动作exit 当事件发生 状态退出活动状态时执行相应的动作during 当事件发生 状态保持其活动状态时执行相应的动作onevent动作是指当状态处于活动状态 事件event发生 而状态并不退出活动状态时所执行的动作 bind动作是指将事件或者数据对象与状态绑定的动作 被绑定的事件只能由状态以及状态的子状态进行广播 而被绑定的数据对象只能由状态以及状态的子状态中相应的动作进行修改 绑定的数据对象可以在其他状态中被访问 但是不能修改 绑定的事件可以被所有状态监听 但是不能由其他状态广播 注意 在进行状态动作的定义时 可以使用状态动作关键字的简写方式 也就是说 在定义状态动作时只要写关键字的前两个字符即可 例如定义状态的entry动作 只要在状态中定义 en data 即可 onevent动作是during动作的特例 两者的区别就是 onevent动作需要有特定事件触发才可能执行 而during动作在有事件发生 但又没有使状态退出活动状态时就可以执行 讨论车载播放器 onevent事件相当于during事件的子集 即当STEP UP事件发生时 首先执行during动作 然后再来执行onSTEP UP动作 这样 在发生STEP UP事件时 track数据对象每次累加了两次 数据对象data与状态A进行了绑定 这样在其他的地方就只能读取data 而不能修改数据对象data 在动作中使用事件 输出事件广播所谓事件广播 其实就是在动作中调用事件 事件广播主要用来在Stateflow中影响其他状态图或者条件执行子系统的运行 Simulink的条件执行子系统有使能子系统 触发子系统和函数调用子系统 利用事件广播以及数据的输出就可以在Stateflow中调用这些不同类型的子系统 完成复杂的工作 类型为InputfromSimulink的事件是不能够通过状态动作 转移动作或者条件动作进行广播的 此外 类型为Local的事件也可以进行广播 这就是在第6章将要介绍的本地事件广播 输出状态的活动情况Stateflow还可以将Stateflow状态的活动情况输出到Simulink 利用Stateflow框图的活动情况可以触发 使能其他子系统或者Stateflow框图运行 从而实现系统的同步协调工作 函数调用子系统在Stateflow的事件类型中 存在类型为函数调用 FunctionCall 的事件 此类事件能够触发函数调用子系统 函数调用子系统是一类比较特殊的子系统 该类子系统在整个Simulink模型内部运行起来就好比函数一样 需要通过其他的系统来调用才能够执行 当Stateflow框图中的转移动作发出函数调用事件之后 系统首先执行Simulink模型中的函数调用子系统 当函数调用子系统全部运行完毕 并将新的计算结果提供给Stateflow的输入数据对象后 Stateflow才继续激活相应的目标状态 因此 在很多Simulink和Stateflow混合的系统模型中 都充分利用了这一 函数调用 特性 利用Stateflow模型来控制Simulink子系统的运行 合理完成数据的交互任务 绑定事件如果将事件与状态绑定 则只有状态内的动作 状态动作 或者子状态的动作 子状态之间的转移动作和条件动作 能够调用该事件 实现事件的广播 事件广播可以是输出事件的广播 也可以是本地事件的广播 层次化建模 层次化模型的构成 层次化状态图的转移转移原则 1 子状态的各种对象仅仅在父状态活动时才有可能执行或者有效 2 当存在直接从父状态发出的转移时 可以不用考虑具体哪一个子状态处于活动状态 3 超转移优先于子状态之间的转移而被检测 case1 假设 当前Super1状态处于活动状态同时其子状态Sub2也处于活动状态 当事件E发生时 case2 如果Super2状态处于活动状态 同时其子状态Sub4处于活动状态 当事件E发生时 历史节点 车载音响系统为例 每次打开车载音响时 音响总是恢复前一次关闭音响时的状态 如果前一次关闭音响时正在收听激光唱机 则再次打开音响时 音响总是会恢复打开激光唱机 甚至从关闭音响时正在播放的音轨处继续播放歌曲 那么像这样的系统用Stateflow来进行建模就需要使用Stateflow中的历史节点 历史节点是一种特殊的Stateflow图形对象 它只能够用于具有层次的状态内部 在层次化的框图子状态之间如果存在超转移 则历史节点也无法发挥作用 历史节点能够影响默认转移的工作 使默认转移仅在首次激活系统时发挥作用 其余的时间就依赖于历史节点记录的状态来恢复子状态的活动情况 内部转移 内部转移是一种特殊的转移 就是指在状态内部的转移 它从父状态内边缘出发 终止于父状态内的子状态或者连接节点边缘上 也可以终止于状态的内边缘 内部转移能够适当地减小模型复杂度 提高模型的执行效率 示例 讨论关于自循环转移的执行 1 当前状态A处于活动状态 事件E发生 但是条件C1不满足 2 事件E再次发生了 而且此时条件C1满足 3 事件E第三次发生 此时条件C2不满足 1 当前父状态A处于活动状态 同时子状态A1处于活动状态 当事件R发生时 2 如果当前父状态A处于活动状态 同时子状态A2处于活动状态 当事件R发生 层次化模型的转移检测优先权 转移检测的基本原则 1 转移测试首先从最高层次的活动状态开始 然后逐级向内检测 2 外部转移优先于内部转移被检测 3 在同样的层次上 超转移首先被检测 根据这些基本原则 有以下的检测顺序 1 转移的测试总是从活动的父状态开始 向外的转移 即从父层次状态外边缘出发的转移首先被测试 这些转移能够使父状态退出活动转移 所以它们首先被检测 2 接着被检测的是内部转移 即从父层次状态内边缘出发的转移 3 从活动的子状态开始检测转移 从子状态外边缘出发穿越父状态边缘的转移 超转移 首先被检测 4 然后是父状态内部子状态之间的转移被检测 假设此时父状态A处于活动状态并且子状态A1处于活动状态 当触发发生时 根据前面介绍的层次化状态图转移检测优先权和转移冲突检测优先权 求系统处理的次序 状态动作与状态执行的次序 1 当Super父状态被首次激活时 2 当父状态处于活动状态而此时发生了某个事件触发时 示例 讨论 转移检测 子状态图 在创建层次化模型时 尽管使某个状态包含了其他的状态 转移以及连接节点等图形对象而构成了层次 但是在用鼠标移动父状态时 子状态并不跟随父状态移动 这对于编辑层次化的状态图很不方便 而且 当子层次内部的状态变得复杂时 框图的编辑区域是有限的 为了解决这些问题 就引出了子状态图的方式 使用组合的状态 1 在需要组合的状态上单击鼠标右键 例如这里就需要右键单击PowerON状态 2 在弹出的快捷菜单中执行MakeContents子菜单下的Grouped命令最便捷的方法是通过鼠标双击来完成 利用鼠标左键双击需要组合的状态 则状态会变成组合模式 再次双击 则取消组合模式 创建子状态图ex11 第五章有限状态系统 并行机制 并行机制本地事件广播隐含事件时间逻辑 并行机制 概述在有限状态系统中 状态的行为可以按照其解析方式分为两大类 互斥状态 exclusive或者OR 和并行状态 parallel或者AND 如果在层次化的状态图中包含了互斥的状态 也就意味着同一时刻在同一层次的状态中仅有一个状态处于活动状态 若状态被设置为并行状态 则位于同一层次下的所有状态都在同一时刻处于活动状态 在同一层次下 状态要么是互斥的 要么是并行的 不可能在同一层次下存在两种模式共存的情况 状态Slot和状态Player的边框是虚线 因此这两个状态就是处于并行状态的Stateflow状态 其内部包含的子状态NoDisk和HasDisk以及Stop和Play状态边框是实线 因此子状态之间是互斥的状态 子状态在相应的层次同一时刻只能有一个处于活动状态 当状态处于并行时 并行的状态并不是严格地同时被激活 它们的执行和激活也有一定的次序基本原则就是 在图形编辑器中 位置较高的状态具有较高的执行次序编号 处于同一水平线上的并行状态 左边的状态具有较高的执行次序编号 当第一个事件发生时 求系统首先激活整个状态图 依次激活相应的状态并执行动作 当再次发生事件E时 求系统依次执行相应的转移并执行相应的动作 图形盒的应用 图形盒 Box 是一种比较特别的Stateflow图形对象 它并不参与Stateflow的实际运行 也不能看做是状态 从图形盒上引出转移或者将转移的终点放置在图形盒的边缘上都是非法的 不过 图形盒能够影响并行状态的执行次序 在某些情况下可以将图形盒作为框图的组织形式 图形盒 Box 功能 层次化建模应用数据对象 创建在图形盒内部的本地数据对象只能够被图形盒内部包含的对象使用影响并行状态的执行次序 图形盒对象是所有图形对象中位置最高的对象 本地事件广播 定义本地事件 本地事件主要用于包含并行状态的有限状态系统 使不同的并行状态之间进行交互 广播本地事件进行本地事件广播就是将事件的名称写在相应的动作中就可以了 那么监听这个事件的相应动作 状态转移 动作等就会在事件广播的时刻完成工作 直接事件广播直接事件广播 就是将特定的事件发送给指定的状态 而不是出现一呼百应的情况 直接事件广播需要通过函数send来实现 它的语法如下 send event name state name 受限事件广播将定义在状态内部的事件叫做受限事件 QualifiedEvent 在动作中实现受限事件广播的方法是通过以下语法实现的 state name event name 广播的事件仅仅被定义该事件的状态接收 因为这个事件是定义在指定的状态中的本地事件 在其他状态中 这个事件是没有意义的 事件广播的执行次序 事件广播很类似函数的调用 可以将广播事件看做在动作执行的过程中调用了一个函数 在函数执行完毕退出之后 系统才继续后面的工作 也就是说 当事件被广播后 系统将与事件广播相关的所有动作都执行完毕之后 才会继续执行广播事件动作之后需要执行的其他动作 一般事件广播的执行 假设当前处于活动的子状态为A1a和A2a 当事件E1发生时 如果此时活动的子状态同样为A1a和A2a 那么当事件E1发生时 直接事件广播的执行状态图的本地事件广播能够影响状态图内部所有相关的对象 为了避免事件广播引起一些不必要的动作执行 需要使用直接事件广播 将事件直接发送给状态 假设当前处于活动的子状态为A1a和A2a 当事件E1发生时 受限事件广播的执行 假设当前处于活动的子状态为A1a和A2a 当事件E1发生时 早期返回逻辑 Stateflow在处理状态机工作时实际上是一种单线程的工作方式 事件广播会打断当前的工作流程 而且只有在广播事件相关的工作全部结束之后 才继续处理原来的后续工作 在这种处理方式下 事件广播对原有的工作流程有时可能会造成一些影响 并且产生一些冲突现象 针对不同的动作类型 Stateflow解决的原则略有不同 这里总结如下 Entry动作 如果与事件广播相关的所有动作都执行完毕之后 状态已经不再处于活动状态 则所有剩余的entry动作以及进入状态之后的相应处理就不运行了 Exit动作 如果与事件广播相关的所有动作都执行完毕之后 状态已经不再处于活动状态 则所有剩余的exit动作以及退出源状态进入目标状态之间的转移就不运行了 During动作 如果与事件广播相关的所有动作都执行完毕之后 状态已经不再处于活动状态 则所有剩余的during动作就不运行了 条件动作 如果与事件广播相关的动作都执行完毕之后 转移流程的源状态或者流程图的父层次状态不再处于活动状态 则所有剩余的未执行或未检测流程就不再被检测执行了 转移动作 如果与事件广播相关的动作都执行完毕之后 转移通路的父层次状态不再处于活动状态 或者父层次状态中另外一个子状态被激活了 则所有剩余的未执行的转移动作就不再执行了 当前活动的状态为A 在事件E发生时 简化并行状态图的设计 隐含事件隐含事件 ImplicitEvents 就是在Stateflow模型运行过程中 状态图或者状态发生了某些变化时 系统将其作为某些类型事件来处理的事件 隐含事件之所以隐含是因为在使用这些类型的事件时 用户不需要在数据字典中明显地定义事件就可以直接被Stateflow使用 隐含事件类型 状态图被唤醒 状态被激活 进入活动状态状态退出活动状态数据对象的数值发生了变化 Stateflow中 是通过若干关键字来定义这些隐含事件的 这些关键字包括 change或chg 数据对象发生变化时发生相应的事件 enter或en 进入某个状态时发生相应的事件 exit或ex 退出某个状态时发生相应的事件 tick 与wakeup效果一致 wakeup 当状态图被唤醒时发生相应的事件 在使用隐含事件时要利用相应的关键字以及具体的对象 其基本语法为 event object name Stateflow还定义了隐含条件 它需要通过关键字in来定义 in state name in函数内定义的state name状态当前处于激活的状态 则该条件为真 否则为假 时间逻辑时间逻辑 TemporalLogic 是在Stateflow模型中根据某些事件的发生次数来进行判断的逻辑运算 这类运算得到的结果为逻辑量 非真即假 可以将时间逻辑当作事件或者条件应用于系统的转移中 时间逻辑对建立那些需要统计某些信号次数并且信号次数达到一定数量才进行状态切换的系统非常有用 时间逻辑定义关键字 after n Event 当事件Event发生了n次以后 after运算得到的结果都是逻辑真before n Event 当事件Event发生n次以前before运算符得到的结果都是逻辑真at n Event 当事件Event第n次发生时 at运算得到的结果是逻辑真every n Event 当事件Event每发生n次时 every运算得到的结果是逻辑真 时间逻辑应用时间逻辑可以作为条件或者事件应用在转移标签中 时间逻辑是不能用于默认转移或者流程图中的转移的 如果将时间逻辑用于控制转移 则转移的源状态就是时间逻辑的相关状态 AssociateState 如果将时间逻辑用于状态动作 则包含状态动作的状态就是时间逻辑的相关状态 AssociateState- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Stateflow教程 Stateflow 教程 PPT 课件
装配图网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文