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),
窗口不应该在所有移动3秒。;
*之后,如果来自传感器的信号为0,则恢复正常操作。 否则,窗口不会移动,直到障碍物消失。

让我们从上一段添加模型。 通过添加CannotMove状态,其负责玻璃移动的可能性。 也就是说,当pinched变量大于0时,会发生向此状态的转换。 组装的模型如下所示,模型文件位于名称为 power_window.engee.

power_window--1748326839269.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]:

结论

因此,我们考虑到了当窗口升起时物体被挤压的情况。 您可以进一步使模型复杂化,同时考虑到关闭窗口时的各种困难。 您还可以在[有限自动机]部分中找到使用图表块的其他示例(https://engee.com/helpcenter/stable/interactive-scripts/state_machines.html )。

示例中使用的块