stateflow-有限状态系统-层次化建模

就像 Simulink 一样,Stateflow 也可以进行层次化建模。有限状态系统可以被分为若干 模型片断,每个模型片断都是独立的有限状态系统,而彼此组合起来则可构成复杂的有限 状态系统。

1、层次化模型的构成

注意查看图 5-33 所示的 Stateflow 框图中的 PowerON 状态,在 PowerON 状态内部包含 了三个子状态——Radio、CD 和 Tape。像这样,在一个状态内部包含了其他状态时,就构 成了层次化的状态图模型。此时,像 PowerON 这样的状态被称为父状态,而 CD、Radio 和 Tape 三个状态就是 PowerON 状态的子状态。这种关系可以由状态的属性对话框直接获取。

在图 5-33 所示的有限状态图中,PowerON 和 PowerOFF 状态位于同一层次,它们都在 状态图的层次,所以它们的 Parent 是状态图,即模型中的 Chart。而 Chart 的 Parent 就是状 态机,即整个模型。这些信息都可以在相应对象的属性对话框中通过查看 Parent 属性来 得到。

另外,还需要注意,在同一层次的模型中,一般都需要存在一个默认转移,就像 PowerON 状态内部的三个子状态也具有默认转移一样。 默认转移将 CD 子状态作为那个层次内的默 认状态。根据有限状态机理论可知,当父层次状态被激活时,其内部必有一个子状态处于活动状态。对于处于 Chart 层次的状态,当状态图被激活时,也必有一个状态被激活。默认 转移就是定义在相应层次中第一个被执行的元素。默认转移会激活默认的状态。在有限状 态系统中不允许出现系统的二义性错误。

2、层次化状态图的转移

当 Stateflow 的框图具有了层次时,不同层次的状态之间是允许存在转移的。具有了层 次状态的状态框图运行起来会出现一些特殊情况。不过,万变不离其宗的原则有以下两条, 需要读者牢记:

一、子状态的各种对象仅仅在父状态活动时才有可能执行或者有效。

二、当存在直接从父状态发出的转移时,可以不用考虑具体哪一个子状态处于活动状 态

如前所述,在不同层次的状态之间允许存在转移,例如图 5-37 所示的模型中,从子状 态 Sub4 出发存在一个转移,其终点直接位于父状态 Super1 的边缘上。像这种穿越了父状态 边缘的转移,在 Stateflow 中统称为超转移。根据检测优先权原则可知,超转移优先于子状 态之间的转移而被检测。

假设,当前 Super1 状态处于活动状态,同时其子状态 Sub2 也处于活动状态,当事件 E 发生时,Super1 状态需要脱离活动状态,激活 Super2 状态,各个状态以及动作的执行次序为:

(1) 退出子状态 Sub2,执行 Sub2 子状态的 exit 动作 act4; (2) 退出 Super1 状态,执行 Super1 状态的 exit 动作 act2; (3) 执行转移,执行转移动作 act5; (4) 进入 Super2 状态,执行 Super2 状态的 entry 动作 act6; (5) 进入 Sub3 子状态,执行 Sub3 子状态的 entry 动作 act8。 同样,如果 Super2 状态处于活动状态,同时其子状态 Sub4 处于活动状态,当事件 E 发生时,各个状态的执行次序为: (1) 退出子状态 Sub4,执行 Sub4 子状态的 exit 动作 act9; (2) 退出 Super2 状态,执行 Super2 状态的 exit 动作 act7; (3) 执行转移,执行转移动作 act10; (4) 进入 Super1 状态,执行 Super1 状态的 entry 动作 act1; (5) 进入 Sub1 子状态,执行 Sub1 子状态的 entry 动作 act3。

因此在具有层次的状态之间进行转移时,一般转移路径的源头是从源状态最内部的活 动的子状态出发,而终止于目标状态的最内部的子状态。如果存在超转移,则按照超转移 的定义指定活动目标状态。也就是说,如果从 Sub4 出发的转移终点位于子状态 Sub2 的边 缘,即超转移穿过了 Super1 父状态的边缘,直接终止于子状态的边缘,则在执行转移激活 目标状态时,首先激活父状态 Super1,然后根据超转移的目标直接激活 Sub2 子状态,而不 是像上述过程那样激活 Sub1 子状态。

3、历史节点

在真实的有限状态系统中,每次激活父层次状态时,其默认的子状态并不是总能被激 活。就拿车载音响系统为例,每次打开车载音响时,音响总是恢复前一次关闭音响时的状 态,如果前一次关闭音响时正在收听激光唱机,则再次打开音响时,音响总是会恢复打开 激光唱机,甚至从关闭音响时正在播放的音轨处继续播放歌曲。那么像这样的系统用 Stateflow 来进行建模就需要使用 Stateflow 中的历史节点。 如果需要在 Stateflow 层次化模型中使用历史节点,则单击 Stateflow 图形对象工具栏上 的历史节点按钮 ,然后把历史节点拖放到状态的内部任意位置即可,如图 5-40 所示。

