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

Моделирование управляющей логики светофора

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


Принцип работы

trafic_lights—​1712047742159_2.png

Светофор имеет три цвета и все время переключается между ними. Момент, когда горит какой-то из цветов, называется состоянием системы. Соответственно, наша модель будет иметь три состояния: Red, Yellow и Green. Red будет являться состоянием по умолчанию, то есть каждый цикл будет начинаться с него.

В данном примере все переходы системы из одного состояния в другое будут обусловлены истечением заданного времени. Состояние Green становится активным после того, как пройдет время, указанное в функции after().

trafic_lights—​1712054565347.png

Промежутки времени зададим в виде локальных переменных: redtime, yellowtime и greentime. Также зададим выходную переменную light, чтобы выводить результаты.

crhby.png

Чтобы отслеживать работу системы в каждом состоянии будем присваивать выходной переменной light некоторое значение. Допустим, в состоянии, когда горит красный сигнал светофора будем присваивать light значение 1. В состоянии, когда горит желтый и зеленый, значения 2 и 3, соответственно.

В каждом из состояний присутствует оператор entry, который говорит о том, что указанное действие выполняется один раз, когда состояние становится активным.

Вывод результатов

Запустим модель и посмотрим на результат выполнения.

# Подключение вспомогательной функции запуска модели.
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
run_model (generic function with 1 method)
run_model("traffic_lights",@__DIR__) # Запуск модели.
Building...
Progress 62%
Progress 100%
Progress 100%
Dict{String, DataFrames.DataFrame} with 1 entry:
  "light" => 8001×2 DataFrame…
# Считывание из simout залогированных сигналов
light = simout["traffic_lights/light"];
light = collect(light);
using Plots
plot(light.time, light.value, label = "light")

interactive-scripts/images/state_machines_traffic_lights/2af69ac07efdeb5bb73918e78614a870e8d40da7

На получившемся графике видим, как изменялся сигнал светофора. Первые 15 секунд горел красный сигнал, затем на протяжении 20 секунд горел зеленый и 5 секунды желтый, далее цикл начался заново.

Вывод

Мы рассмотрели вариант простой реализации управляющей логики светофора с помощью блока Chart библиотеки конечных автоматов. Подробнее познакомиться с библиотекой можно по ссылке: https://engee.com/helpcenter/stable/articles/statemachines-first.html