摩尔图的设计考虑
摩尔机是有限状态机,其输出在时钟边缘处被修改。在摩尔图中,输出只是当前状态的函数。在每个时间步中,摩尔图被唤醒,计算它的输出,然后计算它的输入,为下一个时间步重新配置自己。例如,在评估其输入之后,图表可以过渡到活动状态的新配置。图表在计算输入和更新状态之前计算输出。Moore语义在独立的Stateflow中不受支持®在MATLAB图表®.
摩尔的语义
以确保输出是一个函数只有的状态,摩尔状态机执行这些语义:
输出不依赖于输入。
产出不依赖于以前的产出。
输出不依赖于时间逻辑。
摩尔图设计指南
为了符合状态机的摩尔定义,确保每次摩尔图被唤醒时,它都从当前活动状态集计算输出,而不考虑输入。
对国家行为的限制
为了确保输出完全依赖于当前状态,你可以在状态操作中计算输出,但受以下限制:
结合操作。在摩尔图中,每个状态只能包含一个动作。操作可以由多个命令语句组成。Stateflow从最上层向下评估摩尔图中的状态。摩尔图中的活动状态在评估转换之前执行状态动作。因此,无论外部转换是否有效,输出都在每个时间步上计算。
不要给状态操作贴上标签。不要在摩尔图中用任何关键字标记状态动作,例如
条目
,在
,或退出
.默认情况下,Moore图表在计算输入和更新状态之前执行活动状态下的操作。
过渡行动的限制
摩尔图中的转换可以包含条件和转换操作,如果这些操作不引入输出值和输入值之间的依赖关系。例如,在此图表中,每个转换都测试输入u
,并修改输出y
在条件动作中。因为输出值取决于输入值,所以这个构造违反了摩尔语义并触发了一个错误。
不使用输入计算输出
在摩尔图中,输出不能依赖于输入。使用输入直接或间接参与输出的计算将触发错误。
限制数据范围
在摩尔图中,这些数据限制适用:
限制Machine-Parented数据。机器父数据是为Stateflow机器定义的数据。状态流机器是状态流层次结构的最高级别。在此级别定义数据时,机器中的每个图表都可以读取和修改数据。为了确保摩尔图不访问可以在图外不可预测地修改的数据,不要使用机器父数据。
不要定义数据存储内存。不能在摩尔图表中定义数据存储内存(DSM),因为图表外部的对象可以修改DSM对象。状态流图使用数据存储内存与Simulink共享数据®模型。数据存储内存充当全局数据。在包含图表的Simulink层次结构中,其他块和模型可以修改DSM。摩尔图不能访问可能发生不可预测变化的数据。
不要使用coder.extrinsic
调用外部函数
你不能调用外部函数coder.extrinsic
因为不可能强制要求外在函数的输出只依赖于当前状态。调用外部函数coder.extrinsic
在摩尔图中触发错误。
不调用自定义代码函数
不能在摩尔图中调用自定义代码函数,因为不可能强制自定义代码函数的输出仅依赖于当前状态。在摩尔图中调用自定义代码函数会触发错误。
不要使用动态仿真模块功能
不能在摩尔图中使用Simulink函数。这个限制防止在图表执行过程中违反摩尔语义。
不要导出函数
摩尔图中不能导出函数。
不要禁用内联
摩尔图语义需要内联。
不启用超级步骤语义
在摩尔图中不能使用超步语义。
不要使用短信
不能在摩尔图中使用消息。
限制事件的使用
限制摩尔图中事件的使用:
有效的用途:
只使用一个输入事件来触发图表。
使用基于事件的时态逻辑来保护转换。
时间逻辑条件值的变化就像摩尔图内部安排的事件一样。在每个时间步中,执行时态事件之前的刻度数只取决于图表的状态。有关更多信息,请参见时序逻辑操作符.
请注意
在摩尔图中,时间逻辑运算符的基本事件必须是预定义的事件,例如
蜱虫
(见基于数据和状态的隐式事件).
无效的用途:
您不能广播任何类型的事件。
您不能使用本地事件来保护转换。局部事件违反摩尔语义,因为它们不是确定性的,并且可以在图表计算输出时发生。
您不能使用隐式事件,例如
chg (data_name)
,en (state_name)
,或例(state_name)
.
不使用摩尔图建模连续时间系统
在摩尔图表中,不能将更新方法设置为连续
.对于在Stateflow中具有连续时间的系统建模,请使用Classic或Mealy图。