Управление выполнением диаграммы при помощи временной логики

Временная логика управляет выполнением графика с точки зрения времени. В состояниях активности и переходах можно использовать два типа временной логики:

  • Основанная на событиях временная логика отслеживает повторяющиеся события. В качестве базового события можно использовать любое явное или неявное событие.

  • Временная логика в абсолютном времени отслеживает истекшее время с тех пор, как состояние стало активным. Время для временных логических операторов в абсолютном времени зависит от типа Stateflow® график:

    • Графики в Simulink® модель задает абсолютную временную логику с точки зрения времени симуляции.

    • Автономные диаграммы в MATLAB® задайте абсолютную временную логику в терминах настенного времени, которая ограничена точностью 1 миллисекунда.

Временные логические операторы

Чтобы определить поведение диаграммы Stateflow на основе временной логики, используйте операторы, перечисленные в этой таблице. Эти операторы могут появиться в:

  • Конечные on действия

  • Действия с путями перехода, которые исходят из состояния

Каждый оператор временной логики имеет связанное состояние, которое является состоянием, в котором появляется действие или из которого берётся путь перехода. Диаграмма Stateflow сбрасывает счетчик, используемый каждым оператором каждый раз, когда связанное состояние повторно активируется.

ОператорСинтаксисОписаниеПример
after

after(n,E)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

E является базовым событием для оператора.

Возвращает true если событие E произошло по крайней мере n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Отображает сообщение о состоянии, когда график обрабатывает широковещательную передачу события E, начиная с третьей трансляции E после того, как состояние стало активным.

on after(3,E):
   disp('ON');

Переход из связанного состояния, когда график обрабатывает широковещательную передачу события E, начиная с пятой трансляции E после того, как состояние стало активным.

after(5,E)

after(n,tick)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

Возвращает true если график проснулся хотя бы n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Неявное tick события не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события. Для получения дополнительной информации см. «Управление поведением диаграммы управления при помощи неявных событий».

Переход из связанного состояния, когда график просыпается по крайней мере в седьмой раз после того, как состояние стало активным, но только если переменная temp больше 98,6.

after(7,tick)[temp > 98.6]

after(n,sec)

after(n,msec)

after(n,usec)

n является положительным вещественным числом или выражением, которое вычисляется до положительного вещественного значения.

Возвращает true если хотя бы n Модули времени прошли с тех пор, как связанное состояние стало активным. В противном случае оператор возвращается false.

В графиках в модели Simulink задайте время в секундах (sec), миллисекунды (msec), или микросекунды (usec).

В автономных диаграммах в MATLAB задайте время в секундах (sec). Оператор создает MATLAB timer объект, который генерирует неявное событие для пробуждения графика. Файлы MATLAB timer объекты ограничены точностью 1 миллисекунда. Для получения дополнительной информации см. раздел События в автономных диаграммах.

Установите temp переменная в LOW каждый раз, когда график просыпается, начиная с момента, когда связанное состояние активно в течение не менее 12,3 секунд.

on after(12.3,sec):
   temp = LOW;
at

at(n,E)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

E является базовым событием для оператора.

Возвращает true если событие E произошло точно n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Отображает сообщение о состоянии, когда график обрабатывает третье вещание события E после того, как состояние стало активным.

on at(3,E):
   disp('ON');

Переход из связанного состояния, когда график обрабатывает пятое вещание события E после того, как состояние стало активным.

at(5,E)

at(n,tick)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

Возвращает true если график проснулся точно n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Неявное tick события не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события. Для получения дополнительной информации см. «Управление поведением диаграммы управления при помощи неявных событий».

Переход из связанного состояния, когда график просыпается в седьмой раз после того, как состояние стало активным, но только если переменная temp больше 98,6.

at(7,tick)[temp > 98.6]

at(n,sec)

n является положительным вещественным числом или выражением, которое вычисляется до положительного вещественного значения.

Возвращает true если именно n с момента активизации связанного состояния прошло несколько секунд. В противном случае оператор возвращается false.

Использование at как абсолютный временной логический оператор поддерживается только в автономных диаграммах в MATLAB. Оператор создает MATLAB timer объект, который генерирует неявное событие для пробуждения графика. MATLAB- timer объекты ограничены точностью 1 миллисекунда. Для получения дополнительной информации см. раздел События в автономных диаграммах.

