Временная логика управляет выполнением графика с точки зрения времени. В состояниях активности и переходах можно использовать два типа временной логики:
Основанная на событиях временная логика отслеживает повторяющиеся события. В качестве базового события можно использовать любое явное или неявное событие.
Временная логика в абсолютном времени отслеживает истекшее время с тех пор, как состояние стало активным. Время для временных логических операторов в абсолютном времени зависит от типа Stateflow® график:
Графики в Simulink® модель задает абсолютную временную логику с точки зрения времени симуляции.
Автономные диаграммы в MATLAB® задайте абсолютную временную логику в терминах настенного времени, которая ограничена точностью 1 миллисекунда.
Чтобы определить поведение диаграммы Stateflow на основе временной логики, используйте операторы, перечисленные в этой таблице. Эти операторы могут появиться в:
Конечные on
действия
Действия с путями перехода, которые исходят из состояния
Каждый оператор временной логики имеет связанное состояние, которое является состоянием, в котором появляется действие или из которого берётся путь перехода. Диаграмма Stateflow сбрасывает счетчик, используемый каждым оператором каждый раз, когда связанное состояние повторно активируется.
Оператор | Синтаксис | Описание | Пример |
---|---|---|---|
after |
| Возвращает true если событие E произошло по крайней мере n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false . | Отображает сообщение о состоянии, когда график обрабатывает широковещательную передачу события on after(3,E): disp('ON'); |
Переход из связанного состояния, когда график обрабатывает широковещательную передачу события after(5,E) | |||
| Возвращает Неявное | Переход из связанного состояния, когда график просыпается по крайней мере в седьмой раз после того, как состояние стало активным, но только если переменная after(7,tick)[temp > 98.6] | |
| Возвращает В графиках в модели Simulink задайте время в секундах ( В автономных диаграммах в MATLAB задайте время в секундах ( | Установите on after(12.3,sec):
temp = LOW; | |
at |
| Возвращает true если событие E произошло точно n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false . | Отображает сообщение о состоянии, когда график обрабатывает третье вещание события on at(3,E): disp('ON'); |
Переход из связанного состояния, когда график обрабатывает пятое вещание события at(5,E) | |||
| Возвращает Неявное | Переход из связанного состояния, когда график просыпается в седьмой раз после того, как состояние стало активным, но только если переменная at(7,tick)[temp > 98.6] | |
| Возвращает Использование | Установите on at(12.3,sec):
temp = HIGH; | |
before |
| Возвращает Оператор временной логики | Отображает сообщение о состоянии, когда график обрабатывает первую и вторую трансляции события on before(3,E): disp('ON'); |
Переход из связанного состояния, когда график обрабатывает широковещательную передачу события before(5,E) | |||
| Возвращает Неявное Оператор временной логики | Переход из связанного состояния, когда график просыпается, но только если переменная before(7,tick)[temp > 98.6] | |
| Возвращает Задайте время в секундах ( Оператор временной логики | Установите on before(12.3,sec):
temp = MED; | |
every |
| Возвращает | Отображает сообщение о состоянии, когда график обрабатывает каждую третью трансляцию события on every(3,E): disp('ON'); |
Переход из связанного состояния, когда график обрабатывает каждое пятое вещание события every(5,E) | |||
| Возвращает Неявное | Переход из связанного состояния каждый седьмой every(7,tick)[temp > 98.6] | |
| Возвращает Использование | Увеличьте on every(12.3,sec):
temp = temp+5; | |
temporalCount |
| Возвращает количество вхождений события Использование | Доступ к последовательным элементам
|
temporalCount(tick) | Возвращает количество пробуждений графика с момента активации связанного состояния. Неявное Использование | Сохраните значение входных данных en,du: M(temporalCount(tick)+1) = u; | |
| Возвращает интервал времени, прошедший с момента активации связанного состояния. Задайте время в секундах ( | Сохраните количество миллисекунд с момента активации состояния. en,du: y = temporalCount(msec); | |
elapsed |
| Возвращает интервал времени, прошедший с момента активации связанного состояния. Эквивалентно | Сохраните количество секунд с момента активации состояния. en,du: y = elapsed(sec); |
et | Альтернативный способ выполнения elapsed(sec) . | Когда график обрабатывает широковещательную передачу события E{disp(et);} | |
count |
| Возвращает количество пробуждений графика с момента условного выражения Диаграмма Stateflow сбрасывает значение В графиках в модели Simulink значение | Переход из связанного состояния, когда переменная [count(x>=2) > 5] |
Сохраните количество выполнений графика с момента en,du: y = count(x>5); | |||
duration |
| Возвращает интервал времени, прошедший с момента условного выражения Задайте время в секундах ( Диаграмма Stateflow сбрасывает значение Оператор временной логики | Переход из состояния, когда переменная [duration(x>=0) > 0.1] |
Сохраните количество миллисекунд с момента en,du: y = duration(x>5,msec); |
Можно использовать кавычки, чтобы заключить ключевые слова 'tick'
, 'sec'
, 'msec'
, и 'usec'
. Для примера, after(5,'tick')
эквивалентно after(5,tick)
.
Примечание
Операторы временной логики after
, at
, before
, и every
сравнить пороговое n
во внутренний счетчик целого типа. Если n
является числом с фиксированной точкой, заданным либо наклоном, который не является целочисленной степенью двойки, либо ненулевым смещением, тогда сравнение может привести к неожиданным результатам из-за округления. Для получения дополнительной информации см. «Реляционные операции для данных с фиксированной точкой».
В этом примере показано, как задать две абсолютные задержки времени на графике непрерывного времени.
Выполнение графика следует следующим шагам:
Когда график пробуждается, состояние Input
сначала активируется.
После 5,33 миллисекунд времени симуляции переход от Input
на Output
происходит.
Состояние Input
становится неактивным, и состояние Output
становится активным.
Через 10,5 секунд времени симуляции переход от Output
на Input
происходит.
Состояние Output
становится неактивным, и состояние Input
становится активным.
Шаги 2-5 повторяются до окончания симуляции.
Если график имеет дискретный шаг расчета, любое действие на графике происходит в целочисленных множителях этого шага расчета. Например, предположим, что вы изменяете параметры конфигурации так, чтобы решатель Simulink ® использовал фиксированный шаг размером 0,1 секунды. Затем первый переход от Input состояний
в состояние Output
происходит на t = 0,1 секунде. Это поведение применяется, потому что решатель не пробуждает график точно t = 5,33 миллисекунд. Вместо этого решатель пробуждает график с целым числом, умноженным на 0,1 секунды, таким как t = 0,0 и 0,1 секунды.
В этом примере блок Step (Simulink) предоставляет модулю шаг входа диаграмме Stateflow.
График определяет, когда вход u
равен 1:
Если вход равен 1 перед t = 2 секундами, происходит переход от Start
на Fast
.
Если вход равен 1 между t = 2 и t = 5 секундами, происходит переход от Start
на Medium
.
Если вход равен 1 после t = 5 секунд, происходит переход от Start
на Slow
.
Можно использовать временную логику в абсолютном времени в графике, которая находится в условно выполненной подсистеме. Когда подсистема отключена, график становится неактивным, и оператор временной логики останавливается, пока график спит. Оператор не продолжает подсчитывать время симуляции до тех пор, пока подсистема не будет включена и график не активизируется.
Эта модель имеет включенную подсистему с состояниями, когда разрешается набор параметров на held
.
Подсистема содержит график, которая использует after
оператор для запуска перехода.
Блок Редактор (Simulink) обеспечивает входной сигнал с этими характеристиками:
Сигнал включает подсистему при t = 0.
Сигнал отключает подсистему при t = 2.
Сигнал вновь включает подсистему при t = 6.
Этот график показывает общее время, прошедшее на графике. Когда входной сигнал включает подсистему в момент t = 0, состояние A
становится активным. Пока система включена, истекшее время увеличивается. Когда подсистема отключена при t = 2, график переходит в спящий режим, и истекшее время перестает увеличиваться. В течение 2 < t < 6 истекшее время остается замороженным на уровне 2 секунд, поскольку система отключена. Когда график просыпается при t = 6, истекшее время снова начинает увеличиваться.
Переход от состояния A
в состояние B
зависит от истекшего времени в состоянии A
активно, не во времени симуляции. Поэтому переход происходит в t = 9, когда прошло время в состоянии A
равен 5 секундам. Когда происходит переход, значение выхода y
изменяется с 0 на 1.
Это поведение модели применяется только к подсистемам, где вы задаете состояния параметров блоков при включении held
. Если вы устанавливаете параметр равным reset
график полностью инициализируется при повторном включении подсистемы. По умолчанию выполняются переходы, и все временные логические счетчики сбрасываются на 0.
В диаграммах Stateflow в моделях Simulink операторы after
, at
, и before
поддерживает два различных обозначений, чтобы выразить основанную на событиях временную логику в переходе.
Trigger notation задает переход, который зависит только от базового события для оператора временной логики. Триггерные обозначения следуют этому синтаксису:
temporalLogicOperator(n,E)[C]
temporalLogicOperator
является логическим оператором временной логики.
n
- количество вхождений оператора.
E
является базовым событием оператора.
C
является необязательным выражением условия.
Когда вы используете обозначение триггера, переход может произойти только тогда, когда график обрабатывает широковещательную передачу базового события E
.
Conditional notation задает переход, который зависит от базовых и небазовых событий. Условное обозначение следует этому синтаксису:
F[temporalLogicOperator(n,E) && C]
temporalLogicOperator
является логическим оператором временной логики.
n
- количество вхождений оператора.
E
является базовым событием оператора.
F
является необязательным событием без базы данных.
C
является необязательным выражением условия.
Когда вы используете условное обозначение с событием без базы данных F
переход может происходить только тогда, когда график обрабатывает широковещательную передачу F
. Если вы опускаете событие без базы данных, переход может произойти, когда график обрабатывает любое явное или неявное событие.
Условное обозначение для временных логических операторов не поддерживается в автономных диаграммах в MATLAB.
Для примера эта метка перехода использует обозначение триггера, чтобы указать переход из связанного состояния, когда график обрабатывает широковещательную передачу базового события E
, начиная с пятой трансляции E
после того, как состояние стало активным.
after(5,E)
Напротив, эта метка перехода использует условное обозначение, чтобы указать переход из связанного состояния, когда состояние было активным для по меньшей мере пяти широковещательных сообщений базового события E
, даже если график не обрабатывает широковещательную передачу E
.
[after(5,E)]
Примечание
Оператор every
поддерживает триггер и условные обозначения. Однако оба обозначений эквивалентны для этого оператора. Метки переходов every(5,E)
и [every(5,E)]
указать переход из связанного состояния, когда график обрабатывает kth трансляция базового события E
после того, как состояние стало активным, где k кратно пяти.
Значение оператора временной логики зависит от того, когда его связанное состояние стало активным. Чтобы гарантировать, что каждый оператор временной логики имеет уникальное связанное состояние, используйте только эти операторы в:
Конечные on
действия
Действия с путями перехода, которые исходят из состояния
Не используйте временные логические операторы для переходов по умолчанию или для переходов в графических функциях, потому что эти переходы не происходят из состояния.
tick
в графиках в моделях SimulinkВ графиках в модели Simulink значение выражений задержки, которые используют временную логику в абсолютном времени, семантически не зависит от шага расчета модели. Напротив, выражения с задержкой, которые используют временную логику, основанную на неявном событии tick
зависят от размера шага, используемого решателем Simulink.
Кроме того, временная логика в абсолютном времени поддерживается в графиках, которые имеют входные события. Неявное tick события
не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события.
at
для Абсолютно-временной временной логики в Графики в моделях SimulinkВ графиках в модели Simulink, использование at
как абсолютный временной логический оператор не поддерживается. Вместо этого используйте after
оператор. Например, предположим, что вы хотите задать временную задержку с помощью выражения at(5.33, sec)
.
Чтобы предотвратить ошибку времени выполнения, измените метку перехода на after(5.33, sec)
.
every
для Абсолютно-временной временной логики в Графики в моделях SimulinkВ графиках в модели Simulink, использование every
как абсолютный временной логический оператор не поддерживается. Вместо этого используйте внешний переход с самоциклом со after
оператор. Например, предположим, что вы хотите распечатать сообщение о состоянии для активного состояния каждые 2,5 секунды во время выполнения графика.
Чтобы предотвратить ошибку времени выполнения, замените состояние активности на переход с внешним самоциклом.
Добавьте историческое соединение в состоянии, чтобы график запоминал настройки состояния перед каждым переходом в самоцикл. Смотрите Действия Состояния Записи при Помощи History Junctions.
Автономные диаграммы в MATLAB не поддерживают использование временных логических операторов на переходных путях, которые имеют более одного исходного состояния. Для примера эта автономная диаграмма создает ошибку времени выполнения, потому что временное логическое выражение after(10,sec)
запускает путь перехода, который имеет более одного исходного состояния.
Чтобы решить проблему, используйте временные логические выражения на отдельных путях перехода, каждый с одним исходным состоянием.
В автономных диаграммах в MATLAB операторы after
, at
, и every
создайте timer MATLAB
объекты, которые генерируют неявные события для пробуждения графика. Объединение этих операторов с условиями на том же переходном пути может привести к непреднамеренному поведению:
Если условие на переходном пути ложно, когда timer
пробуждает график, график выполняет during
и on
действия активного состояния.
График не сбрасывает timer
объект, сопоставленный с операторами after
и at
. Если условие на переходном пути становится верным в более позднее время, переход не происходит, пока другое явное или неявное событие не пробудит график.
Для примера на этой диаграмме путь перехода от состояния A
в состояние B
объединяет триггер временной логики в абсолютное время after(1,sec)
и условие [guard]
. Переход от состояния A
в состояние C
имеет абсолютный временной логический триггер after(5,sec)
. Каждый переход связан с timer
объект, который генерирует неявное событие. Первоначально локальная переменная guard
является false
.
Когда вы выполняете график, состояние A
становится активным. График выполняет entry
и отображает сообщение 'Hello!'
. Через 1 секунду timer
связана с переходом от A
на B
пробуждает график. Поскольку переход недопустим, график выполняет during
действие в состоянии A
и отображает сообщение 'Hello!'
второй раз.
Предположим, что через 2 секунды график получит вход событие E
. График выполняет on
действие в состоянии A
и изменяет значение guard
на true
. Поскольку график не сбрасывает timer
сопоставлен с оператором after
, переход от A
на B
не происходит, пока другое событие не пробудит график.
Через 5 секунд timer
связана с переходом от A
на C
пробуждает график. Потому что переход от A
на B
действителен и имеет более высокий порядок выполнения, график не принимает переход в состояние C
или отобразить сообщение 'Farewell!'
. Вместо этого состояние B
становится активным, и на графике отображается сообщение 'Good bye!'
.
Код, сгенерированный для дискретных графиков, которые не находятся внутри срабатывающей или активированной подсистемы, использует целочисленные счетчики для отслеживания времени вместо времени, предоставленного Simulink. Это поведение позволяет более эффективно генерировать код с точки зрения служебных данных и памяти и включает этот код для использования в режимах симуляции «цикл» (SIL) и «цикл» (PIL). Для получения дополнительной информации смотрите SIL и PIL симуляции (Embedded Coder).
after | at | before | count | duration | elapsed | every | temporalCount | timer
| Signal Editor (Simulink) | Step (Simulink)