Обнаружьте изменения в значениях данных и выражения

Stateflow® графики могут обнаружить изменения в значениях данных и выражений между временными шагами. Вы можете:

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

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

Чтобы сгенерировать неявное локальное событие, когда график установит значение переменной, используйте change оператор. Для получения дополнительной информации смотрите Поведение Диаграммы управления при помощи Неявных Событий.

Измените операторы обнаружения

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

ОператорСинтаксисОписаниеПример
hasChangedtf = hasChanged(data_name)Возвращается 1 (true) если значение data_name в начале текущего времени шаг отличается от значения data_name в начале предыдущего временного шага. В противном случае оператор возвращается 0 (false).

Переход из состояния, если любой элемент матричного M изменил значение начиная с последнего временного шага или ввел событие.

[hasChanged(M)]

Переход из состояния, если элемент в строке 1 и столбце 3 матричного M изменил значение начиная с последнего временного шага или ввел событие.

В графиках то использование MATLAB® как язык действия, используйте:

[hasChanged(M(1,3))]

В графиках, которые используют C в качестве языка действия, используйте:

[hasChanged(M[0][2])]
hasChangedFromtf = hasChangedFrom(data_name,value)Возвращается 1 (true) если значение data_name было равно заданному value в начале предыдущего временного шага и различное значение в начале шага текущего времени. В противном случае оператор возвращается 0 (false).

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

[hasChangedFrom(struct,structValue)]
hasChangedTotf = hasChangedTo(data_name,value)Возвращается 1 (true) если значение data_name не было равно заданному value в начале предыдущего временного шага и равно value в начале шага текущего времени. В противном случае оператор возвращается 0 (false).

Переход из состояния, если поле struct.field структуры изменил в значение 5 начиная с последнего временного шага или входного события.

[hasChangedTo(struct.field,5)]

Примечание

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

Пример графика с обнаружением изменения

Эта модель показывает как операторы hasChanged, hasChangedFrom, и hasChangedTo обнаружьте определенные изменения во входном сигнале. В этом примере блок Ramp (Simulink) отправляет дискретный, увеличивающийся сигнал времени в график.

Модель использует решатель фиксированного шага с размером шага 1. Сигнал постепенно увеличивается 1 каждым временным шагом. График анализирует входной сигнал u для этих изменений:

  • Любое изменение от предыдущего временного шага

  • Изменение в значении 3

  • Изменение от значения 3

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

В процессе моделирования блок Scope (Simulink) показывает сигналы ввода и вывода для графика.

  • Значение u увеличения 1 каждым временным шагом.

  • Значение y1 изменения от 0 до 1 во время t = 1. Значение y1 остается 1 потому что u продолжает изменяться на каждом последующем временном шаге.

  • Значение y2 изменения от 0 до 1 во время t = 4 когда значение u изменения от 3 до 4. Значение y2 возвращается к 0 после одного временного шага.

  • Значение y3 изменения от 0 до 1 во время t = 3 когда значение u изменения от 2 до 3. Значение y3 возвращается к 0 после одного временного шага.

Ограничения обнаружения изменения

Тип диаграммы Stateflow определяет осциллограф данных, поддержанных для обнаружения изменения:

  • Автономные диаграммы Stateflow в MATLAB: Local только

  • Графики в Simulink® то использование MATLAB как язык действия: Input только

  • Графики в Simulink, которые используют C в качестве языка действия: Inputвывод , Local, или Data Store Memory

Аргумент data_name может быть:

  • Скалярная переменная.

  • Матрица A или элемент матрицы.

    • Если data_name матрица, оператор возвращает true когда это обнаруживает изменение в любом элементе data_name.

    • Индексируйте элементы матрицы при помощи чисел или выражений, которые оценивают до постоянного целого числа. Смотрите Поддерживаемые Операции для Векторов и Матриц.

  • Структура или поле в структуре.

    • Если data_name структура, оператор обнаружения изменения возвращает true когда это обнаруживает изменение в любом поле data_name.

    • Индексируйте поля в структуре при помощи записи через точку. Смотрите индекс и Значения Присвоения к Структурам Stateflow.

  • Любая допустимая комбинация полей структуры или элементов матрицы.

