Scade 状态机 - 同步迁移
在 Scade 控制流状态机结构支持的迁移中,迁移类型除了强迁移与弱迁移外,还支持一类被称为同步(Synchro)迁移的迁移类型。在同步迁移特性中,涉及到两项关键字,分别为 state 修饰符 final
与迁移类型 synchro
。相关的文法如下
state_decl ::= [[ initial ]] [[ final ]] state ID
[[ unless {{ transition ; }}+ ]]
data_def
[[ until {{ transition ; }}
[[ synchro [[ actions ]] fork ; ]] ]]
为了更好地说明同步迁移的概念,将从说明以下例子开始
node SynchroTrTest(i1, i2, i3: int8)
returns (o: int8)
automaton SM
initial state State1
automaton InnerSM
initial state InnerState1
unless
if i2 > 42 restart InnerState2;
o = i1;
final state InnerState2
o = i2;
returns ..;
until synchro resume State4;
state State4
o = i3;
returns ..;
在该例子中,状态机 SM
中的状态 State1
内,data_def
部分包含的内容同样包含了一项状态机,InnerSM
。在状态机 InnerSM
中,有一项状态为 final
状态。在InnerSM
状态机中,若控制转移至 final
状态,则synchro
有资格被评估是否激发。在本例中,synchro resume State4
意味着总是激发。
所以同步迁移的目的是为了这样的场景:当状态机中某状态内,所有的内部状态机都达到了 final
状态,则该状态的 synchro
迁移才会被评估是否激发。
若干边界情况
在使用synchro
迁移过程中,需要注意一些边界情况。
1)当状态内没有状态机,但状态有synchro
迁移。
在syncrho
迁移的定义中,需要状态内的状态机都达到final
状态,迁移才开始被评估。若状态内无状态机,在该情况下,同步迁移总是会被评估,其行为如同常规的弱迁移。
例子如下。在该例子中,迁移 synchro restart State2;
总是会激发。
node AutomatonTest(i1, i2: int8)
returns (o: int8)
automaton SM
initial state State1
o = i1;
until synchro restart State2;
state State2
o = i2;
returns ..;
- 当状态内的状态机,没有
final
状态,但状态包含同步迁移。
由于同步迁移的被评估条件为,状态内部的状态机都转移至 final
状态。因此,当存在状态机无法进入 final
状态的场景下,同步迁移在任何情况下都无法被激发。
该场景如下例子所示。在该例子中,由于状态机 SM3
无 final 状态,因此,状态 S1 的同步迁移在任何情况下都不会被激发。
node smTest() returns ()
automaton SM
initial state S1
let
automaton SM2
initial state S3
let
tel
until if true restart S4;
final state S4
let
tel
returns ..;
-- SM3 has no final state.
automaton SM3
initial state S5
let
tel
until if true restart S6
state S6
let
tel
returns ..;
tel
until synchro restart S2;
state S2
let
tel
returns ..;