Когда переключатель размыкается и замыкается, контакты переключателя могут отскочить друг от друга до того, как коммутатор полностью перейдет в состояние включения или выключения. Подпрыгивающее действие может генерировать переходные сигналы, которые не представляют истинного изменения состояния. Поэтому при моделировании логики переключения важно отфильтровывать переходные сигналы с помощью алгоритмов разгона.
Если вы моделируете контроллер на диаграмме Stateflow ®, вы не хотите, чтобы логика коммутатора перегружала контроллер, включая и выключая его в ответ на каждый принимаемый им переходный сигнал. Чтобы избежать этого, разработайте контроллер Stateflow, который использует временную логику для сброса входных сигналов и определения того, действительно ли переключатель включен или выключен.
Существует два способа устранения сигнала с помощью Stateflow:
Фильтрация переходных сигналов с помощью duration временной оператор.
Фильтрация переходных сигналов с использованием промежуточного графического состояния. Используйте промежуточное графическое состояние для расширенных методов фильтрации, таких как обнаружение неисправностей.
duration поддерживается только в диаграммах Stateflow в модели Simulink ®.
duration ОператорВ этом примере показан образец конструкции, в котором используется duration оператор для фильтрации переходных сигналов.

Диаграмма Debouncer содержит эту логику.

Логика состояния
Начальное состояние для этой модели: Off. С помощью duration оператор может управлять активным состоянием в зависимости от длительности сигнала переключения, sw, был отрицательным или неотрицательным.
Когда sw был неотрицательным в течение более 0,01 секунды, переключатель переходит из состояния Off указывать On.
Когда sw был отрицательным в течение более 0,01 секунды, переключатель переходит из состояния On указывать Off.
Запуск отладчика
Откройте модель.
Откройте блок «Область».
Откройте отладчик диаграммы Stateflow.
Моделирование модели. Область применения показывает, как разуплотнитель изолирует переходные сигналы от шумного входного сигнала.

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

Диаграмма Debouncer содержит эту логику.

Логика состояния
Диаграмма Debouncer содержит промежуточное состояние с именем Debounce. Это состояние изолирует переходные входы, проверяя наличие сигнала sw остается положительным или отрицательным, или если она колеблется между нулевыми пересечениями в течение заданного периода.
Когда sw был положительным в течение более 0,1 секунды, переключатель переходит в состояние On.
Когда sw отрицательный в течение более 0,1 секунды, переключатель переходит в состояние Off.
Когда sw колеблется между пересечениями нуля в течение более 0,3 секунды, переключатель переходит в состояние Off.Fault, изоляция sw в качестве переходного сигнала и давая ему время на восстановление.
Запуск отладчика
Откройте модель.
Откройте блок «Область».
Откройте отладчик диаграммы Stateflow.
Моделирование модели. Область применения показывает, как разуплотнитель изолирует переходные сигналы от шумного входного сигнала.

В качестве альтернативы временной логике абсолютного времени можно применить временную логику на основе событий для определения истинного состояния в диаграмме Debouncer с помощью after оператор. Ключевое слово tick определяет и неявно генерирует локальное событие при пробуждении диаграммы.
Блок генератора ошибок в sf_debouncer модель генерирует импульсный сигнал каждые 0,001 секунды. Поэтому для преобразования временной логики абсолютного времени, указанной в диаграмме Debouncer, в логику, основанную на событиях, умножьте аргумент after оператор на 1000, как указано в этой таблице.
| Логика, основанная на абсолютном времени | Логика на основе событий |
|---|---|
after(0.1,sec) | after(100,tick) |
after(0.3,sec) | after(300,tick) |
after(1,sec) | after(1000,tick) |