Engee 文档
Notebook

弹簧阻尼系统分析

系统原理图如下图所示。

image.png

实施过程将包括三个子系统: 质量-1、弹簧-1、阻尼器-1。 弹簧-2、翻斗-2。 质量-2、弹簧-3、阻尼器-3。

下图显示了实施系统的顶层。

image_6.png

下图还显示了按时间顺序排列的模型所有子系统的内容。第一个是 质量_1 弹簧_1 阻尼器_1

image_3.png

第二个是弹簧_2 阻尼器_2

image_4.png

第三个是质量_2 弹簧_3 阻尼器_3

image_5.png

现在让我们开始声明这些系统的参数。

In [ ]:
# Определение масс тел
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;

让我们使用参数运行模型。

In [ ]:
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
Out[0]:
run_model (generic function with 1 method)
In [ ]:
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%
Out[0]:
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

在本演示中,描述质量振荡过程的输出信号不是通过到工作区记录,而是通过总线记录。因此,在运行模型时,我们会看到创建了多个变量,其中包含子系统名称和输出端口名称,并存储在 simout结构中。如果在仿真过程中记录了四个以上的信号,则可以通过将光标悬停在 simout 变量上查看所有信号的名称。 image.png

In [ ]:
# Считывание из 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);
In [ ]:
X1[1:3,:]
Out[0]:

3 rows × 2 columns

timevalue
AnyAny
10.00.0001
20.010.000200998
30.020.000501961

正如我们看到的数据读取字段一样,从 simout 中我们会得到一个包含时间戳和数据字段的 DataFrames 结构。在读取 WorkspaceArray 时,我们也会得到类似的结构。

现在,让我们根据模型构建两个物体的振荡对比图。在这种情况下,我们可以通过相对于物体质量的冲击力之和得到加速度。 然后通过积分计算速度。通过第二次积分,我们可以得到位移,然后再对其进行对数。

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

从图中我们可以看到,第一个物体的摆动比第二个物体的摆动剧烈。这主要是因为第一个物体的质量是第二个物体质量的两倍。

在模拟过程中,我们还记录了阻尼器和弹簧的容量。让我们来分析一下这些数据。

功率是通过力与速度的乘积计算得出的。

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

我们来画一个图。

In [ ]:
plot( Fd2x1d.time, Fd2x1d.value )
Out[0]:

在这两幅图中,我们可以看到第一个弹簧和第一个阻尼器的功率下降情况。

结论

在本演示中,我们分析了阻尼器系统的行为,还了解了在Engee中记录模型信号的不同可能性。

示例中使用的块