exponenta event banner

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

Диаграммы 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 не может быть нетривиальным выражением или пользовательской переменной кода.

Примечание

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

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

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

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

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

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

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

Внедрение функции обнаружения изменений

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

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

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

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

x_start

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

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

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

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

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

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

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

См. также

| | |

Связанные темы