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

Eng*_*ess 2 modelica openmodelica dymola

我\xe2\x80\x99m 在 Modelica 语言中相当菜鸟,并且我\xe2\x80\x99d 感谢有关这个简单问题的任何帮助。我\xe2\x80\x99d想知道\xe2\x80\x99是否可以将变量名称(取决于子模型)编写为其他变量的函数,以缩短一般代码。这里有一个关于我\xe2\x80\x99d 喜欢做什么的例子。

\n

I\xe2\x80\x99m 考虑一个顶级模型,其中包括标准 Modelica 库的三个相同的子模型 (OpenTank)(tank1、tank2 和 Tank3)。我\xe2\x80\x99d想知道\xe2\x80\x99s是否可以使用类似的循环从顶级模型调用子模型内的变量(\xe2\x80\x9clevel\xe2\x80\x9d)这样(附有示例代码)或类似的东西,而不是重复代码三次(I\xe2\x80\x99m 真的有兴趣在顶级模型中设置此操作)

\n

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

\n
model threeTanks\n  Modelica.Fluid.Vessels.OpenTank tank1;\n  Modelica.Fluid.Vessels.OpenTank tank2;\n  Modelica.Fluid.Vessels.OpenTank tank3;\nequation\n  for i in 1:3 loop\n    tank(i).level= /* \xe2\x80\xa6 */;\n  end for;\nend threeTanks;\n
Run Code Online (Sandbox Code Playgroud)\n

mar*_*rco 5

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

\n

对于当前的 Modelica 语言版本(在Modelica 语言规范 3.5中指定),引用组件时必须使用文字名称。
\n (在 Modelica 中,没有任何东西eval可以与您从其他语言中了解到的类似。)

\n

因此,要么采用 Rene Just Nielsens 解决方案并使用矢量化储罐。\n这可行,但在图形视图中您将只有一个储罐。然后,参数窗口将接受矢量,并且水箱连接器也将被矢量化。

\n

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

\n
for item in {tank1, tank2, tank3} loop\n  item.level= /* \xe2\x80\xa6 */;\nend for;\n
Run Code Online (Sandbox Code Playgroud)\n

问题也是你想要实现什么。水箱已经有计算液位的方程,因此您不太可能想要设置它。

\n

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

\n
Modelica.Units.SI.Length levels[3] = {item.level for item in {tank1, tank2, tank3}};\n
Run Code Online (Sandbox Code Playgroud)\n