Временная логика управляет выполнением графика в терминах времени. В состояниях активности и переходах, можно использовать два типа временной логики:
Основанная на событии временная логика отслеживает повторяющиеся события. Можно использовать любое явное или неявное событие в качестве основного события.
Абсолютно-разовая временная логика отслеживает прошедшее время, поскольку состояние стало активным. Синхронизация для абсолютно-разовых временных логических операторов зависит от типа графика Stateflow®:
Графики в модели define 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); |
Можно использовать кавычки, чтобы заключить ключевые слова 'tick'
секунда
, '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 предоставляет модульный вход шага диаграмме Stateflow.
График определяет когда вход u
равняется 1:
Если вход равняется 1 прежде t = 2 секунды, переход происходит от Start
к Fast
.
Если вход равняется 1 между t = 2 и t = 5 секунд, переход происходит от Start
к Medium
.
Если вход равняется 1 после t = 5 секунд, переход происходит от Start
к Slow
.
Можно использовать абсолютно-разовую временную логику в графике, который находится в условно выполняемой подсистеме. Когда подсистема отключена, график становится неактивным, и временный логический оператор делает паузу, в то время как график спит. Оператор не продолжает считать время симуляции, пока подсистема не повторно включена, и график бодрствует.
Эта модель имеет активированную подсистему со Штатами при включении набора параметров к held
.
Подсистема содержит график, который использует after
оператор, чтобы инициировать переход.
Блок Signal Editor предоставляет входному сигналу эти характеристики:
Сигнал включает подсистему в 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)]
укажите на переход из ассоциированной страны, когда график обработает k th широковещательная передача основного события 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 секунды во время выполнения графика.
Чтобы предотвратить ошибку времени выполнения, замените состояние активности на внешний переход самоцикла.
Добавьте соединение истории в состоянии, таким образом, график помнит настройки состояния до каждого перехода самоцикла. Смотрите Действие состояния Записи при помощи Соединений Истории.
Автономные диаграммы в MATLAB не поддерживают использование временных логических операторов на путях к переходу, которые имеют больше чем одно исходное состояние. Например, эта автономная диаграмма производит ошибку времени выполнения потому что временное логическое выражение after(10,sec)
инициировал путь к переходу, который имеет больше чем одно исходное состояние.
Чтобы решить вопрос, используйте временные логические выражения на отдельных путях к переходу, каждом с одним исходным состоянием.
В автономных диаграммах в MATLAB, операторы after
, at
, и every
создайте MATLAB timer
объекты, которые генерируют неявные события, чтобы разбудить график. Объединение этих операторов с условиями на том же пути к переходу может привести к непреднамеренному поведению:
Если условие на пути к переходу является ложным когда 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
toc
будит график. Поскольку переход от A
к B
допустимо и имеет более высокий порядок выполнения, график не берет переход, чтобы утвердить C
или отобразите сообщение 'Farewell!'
. Вместо этого B
состояния становится активным, и график отображает сообщение
'Good bye!'
.
Код сгенерировал для дискретных графиков, которые не являются в целочисленных счетчиках использования инициированной или активированной подсистемы, чтобы отследить время вместо времени, обеспеченного Simulink. Это поведение допускает более эффективную генерацию кода в терминах издержек и памяти, и включает этот код для использования в программном обеспечении в цикле (SIL) и процессоре в цикле (PIL) режимы симуляции. Для получения дополнительной информации см. SIL и PIL симуляции (Embedded Coder).
after | at | before | count | duration | elapsed | every | Signal Editor | Step | temporalCount | timer