在 Modelica 模型中声明包和导入包有什么区别?

What is the difference between declaring a package and importing a package in a Modelica model?

我可以在 Modelica 模型中声明一个包或导入一个包,但我不确定它们之间是否有任何区别,我尝试了以下代码,它们都可以正常工作。 我的问题是: 使用这两种方法有什么需要注意的吗?

partial model A
  package SI1=Modelica.SIunits;
  import SI2=Modelica.SIunits;
  SI1.Voltage u1;
  SI2.Voltage u2;
end A;

只有 import 子句似乎触发了对尚未加载的包的查找。例如使用 Modelica_LinearSystems2 库:

  1. 导入:检查并加载 Modelica_LinearSystems2
    partial model A
    import ls2=Modelica_LinearSystems2;
    end A;
  1. 包:它检查了,但是 Modelica_LinearSystems2 没有加载
  partial model B
  package ls=Modelica_LinearSystems2;
  end B;

我想如果在尝试模拟时没有加载所有依赖项,这可能会破坏您的模型。

Dymola(甚至 Modelica,因为迂腐的检查不会抛出任何错误)似乎不太关心使用 package 而不是 import,当涉及到已经加载的包时,这仍然很有趣.我没想到以下模型会起作用:

  model C
    package SI1=Modelica.SIunits;
    SI1.Voltage u1;
    parameter SI1.Current R=1;
  equation 
    u1=2*R;
  end C;

事实证明,即使自动完成 (Ctrl+Space) 也有效:

你在这里做了两件根本不同的事情,它们都适用于这种情况:

package SI1=Modelica.SIunits; 称为短 class 定义。 您创建一个名为 SI1 的新包,它继承了 Modelica.SIunits.

的所有内容

短class定义与写作基本相同

package SI1
  extends Modelica.SIunits;
end SI1;

有关详细信息,请参阅 Modelica 规范中的第 4.5.1 Short Class Definitions 章。

另一方面,

import SI2=Modelica.SIunits 只会影响 Modelica 工具查找 class 定义的位置 - 因此此处没有定义新的 class。 13.2.1.1 Lookup of Imported Names 章在 Modelica 规范中对此进行了解释。

如果你只是想使用这个包,导入它。这就是 import 的设计目的。只有当你想添加功能或改变任何东西时,声明一个新包才有意义(如果你使用短 class 定义,这是非常有限的)。