Моделирование управляющей логики светофора¶
Целью данного примера является демонстрация возможностей библиотеки конечных автоматов и знакомство с ее основными элементами. Мы рассмотрим реализацию простейшей логики управления светофором с помощью блока Chart.
Принцип работы¶
Светофор имеет три цвета и все время переключается между ними. Момент, когда горит какой-то из цветов, называется состоянием системы. Соответственно, наша модель будет иметь три состояния: Red, Yellow и Green. Red будет являться состоянием по умолчанию, то есть каждый цикл будет начинаться с него.
В данном примере все переходы системы из одного состояния в другое будут обусловлены истечением заданного времени. Состояние Green становится активным после того, как пройдет время, указанное в функции after()
.
Промежутки времени зададим в виде локальных переменных: redtime, yellowtime и greentime. Также зададим выходную переменную light, чтобы выводить результаты.
Чтобы отслеживать работу системы в каждом состоянии будем присваивать выходной переменной 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("traffic_lights",@__DIR__) # Запуск модели.
# Считывание из simout залогированных сигналов
light = simout["traffic_lights/light"];
light = collect(light);
using Plots
plot(light.time, light.value, label = "light")
На получившемся графике видим, как изменялся сигнал светофора. Первые 15 секунд горел красный сигнал, затем на протяжении 20 секунд горел зеленый и 5 секунды желтый, далее цикл начался заново.
Вывод¶
Мы рассмотрели вариант простой реализации управляющей логики светофора с помощью блока Chart библиотеки конечных автоматов. Подробнее познакомиться с библиотекой можно по ссылке: https://engee.com/helpcenter/stable/articles/statemachines-first.html