Engee 文档
Notebook

管道压力控制建模

这个例子演示了管道压力控制的模拟.

模型如何工作

管道由物理建模库的块描述,特别是,块负责其体积。

通过阀1,液体从单元流向体积单元。 反过来,一个压力传感器**被连接到它,从该信号被发送到控制系统,由一个加法器,一个设定点传感器和一个PID控制器表示。

模型图:

liquid_pressure_regulator--1725958617592.png

PID控制器发送控制信号给阀1打开或关闭,提供压力控制。

体积块的右边,沿着流体运动的路径,有一个块泄漏,它就像阀门1一样,是一个受控的节气门。

泄漏创建一些"意外"泄漏的液体从模拟管道。

通过该单元的液体最终进入排放,这由具有设定压力的无限储液器描述。

边界条件

  1. 源中的压力始终保持在151.3kpa。
  2. 在罐中,其特征在于液体通过泄漏排出的空间,压力始终为50kPa。

初始条件:

  1. 管道中的初始压力为100kPa。
  2. 设定点信号为100000,在调节范围内意味着100kPa。

定义加载和运行模型的函数:

In [ ]:
function start_model_engee()
    try
        engee.close("liquid_pressure_regulator", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/liquid_pressure_regulator.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/liquid_pressure_regulator.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

运行模拟

In [ ]:
try
    start_model_engee() # запуск симуляции с помощью специальной функции, реализованной выше
    catch err
    end;

从simout变量中提取站点温度数据并将其写入变量:

In [ ]:
result = simout;
res = collect(result)
Out[0]:
14-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.port_a.p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.restriction_area_in")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.rho_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Задатчик.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.mdot_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Сумматор.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.delta_p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.rho_b")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.Vdot_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.port_b.p")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.mdot_b")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Датчик давления.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/PID-регулятор.1")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Клапан 1.Vdot_b")

在变量中记录设定点和压力传感器信号:

In [ ]:
control_signal = collect(res[4])
pressure = collect(res[12])
Out[0]:
10001×2 DataFrame
9976 rows omitted
Rowtimevalue
Float64Float64
10.0100000.0
20.011.00783e5
30.021.01528e5
40.031.00949e5
50.041.01504e5
60.051.00924e5
70.061.00693e5
80.071.00127e5
90.0899619.1
100.0999082.9
110.198723.7
120.1198441.9
130.1298267.5
999099.891.20968e5
999199.91.20968e5
999299.911.20967e5
999399.92120966.0
999499.931.20965e5
999599.941.20964e5
999699.951.20964e5
999799.961.20963e5
999899.971.20962e5
999999.981.20961e5
1000099.991.20961e5
10001100.01.2096e5

模拟结果的可视化

In [ ]:
using Plots
plot(control_signal[:,1], control_signal[:,2], label="Задатчик", linewidth=3)
plot!(pressure[:,1], pressure[:,2], label="Датчик давления", linewidth=3)
Out[0]:

结论:

在这个例子中,演示了一个带有自动控制系统的物理对象的模拟。 过渡时间约为15秒,压力稳定在可接受的限度内,轻微的波动与来自管道的流体泄漏相关联。