主要内容

如何状态流对象在执行期间进行交互

在执行期间,Stateflow®对象相互交互以模拟真实世界的行为。在下面的模型中,显示了不同的statflow对象,并解释了它们之间的交互。

示例模型概述

示例模型显示了图表中常见的图形对象和非图形对象在执行期间是如何交互的。这些对象包括:

  • 条件和条件作用

  • 专属(或)国家

  • 流程图

  • 职能调用

  • 历史交汇处

  • 平行(和)状态

  • 国家行动

  • 由输入事件保护的转换

有关图表语义的详细信息,请参见图表执行的阶段

酒店办理登机手续的模型

本例使用酒店登记流程来解释状态流程图语义。

sf_语义酒店_入住模型由四部分组成手动开关(金宝app模型)块,一多路复用器(金宝app模型)块,一多端口交换机(金宝app模型)街区,一张酒店图表,还有一张陈列(金宝app模型)块。

意图 基本原理

手动开关(金宝app模型)

允许在模拟期间在两个设置之间切换,而无需暂停或重启。

在模拟过程中,您可以通过发送以下输入事件之一交互式触发图表:

  • 入住酒店

  • 致电客房服务

  • 触发火警

  • 火灾警报后发出全无警报信号

多路复用器(金宝app模型)

将多个输入信号组合成一个向量。

只有当图表作为输入向量连金宝app接到图表的触发端口时,图表才能支持多个输入事件。

多端口交换机(金宝app模型)

允许在两个以上输入之间进行选择。

此块为图表输入数据提供值room_type,每个房间类型对应一个数字(1、2或3)。

一个手动开关块不能支持两个以上的输入,金宝app但支持一个多端口交换机块罐。

陈列(金宝app模型)

显示输入信号的最新数值。

在模拟期间,对图表输出数据的任何更改费用显示在显示器中。

Hotel图表包含图形对象,如状态和历史节点,以及非图形对象,如条件和条件动作。

有关对象到其在图表中位置的映射,请参见状态流对象

图表如何与金宝app阻碍

图表初始化

模拟开始时,图表将唤醒并执行其默认转换,因为在初始化时执行(输入)图表期权已开启(见在初始化时执行图表).然后图表就睡着了。

请注意

如果此选项处于禁用状态,则在您切换其中一个选项之前,图表不会唤醒手动开关阻碍。可以在“图表属性”对话框中验证此选项的设置。在图表的顶层内单击鼠标右键,然后选择性质从上下文菜单中。

图表与其他块的交互

图表只有在一个时才会醒来边沿触发输入事件发生:check_in客房服务火警一切正常.当你切换一个手动开关块用于模拟期间的输入事件,图表检测上升或下降边并唤醒。当图表是清醒的:

  • 多端口交换机块为图表输入数据提供一个值room_type

  • 陈列块显示图表输出数据值的任何更改费用

图表不活动

完成执行所有可能的执行阶段后,图表返回睡眠状态。

图表执行的阶段

以下各节解释了酒店图表中每个阴影区域的图表执行。

提示

单击着色区域可直接跳转到有关图表执行阶段的信息。

阶段:图表初始化

本节描述了Front_desk在图表醒来之后的状态。

阶段 酒店情景 图表行为
1

您的第一站是酒店的前台。

在图表级别,默认转换为Check_in发生,使该状态处于活动状态。然后,默认转换为Front_desk发生,使该状态处于活动状态。

参考,见输入图表或状态

2

你在入住酒店后离开前台。

check_in事件保护来自的传出转换Front_desk. 当图表接收到一个事件广播时check_in,转换将生效。

参考,见状态流程图如何响应事件

3.

就在离开前台之前,你可以拿起你的包搬到你的房间。

在转换发生之前出口作用Front_desk设置搬运行李本地数据为1。然后Front_desk变得不活跃。

参考,见退出一个国家

图表初始化建模指南。以下准则适用于图表初始化。

建模指南 为什么本指南适用 参考

使用独占(或)分解时,当层次结构级别的两个状态时可以同时处于活动状态。

本指南可确保正确的图表执行。例如,Check_in候车区是独占(或)状态,因为您不能同时在酒店内外。

使用默认转换将第一个状态标记为在独占(或)状态中变为活动状态。

此指南可防止图表执行期间出现状态不一致错误。

使用事件,而不是条件,保护依赖于出现的转换,而无需固有的数值。

由于您无法轻松量化入住酒店的数值,因此将此类事件建模为事件。

用A.出口操作,在状态变为非活动之前执行一次语句。

