交通灯控制逻辑建模¶
本例旨在展示有限自动机库的可能性,并让您熟悉其基本要素。 本例将介绍有限自动机库的基本要素。我们将考虑使用图表模块实现一个简单的交通灯控制逻辑。
运行原理¶
交通信号灯有三种颜色,并一直在三种颜色之间切换。其中一种颜色亮起的时刻称为系统的状态。因此,我们的模型将有三种状态:红色、黄色和绿色。红色是默认状态,即每个循环都从红色开始。
在本示例中,系统从一个状态到另一个状态的所有转换都以指定时间结束为条件。在函数after()
中指定的时间结束后,绿色状态变为活动状态。
我们将时间间隔设置为本地变量:redtime、yellowtime 和 greentime。同时设置输出变量 light 以输出结果。
为了跟踪系统在每个状态下的运行情况,我们将为输出变量 light 赋值。例如,在红灯亮起的状态下,我们将给 light 赋值 1。在黄灯和绿灯亮起的状态下,其值分别为 2 和 3。
每个状态都包含进入操作符,表示当该状态变为活动状态时,指定的操作将执行一次。
输出结果¶
让我们运行模型并查看执行结果。
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]:
In [ ]:
run_model("traffic_lights",@__DIR__) # Запуск модели.
Out[0]:
In [ ]:
# Считывание из simout залогированных сигналов
light = simout["traffic_lights/light"];
light = collect(light);
In [ ]:
using Plots
plot(light.time, light.value, label = "light")
Out[0]:
在结果图中,我们可以看到交通信号灯是如何变化的。在最初的 15 秒内,红色信号灯亮起,20 秒内绿色信号灯亮起,5 秒内黄色信号灯亮起、 然后周而复始。
结论¶
我们使用有限自动机库中的 Chart 模块,对交通灯控制逻辑的简单实现进行了变体分析。有关该库的更多信息,请访问:https://engee.com/helpcenter/stable/articles/statemachines-first.html。