




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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调试器 状态面板 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在处理状态机工作时实际上是一种单线程的工作方式 事件广播会打断当前的工作流程 而且只有在广播事件相关的工作全部结束之后 才继续处理原来的后续工作 在这种处理方式下 事件广播对原有的工作流程有时可能会造成一些影响 并且产
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 强化电子信息制造业知识产权保护的策略及实施路径
- 晶圆级封装生产线项目可行性研究报告
- 2025年全科医学家综合能力评估模拟考试答案及解析
- 教育设施建设材料设备进场管理措施
- 2025年心脏科心电图分析竞赛试卷答案及解析
- 2025年急救中风病人的护理操作规范训练试卷答案及解析
- 收割机转让协议合同范本
- 月结协议合同去哪找模板
- 旅行社合同范本模板模板
- 抵押拍卖合同协议书范本
- 2025年村医笔试重点题库
- GB/T 22080-2025网络安全技术信息安全管理体系要求
- 2025年高校教师岗前培训《高等教育学》考试模拟试卷及答案(共五套)
- 储能站施工组织设计施工技术方案(技术标)
- 楼梯 栏杆 栏板(一)22J403-1
- 九年级《道德与法治》(上册)教学计划及教学进度
- 山地旅馆案例分析
- 国家城镇救援队伍能力建设与分级测评指南
- DB32∕T 4065-2021 建筑幕墙工程技术标准
- 部编版五年级语文上册(精美)课件 2 落花生
- 检具设计PPT.
评论
0/150
提交评论