Логические операторы временной (темпоральной) логики или временные логические операторы - двоичные операторы, операндами которых являются количества Stateflow-событий.
Следующие общие правила применяются к использованию любых временных логических операторов.
Событие, с которым оператор работает, называется базовым событием. Любое Stateflow-событие может служить базовым событием для оператора. Временные логические операторы могут также работать с неявными событиями, такими как вход в состояние, выход из него, изменение данных. В диаграмме без поступающих из Simulink-событий можно использовать ключевые слова tick или wakeup, обозначающие неявные события активизации диаграмм. Временные логические операторы могут использоваться либо в условиях на переходах, выходящих из состояний, либо в действиях состояний. Это означает, что их нельзя использовать как условия на переходах по умолчанию или переходах в потоковых диаграммах (flow- диаграммах).
Состояние, в которое происходит переход, обусловленный временным логическим оператором, или состояние, в during действии которого этот оператор появляется, называется связанным состоянием временного оператора.
Хотя временная логика не генерирует никаких новых событий в модели Stateflow, полезно думать об изменении значения временного логического условия как о событии. Предположим, необходимо, чтобы переход из состояния A произошел точно через 10 временных циклов после активизации этого состояния. Один из способов достижения поставленной цели состоит в том, чтобы определить событие ALARM (ТРЕВОГА) и вызвать это событие через десять событий CLK после того, как состояние A стало активным. Затем можно использовать ALARM как событие, которое вызовет переход из состояния A. Более простой способ - "установить" временное логическое условие на событие CLK, которое вызывает переход из состояния A:
CLK[after(10, CLK)]
Обратите внимание, что этот подход не требует создания новых событий. Однако можно думать об этом выражении как о создании неявного события, которое вызывает переход. Следовательно, Stateflow поддерживает эквивалентное описание события:
after(10, CLK)
Обратите внимание, что описание события позволяет устанавливать дополнительные ограничения на неявные временные логические "события", например,
after(10, CLK)[temp == COLD]
Это выражение означает: "покинуть состояние А, если температура низкая, но не быстрее, чем через 10 временных циклов".
Группа примеров Temporal Logic (рис. 1) раскрывает некоторые особенности использования в Stateflow операторов темпоральной или временной логики. Эта группа включает примеры использования функций AFTER, BEFORE, AT, EVERY. Получить доступ к этим примерам можно через закладку Demos окна помощи Help системы MATLAB.
Рис. 1
Временная логика, использующая функцию after (после того, как).
Синтаксис оператора after (после того, как): after(n, E).
Здесь E - базовое событие для оператора, а n либо целое положительное число, либо выражение, принимающее неотрицательное целое значение. Оператор after принимает значение "истина", если событие E произошло n раз после того, как связанное состояние стало активно. В противном случае значение оператор after - "ложь". Оператор after устанавливает счетчик событий E в 0 каждый раз, когда связанное состояние становится активным.
Демонстрационный пример AFTER function.
Simulink-модель этого примера представлена на рис. 2. Эта модель включает две Stateflow-диаграммы. Одна диаграмма (Temporal Logic) использует временную логику и функцию after. Другая диаграмма (Without Temporal Logic) достигает той же самой цели без использования временной логики.
Рис. 2
На рис. 3 показана Stateflow-диаграмма Temporal Logic. Она содержит два состояния: 'Off' и 'On'. По умолчанию активизируется состояние 'Off' , при этом выходная переменная roud_count устанавливается в ноль. Функция after позволяет подсчитать число событий, которые произошли в пределах диаграммы и затем использовать это как условие для перехода. Так, в этом демонстрационном примере переход от состояния 'Off' к состоянию 'On' произойдет после того, как 10 событий с именем 'secs' ('секунды') произошли, если при этом входная переменная с именем 'step' ('шаг') меньше 1. События 'secs' ('секунды') задаются в модели Simulink-блоком Pulse Generator (генератор импульсов), параметры которого приведены в окне Block Parameters рис. 4. Переменная 'step' ('шаг') задается Simulink-блоком 'Step' с параметрами рис. 5. На выходе блока 'Step' будет нулевой сигнал в течение 60 секунд модельного времени, после чего сигнал станет единичным. После этого условие перехода [step<1] не выполняется и переход в состояние On больше не происходит.
Рис. 3
Рис. 4
Рис. 5
Тот же самый эффект может быть достигнут без использования операторов временной логики. Отличие этой диаграммы (см. рис. 6) от предыдущей состоит лишь в том то, что здесь необходимо использовать дополнительную переменную и внутренний переход. Они нужны, чтобы подсчитывать количество раз, когда событие наступило. В этом случае локальная переменная 'count_after' является счетчиком событий 'secs'. Переход будет иметь место, если ' count_after ' станет больше 10, а величина переменной 'step' ('шаг') - меньше 1.
Рис. 6
Осциллограммы, отображающие процесс изменения во времени величин выходных переменных, приведены на рисунке 7. Нетрудно заметить полную идентичность графиков для диаграмм Temporal Logic и Without Temporal Logic. При этом первая диаграмма, использующая временную логику, проще и нагляднее второй.