Modelica - 是否可以将子模型的名称设置为另一个变量的值?

Modelica - Is it possible to set name of a submodel as the value of another variable?

我对 Modelica 语言相当菜鸟,对于这个简单问题的任何帮助,我将不胜感激。我想知道是否可以将变量名称(取决于子模型)编写为其他变量的函数以缩短通用代码。这里有一个关于我想做什么的例子。

我正在考虑一个包含标准模型库(tank1、tank2 和 tank3)的三个相同子模型 (OpenTank) 的顶级模型。我想知道是否可以使用这样的循环(附上示例代码)或类似的方式从顶级模型调用子模型内部的变量(“level”),而不是将代码重复三次(我真的很想在顶层模型中设置这个操作)

你会建议我做什么?提前致谢!

model threeTanks
  Modelica.Fluid.Vessels.OpenTank tank1;
  Modelica.Fluid.Vessels.OpenTank tank2;
  Modelica.Fluid.Vessels.OpenTank tank3;
equation
  for i in 1:3 loop
    tank(i).level= /* … */;
  end for;
end threeTanks;

类似于 post (Modelica - Is it possible to set name of a variable as the value of another variable?) 的答案,您可以像这样声明一个 组件 的数组:

model threeTanks
Modelica.Fluid.Vessels.OpenTank[3] tank;
equation
  for i in 1:3 loop
    tank[i].level= /* … */;
  end for;
end threeTanks;

您将需要一个 组件迭代器,这是在 Modelica Change Proposal MCP-0021 Component Iterators 中提出的。但它还不可用,如果我没看错的话,自 2016 年以来没有任何变化,所以不要指望很快就会得到它。

使用当前的 Modelica 语言版本(在 Modelica Language Specification 3.5 中指定),在引用组件时必须使用文字名称。
(在 Modelica 中,您可能从其他语言中了解到 eval。)

所以要么选择 Rene Just Nielsens 解决方案并使用矢量化水箱。 这可行,但在图形视图中您将只有一个坦克。然后参数 window 将接受向量,并且罐连接器也将被向量化。

如果您不想这样,您也可以像以前一样实例化您的坦克并手动指定您要迭代的组件名称:

for item in {tank1, tank2, tank3} loop
  item.level= /* … */;
end for;

问题也是你想达到什么目的。坦克已经有了计算液位的方程式,所以你不太可能想要设置它。

也许您想将顶部的所有级别收集到一个变量中。您可以通过添加此行来做到这一点:

Modelica.Units.SI.Length levels[3] = {item.level for item in {tank1, tank2, tank3}};