历史节点是一种特殊的 Stateflow 图形对象,它只能够用于具有层次的状态内部。如果 层次化的框图中父层次状态内存在历史节点,则历史节点就能够保存父层次状态退出活动 状态时子状态的活动情况。当父层次状态再次被激活时,历史节点能够替代默认转移和默 认状态,恢复历史节点记录的子状态,即恢复父层次状态退出活动状态时的现场状况。不 过,在层次化的框图子状态之间如果存在超转移,则历史节点也无法发挥作用。 如图 5-40 所示的框图与如图 5-33 所示的框图运行起来有什么样的区别呢?对于图 5-33 所示的系统,由于该框图没有使用历史节点,因此每次在 PowerON 父状态激活时,系统就 会根据默认转移激活默认的子状态——状态 CD。

由于图 5-40 所示模型中使用了历史节点, 因此只有在系统首次激活 PowerON 状态时,才会根据默认转移的定义激活默认状态 CD; 而在 Power 事件发生 PowerON 状态需要退出活动状态时,历史节点就记录下当前 PowerON 状态内部活动的子状态(假设发生 Power 事件时,用户正在听收音机,即 Radio 子状态处于 活动状态,则退出 PowerON 状态时历史节点记录下来 Radio 子状态是活动的子状态),当再 次发生 Power 事件激活 PowerON 状态时,系统会根据历史节点的记录,激活前一次退出 PowerON 状态时活动的子状态(即激活 Radio 子状态),而不是激活默认转移定义的默认状 态 CD。

4、内部转移

4.1、创建内部转移

4.2、内部转移的执行

4.3、自循环转移的执行

自循环转移可以分为向外的外部自循环转移和位于状态内部的内部自循环转移两种。

在图 5-47 所示的 Stateflow 框图中具有两个状态——状态 A 和状态 B,连接两个状态之 间的转移使用事件 E 和相应的条件控制。状态 A 和状态 B 都定义了状态动作,转移上也有 转移动作。其中,状态 A 内部具有内部自循环转移,而状态 B 具有外部自循环转移。

(1) 系统检查是否存在能够使状态 A 退出活动状态的转移,显然不存在这样的转移,因 此状态 A 将保持活动状态; (2) 执行状态 A 的 during 动作 out = 2,在 MATLAB 命令行窗体中会看到相应的输出; (3) 系统进一步检查状态 A 内部是否存在有效的转移,例如子状态之间的转移或者内部 转移,此时内部自循环转移有效; (4) 执行内部自循环转移上的转移动作 out = 4,在 MATLAB 命令行窗体中会看到相应 的输出; (5) 由于状态 A 保持活动状态,因而此时状态 A 的 exit 动作和 entry 动作都不会被执行, 系统进入到暂时的挂起状态,等待下一个触发事件的到来。 紧接着事件 E 再次发生了,而且此时条件 C1 满足,则系统按照下列次序执行相应的对 象和动作: (1) 系统检查是否存在能够使状态 A 退出活动状态的转移,此时存在这样的转移,因此 状态 A 将退出活动状态; (2) 执行状态 A 的 exit 动作 out = 3,在 MATLAB 命令行窗体中将看到相应的输出; (3) 状态 A 退出活动状态,执行转移,此时将执行转移动作 out = 5,同样在 MATLAB 命令行窗体中将看到相应的输出; (4) 激活状态 B,执行状态 B 的 entry 动作 out = 7,在 MATLAB 命令行窗体中将看到 相应的输出; (5) 系统进入暂时的挂起状态,等待下一个触发事件的到来。 接着事件 E 第三次发生,此时条件 C2 不满足,则系统按照下列次序执行相应的对象和 动作: (1) 系统检查是否存在能够使状态 B 退出活动状态的转移,显然从状态 B 出发,终点 为状态 A 的转移是无效的,但是状态 B 存在外部自循环转移,该转移此时是有效的; (2) 状态 B 执行 exit 动作 out = 9,在 MATLAB 命令行窗体中将看到相应的输出; (3) 状态 B 退出活动状态,执行外部自循环转移,此时将执行转移动作 out = 6,同样 在 MATLAB 命令行窗体中将看到相应的输出; (4) 外部自循环转移将重新激活状态 B,执行状态 B 的 entry 动作 out = 7,在 MATLAB 命令行窗体中将看到相应的输出; (5) 系统进入暂时的挂起状态,等待下一个触发事件的到来。 注意事件 E 第一次和第三次发生时,系统是如何处理内部自循环转移和外部自循环转 移的。由于外部自循环转移是一种向外的转移,它能够让状态退出活动状态,因此在第三 次事件发生时,状态 B 没有保持活动状态,而是完成了一次退出和一次进入的过程。相应 的内部自循环转移是保持在状态内部的转移,它不会让状态退出活动状态。因此状态 A 的 exit 和 entry 动作没有执行,而是执行了 during 动作。

