引用包内内容

现在,我们已经介绍了组织内容。下面我们将开始讨论如何访问不同包里的内容。让我们观察以下例子:

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开始。SIunitsModelica包内的一个包。SIunits包的目的是存储符合ISO标准的物理量和量度单位定义。

在示例代码中可以看出,这些类型是以其“全限定名”引用的。这意味着,类型名称的开头是顶层包(不包含在其他包内的包)的名称。每个在名称里的.代表一个新的子包。序列中的最后一个名称标记所引用的实际类型。

在本例里,我们从Modelica.SIunits包内使用了5种不同的类型:VoltageInductanceResistanceCapacitance以及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_RVR均声明为Real类型,那么上述方程便没有任何问题。然而,因为(从类型定义)我们知道 ,这些变量分别表示电流、电压和电阻。Modelica语言编译器由此能够确定(完全自动地使用上述定义),这个等式的左侧和右侧的物理单位不一致。换句话说,将变量和物理类型相关联可以自动地检查建模错误。