“内部”或“导入”使用 Modelica 概念?

问题描述 投票:0回答:1

我想找到以最少的代码更改来重用代码的方法。构建库时,您可以使用包并使用包的“导入”将其引入特定模型。另一种方法是使用“within”命令,使引用更短并带来方便。然而,在 OpenModelica 中,当使用 OMEdit 进行模拟时,使用“within”确实有效,但模型无法导出为 FMU。在 JModelica 中,“within”的使用在下面的示例中不起作用。方便访问包的正确 Modelica 用法是什么?

下面的最小示例说明了该问题。第一个包 DEMO_v90.mo 包含包 A 以及模型 M1 和 M2 - 全部在一个文件中。效果很好。

package DEMO_v90
   package A
      constant Real a=1;
      constant Real b=2;
      constant Real c=3;
   end A;   
   model M1
      replaceable package A = DEMO_v90.A;
      Real x, y, z;
   equation
      x = A.a;
      y = A.b;
      z = A.c;
   end M1;
   model M2
      replaceable package A = DEMO_v90.A;
      Real x, y, z;
   equation
      x = 2*A.a;
      y = 2*A.b;
      z = 2*A.c;
   end M2;
end DEMO_v90;

通常我们希望使用单独文件中的 DEMO_v90 内容进行配置。我有两种方法可以做到这一点:D90_1 和 D90_2。这里的配置仅意味着创建 M1 和 M2 的实例,并没有实际的进一步配置,以保持简单。

在D90_1中,我们导入DEMO_v90并制作实例。请注意,我们需要拼写 DEMO_v90 五次。然而,这是一种在 OpenModelica 和 JModelica 中都运行良好的方法。

model D90_1
   import DEMO_v90; 
   DEMO_v90.M1 m1(redeclare package A = DEMO_v90.A);
   DEMO_v90.M2 m2(redeclare package A = DEMO_v90.A);
end D90_1;

在 D90_2 中,我们使用 DEMO_v90 中的概念。这样我们只需要引用DEMO_v90一次。这是一个优点,因为我们可能希望将配置 D90_2 与其他一些包(例如 DEMO_v91)重复使用,然后只需要在一个地方进行更改。

within DEMO_v90;
model D90_2 
   M1 m1(redeclare package A = A);
   M2 m2(redeclare package A = A);
end D90_2;  

D90_2 代码确实在 OpenModelica 中进行模拟,但无法导出 FMU。对于 JModelica 它根本不起作用。 OpenModelica 的错误文本如下。

enter image description here

我们还看到,当我们使用 GUI 并为 M1 和 M2 提供图标时,当我们选择访问参数时,与方法 2) 相比,我们可以更清楚地显示方法 1) 所使用的包 A。 (配备图标的代码称为91而不是90,左边是91_1,右边是91_2)

enter image description here

总结一下 - 问题是:

  1. D90_2 Modelica 对“内部”的使用正确吗?我们在 FMU 一代中存在错误吗?
  2. 当我们想要将包 DEMO_v90 切换到其他包时,是否有其他方法可以最小化配置文件 D90 中的代码更改?
modelica openmodelica jmodelica graphical-interaction
1个回答
0
投票

关于 2:您可以使用

*
从包中导入所有内容:

model D90_1
   import DEMO_v90.*; 
   M1 m1(redeclare package A = A);
   M2 m2(redeclare package A = A);
end D90_1;
© www.soinside.com 2019 - 2024. All rights reserved.