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

Графики Stateflow® могут обнаружить изменения в значениях данных от одного временного шага до следующего временного шага. Все диаграммы Stateflow могут обнаружить изменения во входных данных графика. Графики, которые используют C в качестве языка действия, могут также обнаружить изменения в выходных данных графика, локальных переменных графика и данных оперативной памяти хранилища данных.

Изменитесь обнаружение поддерживается только в диаграммах Stateflow в моделях Simulink®.

Измените операторы обнаружения

Чтобы обнаружить изменения в данных Stateflow, используйте операторы, перечисленные в этой таблице.

ОператорСинтаксисОписаниеПример
hasChangedtf = hasChanged(u)

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

Возвращает true, если u изменил значение.

hasChanged(u)
hasChangedFromtf = hasChangedFrom(u,v)

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

Возвращает true, если u изменил от значения v.

hasChangedFrom(u,v)
hasChangedTotf = hasChangedTo(u,v)

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

Возвращает true, если u изменил на значение v.

hasChangedTo(u,v)

Изменитесь операторы обнаружения возвращают true, если существует изменение в значении данных и false, если нет никакого изменения в значении данных.

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

Индексы могут быть числами или выражениями, которые оценивают к скалярному значению.

Для 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 _prev

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

var_name _start

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

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

Когда вы вызываете оператор обнаружения изменения в действии, диаграмме Stateflow:

  • Значения данных двойных буферов после события Simulink инициировали график, но прежде чем график начинает выполнение.

  • Сравнивает значения в буферах _start и _prev. Если значения соответствуют, оператор обнаружения изменения возвращает false (никакое изменение); в противном случае это возвращает true (изменение).

Эта схема помещает эти задачи в контекст жизненного цикла графика.

Буферизация происходит перед выполнением графика и влияет на обнаружение изменения когда:

  • Локальные переменные имеют переходные изменения в значении.

  • Несколько входных событий имеют место в том же временном шаге.

Отфильтруйте переходные изменения значения

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

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

Обнаружьте изменения значения между входными Событиями

Когда несколько входных событий имеют место в том же временном шаге, диаграмма Stateflow обновляет _prev и буферы _start однажды на событие. График обнаруживает изменения между входными событиями, даже если изменения происходят несколько раз в данном временном шаге.

Смотрите также

| |

Похожие темы