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
.
Индексируйте поля в структуре с помощью записи через точку. См. Индекс и присвоение значений структурам 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_start | Значение данных |
Чтобы обнаружить изменения, график двойной буферизации значений данных после события запускает график, но до того, как график начинает выполняться. Если значения xprev
и xstart
соответствует, оператор обнаружения изменений возвращается false
(указать, что никаких изменений не произошло); в противном случае возвращается true
(для указания изменения). Эта схема помещает эти задачи в контекст жизненного цикла графика.
Операторы обнаружения изменений пытаются отфильтровать переходные изменения в переменных локального графика путем оценки их значений только в контуры. График оценивает указанную локальную переменную только один раз в конце шага выполнения. Возврат значение операторов обнаружения изменений остается постоянным, даже если значение локальной переменной колеблется в течение заданного временного шага. Например, предположим, что в текущем временном шаге локальная переменная temp
изменяется с его значения на предыдущем временном шаге, но затем возвращается к исходному значению. Оператор hasChanged(temp)
возвращает false
для следующего временного шага, указывающего, что никаких изменений не произошло.
Когда в одном временном шаге происходит несколько входных событий или когда вы включаете семантику супер шага, график обновляет xprev
и xstart
буферы при каждом выполнении. График обнаруживает изменения в значении между входными событиями и итерациями супершага, даже если изменения происходят более одного раза в установленном временном шаге. Для получения дополнительной информации смотрите Использование событий для выполнения графиков и Семантика супер шага.
change | hasChanged | hasChangedFrom | hasChangedTo