Установите temp переменная в HIGH если состояние было активным ровно 12,3 секунды.

on at(12.3,sec):
   temp = HIGH;
before

before(n,E)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

E является базовым событием для оператора.

Возвращает true если событие E произошло меньше n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Оператор временной логики before поддерживается только в диаграммах Stateflow в моделях Simulink.

Отображает сообщение о состоянии, когда график обрабатывает первую и вторую трансляции события E после того, как состояние стало активным.

on before(3,E):
   disp('ON');

Переход из связанного состояния, когда график обрабатывает широковещательную передачу события E, но только если состояние было активным менее пяти трансляций E.

before(5,E)

before(n,tick)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

Возвращает true если график проснулся меньше n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Неявное tick события не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события. Для получения дополнительной информации см. «Управление поведением диаграммы управления при помощи неявных событий».

Оператор временной логики before поддерживается только в диаграммах Stateflow в моделях Simulink.

Переход из связанного состояния, когда график просыпается, но только если переменная temp больше, чем 98,6, и график проснулся менее семи раз с тех пор, как состояние стало активным.

before(7,tick)[temp > 98.6]

before(n,sec)

before(n,msec)

before(n,usec)

n является положительным вещественным числом или выражением, которое вычисляется до положительного вещественного значения.

Возвращает true если меньше n Модули времени прошли с тех пор, как связанное состояние стало активным. В противном случае оператор возвращается false.

Задайте время в секундах (sec), миллисекунды (msec), или микросекунды (usec).

Оператор временной логики before поддерживается только в диаграммах Stateflow в моделях Simulink.

Установите temp переменная в MED каждый раз, когда график просыпается, но только если связанное состояние было активным в течение менее 12,3 секунд.

on before(12.3,sec):
   temp = MED;
every

every(n,E)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

E является базовым событием для оператора.

Возвращает true на каждом nth вхождение события E поскольку связанное состояние стало активным. В противном случае оператор возвращается false.

Отображает сообщение о состоянии, когда график обрабатывает каждую третью трансляцию события E после того, как состояние стало активным.

on every(3,E):
   disp('ON');

Переход из связанного состояния, когда график обрабатывает каждое пятое вещание события E после того, как состояние стало активным.

every(5,E)

every(n,tick)

n является положительным целым числом или выражением, которое вычисляется до положительного целого значения.

Возвращает true на каждом nth время, когда график просыпается с тех пор, как связанное состояние стало активным. В противном случае оператор возвращается false.

Неявное tick события не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события. Для получения дополнительной информации см. «Управление поведением диаграммы управления при помощи неявных событий».

Переход из связанного состояния каждый седьмой tick событие, поскольку состояние стало активным, но только если переменная temp больше 98,6.

every(7,tick)[temp > 98.6]

every(n,sec)

n является положительным вещественным числом или выражением, которое вычисляется до положительного вещественного значения.

Возвращает true каждый n с тех пор как связанное состояние стало активным. В противном случае оператор возвращается false.

Использование every как абсолютный временной логический оператор поддерживается только в автономных диаграммах в MATLAB. Оператор создает MATLAB timer объект, который генерирует неявное событие для пробуждения графика. Файлы MATLAB timer объекты ограничены точностью 1 миллисекунда. Для получения дополнительной информации см. раздел События в автономных диаграммах.

Увеличьте temp Переменная на 5 каждые 12,3 секунды, когда состояние активно.

on every(12.3,sec):
   temp = temp+5;
temporalCount

temporalCount(E)

E является базовым событием для оператора.

Возвращает количество вхождений события E поскольку связанное состояние стало активным.

Использование temporalCount как основанный на событиях оператор временной логики поддерживается только в диаграммах Stateflow в моделях Simulink.

Доступ к последовательным элементам M массива каждый раз, когда график обрабатывает широковещательную передачу события E.

on E:
   y = M(temporalCount(E));
temporalCount(tick)

Возвращает количество пробуждений графика с момента активации связанного состояния.

Неявное tick события не поддерживается, когда диаграмма Stateflow в модели Simulink имеет входные события.

Использование temporalCount как основанный на событиях оператор временной логики поддерживается только в диаграммах Stateflow в моделях Simulink.

Сохраните значение входных данных u в последующих элементах массива M.

en,du:
   M(temporalCount(tick)+1) = u;

