Документация Engee
Notebook

Электроподъемник стекла автомобиля

В этом примере расскажем, как описать логику работы электроподъемника стекла с помощью блока Chart библиотеки конечных автоматов.


Логика работы при поднятии и опускании стекла

Создадим диаграмму перехода состояний для моделирования системы электролоподъемника стекла в автомобиле по следующим требованиям.

Один вход (u) – направление, в котором должно двигаться окно.

  • -1 – стекло опускается
  • 0 – стекло остается неподвижным
  • 1 – стекло поднимается.

Один вывод (pos) – текущее положение окна.

  • pos = 0 – Окно полностью открыто
  • pos = 20 – Окно полностью закрыто

Диаграмма блока Chart должна иметь следующие характеристики: pos следует увеличить на 1.

  • Если указано, что окно закрывается (u = 1), но оно закрыто не полностью,
  • Если окно опускается (u = -1) и оно открыто не полностью, значение pos должно быть уменьшено на 1.
  • Если окно запрограммировано оставаться неподвижным (u = 0), значение pos не должно изменяться.
  • Положение окна должно начинаться с полного закрытия (pos = 20).
  • График должен отображаться каждые 0,1 секунды.
  • График должен содержать три состояния – Вверх, Вниз и Стоп.

Полученная модель находится в папке под названием power_window_simple.engee. Вы можете открыть ее и изучить более подробно. Но также возможно запустить модель с помощью кода и получить результаты.

In [ ]:
# Подключение вспомогательной функции запуска модели.
function run_model( name_model, path_to_folder )
    
    Path = path_to_folder * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end
Out[0]:
run_model (generic function with 1 method)
In [ ]:
run_model("power_window_simple",@__DIR__) # Запуск модели.
Building...
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "u"   => 11×2 DataFrame…
  "pos" => 101×2 DataFrame
In [ ]:
# Считывание из simout залогированных сигналов
Pos = simout["power_window_simple/pos"];
Pos = collect(Pos);
In [ ]:
using Plots
plot(Pos.time, Pos.value)
Out[0]:

Теперь можно усложнить модель и учесть при поднятии стекла вариант, когда что-то попало между стеклом и рамой окна.

Логика работы с учетом датчика

Изменим модель, чтобы учесть датчик "защемления". К логике работы стеклоподъемника с датчиком предъявим следующие требования:

  • Если датчик защемления обнаруживает защемление (сигнал защемления больше 0), окно вообще не должно двигаться;
  • После обнаружения сдвига сигнал датчика сдвига должен быть меньше или равен 0 в течение трех последовательных обновлений графика, прежде чем возобновится нормальная работа. В течение этого времени окно не должно перемещаться.

Дополним модель из предыдущего пункта. Добавив состояние CannotMove, которое отвечает за возможность движение стекла. То есть переход в это состояние происходит тогда, когда переменная pinched больше 0. Собранная модель показана ниже и файл с моделью находится в папке с названием power_window.engee.

power_window_1718904216220.png

In [ ]:
run_model("power_window",@__DIR__) # Запуск модели.
Building...
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 3 entries:
  "Repeating Sequence Stair-1.1" => 11×2 DataFrame…
  "u"                            => 11×2 DataFrame…
  "pos"                          => 101×2 DataFrame
In [ ]:
# Считывание из simout залогированных сигналов
Pos = simout["power_window/pos"];
Pos = collect(Pos);
In [ ]:
plot(Pos.time, Pos.value)
Out[0]:

Таким образом, мы учли случай, когда происходит защемление какого-либо предмета при поднятии окна. Можно и дальше усложнять модель, учитывая различные сложности при закрытии окна. Также вы можете познакомиться с другими примерами использования блока Chart в разделе Конечные автоматы.

Блоки, использованные в примере