Engee 文档
Notebook

交通灯控制逻辑建模

本例旨在展示有限自动机库的可能性,并让您熟悉其基本要素。 本例将介绍有限自动机库的基本要素。我们将考虑使用图表模块实现一个简单的交通灯控制逻辑。


运行原理

trafic_lights_1712047742159_2.png

交通信号灯有三种颜色,并一直在三种颜色之间切换。其中一种颜色亮起的时刻称为系统的状态。因此,我们的模型将有三种状态:红色、黄色和绿色。红色是默认状态,即每个循环都从红色开始。

在本示例中,系统从一个状态到另一个状态的所有转换都以指定时间结束为条件。在函数after() 中指定的时间结束后,绿色状态变为活动状态。

trafic_lights_1712054565347.png

我们将时间间隔设置为本地变量:redtime、yellowtime 和 greentime。同时设置输出变量 light 以输出结果。

crhby.png

为了跟踪系统在每个状态下的运行情况,我们将为输出变量 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]:
run_model (generic function with 1 method)
In [ ]:
run_model("traffic_lights",@__DIR__) # Запуск модели.
Building...
Progress 62%
Progress 100%
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 1 entry:
  "light" => 8001×2 DataFrame
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。

示例中使用的块