temporalCount(sec)

temporalCount(msec)

temporalCount(usec)

Возвращает интервал времени, прошедший с момента активации связанного состояния.

Задайте время в секундах (sec), миллисекунды (msec), или микросекунды (usec).

Сохраните количество миллисекунд с момента активации состояния.

en,du:
   y = temporalCount(msec);
elapsed

elapsed(sec)

Возвращает интервал времени, прошедший с момента активации связанного состояния.

Эквивалентно temporalCount(sec).

Сохраните количество секунд с момента активации состояния.

en,du:
   y = elapsed(sec);
etАльтернативный способ выполнения elapsed(sec).

Когда график обрабатывает широковещательную передачу события E, переход из связанного состояния и отображение истекшего времени с момента активизации состояния.

E{disp(et);}
count

count(C)

C - выражение, которое вычисляется как true или false.

Возвращает количество пробуждений графика с момента условного выражения C стал true и связанное состояние стало активным.

Диаграмма Stateflow сбрасывает значение count оператор, если условное выражение C становится false или если связанное состояние становится неактивным.

В графиках в модели Simulink значение count может зависеть от размера шага. Изменение решателя или размера шага для модели влияет на результаты, произведенные count оператор.

Переход из связанного состояния, когда переменная x больше или равно 2 в течение более пяти выполнения на графике.

[count(x>=2) > 5]

Сохраните количество выполнений графика с момента x переменной стал больше 5.

en,du:
   y = count(x>5);
duration

duration(C)

duration(C,sec)

duration(C,msec)

duration(C,usec)

  • C - выражение, которое вычисляется как true или false.

Возвращает интервал времени, прошедший с момента условного выражения C стал true и связанное состояние стало активным.

Задайте время в секундах (sec), миллисекунды (msec), или микросекунды (usec). Единица модуля по умолчанию является секундами.

Диаграмма Stateflow сбрасывает значение duration оператор, если условное выражение C становится false или если связанное состояние становится неактивным.

Оператор временной логики duration не поддерживается в автономных диаграммах в MATLAB.

Переход из состояния, когда переменная x больше или равно 0 в течение более 0,1 секунды.

[duration(x>=0) > 0.1]

Сохраните количество миллисекунд с момента x переменной стал больше 5 и состояние стало активным.

en,du:
   y = duration(x>5,msec);

Можно использовать кавычки, чтобы заключить ключевые слова 'tick', 'sec', 'msec', и 'usec'. Для примера, after(5,'tick') эквивалентно after(5,tick).

Примечание

Операторы временной логики after, at, before, и every сравнить пороговое n во внутренний счетчик целого типа. Если n является числом с фиксированной точкой, заданным либо наклоном, который не является целочисленной степенью двойки, либо ненулевым смещением, тогда сравнение может привести к неожиданным результатам из-за округления. Для получения дополнительной информации см. «Реляционные операции для данных с фиксированной точкой».

Примеры временной логики

Определите задержки

В этом примере показано, как задать две абсолютные задержки времени на графике непрерывного времени.

Выполнение графика следует следующим шагам:

  1. Когда график пробуждается, состояние Input сначала активируется.

  2. После 5,33 миллисекунд времени симуляции переход от Input на Output происходит.

  3. Состояние Input становится неактивным, и состояние Output становится активным.

  4. Через 10,5 секунд времени симуляции переход от Output на Input происходит.

  5. Состояние 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

Автономные диаграммы в MATLAB не поддерживают использование временных логических операторов на переходных путях, которые имеют более одного исходного состояния. Для примера эта автономная диаграмма создает ошибку времени выполнения, потому что временное логическое выражение after(10,sec) запускает путь перехода, который имеет более одного исходного состояния.

Standalone chart containing a temporal logic expression on the transition path originating from states Positive and Negative to state End.

Чтобы решить проблему, используйте временные логические выражения на отдельных путях перехода, каждый с одним исходным состоянием.

Standalone chart using temporal logic expressions on separate transition paths.

Избегайте смешения временной логики в абсолютном времени и условий в переходных путях автономных диаграмм в MATLAB

В автономных диаграммах в 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.

Chart combining an absolute-time temporal logic trigger and a condition on the same transition path.

Когда вы выполняете график, состояние 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).

См. также

| | | | | | | | | (Simulink) | (Simulink)

Похожие темы