Main Content

检测仿真期间常见的建模错误

为了避免常见的设计错误,您可以运行诊断检查,以在编译和仿真过程中测试 Stateflow® 图的完整性。Stateflow 诊断检测 Simulink® 模型中 Stateflow 图中的状态不一致、数据范围违规和循环行为。

当您对模型进行仿真时,Stateflow 解析器会根据支持的图表示法和动作语言语法计算每个 Stateflow 状态机中的图形对象和非图形对象以及数据。您还可以通过在 Stateflow 工具条的建模选项卡中选择更新图来检查图的语法。

如果图中存在语法错误,图会自动高亮显示导致第一个错误的对象。您可以在诊断窗口中选择该错误以将其源图前置,源对象也会高亮显示。图中任何未解析的数据或事件都会在符号向导中被标记。

提示

编辑图时,Stateflow 编辑器以红色或橙色突出显示对象来显示错误的潜在原因。有关详细信息,请参阅在编辑时检测建模错误

检测状态不一致性

在 Stateflow 图中,如果状态违反以下规则之一,则存在不一致:

  • 具有互斥 (OR) 分解且至少包含一个子状态的激活状态只有一个激活的子状态。

  • 具有并行 (AND) 分解的激活状态的所有子状态都处于激活状态。

  • 不管状态分解如何,非激活状态的所有子状态均处于非激活状态。

例如,下图存在状态不一致,因为没有默认转移来指示哪个子状态首先变为激活状态。

Chart that contains two states but no default transition.

添加指向其中一个状态的无条件默认转移可以解决状态不一致问题。

Chart that contains two states and a default transition.

在编译时,Stateflow 图会检测由于省略无条件默认转移而导致的状态不一致。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将不存在无条件默认转移参数设置为错误警告。默认设置是错误。有关详细信息,请参阅No unconditional default transitions (Simulink)

检测数据范围违规

在仿真过程中,当出现以下情况时,会发生数据范围违规:

例如,下图包含局部数据 a,其最小值的值为 0,最大值的值为 2。状态 A 中的 entry 动作将 a 初始化为 1。during 动作将 a 的值递增 1。经过两个时间步后,a 的值超出其指定范围,导致数据范围违规。

State with an entry action that initializes a to one and a during action that increments a every time step.

在运行时,Stateflow 图检测数据范围违规。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > 数据有效性窗格中,将这些参数设置为错误警告

  • 仿真范围检查根据最小和最大范围检查检测违规情况。默认设置为

  • 溢出时绕回溢出时饱和检测整数或定点运算超出其结果类型的数值容量时发生的违规。默认设置为警告

有关详细信息,请参阅Simulation range checking (Simulink)溢出时绕回 (Simulink)溢出时饱和 (Simulink)

检测循环行为

在图仿真过程中,当一个步骤或一系列步骤无限期重复时,就会出现循环行为。

例如,下图中的动作会产生递归事件广播的无限循环。

  • 状态 C 中的 during 动作会广播 E1 事件。

  • E1 事件触发从 A.A1 状态到 A.A2 状态的转移。此转移的条件动作会广播事件 E2

  • E2 事件触发从 B.B1 状态到 B.B2 状态的转移。此转移的条件动作会广播事件 E1

状态 AB 中的事件广播在条件动作中发生,因此在图处理结果事件之前不会发生转移。子状态 A.A1B.B1 保持激活状态,因此新事件广播会继续触发转移,并且该过程会无限期重复。

Chart that exhibits cyclic behavior caused by undirected event broadcasts.

在图仿真过程中,Stateflow 图使用循环检测算法来检测一类由事件广播导致的无限递归。要启用循环检测,请打开您的 Stateflow 图。在调试选项卡中,选择诊断 > 检测循环行为。默认情况下循环行为检查已选中。

Stateflow 图还检测无向局部事件广播。要控制诊断操作的级别,请打开“配置参数”对话框,并在诊断 > Stateflow 窗格中,将无向事件广播参数设置为 errorwarningnone。默认设置为 warning。有关详细信息,请参阅Undirected event broadcasts (Simulink)

提示

由于无向局部事件广播可能导致不必要的递归行为,建议使用 send 运算符来广播有向局部事件。有关详细信息,请参阅Avoid Unwanted Recursion in a Chart

修复流程图中的循环行为

循环行为的运行时检测仅限于事件广播引起的递归情况,不能扩展到其他类型的循环行为。例如,循环检测不检测以下流程图中的无限循环。在本示例中,默认转移将局部数据 i 初始化为 0。下一个转移段将递增 i。当 i 为正时,返回第一个结点的转移有效。由于此条件始终成立,因此会产生无限循环。

在许多情况下,流程图中的循环行为是由循环中没有无条件退出路径的结点引起的。Stateflow 编辑器用红色突出显示这些结点。例如,在以下流程图中,循环中顶部的两个结点没有到终止结点的无条件路径。

要解决此问题,请将条件 c1 的求反合并到包含 c2 的转移中,这样得到的图就有跳出循环的无条件路径。

同样,此流程图中的顶部结点没有到终止结点的无条件路径。

要解决此问题,请创建从顶部结点到终止结点的无条件转移。

相关主题