Диаграммы Stateflow ® могут обнаруживать изменения значений данных и выражений между временными шагами. Операторы обнаружения изменений можно использовать для определения того, когда переменная изменяется на значение или от него.
Чтобы создать неявное локальное событие, когда диаграмма задает значение переменной, используйте change оператор. Дополнительные сведения см. в разделе Управление поведением диаграммы с помощью неявных событий.
Чтобы обнаружить изменения в данных Stateflow, используйте операторы, перечисленные в этой таблице.
| Оператор | Синтаксис | Описание | Пример |
|---|---|---|---|
hasChanged | tf = hasChanged(data_name) | Возвращает 1 (true), если значение data_name в начале текущего временного шага отличается от значения data_name в начале предыдущего шага времени. В противном случае оператор возвращает 0 (false). | Переход из состояния, если какой-либо элемент матрицы [hasChanged(M)] |
Переход из состояния, если элемент в строке 1 и столбце 3 матрицы В диаграммах, использующих MATLAB ® в качестве языка действий, используйте: [hasChanged(M(1,3))] В диаграммах, использующих C в качестве языка действий, используйте: [hasChanged(M[0][2])] | |||
hasChangedFrom | tf = hasChangedFrom(data_name,value) | Возвращает 1 (true), если значение data_name равно указанному value в начале предыдущего временного шага и является другим значением в начале текущего временного шага. В противном случае оператор возвращает 0 (false). | Переход из состояния, если предыдущее значение структуры [hasChangedFrom(struct,structValue)] |
hasChangedTo | tf = hasChangedTo(data_name,value) | Возвращает 1 (true), если значение data_name не было равно указанному value в начале предыдущего временного шага и равно value в начале текущего временного шага. В противном случае оператор возвращает 0 (false). | Переход из состояния, если поле структуры [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.
Индексировать поля в структуре с помощью точечной нотации. См. раздел Индексирование и присвоение значений структурам потока состояний.
Любая допустимая комбинация полей структуры или элементов матрицы.
Аргумент 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_start | Значение данных |
Чтобы обнаружить изменения, диаграмма дважды буферизирует значения данных после того, как событие запускает диаграмму, но до начала выполнения диаграммы. Если значения xprev и xstart match, оператор обнаружения изменений возвращает false (указать, что никаких изменений не произошло); в противном случае возвращается true (для обозначения изменения). Эта диаграмма помещает эти задачи в контекст жизненного цикла диаграммы.

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