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

Анализ пружинной демпферной системы

Схема системы представлена на рисунке ниже.

image.png

Реализация будет включать в себя три подсистемы:

  1. масса-1, пружина-1, дампер-1.

  2. пружина-2, дампер-2.

  3. масса-2, пружина-3, дампер-3.

На рисунке ниже показан верхний уровень реализованной системы.

image_6.png

Также ниже продемонстрировано содержимое всех подсистем модели в их хронологическом порядке. Первая – это Mass_1 Spring_1 Damper_1.

image_3.png

Вторая – Spring_2 Damper_2.

image_4.png

И третья – Mass_2 Spring_3 Damper_3.

image_5.png

Теперь перейдём к объявлению параметров этих систем.

# Определение масс тел
m1 = 20;
m2 = 10;

# Расчёт обратной дроби от массы тел
invm1 = 1/m1;
invm2 = 1/m2;

# Определение коэффициентов гашения демпферов
d1 = 0.5;
d2 = 0.2;
d3 = 2;

# Коэффициенты упругости пружин
k1 = 5;
k2 = 3;
k3 = 2;

# Начальные состояния интеграторов для первой и третьей подсистем
init_integrator_1 = 0.0001;
init_integrator_3 = 0;

# Входные силы воздействия
F1 = 20;
F2 = 40;

Запустим модель с нашими параметрами.

function run_model( name_model, path_to_folder )

    Path = path_to_folder * "/" * name_model * ".engee"

    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end
run_model (generic function with 1 method)
run_model( "PowerAnalysis", @__DIR__ )
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%
Dict{String, DataFrame} with 4 entries:
  "Mass_1_Spring_1_Damper_1.X1" => 10001×2 DataFrame…
  "Mass_2_Spring_3_Damper_3.X2" => 10001×2 DataFrame…
  "Product-1.1"                 => 20002×2 DataFrame…
  "Product.1"                   => 20002×2 DataFrame…

В данной демонстрации выходные сигналы, описывающие колебательные процессы масс, логируются не через To Workspace, а через логирования шины. Поэтому при запуске модели мы видим, что было создано несколько переменных с названием подсистемы и именем выходного порта, которые хранятся в структуре simout. Если во время симуляции логируется больше четырех сигналов, все их имена можно просмотреть, наведя курсор на переменную simout. image.png

# Считывание из simout залогированных сигналов
X1 = simout["PowerAnalysis/Mass_1_Spring_1_Damper_1.X1"];
X1 = collect(X1);
X2 = simout["PowerAnalysis/Mass_2_Spring_3_Damper_3.X2"];
X2 = collect(X2);
X1[1:3,:]
3×2 DataFrame
 Row │ time  value
     │ Any   Any
─────┼───────────────────
   1 │ 0.0   0.0001
   2 │ 0.01  0.000200998
   3 │ 0.02  0.000501961

Как мы видим поле считывания данных, из simout мы получаем структуру DataFrames, содержащую поля временных отметок и данных. Аналогичную структуру мы получаем при чтении WorkspaceArray.

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

using Plots # Подключения библиотеки построения графиков
plotly()
Plots.PlotlyBackend()
plot(X1.time,X1.value) # Первое тело
plot!(X2.time,X2.value) # Второе тело

interactive-scripts/images/base_simulation_demo_PowerAnalysis/a2c42fbf6801ad92b017aff0c8ecdfe2790c4cc6

Как мы видим из графика, колебания первого тела интенсивнее второго. Это связано в первую очередь с тем, что масса первого тела в два раза больше массы второго тела.

Также во время моделирования мы логировали мощности демпферов и пружин. Проанализируем эти данные.

Мощность рассчитывается через произведение силы на скорости.

# Демпфер
Fd2x1d = simout["PowerAnalysis/Mass_1_Spring_1_Damper_1/Product.1"];
Fd2x1d = collect(Fd2x1d);

Построим график.

plot( Fd2x1d.time, Fd2x1d.value )

interactive-scripts/images/base_simulation_demo_PowerAnalysis/2b18c56dc6d524fb96dfe1644707e0592b0592d0

На этих двух графиках мы видим перепады мощности для первой пружины и первого демпфера.

Вывод

В данной демонстрации мы проанализировали поведение демпферной системы, а также рассмотрели различные возможности логирования сигналов из моделей в Engee.