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

Графики 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вывод , Local, или Data Store Memory

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

  • Скалярная переменная.

  • Матрица A или элемент матрицы.

    • Если 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 точно.

Когда вы используете операторы обнаружения изменения в графиках, в то время как упорядоченное по строкам размещение массивов включено, генерация кода производит ошибку. Прежде, чем сгенерировать код в графиках, которые используют операторы обнаружения изменения, включите упорядоченное по столбцам размещение массивов. Смотрите Избранное Размещение Массивов для Матриц в Сгенерированном коде.

Реализация обнаружения изменения

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

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

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

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

x_start

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

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

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

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

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

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

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

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

| | |

Похожие темы