Engee 文档
Notebook

电动车窗升降器

在本示例中,我们将介绍如何使用有限自动机库的图表模块来描述电动车窗升降器的逻辑。


升降车窗的操作逻辑

根据以下要求创建一个状态转换图,以模拟汽车电动车窗升降系统。

一个输入(u)是车窗移动的方向。

  • -1 - 车窗降下
  • 0 - 车窗保持静止
  • 1 - 车窗上升。

一个输出(pos)--窗口的当前位置。

  • pos = 0 - 窗口完全打开
  • pos = 20 - 窗口完全关闭

图表框图必须具备以下特征:

  • 如果显示窗口正在关闭(u = 1),但并未完全关闭、 pos 应增加 1。
  • 如果车窗正在下降(u =-1),但没有完全打开,则 pos 应减小 1。
  • 如果窗口被编程为保持静止(u = 0),则 pos 值不得更改。 的值不得更改。
  • 窗口位置必须从窗口完全关闭(pos = 20)时开始。
  • 图形必须每 0.1 秒显示一次。
  • 图形必须包含三种状态 - 上升、下降和停止。

获得的模型位于名为power_window_simple.engee 的文件夹中。您可以打开并详细研究。您也可以使用代码运行模型并获得结果。

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("power_window_simple",@__DIR__) # Запуск модели.
Building...
Progress 0%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "u" => WorkspaceArray{Float64}("power_window_simple/u")
,
    "pos" => WorkspaceArray{Float64}("power_window_simple/pos")

)
In [ ]:
# Считывание из simout залогированных сигналов
Pos = simout["power_window_simple/pos"];
Pos = collect(Pos);
In [ ]:
using Plots
plot(Pos.time, Pos.value)
Out[0]:

现在,您可以将模型复杂化,并考虑到在提升玻璃时有东西卡在玻璃和窗框之间的情况。

考虑传感器的运行逻辑

我们来修改模型,将夹紧传感器考虑在内。带传感器的电动车窗的运行逻辑需要满足以下要求:

  • 如果夹紧传感器检测到夹紧(夹紧信号大于 0)、 如果夹紧传感器检测到夹紧(夹紧信号大于 0),车窗必须在 3 秒钟内完全不动;
  • 之后,如果传感器发出的信号为 0,则恢复正常操作。否则,车窗不会移动,直到障碍物被移走。

让我们完成上一段的模型。添加CannotMove状态,该状态决定了窗口移动的可能性。组装好的模型如下所示,模型文件位于名为power_window.engee 的文件夹中。

power_window_1718904216220.png

In [ ]:
run_model("power_window",@__DIR__) # Запуск модели.
Building...
Progress 0%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "Сигнал с датчика.1" => WorkspaceArray{Float64}("power_window/Сигнал с датчика.1")
,
    "u" => WorkspaceArray{Float64}("power_window/u")
,
    "pos" => WorkspaceArray{Float64}("power_window/pos")

)
In [ ]:
# Считывание из simout залогированных сигналов
Pos = simout["power_window/pos"];
Pos = collect(Pos);
In [ ]:
plot(Pos.time, Pos.value)
Out[0]:

结论

至此,我们已经考虑了当窗口升起时物体被夹住的情况。我们还可以将模型进一步复杂化,考虑关闭窗口时的各种困难。您还可以在 有限自动机 中查看使用 Chart block 的其他示例。

示例中使用的块