引用包内内容¶
现在,我们已经介绍了组织内容。下面我们将开始讨论如何访问不同包里的内容。让我们观察以下例子:
within ModelicaByExample.PackageExamples;
model RLC "An RLC circuit referencing types from the Modelica Standard Library"
parameter Modelica.SIunits.Voltage Vb=24 "Battery voltage";
parameter Modelica.SIunits.Inductance L = 1;
parameter Modelica.SIunits.Resistance R = 100;
parameter Modelica.SIunits.Capacitance C = 1e-3;
Modelica.SIunits.Voltage V;
Modelica.SIunits.Current i_L;
Modelica.SIunits.Current i_R;
Modelica.SIunits.Current i_C;
equation
i_R = V/R;
i_C = C*der(V);
i_L=i_R+i_C;
L*der(i_L) = (Vb-V);
end RLC;
正如我们在上节里知道的,第一行:
within ModelicaByExample.PackageExamples;
告诉我们RLC
模型是ModelicaByExample.PackageExamples
包的一部分。正如前面的例子一样,我们将利用Modelica的package
系统,以避免直接在模型中定义类型。这样一来,我们一旦在包内定义了类型,就可以简单地通过引用而在不同的地方而对类型进行重用。
不像本章之前例子,我们并没有在本例内定义任何类型。相反,我们依赖于在Modelica标准库内定义的类型。Modelica标准库包含了许多有用的类型、模型、常量等。在本例里,我们只会利用其中的几个。这些类型可以很容易识别,因为其名字均以Modelica.
开头。
在本章后面,我们会进一步研究查找规则。就目前而言,可以暂时认为所有以Modelica.
开头的类型均存在于Modelica
包内。在此例里,所有的类型均以Modelica.SIunits
开始。SIunits
为Modelica
包内的一个包。SIunits
包的目的是存储符合ISO标准的物理量和量度单位定义。
在示例代码中可以看出,这些类型是以其“全限定名”引用的。这意味着,类型名称的开头是顶层包(不包含在其他包内的包)的名称。每个在名称里的.
代表一个新的子包。序列中的最后一个名称标记所引用的实际类型。
在本例里,我们从Modelica.SIunits
包内使用了5种不同的类型:Voltage
、Inductance
、Resistance
、Capacitance
以及Current
。这些类型提供了每种类型的单位,以及对这些类型值所在范围的限制(例如,电容不能小于零)等信息。这些类型在Modelica标准库内定义如下:
// Base Definitions
type ElectricPotential = Real(final quantity="ElectricPotential",
final unit="V");
type ElectricCurrent = Real(final quantity="ElectricCurrent",
final unit="A");
// The types referenced in our example
type Voltage = ElectricPotential;
type Inductance = Real(final quantity="Inductance",
final unit="H");
type Resistance = Real(final quantity="Resistance",
final unit="Ohm");
type Capacitance = Real(final quantity="Capacitance",
final unit="F", min=0);
type Current = ElectricCurrent;
除了能提供更好的文档外,将变量和类型关联起来有一个直接的好处。那就是支持方程单位的一致性检查。例如,注意本例中的以下等式:
i_R = V/R;
显然,这是对欧姆定律的陈述。但是,假若我们犯了一个错误,而将其意外写成了:
i_R = V*R;
在语法上来讲,这个公式是完全合法的。再者,若变量i_R
、 V
、R
均声明为Real
类型,那么上述方程便没有任何问题。然而,因为(从类型定义)我们知道 ,这些变量分别表示电流、电压和电阻。Modelica语言编译器由此能够确定(完全自动地使用上述定义),这个等式的左侧和右侧的物理单位不一致。换句话说,将变量和物理类型相关联可以自动地检查建模错误。