Engee 文档
Notebook

水力系统建模

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

image.png

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

Engee 中的模型示意图:

single_hydraulic_cylinder_simulation--1707475635711.png

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

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

等式块 1

在哪里?
- - 泵的流量
- - 流向控制阀的流量
- - 泄漏流量
- - 流量系数

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

方程组 2

其中

- - 通过调节阀的流量
- - 通过节流孔的流量系数
- - 孔口面积
- - 控制阀后的压力
- - 液体密度

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

方程组 3

其中

- - 压力下的液体体积
- - 气缸中压力变化的时间速率、
- - 液体的体积弹性模量、
- - 时活塞中液体的体积、
- - 气缸的横截面积

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

方程块 4

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

泵 "子系统

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

single_hydraulic_cylinder_simulation--1707296300526_2.png

阀/液压缸 "子系统

双击子系统 "阀门/液压缸",打开控制阀和液压缸模型。微分代数方程系统通过压力 对液压缸中的压力上升进行建模,压力上升作为导数出现在方程块 3 中。如果忽略活塞的质量,其位置和弹簧力与 成正比,其速度与 的时间导数成正比。中间压力 和从阀门流入气缸的压降之和(方框 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 秒的模拟持续时间内增加到 平方米。阀门关闭时,泵的全部流量都转化为泄漏流量。

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

结论

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

示例中使用的块