Аргумент data_name не может быть нетривиальное выражение или переменная пользовательского кода.

Примечание

Автономные диаграммы в MATLAB не поддерживают обнаружение изменения на элементе матрицы или поля в структуре.

Для hasChangedFrom и hasChangedTo операторы, аргумент value может быть любое выражение, которое решает к значению, которое сопоставимо с data_name.

  • Если data_name скаляр, затем value должен решить к скалярному значению.

  • Если data_name матрица, затем value должен решить к матричному значению с теми же размерностями как data_name.

    В качестве альтернативы в графике, который использует C в качестве языка действия, value может решить к скалярному значению. График использует скалярное расширение, чтобы сравнить data_name к матрице, элементы которой все равны значению, заданному value. Смотрите значения присвоения ко всем элементам матрицы.

  • Если data_name структура, затем value должен решить к значению структуры, полевая спецификация которого совпадает с data_name точно.

Если вы генерируете код из графика, который использует операторы обнаружения изменения, и упорядоченное по строкам размещение массивов включено, генерация кода производит ошибку. Прежде, чем сгенерировать код, включите упорядоченное по столбцам размещение массивов. Смотрите Избранное Размещение Массивов для Матриц в Сгенерированном коде.

Операторы обнаружения ребра

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

ОператорСинтаксисОписаниеПример
crossingtf = crossing(expression)

Возвращается 1 (true) если:

  • Предыдущее значение expression было положительно, и его текущее значение является нулем или отрицательный.

  • Предыдущее значение expression был нуль, и его текущее значение является ненулевым.

  • Предыдущее значение expression было отрицательно, и его текущее значение является нулем или положительный.

В противном случае оператор возвращается 0 (false).

Этот оператор подражает поведению блока Trigger (Simulink) с набором Trigger Type к either.

Переход из состояния, если значение входных данных signal пересекает порог 2,5.

[crossing(signal-2.5)]

Ребро обнаруживается когда значение выражения signal-2.5 изменения от положительного до отрицания, от отрицательного до положительного, от нуля до ненулевого, или от ненулевого, чтобы обнулить.

fallingtf = falling(expression)

Возвращается 1 (true) если:

  • Предыдущее значение expression было положительно, и его текущее значение является нулем или отрицательный.

  • Предыдущее значение expression был нуль, и его текущее значение отрицательно.

В противном случае оператор возвращается 0 (false).

Этот оператор подражает поведению блока Trigger (Simulink) с набором Trigger Type к falling.

Переход из состояния, если значение входных данных signal падения ниже порога 2,5.

[falling(signal-2.5)]

Падающее ребро обнаруживается когда значение выражения signal-2.5 изменения от положительного до отрицания, от положительного, чтобы обнулить, или от нуля до отрицания.

risingtf = rising(expression)

Возвращается 1 (true) если:

  • Предыдущее значение expression было отрицательно, и его текущее значение является нулем или положительный.

  • Предыдущее значение expression был нуль, и его текущее значение положительно.

В противном случае оператор возвращается 0 (false).

Этот оператор подражает поведению блока Trigger (Simulink) с набором Trigger Type к rising.

Переход из состояния, если значение входных данных signal повышения выше порога 2,5.

[rising(signal-2.5)]

Возрастающее ребро обнаруживается когда значение выражения signal-2.5 изменения от отрицательного до положительного, от отрицательного, чтобы обнулить, или от нуля до положительного.

Примечание

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

Пример графика с обнаружением ребра

Эта модель показывает как операторы crossing, falling, и rising обнаружьте ребра во входном сигнале. В этом примере блок Pulse Generator (Simulink) отправляет прямоугольную волну в график.

Модель использует решатель фиксированного шага с размером шага 1. Значение входного сигнала u альтернативы между 0 и 5 каждыми двумя временными шагами. График анализирует входной сигнал u для этих ребер:

  • Падение или возрастающее ребро, пересекающее порог 2,5

  • Ребро, повышающееся по порогу 2,5

  • Ребро, подпадающее под порог 2,5

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

