Графики Stateflow® могут обнаружить изменения в значениях данных от одного временного шага до следующего временного шага. Все диаграммы Stateflow могут обнаружить изменения во входных данных графика. Графики, которые используют C в качестве языка действия, могут также обнаружить изменения в выходных данных графика, локальных переменных графика и данных оперативной памяти хранилища данных.
Изменитесь обнаружение поддерживается только в диаграммах Stateflow в моделях Simulink®.
Чтобы обнаружить изменения в данных Stateflow, используйте операторы, перечисленные в этой таблице.
Оператор | Синтаксис | Описание | Пример |
---|---|---|---|
hasChanged | tf = hasChanged(u) | Обнаруживает изменения в значении данных с начала последнего временного шага к началу шага текущего времени. | Возвращает hasChanged(u) |
hasChangedFrom | tf = hasChangedFrom(u,v) | Обнаруживает изменения в значении данных от заданного значения в начале последнего временного шага к различному значению в начале шага текущего времени. | Возвращает hasChangedFrom(u,v) |
hasChangedTo | tf = hasChangedTo(u,v) | Обнаруживает изменения в значении данных к заданному значению в начале шага текущего времени от различного значения в начале последнего временного шага. | Возвращает hasChangedTo(u,v) |
Изменитесь операторы обнаружения возвращают true
, если существует изменение в значении данных и false
, если нет никакого изменения в значении данных.
Аргумент u
может быть:
Скалярная переменная.
Матрица или элемент матрицы. Смотрите Поддерживаемые Операции для Векторов и Матриц.
Структура или поле в структуре. Смотрите Значения Индекса и Присвоения к Структурам Stateflow.
Любая допустимая комбинация полей структуры или матричных индексов.
Индексы могут быть числами или выражениями, которые оценивают к скалярному значению.
Для hasChangedFrom
и операторов hasChangedTo
, второй аргумент v
может быть любым выражением, которое решает к значению, которое сопоставимо с u
.
Если u
является скаляром, то v
должен решить к скалярному значению.
Если u
является матрицей, то v
должен решить к матричному значению с теми же размерностями как u
.
Также в графике, который использует C в качестве языка действия, v
может решить к скалярному значению. График использует скалярное расширение, чтобы сравнить u
с матрицей, элементы которой все равны значению, заданному v
. Смотрите Преобразовывают Скаляры в Нескаляры при помощи Скалярного Расширения.
Если u
является структурой, то v
должен решить к значению структуры, полевая спецификация которого совпадает с u
точно.
Осциллограф u
зависит от языка действия графика:
MATLAB® как язык действия: Input
только.
C как язык действия: Input
, Output
, Local
или Data Store Memory
.
Аргумент u
не может быть нетривиальным выражением или переменной пользовательского кода.
Эта модель показывает, как операторы hasChanged
, hasChangedFrom
и hasChangedTo
обнаруживают определенные изменения во входном сигнале. В этом примере блок Ramp отправляет дискретный, увеличивающийся сигнал времени в график.
Модель использует решатель фиксированного шага с размером шага 1. Сигнал постепенно увеличивается 1 на каждом временном шаге. На каждом временном шаге график анализирует входной сигнал u
для этих изменений:
Любое изменение от предыдущего временного шага
Изменение в значении 3
Изменение от значения 3
Чтобы проверять сигнал, график вызывает три оператора обнаружения изменения в действии перехода. График выводит возвращаемые значения как y1
, y2
и y3
.
Во время симуляции блок Scope показывает сигналы ввода и вывода графику.
u
увеличивается на 1 на каждом временном шаге.
Переходы y1
к значению 1 во время t = 1. y1
остается 1, потому что u
продолжает изменяться на каждом последующем временном шаге.
Переходы y2
к 1 во время t = 4, когда значение u
изменяется от 3 до 4. переходы y2
назад к 0 во время t = 5, когда u
увеличивается от 4 до 5.
Переходы y3
к 1 во время t = 3, когда значение u
изменяется от 2 до 3. переходы y3
назад к 0 во время t = 4, когда u
увеличивается от 3 до 4.
График обнаруживает изменения в данных о графике путем оценки значений на контурах временного шага. График сравнивает значение в начале предыдущего шага выполнения со значением в начале текущего шага выполнения. Обнаружить изменения, двойные буферы графика эти значения в локальных переменных.
Локальный буфер | Описание |
---|---|
var_name | Значение данных var_name в начале последнего временного шага |
var_name | Значение данных var_name в начале шага текущего времени |
Двойная буферизация происходит однажды на временной шаг кроме тех случаев, когда несколько входных событий имеют место в том же временном шаге. Если несколько входных событий имеют место в том же временном шаге, двойная буферизация происходит однажды на входное событие. Смотрите Обнаруживают Изменения Значения Между Входными Событиями.
Когда вы вызываете оператор обнаружения изменения в действии, диаграмме Stateflow:
Значения данных двойных буферов после события Simulink инициировали график, но прежде чем график начинает выполнение.
Сравнивает значения в буферах _start
и _prev
. Если значения соответствуют, оператор обнаружения изменения возвращает false
(никакое изменение); в противном случае это возвращает true
(изменение).
Эта схема помещает эти задачи в контекст жизненного цикла графика.
Буферизация происходит перед выполнением графика и влияет на обнаружение изменения когда:
Локальные переменные имеют переходные изменения в значении.
Несколько входных событий имеют место в том же временном шаге.
Диаграммы Stateflow пытаются отфильтровать переходные изменения в локальных переменных графика путем оценки их значений только на контурах времени. График оценивает заданную локальную переменную только однажды в конце шага выполнения. Возвращаемое значение операторов обнаружения изменения остается постоянным, даже если значение локальной переменной колеблется в данном временном шаге.
Например, предположите, что на шаге текущего времени локальная переменная temp
изменяется от его значения на предыдущем временном шаге, но затем возвращается к исходному значению. hasChanged(temp)
оператора возвращает false
для следующего временного шага, указывая, что никакое изменение не произошло.
Когда несколько входных событий имеют место в том же временном шаге, диаграмма Stateflow обновляет _prev
и буферы _start
однажды на событие. График обнаруживает изменения между входными событиями, даже если изменения происходят несколько раз в данном временном шаге.
hasChanged | hasChangedFrom | hasChangedTo