Engee 文档
Notebook

红绿灯控制逻辑仿真

这个例子的目的是演示有限状态机库的功能,并熟悉
其基本要素。 我们将考虑使用图表块实现最简单的红绿灯控制逻辑。


操作原理

trafic_lights--1712047742159_2.png

红绿灯有三种颜色,它们之间所有的时间切换。 其中一种颜色被点亮的时刻称为系统的状态。 因此,我们的模型将有三种状态:红色,黄色和绿色。 红色将是默认状态,这意味着每个周期都将从它开始。

在这个例子中,系统从一个状态到另一个状态的所有转换都将由设定时间的到期引起。 在函数中指定的时间过去后,绿色状态变为活动状态。 after().

trafic_lights--1712054565347.png

我们将时间间隔设置为局部变量:redtime、yellowtime和greentime。 我们还将设置光输出变量以输出结果。

crhby.png

为了监控系统在每个状态下的运行,我们将为光输出变量分配一定的值。 例如,在红色交通灯亮的状态下,我们将为灯值赋值1。 在点亮黄色和绿色的状态下,值分别为2和3。

每个状态都包含entry运算符,该运算符指示在状态变为活动状态时执行一次指定的操作。

结果输出

让我们运行模型并查看结果。

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 [ ]:
plot(light.time, light.value, label = "light")
Out[0]:

在生成的图表中,我们可以看到交通信号灯信号是如何变化的。 第一个15秒红灯亮,然后绿灯亮20秒,黄灯亮5秒,
然后循环又开始了。

结论

我们已经考虑了使用有限状态机库的图表块的交通灯控制逻辑的简单实现。 如欲了解更多有关图书馆的资料,请浏览以下连结:https://engee.com/helpcenter/stable/articles/statemachines-first.html

示例中使用的块