В процессе моделирования блок Scope (Simulink) показывает сигналы ввода и вывода для графика.

  • Значение u альтернативы между 0 и 5 на любом временном шаге.

  • Значение y1 изменения от 0 до 1 во время t = 1, 3, 5, и 7, когда значение выражения u-2.5 изменяет знак. Значение y1 возвращается к 0 после одного временного шага.

  • Значение y2 изменения от 0 до 1 во время t = 1 и 5, когда значение выражения u-2.5 изменения от отрицательного до положительного. Значение y2 возвращается к 0 после одного временного шага.

  • Значение y3 изменения от 0 до 1 во время t = 3 и 7, когда значение выражения u-2.5 изменения от положительного до отрицания. Значение y3 возвращается к 0 после одного временного шага.

Ограничения обнаружения ребра

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

Аргумент expression:

  • Должно быть выражение со скалярным знаком

  • Может объединить входные данные графика, константы, ненастраиваемые параметры, непрерывное время локальные данные, и утвердить данные из основанных на Simulink состояний

  • Может включать сложение, вычитание, и умножение скалярных переменных, элементы матрицы, полей в структуре или любой допустимой комбинации полей структуры и элементов матрицы

Индексируйте элементы матрицы при помощи чисел или выражений, которые оценивают до постоянного целого числа.

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

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

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

Реализация обнаружения изменения и ребра

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

Например, когда вы вызываете hasChanged оператор с аргументом x, двойные буферы диаграммы Stateflow значения x в локальных переменных.

Локальный буферОписание
x_prev

Значение данных x в начале последнего временного шага

x_start

Значение данных x в начале шага текущего времени

Чтобы обнаружить изменения, значения данных двойных буферов графика после, событие инициировало график, но прежде чем график начинает выполнение. Если значения xprev и xstart соответствуйте, оператор обнаружения изменения возвращает false указать, что никакое изменение не произошло; в противном случае это возвращает true указать на изменение. Эта схема помещает эти задачи в контекст жизненного цикла графика.

Flowchart detailing double-buffering of data values for change detection.

Операторы обнаружения ребра ведут себя похожим способом, за исключением того, что они сравнивают значение выражения в начале последнего временного шага (xprev) с его текущим значением (x). Различие в реализации позволяет графикам непрерывного времени обнаруживать ребра в локальных данных во время незначительных временных шагов.

Переходные изменения значения в локальных данных

Операторы обнаружения изменения пытаются отфильтровать переходные изменения в локальных переменных графика путем оценки их значений только на контурах времени. График оценивает заданную локальную переменную только однажды в конце шага выполнения. Возвращаемое значение операторов обнаружения изменения остается постоянным, даже если значение локальной переменной колеблется в данном временном шаге. Например, предположите это на шаге текущего времени, локальная переменная temp изменения от его значения на предыдущем временном шаге, но затем возвращаются к исходному значению. Оператор hasChanged(temp) возвращает false для следующего временного шага, указывая, что никакое изменение не произошло.

В отличие от этого операторы обнаружения ребра могут обнаружить ребра в непрерывное время локальные данные во время незначительных временных шагов. Например, предположите тот p локальная переменная непрерывного времени с отрицательной производной. Затем оператор falling(p) возвращает true во время незначительного временного шага, когда p изменяет знак от положительного до отрицания.

Обнаружьте изменения значения между входными Событиями или супер продвиньтесь итерации

Когда несколько входных событий имеют место в том же временном шаге, или когда вы включаете супер семантику шага, график обновляет xprev и xstart буферизует каждый раз, когда это выполняется. График обнаруживает изменения в значении между входными событиями, и супер продвиньтесь итерации, даже если изменения происходят несколько раз в данном временном шаге. Для получения дополнительной информации смотрите События Использования, чтобы Выполнить Графики и Супер Семантику Шага.

Смотрите также

| | | | | |

Похожие темы