齿轮总成

在本节中,我们将仔细观察对简单齿轮的建模。我们会考虑一系列因素,例如每个齿轮元件的惯性、齿之间存在的间隙等。最重要的当然还有两个旋转轴间的运动学关系了。我们将首先介绍一个如何创建上述总成的无层级模型的例子。然后,我们会讨论如何把上述无层级模型重构成能在不同场景下重用的子系统模型。

到现在为止,我们在创建组件模型时仅对一个物理作用进行建模,如惯性、柔顺性、阻性、对流等。正如已经多次提到的这样,这一般是值得提倡的。前提是在组件级建模。但许多现实世界的子系统综合了所有这些影响。在Modelica里,我们解决这个问题的方法就是建立可重复使用的子系统模型。当然,我们不会推倒重来,一个个地加入所有影响子系统模型的方程。相反,我们会重用已经开发了的组件模型。最终,子系统模型不过是预先存在的组件模型的特定组合而已。此外,我们会展示部件参数是如何连接到子系统参数上的。

无层级版本

如果对Modelica里创建可重用子系统模型的能力不甚熟悉的话,我们在开始时建立的Modelica模型可能看起来会是这样的:

Flat system model including backlash

该模型包括两个基本部件。虚线内的一部分模型表示齿轮本身的模型。它包括每个齿轮元件的惯性、两轮间的齿隙以及两轴之间的运动学关系。每个上述零部件均表示为一个单独的组件模型。虚线以外的另一部分模型表示我们正在运行的特定情景或实验。这包括一个以施加到齿轮上的扭矩曲线,以及被该齿轮驱动的下游负载。

如果我们对这个系统进行仿真,那么会得到如下响应:

../../../_images/FSWB_comp.png

对这个系统必须要明白一点:虚线内的组件可能会任何齿轮相关的应用里重复出现。事实上,例如在汽车变速器模型里上述组件模型就可能会多次重复出现。

有层级版本

因此,为了避免冗余(至于为何要避免前面已经讨论过了),我们应该将虚线内的组件创建为可重复使用的子系统模型。在这种情况下,我们的示意图将如下所示:

System model including gear subsystem

在这种情况下,一系列用于表示齿轮的组件被替换为简图层内的单个实例。这是得益于,所有构成齿轮模型的部件模型组装为了以下子系统模型:

within ModelicaByExample.Subsystems.GearSubsystemModel.Components;
model GearWithBacklash "A subsystem model for a gear with backlash"
  extends Modelica.Mechanics.Rotational.Icons.Gear;
  import Modelica.Mechanics.Rotational.Components.*;

  parameter Boolean useSupport(start=true);
  parameter Modelica.SIunits.Inertia J_a
    "Moment of inertia for element connected to flange 'a'";
  parameter Modelica.SIunits.Inertia J_b
    "Moment of inertia for element connected to flange 'b'";
  parameter Modelica.SIunits.RotationalSpringConstant c
    "Backlash spring constant (c > 0 required)";
  parameter Modelica.SIunits.RotationalDampingConstant d
    "Backlash damping constant";
  parameter Modelica.SIunits.Angle b=0
    "Total backlash as measured from flange_a side";
  parameter Real ratio
    "Transmission ratio (flange_a.phi/flange_b.phi, once backlash is cleared)";
protected
  Inertia inertia_a(final J=J_a) "Inertia for the element 'a'"
    annotation (Placement(transformation(extent={{-80,-10},{-60,10}})));
  Inertia inertia_b(final J=J_b)
    annotation (Placement(transformation(extent={{40,-10},{60,10}})));
  ElastoBacklash backlash(final c=c, final d=d, final b=b) "Backlash as measured from flange_a"
    annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));
  IdealGear idealGear(final useSupport=useSupport, final ratio=ratio)
    annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
public
  Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a
    annotation (Placement(transformation(extent={{-110,-10},{-90,10}})));
  Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b
    annotation (Placement(transformation(extent={{90,-10},{110,10}})));
  Modelica.Mechanics.Rotational.Interfaces.Support support if useSupport
    annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
equation
  connect(flange_a, inertia_a.flange_a)
    annotation (Line(points={{-80,0},{-100,0}},
      color={0,0,0}, smooth=Smooth.None));
  connect(inertia_b.flange_b, flange_b)
    annotation (Line(points={{60,0},{100,0}},
      color={0,0,0}, smooth=Smooth.None));
  connect(idealGear.support, support)
    annotation (Line(points={{0,-10},{0,-100}},
      color={0,0,0}, smooth=Smooth.None));
  connect(idealGear.flange_b, inertia_b.flange_a)
    annotation (Line(points={{10,0},{40,0}},
      color={0,0,0}, smooth=Smooth.None));
  connect(backlash.flange_a, inertia_a.flange_b)
    annotation (Line(points={{-40,0},{-60,0}},
      color={0,0,0}, smooth=Smooth.None));
  connect(backlash.flange_b, idealGear.flange_a)
    annotation (Line(points={{-20,0},{-10,0}},
      color={0,0,0}, smooth=Smooth.None));
end GearWithBacklash;

渲染后的GearWithBacklash模型简图如下所示:

Gear with backlash subsystem model

本模型做了不少的事情。首先,请注意这里有useSupport参数。我们在前面的章节中讨论过,此参数用以确定是否包括可选地面连接器

注意,所有的子组件(inertia_ainertia_bbacklashidealGear)是protected。只有连接器(flange_aflange_bsupport)和参数(J_aJ_bcdbratio)是public。这里的考虑是,用户唯一需要知道的是(或者说,应只能访问)连接器和参数。其他的一切是实现细节。模型的protected元素不能从外部引用。这可以防止模型在(用户不应该知道的)内部细节改变时不再有效。

还要注意有多少的参数,如c,是在子系统级别中指定的。之后,这些参数会通过层级结构传值给深层的参数(通常结合final限定词)。这样,组件的参数可以集中在子系统级别。而该模型的用户可以在一个地方(在子系统级别)看到所有相关参数。这就是所谓的传值。本章后面,我们会对其进行更详细的讨论。

从下图中能看出,结果与此前无层级的版本别无二致:

../../../_images/SWB.png

结论

我们已经看到了如何利用组件模型可把方程化为可重用的组件。这避免了一次次手工输入方程这一繁琐、耗时且容易出错的过程。而当我们发现自己在不停将同样一系列模型放入类似的总成里时,同样的原则也适用。我们可以利用这个子系统模型的方法来创建可重用组件总成。将总成模型内部参数设定得令模型可以一次次的重用,而且重用时只需要改变参数