如何创建一个可重用块,其中包含可从顶级图表视图编辑的组件的各个实例和参数?

How do I create a reusable block with individual instances and parameters of components editable from the top level diagram view?

我有一个模块,是我在我的模型中用一个重复的子系统制作的。这个子系统有小的变化(管道直径变化这里,流量差异那里)需要在更广泛的模型中考虑。

尽我所能,我无法找到一种方法来通过这些小的更改使这个块可编辑,因为我最终返回编辑原始块,然后传播到所有实例。

现在一个糟糕的解决方法是使用我的原始块并将整个 shebang 复制粘贴到新块中,并手动将每个小变化编辑到每个组件中 - 但不用说,这很乏味,必须有更好的方法以某种方式做到这一点。

我怀疑我需要使用 Extends 但我不确定如何使用。

理想情况下,我试图达到可以右键单击并编辑其中组件使用的块的参数的程度 - 同样,我不确定如何。

感谢观看。

E1:

现在我的目标是获得用于工业过程的冷却塔的低细节模型。

塔模型本质上是四个喷水器连接到一个共轨管网,具有规定质量流量的热水,由环境空气冷却。稍后为热交换扩展模型是一个不同的问题,现在它只是评估泵尺寸的压力损失。

我的问题是,我有一个通用的喷水器设计,但每个单独的喷水器在管道直径、长度和喷嘴特性方面都有自己的参数,适用于不同的硬件。我有一个实例化了四次的块,每次实例都无法更改参数,只有块模型发生了变化。

如果这是 Python,我希望将 WInj 设为 class 并更改调用语句中的参数,以获得与共同主题略有不同的变体。

现在我输入了,我意识到我很可能把我的问题回避到无关紧要的地方,因为我认为管道模型扩展了一个基础 class,里面有很多我可以检查的参数用作模板。

Note this answer was written before more information was added to the question. IMHO it still answers it, even though it does not consider the cooling tower model

通过设计每个 class,因此 Modelica 中的每个块都是可重用的。就像在面向对象的编程语言中一样,您创建 类 的实例,在 Modelica 世界中通常也称为 components。 然后您可以使用 Modifiers.

为这些组件分配某些值

为顶层组件设置参数可能是最简单也是最常用的修饰符使用方式。它也是 OMEdit 中得到很好支持的那个。

但是,对于您的情况,组件通常可以包含子组件。您还可以从更高级别为这些子组件设置修饰符。

下面的代码演示了如何做到这一点:Example 是我们的顶层,tractor 是组件,我们有两个子组件,front_wheelrear_wheel .车轮的半径设置为不同的值。

package Demo
  model Example
    Vehicle tractor(
      m = 7e3,
      front_wheel(r=1), 
      rear_wheel(r=2)
    );
  end Example;

  model Vehicle
    parameter Modelica.Units.SI.Mass m;
    Wheel front_wheel;
    Wheel rear_wheel;
  end Vehicle;

  model Wheel
    parameter Modelica.Units.SI.Radius r;
  end Wheel;
end Demo;

您还可以在 OMEdit 中使用组件的 Modifiers 选项卡以图形方式为子组件添加修饰符。在那里你只需输入修饰方程,它就会被添加到代码中。

一些 Modelica 工具(如 Dymola)还允许您以图形方式查看组件,而不仅仅是查看 类。然后您可以通过设置子组件的参数轻松添加修正方程,而无需键入完整路径。 OMEdit好像还没有这个功能(至少我没找到)

但是,有一个简单的解决方案可以解决此限制:您可以为要从更高级别更改的值声明参数,并将它们的值传播到子组件。如果我们在上面的演示代码中这样做,ExampleVehicle 可能看起来像这样:

  model Example
    Vehicle tractor(
      m = 7e3,
      r_front=1,
      r_rear=2);
  end Example;

  model Vehicle
    parameter Modelica.Units.SI.Mass m;
    parameter Modelica.Units.SI.Radius r_front;
    parameter Modelica.Units.SI.Radius r_rear;
    Wheel front_wheel(r=r_front);
    Wheel rear_wheel(r=r_rear);
  end Vehicle;

那么您也可以在图形层中更改这些值: