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

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, Output, Local, или Data Store Memory

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

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

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

    • Если 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 точно.

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

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

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

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

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

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

x_start

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

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

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

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

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

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

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

См. также

| | |

Похожие темы