Eng*_*ess 2 modelica openmodelica dymola
我\xe2\x80\x99m 在 Modelica 语言中相当菜鸟,并且我\xe2\x80\x99d 感谢有关这个简单问题的任何帮助。我\xe2\x80\x99d想知道\xe2\x80\x99是否可以将变量名称(取决于子模型)编写为其他变量的函数,以缩短一般代码。这里有一个关于我\xe2\x80\x99d 喜欢做什么的例子。
\nI\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你会建议我做什么?提前致谢!
\nmodel 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;\nRun Code Online (Sandbox Code Playgroud)\n
您将需要一个组件迭代器,这在Modelica 变更提案 MCP-0021 组件迭代器中提出。但它尚未可用,如果我没看错的话,自 2016 年以来没有任何变化,所以不要指望很快就能得到。
\n对于当前的 Modelica 语言版本(在Modelica 语言规范 3.5中指定),引用组件时必须使用文字名称。
\n (在 Modelica 中,没有任何东西eval可以与您从其他语言中了解到的类似。)
因此,要么采用 Rene Just Nielsens 解决方案并使用矢量化储罐。\n这可行,但在图形视图中您将只有一个储罐。然后,参数窗口将接受矢量,并且水箱连接器也将被矢量化。
\n如果您不希望这样做,您还可以像以前一样实例化您的坦克,并手动指定要迭代的组件名称:
\nfor item in {tank1, tank2, tank3} loop\n item.level= /* \xe2\x80\xa6 */;\nend for;\nRun Code Online (Sandbox Code Playgroud)\n问题也是你想要实现什么。水箱已经有计算液位的方程,因此您不太可能想要设置它。
\n也许您想将顶部的所有级别收集到一个变量中。您可以通过添加以下行来做到这一点:
\nModelica.Units.SI.Length levels[3] = {item.level for item in {tank1, tank2, tank3}};\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |