Engee 文档
Notebook

水力系统建模

本示例将演示利用基础库的模块组装液压缸的建模过程。

image.png

图为模型示意图。泵模型引导水流$Q$ ,产生压力$p1$ ,在压力的作用下,层流$q1ex$ 流向出口。控制阀模拟通过可变面积孔板的湍流。这种流动,$q12$ ,形成一个中间压力,$p2$ ,在连接到执行器气缸的管路中随之下降。气缸中的压力,$p3$ ,在弹簧的作用下移动活塞,使其到达 x 位置。

Engee 中的模型示意图:

single_hydraulic_cylinder_simulation_1707475635711.png

在泵出口处,流量分为两部分:泄漏流量和流向控制阀的流量。我们将泄漏流$q1ex$ 建模为层流(见等式 1)。

In [ ]:
Pkg.add(["CSV"])
In [ ]:
cd( @__DIR__ ) # Переместимся в каталог, где лежит текущий скрипт
homePath = string(@__DIR__)
Out[0]:
"/user/start/examples/base_simulation/single_hydraulic_cylinder_simulation"

等式块 1

$$Q = q_{12} + q_{1ex}$$

$$q_{1ex} = C_2 \cdot p_1 $$

$$p_1 = \frac{(Q - q_{12})}{C_2}$$

在哪里? -$Q$ - 泵的流量 -$q_{12}$ - 流向控制阀的流量 -$q_{1ex}$ - 泄漏流量 -$C_2$ - 流量系数

对通过调节阀的紊流进行建模。函数$sgn$ 和模块允许考虑双向流动(见等式块 2)。

方程组 2

$$q_{12}= C_d \cdot A \cdot \text{sgn}(p_1-p_2) \cdot \sqrt{\frac{2}{\rho}|p_1-p_2|}$$ 其中

-$q_{12}$ - 通过调节阀的流量 -$C_d$ - 通过节流孔的流量系数 -$A$ - 孔口面积 -$p_2$ - 控制阀后的压力 -$\rho$ - 液体密度

气缸中的流体压力因这一流动而增加。流体的可压缩性也已模拟(见方程块 3)。

方程组 3

$$ \frac{dp_3}{dt}= \frac{\beta}{V_3} \left(q_{12} - A_c \frac{dx}{dt}\right) $$ $$ V_3 = V_{30} + A_c \cdot x $$

其中

-$V_3$ - 压力下的液体体积$p_3$ 、 -$dp_3/dt$ - 气缸中压力变化的时间速率、 -$\beta$ - 液体的体积弹性模量、 -$V_{30}$ -$x = 0$ 时活塞中液体的体积、 -$A_c$ - 气缸的横截面积

由于液压力较大,因此未考虑活塞和弹簧的质量。方程组 4 计算了活塞上的力平衡。

方程块 4

$$ x= p_3\frac{A_c}{K} $$ $$ \frac{dx}{dt}= \frac{dp_3}{dt} \frac{A_c}{K} $$ $$ q_{23}=q_{12}=C_1 \left( p_2 - p_3 \right) $$ $$ p_2= p_3 + \frac{q_{12}}{C_1} $$

在哪里? -$K$ - 弹簧刚度 -$C_1$ - 层流系数

泵 "子系统

双击子系统 "泵",打开泵模型。它根据泵本身的流速和下游系统组件的流速计算输送压力。一维表格将流量数据定义为时间函数。模型计算出压力$p1$ ,如等式 1 所示。由于$Qout = q12$ 是$p1$ (通过控制阀)的直接函数,因此形成了一个代数回路。设置初始压力值$p10$ 可以提供更有效的解决方案。

single_hydraulic_cylinder_simulation_1707296300526_2.png

阀/液压缸 "子系统

