【问题标题】:Modelica - Is it possible to set name of a submodel as the value of another variable?Modelica - 是否可以将子模型的名称设置为另一个变量的值?
【发布时间】:2021-11-23 13:08:35
【问题描述】:

我对 Modelica 语言非常陌生,如果能对这个简单的问题提供任何帮助,我将不胜感激。我想知道是否可以将变量名称(取决于子模型)编写为其他变量的函数,以缩短通用代码。这里有一个我想做的例子。

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

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

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;

【问题讨论】:

    标签: modelica dymola openmodelica


    【解决方案1】:

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

    使用当前的 Modelica 语言版本(在 Modelica Language Specification 3.5 中指定),当您引用组件时,您必须使用文字名称。
    (在 Modelica 中,您可能知道没有像 eval 这样的东西其他语言。)

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

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

    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}};
    

    【讨论】:

    • 天啊!非常感谢。我对此一无所知,它将在我的大多数模型中都非常有用。我使用 Modelica 才 3 个月,但我已经厌倦了查看参数窗口中的每个变量,这是解决这个问题的独特方法!我已经尝试过您的想法,并且效果很好。非常感谢您的帮助。
    【解决方案2】:

    与帖子 (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;
    

    【讨论】:

    • 非常感谢。我在上一篇文章中没有理解它,但通过您的示例知道我尝试过并且效果很好。这正是我想要的。谢谢你,雷内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多