AnyMath 文档
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。限制,限制")
 WorkspaceArray{Float64}("liquid_pressure_regulator/阀1。rho_a")
 WorkspaceArray{Float64}("liquid_pressure_regulator/Setter。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秒,压力稳定在可接受的限度内,轻微的波动与来自管道的流体泄漏相关联。