Чтобы избежать ошибок общего умысла, можно осуществить диагностические проверки, которые тестируют полноту графика Stateflow® во время компиляции и симуляции. Диагностика Stateflow обнаруживает несоответствия состояния, нарушения в областях значений данных и циклическое поведение в диаграммах Stateflow в моделях Simulink®.
В диаграмме Stateflow состояния противоречивы, если они нарушают одно из этих правил:
Активное состояние с исключительным (OR) разложение и по крайней мере одно подсостояние имеет точно одно активное подсостояние.
Все подсостояния активного состояния с параллелью (AND) разложение активны.
Все подсостояния неактивного состояния неактивны независимо от разложения состояния.
В то время как вы редактируете свой график, редактор Stateflow отображает потенциальные причины для несоответствий состояния путем выделения объектов красного или оранжевого цвета. Для получения дополнительной информации смотрите, Обнаруживают Ошибки Моделирования В течение Времени Редактирования.
Один тип несоответствия состояния происходит, когда все эти условия верны:
Состояние с несколькими подсостояниями имеет исключительный (OR) разложение.
Состояние не содержит соединение истории.
Каждый путь по умолчанию, который приводит к подсостоянию, охраняет условие или инициировало событие.
Не все переходы в состояние являются суперпереходами, ведущими непосредственно к подсостоянию.
Например, этот график имеет несоответствие состояния, потому что нет никакого перехода по умолчанию, чтобы указать, какое подсостояние становится активным сначала.
Добавление безусловного перехода по умолчанию к одному из состояний разрешает несоответствие состояния.
Во время компиляции диаграммы Stateflow обнаруживают несоответствия состояния, вызванные пропуском безусловного перехода по умолчанию. Чтобы управлять уровнем диагностического действия, откройте диалоговое окно Model Configuration Parameters. В Diagnostics> панель Stateflow, для диагностического No unconditional default transitions, можно выбрать error
, warning
или none
. Настройкой по умолчанию является error
. Для получения дополнительной информации не смотрите безусловные переходы по умолчанию (Simulink).
Во время симуляции нарушение области значений данных происходит когда:
Операция целочисленной или фиксированной точки переполняет числовой способности своего типа результата. Смотрите Целочисленное переполнение Указателя для Операций Данных и Фиксированной точки Графика в диаграммах Stateflow.
Значение объекта данных вне области значений значений, заданных Initial value, Minimum и свойствами Maximum. Смотрите Свойства Области значений Начального значения и Предела.
Например, этот график содержит локальные данные a
, который имеет значение Minimum 0 и значение Maximum 2. Действие entry
в A
состояния инициализирует a
к 1. Действие during
постепенно увеличивает значение a
1. После двух временных шагов значение a
превышает свою заданную область значений, приводящую к нарушению области значений данных.
Во время выполнения диаграммы Stateflow обнаруживают нарушения области значений данных. Чтобы управлять уровнем диагностического действия, откройте диалоговое окно Model Configuration Parameters. В Diagnostics> панель Data Validity, можно выбрать error
, warning
или none
для этой диагностики:
Simulation range checking обнаруживает нарушения на основе проверок диапазона минимума-и-максимума. Настройкой по умолчанию является none
.
Wrap on overflow и Saturate on overflow обнаруживают нарушения, которые происходят, когда операции целочисленной или фиксированной точки превышают числовую способность своего типа результата. Настройкой по умолчанию является warning
.
Для получения дополнительной информации смотрите проверку диапазона Симуляции (Simulink), Перенеситесь на переполнении (Simulink) и Насыщайте на переполнении (Simulink).
Циклическое поведение происходит, когда шаг или последовательность шагов повторяются неопределенно во время симуляции графика.
Например, действия в этом графике производят бесконечный цикл рекурсивных широковещательных сообщений события.
Действие during
в C
состояния широковещательно передает событие E1
.
Событие E1
инициировало переход от A.A1
состояния, чтобы утвердить A.A2
. Действие условия для этого перехода широковещательно передает событие E2
.
Событие E2
инициировало переход от B.B1
состояния, чтобы утвердить B.B2
. Действие условия для этого перехода широковещательно передает событие E1
.
Широковещательные сообщения события в состояниях, A
и B
происходят в действиях условия, таким образом, переходы не происходят до графика, обрабатывают получившиеся события. Подсостояния A.A1
и B.B1
остаются активными, так новые широковещательные сообщения события, продолжают инициировать переходы, и процесс повторяется неопределенно.
Поскольку неориентированные локальные широковещательные сообщения события могут вызвать нежелательное рекурсивное поведение, использование оператора send
, чтобы широковещательно передать направленные локальные события рекомендуется. Для получения дополнительной информации смотрите Широковещательную передачу Локальные События, чтобы Синхронизировать Параллельные состояния.
Во время симуляции графика диаграммы Stateflow используют алгоритмы обнаружения цикла, чтобы обнаружить класс бесконечных рекурсий, вызванных широковещательными сообщениями события. Включите обнаружение цикла через флажок Simulation> Debug> MATLAB & Stateflow Error Checking Options> Detect Cycles. Циклическая проверка поведения выбрана по умолчанию.
Диаграммы Stateflow также обнаруживают неориентированные локальные широковещательные сообщения события. Чтобы управлять уровнем диагностического действия, откройте диалоговое окно Model Configuration Parameters. В Diagnostics> панель Stateflow, для диагностики Undirected event broadcasts, можно выбрать error
, warning
или none
. Настройкой по умолчанию является warning
. Для получения дополнительной информации смотрите широковещательные сообщения события Undirected (Simulink).
Обнаружение цикла Stateflow ограничивается случаями рекурсии из-за широковещательных сообщений события и не расширяет к другим типам циклического поведения.
Например, Stateflow не может обнаружить бесконечный цикл в этой блок-схеме. В этом примере переход по умолчанию инициализирует локальные данные i
к 0. Следующий сегмент перехода постепенно увеличивает i
. Переход к останавливающемуся соединению допустим только, когда условие [i < 0]
верно. Поскольку это условие никогда не верно, бесконечный цикл заканчивается.
Модель sf_cycle_error_fix
обеспечивает предложения для фиксации циклического поведения в блок-схемах. В командной строке MATLAB®, введите:
sfhelp('cycle_error');