Документация Engee
Notebook

Моделирование гидравлической системы

В данном примере будет продемонстрировано моделирование гидроцилиндра, собранного из блоков базовой библиотеки.

image.png

На рисунке показана принципиальная схема модели. Модель насоса направляет поток $Q$, формируя давление $p1$, под действием которого ламинарный поток $q1ex$ вытекает на выпуск. В регулирующем клапане моделируется турбулентный поток через отверстие переменной площади. Этот поток, $q12$, формирует промежуточное давление, $p2$, которое подвергается последующему падению в линии, соединяющей его с цилиндром привода. Давление в цилиндре, $p3$, перемещает поршень, который находится под действием усилия со стороны пружины, в результате чего он оказывается в положении x.

Схема модели в Engee:

single_hydraulic_cylinder_simulation_1707475635711.png

На выходе насоса поток делится на две составляющих: поток утечки и поток к управляющему клапану. Мы моделируем утечку, $q1ex$, как ламинарный поток (см. блок уравнений 1).

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$ - коэффициент ламинарного потока

Подсистема "Pump"

Двойным кликом по подсистеме с названием "Pump" откроется модель насоса. Она вычисляет давление подачи в зависимости от расхода самого насоса и расхода элементов системы после него. Одномерная таблица определяет данные о расходе в зависимости от времени. Модель вычисляет давление $p1$, как указано в блоке уравнений 1. Поскольку $Qout = q12$ является прямой функцией от $p1$ (через регулирующий клапан), формируется алгебраическая петля. Установка начального значения давления, $p10$, позволяет получить более эффективное решение.

single_hydraulic_cylinder_simulation_1707296300526_2.png

Подсистема "Valve/Hydraulic cylinder"

Двойным кликом по подсистеме с названием "Valve/Hydraulic cylinder" откроются модели регулирующего клапана и гидравлического цилиндра. Система дифференциально-алгебраических уравнений моделирует повышение давления в цилиндре с помощью давления $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]:

В начале моделирования регулирующий клапан имеет нулевую площадь отверстия, которая затем увеличивается до $1*10^{-4}$ кв.м. в течение всего моделирования продолжительностью 0,1 секунды. При закрытом клапане весь поток насоса переходит в утечку.

Когда клапан открывается, давления $p2$ и $p3$ увеличиваются, в то время как $p1$ уменьшается в ответ на увеличение расхода. Когда поток насоса прекращается, пружина и поршень действуют как гидроаккумулятор, и $p3$ непрерывно уменьшается. Поведение меняется по мере восстановления потока от насоса.

Вывод:

В данном примере было продемонстрировано моделирование гидравлической системы собранной из библиотеки базовых блоков. Данные симуляции были загружены, предобработаны и визуализированы с помощью функций вызванных библиотек.

Блоки, использованные в примере