我想找到以最少的代码更改来重用代码的方法。构建库时,您可以使用包并使用包的“导入”将其引入特定模型。另一种方法是使用“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 的错误文本如下。
我们还看到,当我们使用 GUI 并为 M1 和 M2 提供图标时,当我们选择访问参数时,与方法 2) 相比,我们可以更清楚地显示方法 1) 所使用的包 A。 (配备图标的代码称为91而不是90,左边是91_1,右边是91_2)
总结一下 - 问题是:
关于 2:您可以使用
*
从包中导入所有内容:
model D90_1
import DEMO_v90.*;
M1 m1(redeclare package A = A);
M2 m2(redeclare package A = A);
end D90_1;