【问题标题】:What is the difference between declaring a package and importing a package in a Modelica model?在 Modelica 模型中声明包和导入包有什么区别?
【发布时间】:2020-05-22 09:11:54
【问题描述】:
我可以在 Modelica 模型中声明一个包或导入一个包,但我不确定它们之间是否有任何区别,我尝试了以下代码,它们都可以正常工作。
我的问题是:
使用这两种方法有什么需要注意的吗?
partial model A
package SI1=Modelica.SIunits;
import SI2=Modelica.SIunits;
SI1.Voltage u1;
SI2.Voltage u2;
end A;
【问题讨论】:
标签:
import
package
modelica
【解决方案1】:
你在这里做了两件根本不同的事情,它们都适用于这种情况:
package SI1=Modelica.SIunits; 称为短类定义。
您创建了一个名为 SI1 的新包,它继承了 Modelica.SIunits 的所有内容。
短类定义与写法基本相同
package SI1
extends Modelica.SIunits;
end SI1;
有关详细信息,请参阅 Modelica 规范中的第 4.5.1 Short Class Definitions 章。
另一方面,import SI2=Modelica.SIunits 只会影响 Modelica 工具查找类定义的位置 - 因此这里没有定义新类。 13.2.1.1 Lookup of Imported Names 章节在 Modelica 规范中解释了这一点。
如果您只想使用该包,请导入它。这就是import 的设计目的。仅当您想要添加功能或更改任何内容时,声明一个新包才有意义(但是,如果您使用的是短类定义,那么这是非常有限的)。
【解决方案2】:
似乎只有 import 子句会触发对尚未加载的包的查找。例如使用 Modelica_LinearSystems2 库:
- import:它检查并加载了 Modelica_LinearSystems2
partial model A
import ls2=Modelica_LinearSystems2;
end A;
- 包:它检查,但 Modelica_LinearSystems2 未加载
partial model B
package ls=Modelica_LinearSystems2;
end B;
我想如果在尝试模拟时没有加载所有依赖项,那么可能会破坏您的模型。
有趣的是,当涉及到已加载的包时,Dymola(甚至 Modelica,因为迂腐检查不会引发任何错误)似乎不太关心使用包而不是导入。我没想到以下模型会起作用:
model C
package SI1=Modelica.SIunits;
SI1.Voltage u1;
parameter SI1.Current R=1;
equation
u1=2*R;
end C;
事实证明,即使自动完成(Ctrl+Space)也可以: