States 可以有不同的操作类型,包含了entry, during, exit, bind, and, on event_name 操作。状态的操作使用以下通用格式的标签表示法分配给操作类型:
name/
entry:进入操作
during:在操作期间
exit:退出操作
bind:数据名, 事件名
on event_name:在事件名操作
下图中显示了不同的状态操作类型。
在状态标签中输入名称后,输入回车并指定状态的操作。在标签中输入动作类型的顺序无关紧要。如果未显式指定语句的操作类型,则图表会将该语句视为entry操作。
状态操作 | 缩写 | 描述 |
---|---|---|
entry | en | 当状态变为激活态时执行 |
exit | ex | 当状态处于激活状态并且发生状态转换时执行 |
during | du | 当状态处于活动状态并且发生特定事件时执行 |
bind | 无 | 绑定事件或数据对象,以便只有该状态及其子级才能广播事件或更改数据值 |
on event_name | 无 | 当状态处于活动状态并接收到event_name广播时执行 |
on after(n, event_name) | 无 | 当状态处于活动状态并且接收到n个event_name广播后执行 |
on before(n, event_name) | 无 | 当状态处于活动状态且在接收到n个event_name广播之前执行 |
on at(n, event_name) | 无 | 当状态处于活动状态并且正好接收到n个event_name广播时执行 |
on every(n, event_name) | 无 | 当状态处于活动状态并且每n次接收到event_name广播时执行 |
Entry 操作前面是前缀Entry,简称en,后面是必需的冒号(:),后面是一个或多个操作。用回车符、分号(;)或逗号(,)分隔多个操作。如果输入名称和斜杠,然后直接跟着操作,则这些操作将被解释为输入操作。如果仅指定条目操作,则此简写非常有用。
状态的输入操作在进入状态(变为活动状态)时执行。在前面的示例中,当默认转换进入状态A时,将执行入口操作id=x+y。
退出操作
退出操作前面是前缀Exit或ex,简称Exit,后面是必需的冒号(:),后面是一个或多个操作。用回车符、分号(;)或逗号(,)分隔多个操作。
当状态处于活动状态并发生状态转换时,将执行状态的退出操作。
During操作前面是前缀During或du,后面是必需的冒号(:),后面是一个或多个操作。用回车符、分号(;)或逗号(,)分隔多个操作。
在一个状态的操作过程中,当该状态处于活动状态且发生事件且无法有效转换到另一个状态时执行。
绑定操作前面是前缀Bind,后面是必需的冒号(:),后面是一个或多个事件或数据。使用回车符、分号(;)或逗号(,)分隔多个数据/事件。
绑定操作将指定的数据和事件绑定到一个状态。绑定到某个状态的数据可以通过该状态或其子级的操作进行更改。其他状态及其子状态可以自由读取绑定的数据,但不能更改。绑定到某个状态的事件只能由该状态或其子状态广播。其他状态及其子状态可以自由收听绑定的活动,但不能发送。
绑定操作应用于图表,无论绑定状态是否处于活动状态。在前面的State Action Types示例中,状态A的绑定操作bind:id,time_out将数据id和事件time_out绑定到状态A。此绑定可防止图表中的任何其他状态(或其子状态)更改id或广播事件time_oout。
如果另一个状态包括更改数据的操作或广播绑定到另一个状态的事件,则会发生解析错误。以下示例显示了其中一些错误情况:
状态动作 | 分析错误的原因 |
---|---|
bind: id in state B | 只有一个状态可以更改绑定到状态A的数据id |
entry: time_out in state C | 只有一个状态可以广播绑定到状态A的事件time_out |
将函数调用事件绑定到状态也会绑定它所调用的函数调用子系统。在这种情况下,函数调用子系统在进入绑定状态时启用,在退出绑定状态时禁用。
在event_name上,操作前面是前缀On,后面是唯一的事件event_name,后面是一个或多个操作。用回车符、分号(;)或逗号(,)分隔多个操作。您可以为多个事件指定操作,方法是在不同事件的event_name行上添加其他操作。如果希望不同的事件触发不同的操作,请在状态标签中输入多个on event_name操作语句,每个语句指定特定事件或一组事件的操作,例如:
on ev1: action1();
on ev2: action2();
转换操作类型
在“状态操作类型”中,可以看到如何将操作附加到状态的标签。也可以将动作附加到变换标签上的变换。转换可以有不同的操作类型,包括事件触发器、条件、条件操作和转换操作。动作类型遵循以下通用格式的标签符号:
event_trigger[condition]{condition_action}/transition_action
以下示例显示了典型的转换标签语法:
Transition | Event Trigger | Condition | Condition Action | Transition Action |
---|---|---|---|---|
状态 A 到 状态 C | event1 | temp>50 | func1() | 无 |
状态A 到 状态B | event2 | 无 | 无 | data1=5 |
在转换标签语法中,事件触发器首先显示为事件的名称。它们没有区别的特殊特性,无法将它们与转换标签中的其他动作区分开来。在转换操作类型的示例中,从状态A的两个转换都有事件触发器。从状态A到状态B的转换具有事件触发事件2,并且从状态A转换到状态C具有事件触发器事件1。
事件触发器指定导致进行转换的事件,前提是条件(如果指定)为true。指定事件是可选的。没有事件表示在发生任何事件时进行转换。使用OR逻辑运算符(|)指定多个事件。
在转换标签语法中,条件是用方括号([])括起来的布尔表达式。在“转换操作类型”中的示例中,从状态A到状态C的转换具有条件temp>50。
条件是一个布尔表达式,用于指定在指定表达式为true的情况下发生转换。遵循以下条件定义和使用指南:
条件表达式必须是计算结果为true(1)或false(0)的布尔表达式。
条件表达式可以由以下任意一个组成:
在数据和数值之间进行比较的布尔运算符
返回布尔值的函数
当指定为参数的状态处于活动状态时,in(state_name)条件的计算结果为true
注意:图表不能使用in条件来触发基于其他图表中状态活动的操作。
条件表达式可以调用图形函数、真值表函数或返回数值的MATLAB®函数。
例如,[test_function(x,y)<0]是一个有效的条件表达式。
注意:如果条件表达式调用具有多个返回值的函数,则仅应用第一个值。不使用其他返回值。
条件表达式不应调用导致图表更改状态或修改任何变量的函数。
对于具有AND关系的表达式,可以使用&for;对于具有OR关系的表达式可以使用|对布尔表达式进行分组。
赋值语句不是有效的条件表达式。
一元递增和递减操作不是有效的条件表达式。
在转换标签语法中,条件操作遵循转换条件,并用大括号({})括起来。在“转换操作类型”中的示例中,从状态A到状态C的转换具有条件操作func1(),这是一个函数调用。
条件操作在条件评估为true后立即执行,但在转换目标被确定为有效之前执行。如果未指定任何条件,则隐含条件的计算结果为true,并执行条件操作。
注意:只有当事件触发器(如果有)处于活动状态时,才会检查条件。
在转换标签语法中,转换操作前面有一个正斜杠(/)。在“转换操作类型”中的示例中,从状态A到状态B的转换具有转换操作data1=5。
只有在采用完整的转换路径后,才会执行转换操作。它们在转换目标被确定为有效并且条件(如果指定)为true之后执行。如果转换由多个段组成,则只有在确定到最终目的地的整个转换路径有效后,才执行转换操作。