其他类型的状态操作执行方式不同,不适用:

  • 条目动作只执行一次,就在状态变为活动状态之后。

  • 在每次执行操作时执行操作(除了状态变为活动之后第一次执行)。只要图表保留在该状态并且不存在有效的传出转换时,执行就会继续执行。

  • 事件名称动作只有在接收到事件广播后才会执行。

阶段:评估单个结的输出跃迁

本节介绍退出后发生的情况Front_desk状态:对单个连接的一组传出转换的评估。

阶段 酒店情景 图表行为
1

您可以移动到三种类型的房间之一。

check_in事件触发从Front_desk,根据您选择的房间类型,有三条转换路径可用多端口交换机块转换测试基于您分配给每个路径的优先级进行。

参考,见一组流程图的执行顺序

2

如果你选择的是高级套房,基本费用是1500美元。

如果是room_type输入数据等于1,顶部转换是有效的。如果此条件为真,则通过设置费用输出数据到1500。

请注意

如果顶部转换无效,则控制流回溯到中心枢纽,以便能够进行下一个转换的测试。这种类型的回溯是有意的。

了解无意的回溯以及如何避免回溯,请看流程图中的回溯创建流程图的最佳实践

3.

如果您选择家庭套房,基本费用是1000。

如果room_type等于2,中间转换有效。如果此条件为true,则通过设置执行条件操作费用到1000。

4

如果你选择单人房,基本费用是500英镑。

如果room_type等于3时,底部过渡有效。如果此条件为真,则通过设置执行条件操作费用到500。

如果room_type是否具有除1、2或3以外的值?

用于评估输出过渡的建模指南。以下指南适用于转换语法。

建模指南 为什么本指南适用 参考

使用条件而不是事件来保护依赖于数值出现的转换。

因为可以用数字量化酒店房间类型,所以可以将房间类型的选择表示为条件。

状态流中的流程图

尽可能使用条件操作而不是转换操作。

条件操作在条件计算为true时立即执行。转换操作只有在转换路径完成后才能执行,直至终止连接或状态。

除非需要执行延迟,否则使用条件操作而不是转换操作。

转换

使用显式排序来控制一组传出转换的测试顺序。

您可以指定明确的或者含蓄的转换顺序。默认情况下,图表使用显式顺序。如果切换到隐式顺序,则当图形对象移动时,转换测试顺序可能会更改。

过渡评估令

阶段:执行巨额的国家行动

本节描述在输入Checked_in状态,无论哪个子状态变为活动状态。

阶段 酒店情景 图表行为
1

到达所需的房间后,您可以完成手提袋。

入口通过设置执行操作搬运行李本地数据到0。

2

如果你叫客房服务,你的旅馆账单会不断增加。

如果图表接收到活动广播客房服务,则会发生以下操作:

  1. 柜台服务本地数据增量1。

  2. 对的函数调用费用发生,返回所存储的酒店账单的价值费用输出数据。

参考,见状态流程图如何响应事件

国家行动执行的建模指南。下面的指导方针适用于状态操作。

建模指南 为什么本指南适用 参考

用A.入口操作,在状态变为活动状态后执行一次语句。

其他类型的状态操作执行方式不同,不适用:

  • 操作在每个时间步骤中执行,直到有一个有效的状态转换。

  • 出口在状态变为非活动状态之前,操作执行一次。

状态

用A.事件名称或者message_name仅在收到事件广播或消息后执行语句的操作。

使用超状态来封装共享相同状态操作的多个子状态。

此指南支持重用应用于多个子状态的状态操作。您只编写状态操作一旦,而不是在每个子变量中单独写入它们。

创建子状态和超级状态

阶段:来自状态操作的函数调用

图表的这一部分描述了在状态处于活动状态时如何执行函数调用。

阶段 酒店情景 图表行为
1

根据您的房间类型和客房服务请求总数,您可以跟踪您的酒店账单。

费用MATLAB是一种®函数,将客房服务请求的总数作为输入,并返回当前的酒店账单作为输出。

如果你双击函数框,你会在函数编辑器中看到这个脚本:

功能y=费用(x)如果(房间类型==1)y=1500+(x*50);否则如果(房间类型==2)y=1000+(x*25);否则y=500+(x*5);结束

函数调用的建模指南。以下准则适用于函数调用。

建模指南 为什么本指南适用 参考

使用MATLAB函数在图表中执行数值计算。

MATLAB函数比图形函数、真值表或Simulink更擅长处理数值计算金宝app®功能。

通过定义MATLAB函数重用MATLAB代码

