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