双击子系统 "阀门/液压缸",打开控制阀和液压缸模型。微分代数方程系统通过压力$p3$ 对液压缸中的压力上升进行建模,压力上升作为导数出现在方程块 3 中。如果忽略活塞的质量,其位置和弹簧力与$p3$ 成正比,其速度与$p3$ 的时间导数成正比。中间压力$p2$ 是$p3$ 和从阀门流入气缸的压降之和(方框 4 等式)。

控制阀子系统计算通过节流孔的流量(方框 2 等式)。它使用阀嘴的入口和出口压力以及可变面积作为输入。

single_hydraulic_cylinder_simulation_1707297894902_2.png

确定液压系统参数和初始条件:

系统参数和初始条件在代码单元中定义:

In [ ]:
A = 0.01
Ac = 0.001
Beta = 700000000
C1 = 2.50000000000000e-08
C2 = 3.00000000000000e-09
Cd = 0.610000000000000
F20 = 0
I = 100
K = 20500
V30 = 2.000000000000000e-05
V2 = 1.250000000000000e-05
V1 = 1.250000000000000e-05
rho = 800
Qmax = 0.005000000000000
p10 = 4.166666666666667e+06
M = 2500
m = 1.000000000000000e-03
L = 1.500000000000000
KA = 0.030000000000000;
Cdsqrt = Cd*sqrt(2/rho);
AcK = Ac/K
C1_1 = 1/C1
C2_1 = 1/C2
Ac2K = Ac^2/K;
Sample_Time = 0.0001;

**运行模拟前必须执行代码单元。

运行并加载模型:

该代码单元使用方法与程序的控制流、try/catch 进行交互:

In [ ]:
try
    engee.close("single_hydraulic_cylinder_simulation", force=true) # закрытие модели 
    catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
        m = engee.load("$(@__DIR__)/single_hydraulic_cylinder_simulation.engee") # загрузка модели
    end;
In [ ]:
try
    engee.run(m, verbose=true) # запуск модели
    catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
        m = engee.load("$(@__DIR__)/single_hydraulic_cylinder_simulation.engee") # загрузка модели
        engee.run(m, verbose=true) # запуск модели
    end
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%
Out[0]:
Dict{String, DataFrame} with 3 entries:
  "p3" => 1001×2 DataFrame…
  "p2" => 1001×2 DataFrame…
  "p1" => 1001×2 DataFrame

加载模拟数据并将其可视化。

读取包含液压系统不同部分压力变化数据的 csv 文件、 随后转换为数据帧和矩阵:

In [ ]:
using DataFrames, Plots, CSV # подключение библиотек
p1 = Matrix(CSV.read("p1.csv", DataFrame)); #загрузка данных об изменении давления на выходе насоса
p2 = Matrix(CSV.read("p2.csv", DataFrame)); #загрузка данных об изменении давления после регулирующего клапана
p3 = Matrix(CSV.read("p3.csv", DataFrame)); #загрузка данных об изменении давления в цилиндре

连接后台--显示图形的方法:

In [ ]:
plotlyjs()
Out[0]:
Plots.PlotlyJSBackend()

绘制描述液压系统各部分压力变化的图表:

In [ ]:
plot(p1[:,1], p1[:,2], label="Изменение давления на выходе насоса")
plot!(p2[:,1], p2[:,2], label="Изменение давления после регулирующего клапана")
plot!(p3[:,1], p3[:,2], label="Изменение давления в цилиндре")
Out[0]:

在模拟开始时,控制阀的阀嘴面积为零,然后在 0.1 秒的模拟持续时间内增加到$1*10^{-4}$ 平方米。阀门关闭时,泵的全部流量都转化为泄漏流量。

阀门打开时,压力$p2$ 和$p3$ 增加,而$p1$ 则随着流量的增加而减小。当泵的流量停止时,弹簧和活塞充当液压蓄能器,$p3$ 持续下降。当泵中的流量恢复时,阀的行为会发生变化。

结论

本例演示了由基本模块库组装而成的液压系统模拟。模拟数据的加载、预处理和可视化均使用了所调用库的功能。

示例中使用的块