在功能签名中使用描述性名称。

描述性函数名称增强了图表对象的可读性。

阶段:使用独占子状态执行状态

图表的这一部分显示了如何具有独占(或)分解的状态。

阶段 酒店情景 图表行为
1

当你到达行政套房时,你首先进入卧室。

请注意

行政套房有独立的卧室和用餐区。因此,您在任何时候都只能在套房的一个区域。

当条件时房间类型==1条件是否为真费用= 1500.执行。完成转换路径触发这些状态初始化操作:

  1. Checked_in变为活动状态并执行其输入操作。

  2. 行政套房变得活跃。

  3. 默认转换到卧室发生,使该状态处于活动状态。

参考,见输入图表或状态

2

当你叫客房服务时,你进入用餐区用餐。

客房服务事件发生时,从卧室Dining_area.发生。

3.

当您希望从用餐区拆除的食物时,您可以再次订购客房服务,然后返回卧室。

客房服务事件发生时,从Dining_area.卧室发生。

4

如果您因火警而离开行政套房,则在发出解除警报信号后返回前一个房间。

如果过渡行政套房发生时,历史连接记录最后一个活动子状态,卧室或者Dining_area..有关如何发生此转换的详细信息,请参阅阶段:事件保护状态之间的转换

排他性(OR)状态执行的建模指南。以下准则适用于独占(OR)州。

建模指南 为什么本指南适用 参考

当该层次结构级别上没有两个状态可以同时处于活动状态时,请使用排他(或)分解。

本指南可确保正确的图表执行。例如,卧室Dining_area.是独占(或)状态,因为您不能同时处于两个位置。

如果重新进入具有独占(或)分解的状态取决于先前活动的子状态,请使用历史连接。这种类型的连接在图表退出状态时记录活动子状态。

如果您不记录以前的活动子状态,则会发生默认转换,并且在状态重新进入时,错误的子状态会变为活动状态。

例如,当火警响起时,你正在吃东西,你会回到卧室而不是餐厅。

阶段:使用并联换物执行状态

图表的这一部分显示了如何使用并行(和)分解的状态。

阶段 酒店情景 图表行为
1

当您的家人到达套房时,家庭成员可以在两个卧室(例如,父母在主卧室,孩子在第二个卧室)。默认房间选择不适用。

当条件时房间类型==2条件是否为真费用=1000执行。完成转换路径触发这些状态初始化操作:

  1. Checked_in变为活动状态并执行其输入操作。

  2. 家庭套房变得活跃。

  3. 并行状态按照每个状态右上角的数字给出的顺序唤醒:主卧室,然后第二间卧室

    我如何指定顺序?

参考,见输入图表或状态

2

你可以同时占据两个房间。

主卧室第二间卧室同时保持活跃。

并行(和)状态执行的建模指南。以下准则适用于平行(和)国家。

建模指南 为什么本指南适用 参考

在层次结构级别的所有状态时使用并行(和)分解可以同时处于活动状态。

本指南可确保正确的图表执行。例如,主卧室第二间卧室是并行状态,因为您可以同时占用两个房间。

具有并行(和)分解的状态中的历史连接。

本指南可防止编译时间错误。由于层次结构级别的所有并行状态同时都处于活动状态,因此历史交叉点没有意义。

使用显式顺序控制并行(和)状态的执行顺序。

您可以指定明确的或者含蓄的并行状态的排序。默认情况下,图表使用显式排序。如果切换到隐式排序,并行状态移动时,执行顺序可能会更改。

阶段:事件保护状态之间的转换

图表的这一部分描述了事件如何在异构(或)状态之间保护转换。

阶段 酒店情景 图表行为
1

如果火灾报警的声音,您将离开酒店并搬到外面的等候区。

当图表接收到一个事件广播时火警,则从的一种基本状态发生转变Check_in候车区

这种转变是如何发生的?

2

如果出现全清零,您可以离开等候区并返回酒店内的上一个位置。

当图表接收到一个事件广播时一切正常,过渡到候车区的先前活跃的状态Check_in发生。

中每个层次的历史连接Check_in使图表能够记住在转换到之前哪个子状态是活动的候车区发生。

这种转变是如何发生的?

保护过渡的建模指南。下面的指南讨论了事件和条件的使用。

建模指南 为什么本指南适用 参考

使用事件,而不是条件,保护依赖于没有数值的发生的转换。

由于无法轻松量化火灾警报或完全清除信号的数值,因此将此类事件建模为事件。

通过发送输入事件激活状态流程图