Engee 文档
Notebook

使用Engee物理建模语言创建复杂组件

Engee物理建模语言不仅允许您开发自己的组件,还可以将不同的组件组合成一个整体。 这样的组件被称为复合材料。

它就像一个构造函数,当有零件(组件)时,我们的任务是按照正确的顺序连接它们。

为什么要制造复合组件?

*将多个组件"打包"为一个(作为常规建模中的子系统)
*组件数组

复合组件的示例

作为复合部件的一个例子,考虑具有外部轴负载的直流电机。

为了确保组件正确组装,让我们从非定向块库中获取基元的参考实现。:

image.png

为了进行测试,我们将模拟以下场景:在运行的前0.1秒,发动机在轴上无负载运行,并达到最大速度,然后在轴上发生负载。

创建复合组件

合成组件的创建方式与使用Engee物理建模语言的自定义组件相同。 因此,组件代码必须包含在*中。ngpc文件位于Engee搜索路径上.

让我们来看看DCMotorComosite中的组件代码。ngpc文件:

``'茱莉亚
@engeemodel DCMotorComposite开始

@组件开始
    P=EngeePhysicalFoundation。电气。销(),[视图=("+","左")]
    N=EngeePhysicalFoundation。电气。销(),[视图=("-","左")]
    r=EngeePhysicalFoundation。机械的。旋转。法兰(),[视图=("R","右")]
    c=EngeePhysicalFoundation。机械的。旋转。法兰(),[视图=("C","右")]
结束

@参数开始
    rotor_resistance=3.9,[单位="欧姆"]
    rotor_inductance=12e-6,[单位="H"]
    motor_inertia=0.01,[单位="g*cm^2"]
    breakaway_torque=0.02e-3,[unit="N*m"]
    coulomb_torque=0.02e-3,[单位="N*m"]
    breakaway_velocity=0.03347,[单位="rad/s"]
    back_emf_constant=0.072e-3*60/(2*pi),[单位="V/(rad/s)"]
    粘度=0.0,[单位="N*m/(rad/s)"]
结束

@组件[gui=无]开始
    rotorResistor=EngeePhysicalFoundation。电气。元素。电阻(R=默认值(rotor_resistance))
    rotorInductor=EngeePhysicalFoundation。电气。元素。电感器(L=默认值(rotor_inductance))
    motorInertia=EngeePhysicalFoundation。机械的。旋转。元素。惯性(I=默认(motor_inertia))
    摩擦=EngeePhysicalFoundation。机械的。旋转。元素。Friction(w_breakaway=default(breakaway_velocity),T_breakaway=default(breakaway_torque),T_coulomb=default(coulomb_torque),viscous_coefficient=默认(viscous_coefficient))
    rotEMechConverter=EngeePhysicalFoundation。电气。元素。RotationalConverter(k=默认值(back_emf_constant))
结束

@方程开始
    接(p,rotorResistor。p)
    接(rotorResistor.n,rotorInductor。p)
    接(rotorInductor.n,rotEMechConverter。p)
    连接(rotEMechConverter.n,n)
    连接(rotEMechConverter.rod_flange,摩擦。rod_flange,motorInertia。法兰,r)
    连接(rotEMechConverter.case_flange,摩擦。case_flange,c)
结束

结束


注意我们如何创建子组件-它们包含在部分中 @components. 我们用部分中的值初始化它们的参数 @parameters

子组件组装成一个单一的组件发生在节 @equations 使用函数 connect(). 请注意,您可以一次指定多个连接端口!

测试复合组件

让我们检查我们的复合组件相对于相同模型的建模结果,但使用基元。

In [ ]:
demoroot = @__DIR__
engee.addpath(demoroot)
mdl = engee.open(joinpath(demoroot,"DCComposite.engee"))
sim_res = engee.run(mdl);

让我们绘制仿真结果。:

In [ ]:
using Plots

CustC = collect(sim_res["Cust"]);
Primitives = collect(sim_res["Prim"]);
plot(CustC.time,CustC.value, label = "自定义组件")
plot!(Primitives.time,Primitives.value, label = "积木图书馆")
plot!(legend=:outerbottom,legendcolumns=2)
Out[0]:

让我们找到最大绝对误差:

In [ ]:
err = CustC.value .- Primitives.value;
println("最大绝对误差:∞(maximum(err))")
Максимальная абсолютная ошибка: 2.093656803481281e-9

仿真结果实际上是匹配的,这意味着我们的组件工作正常!

结论

Engee物理建模语言不仅仅是一种为一维建模编写自定义组件的语言,也是一种创建和描述复杂物理系统的语言。 与此同时,保留了代码的可读性,这对于复杂系统很重要!