使用Engee物理建模语言创建复杂组件
Engee物理建模语言不仅允许您开发自己的组件,还可以将不同的组件组合成一个整体。 这样的组件被称为复合材料。
它就像一个构造函数,当有零件(组件)时,我们的任务是按照正确的顺序连接它们。
为什么要制造复合组件?
*将多个组件"打包"为一个(作为常规建模中的子系统)
*组件数组
复合组件的示例
作为复合部件的一个例子,考虑具有外部轴负载的直流电机。
为了确保组件正确组装,让我们从非定向块库中获取基元的参考实现。:
为了进行测试,我们将模拟以下场景:在运行的前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))")
仿真结果实际上是匹配的,这意味着我们的组件工作正常!
结论
Engee物理建模语言不仅仅是一种为一维建模编写自定义组件的语言,也是一种创建和描述复杂物理系统的语言。 与此同时,保留了代码的可读性,这对于复杂系统很重要!