Moore语义
在Moore图中,输出仅是当前状态的函数。在每个时间步,Moore图都会被唤醒,计算其输出,然后评估其输入,为下一个时间步重新配置自己。例如,在评估其输入后,摩尔图可能会转换到活动状态的新配置,也称为下一状态。然而,Moore图在改变状态之前必须始终计算其输出。
为了确保输出仅是状态的函数,Moore状态机强制执行以下语义:
输出仅取决于当前状态,而不取决于输入或时序逻辑。
输出不依赖于以前的输出。
图表必须只计算状态中的输出,而不是转换中的输出。
图表必须在更新状态之前计算输出。
Moore图设计规则
为了符合状态机的摩尔定义,必须确保每次Moore图唤醒时,它都会计算当前活动状态集的输出,而不考虑输入。因此,必须遵循Moore图的一套设计规则。
计算状态动作中的输出,而不是转换中的输出
为了确保输出仅取决于当前状态,必须在状态操作中计算输出。你无法在转换上定义操作,因为转换通常依赖于输入或时序逻辑。例如,如果你在转换的条件操作中计算输出,则图表会在输入发生变化时更新输出,这违反了Moore语义。
组合动作。
对于经典图表,n可以在状态中定义不同类型的操作。在Moore图中,每个状态只能包含一个动作。一个状态的操作可以由多个命令语句组成。Stateflow从上到下评估Moore图中的状态。Moore图中的活动状态在评估转换之前执行状态操作。因此,无论外部转换是否有效,都会在每个时间步计算输出。
不要标记状态操作。
不要在Moore图中用任何关键字标记状态操作,如en、du或ex。
如果使用,编译会报错。
限制数据范围
在Moore图中,这些数据限制适用:
限制机器父数据。
计算机父数据是你为Stateflow计算机定义的数据。Stateflow机器是Stateflow层次结构的最高级别。当你在此级别定义数据时,机器中的每个图表都可以读取和修改数据。为确保摩尔图不会访问图表外可能被不可预测地修改的数据,请不要使用机器父数据。
不要定义数据存储内存。
你无法在Moore图表中定义数据存储内存(DSM),因为图表外部的对象会修改DSM对象。状态流程图使用数据存储内存与Simulink®模型共享数据。数据存储内存充当全局数据。包含图表的Simulink层次结构中的其他块和模型可以修改DSM。Moore图不得访问可能发生不可预测变化的数据。
不要使用输入来计算输出
在Moore图中,输出不能依赖于输入。因此,使用输入直接或间接地对输出的计算会触发错误。
不要使用coder.extrinsic来调用外部函数
当使用coder.extrinsic调用外部函数时,不可能强制输出仅取决于当前状态。因此,在Moore图中用coder.extrinsic调用外部函数会触发错误。
在转换中不要使用动作
你无法在Moore图中定义条件操作或转换操作。
这些转换在Moore图中无效。
这里,每个转换都在条件中测试输入u,但根据输入的值在条件动作中修改输出y。此构造违反了Moore语义并引发错误。同样,不能在Moore图中使用转换动作。
不要使用纯流图
因为Moore图不能有条件或转换动作,所以使用状态来产生动作。
不要使用Simulink函数
你不能在摩尔图中使用Simulink函数。此限制可防止在图表执行过程中违反Moore语义。
不导出函数
你无法导出Moore图中的函数。
不要禁用内衬
Moore图语义需要内联。不要强行禁用内联。
不启用超级步骤语义
你不能在Moore图中使用超步语义。
不使用消息
你不能在Moore图中使用消息。
限制事件的使用
限制在摩尔图中使用事件:
有效用法:
仅使用一个输入事件来触发图表。
使用基于事件的时态逻辑来保护转换。
时序逻辑条件值的变化表现得像摩尔图内部调度的事件。在每个时间步,时间事件执行前的ticks仅取决于图表的状态。
在Moore图中,时序逻辑运算符的基本事件必须是预定义的事件,如滴答或唤醒。
无效用法:
你无法广播任何类型的事件。
你不能使用本地事件来保护转换。
你不能在摩尔图中使用本地事件,因为它们不是确定性的。这些事件可能在图表计算输出时发生,因此违反了Moore语义。
你不能使用隐式事件,如chg(data_name)、en(state_name)或ex(statename)。
不要使用Moore图对连续时间系统进行建模
在Moore图中,不能将更新方法设置为“Continuous”。对于Stateflow中具有连续时间的建模系统,请使用经典或Mealy图表。