Engee 文档
Notebook

液压系统仿真

这个例子将演示一个液压缸的模拟组装从基本库的块。

image.png

图为模型示意图。 泵模型引导流量 ,成形压力 ,在其作用下层流 它在释放时流出。 控制阀模拟通过可变面积孔口的湍流。 这个线程, ,产生中间压力, ,其在将其连接到驱动缸的线中经历随后的下降。 气缸压力, ,移动活塞,其在来自弹簧的力的作用下,其结果是处于x位置。

工程师模型图:

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

哪里:

  • -弹簧的刚度
  • -层流系数

"泵"子系统

双击名为"Pump"的子系统以打开泵模型。 它根据泵本身的流量和之后系统元件的流量来计算供应压力。 一维表根据时间定义消耗数据。 模型计算压力 如等式块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文件,
然后转换为dataframe和matrix:

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]:

在模拟开始时,控制阀具有零开口面积,然后增加到 平方。m.在整个模拟期间持续0.1秒。 当阀门关闭时,整个泵流量变成泄漏。

当阀门打开时,压力 他们增加,而 它响应于消费的增加而减少。 当泵流量停止时,弹簧和活塞充当液压蓄能器,并且 它在不断减少。 随着泵的流量恢复,行为发生变化。

结论:

在这个例子中,演示了一个由基本块库组装而成的液压系统的模拟。 使用调用的库的函数加载、预处理和可视化仿真数据。

示例中使用的块