5、层次化模型的转移检测优先权

5.1、1. 转移检测的基本原则

(1) 转移测试首先从最高层次的活动状态开始,然后逐级向内检测; (2) 外部转移优先于内部转移被检测; (3) 在同样的层次上,超转移首先被检测。

5.2、状态动作与状态执行的次序

6、本地数据对象

数据对象不仅可以属于状态图(Chart), 还可以属于状态。当数据对象定义给状态时,数据对象的类型只能为 Local、Constant 和 Parameter。其中类型为 Local 的数据对象是最常用的状态数据对象,也叫做本地数据对象。

6.1、创建本地数据对象

如果需要创建本地数据对象,则需要通过模型查看器来完成。

6.2、应用本地数据对象

状态的本地数据对象与一般的数据对象使用起来是没有什么区别的,只不过需要留心 状态的本地数据对象的作用范围

7、子状态图

在创建层次化模型时,尽管使某个状态包含了其他的状态、转移以及连接节点等图形 对象而构成了层次,但是在用鼠标移动父状态时,子状态并不跟随父状态移动,这对于编 辑层次化的状态图很不方便,而且,当子层次内部的状态变得复杂时,框图的编辑区域是 有限的。为了解决这些问题,就引出了子状态图的方式。

7.1、使用组合状态

首先来介绍在创建层次化状态图过程中修改父层次状态位置时使子状态也同时跟着修 改的方法,这就是使用组合的状态。将层次化的状态图组合起来后,Stateflow 就认为组合 的状态是一个单独的图形对象,从而简化了层次化状态图的编辑。

7.2、创建子状态

7.3、子状态的超转移

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StateflowStateflowStateflow StateflowStateflowStateflowStateflow有限状态有限状态有限状态机 (finite state machinefinite state machinefinite state machine finite state machinefinite state machine finite state machine finite state machine finite state machine finite state machinefinite state machine finite state machinefinite state machinefinite state machine)的图形工具, )的图形工具, )的图形工具, )的图形工具, 它通过开发有限 通过开发有限 通过开发有限 状态机和流程图扩展 状态机和流程图扩展 状态机和流程图扩展 状态机和流程图扩展 了 SimulinkSimulinkSimulinkSimulinkSimulinkSimulinkSimulinkSimulink的功能。 的功能。 StateflowStateflowStateflow StateflowStateflowStateflowStateflow 使用自然、可读和易理解的形式 使用自然、可读和易理解的形式 使用自然、可读和易理解的形式 使用自然、可读和易理解的形式 使用自然、可读和易理解的形式 使用自然、可读和易理解的形式 , 可使复杂的逻辑问题 复杂的逻辑问题 复杂的逻辑问题 复杂的逻辑问题 变得清晰与简单,并且还 变得清晰与简单,并且还 变得清晰与简单,并且还 变得清晰与简单,并且还 变得清晰与简单,并且还 变得清晰与简单,并且还 与 MATLABMATLABMATLAB MATLABMATLAB\SimulinkSimulinkSimulinkSimulinkSimulinkSimulinkSimulinkSimulink紧密集成,为包 紧密集成,为包 紧密集成,为包 紧密集成,为包 含控制、优先级管理工作模式逻辑的嵌 含控制、优先级管理工作模式逻辑的嵌 入式系统 设计提供了有效的 开发手段,是 开发手段,是 本书的核心内容之一。读者在 本书的核心内容之一。读者在 本书的核心内容之一。读者在 本书的核心内容之一。读者在 本书的核心内容之一。读者在 本书的核心内容之一。读者在 5~8 5~8章将看到 章将看到 StateflowStateflowStateflow Stateflow StateflowStateflowStateflow应用 于 MCUMCUMCU器件的嵌入式开 器件的嵌入式开 器件的嵌入式开 器件的嵌入式开 发, 尤其 显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利显得心应手,一些采用 传统方法难于实现的算如果利StateflowStateflowStateflow Stateflow StateflowStateflow 建 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 模却非常容易。大到导弹、航空天器的控制,小点亮一个发光二极管 ,StateflowStateflowStateflow Stateflow StateflowStateflow 都非常称职。 都非常称职。 都非常称职。 StateflowStateflowStateflow StateflowStateflowStateflowStateflow 状态图模型 状态图模型 状态图模型 ,还可利用 ,还可利用 ,还可利用 ,还可利用 StateStateState Stateflow Coderlow Coder low Coderlow Coderlow Coder low Coder代码生成工具, 代码生成工具, 代码生成工具, 代码生成工具, 直 接生成 C代码。 代
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值