Modelica标准库

Modelica包的功用是将常用的类型、模型、函数等组织成包,并直接通过对其的引用来实现重用(而不是重新建模)。但倘若每个用户都需要建立对常用定义制作模型包,那么重复建模的问题仍将存在。因此,Modelica协会维护着一个Modelica标准库的模型包。这个库包括了对科学家和工程师有用的定义。

在本节中,我们概述Modelica标准库,让读者对标准库内可用的定义有一个大概的概念。由于这不会是一个彻底的介绍,而且Modelica标准库持续也在持续更新以及改进,这里的介绍并不一定会反映标准库最新版本的情况。但介绍涵盖了基础部分,作者希望由此能够让读者了解如何寻找需要的定义。

常数

Modelica的标准库包含了一些常见的物理、计算机常量的定义。此部分由于篇幅较少,其源码可以直接引用如下。以下内容来自Modelica标准库3.2.1版本内的Modelica.Constants包(带有一些排版上的美化):

within Modelica;
package Constants
  "Library of mathematical constants and constants of nature (e.g., pi, eps, R, sigma)"

  import SI = Modelica.SIunits;
  import NonSI = Modelica.SIunits.Conversions.NonSIunits;

  // Mathematical constants
  final constant Real e=Modelica.Math.exp(1.0);
  final constant Real pi=2*Modelica.Math.asin(1.0); // 3.14159265358979;
  final constant Real D2R=pi/180 "Degree to Radian";
  final constant Real R2D=180/pi "Radian to Degree";
  final constant Real gamma=0.57721566490153286060
    "see http://en.wikipedia.org/wiki/Euler_constant";

  // Machine dependent constants
  final constant Real eps=ModelicaServices.Machine.eps
    "Biggest number such that 1.0 + eps = 1.0";
  final constant Real small=ModelicaServices.Machine.small
    "Smallest number such that small and -small are representable on the machine";
  final constant Real inf=ModelicaServices.Machine.inf
    "Biggest Real number such that inf and -inf are representable on the machine";
  final constant Integer Integer_inf=ModelicaServices.Machine.Integer_inf
    "Biggest Integer number such that Integer_inf and -Integer_inf are representable on the machine";

  // Constants of nature
  // (name, value, description from http://physics.nist.gov/cuu/Constants/)
  final constant SI.Velocity c=299792458 "Speed of light in vacuum";
  final constant SI.Acceleration g_n=9.80665
    "Standard acceleration of gravity on earth";
  final constant Real G(final unit="m3/(kg.s2)") = 6.6742e-11
    "Newtonian constant of gravitation";
  final constant SI.FaradayConstant F = 9.64853399e4 "Faraday constant, C/mol";
  final constant Real h(final unit="J.s") = 6.6260693e-34 "Planck constant";
  final constant Real k(final unit="J/K") = 1.3806505e-23 "Boltzmann constant";
  final constant Real R(final unit="J/(mol.K)") = 8.314472 "Molar gas constant";
  final constant Real sigma(final unit="W/(m2.K4)") = 5.670400e-8
    "Stefan-Boltzmann constant";
  final constant Real N_A(final unit="1/mol") = 6.0221415e23
    "Avogadro constant";
  final constant Real mue_0(final unit="N/A2") = 4*pi*1.e-7 "Magnetic constant";
  final constant Real epsilon_0(final unit="F/m") = 1/(mue_0*c*c)
    "Electric constant";
  final constant NonSI.Temperature_degC T_zero=-273.15
    "Absolute zero temperature";

值得注意的是pieg_n以及eps的定义。

前两个定义pie分别表示数学常数\(pi\)以及\(e\)。这两个常量定义不仅免去了用户自己提供这些(无理数)常量的麻烦,而且使用这些定义可以让用户得到一个在精度范围限制内的最优值。

紧接的常数,g_n是代表地球的重力加速度(可用于计算势能如:math:m g h)。

最后,eps是一个计算机相关的常数,代表一个为任何正在使用计算平台“极小数”。

国际单位

正如上述讨论的一样,为参数与变量标示单位不仅可以让提高代码可读性,而且Modelica编译器可以由此测试变量量纲是否匹配。出于这个原因,尽量在参数和变量里使用物理类型是相当有益的。

Modelica.SIunits包是内容非常多,而且充满了很少使用的物理单位。之所以包含这些非常用单位是为了完整地遵守ISO 31-1992标准。以下是例子说明了SIunits包中常用物理单位是如何定义的:

type Length = Real (final quantity="Length", final unit="m");
type Radius = Length(min=0);
...
type Velocity = Real (final quantity="Velocity", final unit="m/s");
type AngularVelocity = Real(final quantity="AngularVelocity",
                            final unit="rad/s");
...
type Mass = Real(quantity="Mass", final unit="kg", min=0);
type Density = Real(final quantity="Density", final unit="kg/m3",
                    displayUnit="g/cm3", min=0.0);
type MomentOfInertia = Real(final quantity="MomentOfInertia",
                            final unit="kg.m2");
...
type Pressure = Real(final quantity="Pressure", final unit="Pa",
                     displayUnit="bar");
...
type ThermodynamicTemperature = Real(
  final quantity="ThermodynamicTemperature",
  final unit="K",
  min = 0.0,
  start = 288.15,
  nominal = 300,
  displayUnit="degC")
"Absolute temperature (use type TemperatureDifference for relative temperatures)";
type Temperature = ThermodynamicTemperature;
type TemperatureDifference = Real(final quantity="ThermodynamicTemperature",
                                  final unit="K");

模型

Modelica标准库包含了很多描述不同特定领域的模型库。本节概述这些领域的内容,并讨论如何在各个领域模型的组织。

框图

Modelica标准库包含了一系列模型用以进行因果性的框图模型的建模。这些模型的定义均在Modelica.Blocks包内。本库内的模型包括了以下例子:

  • 输入端口(RealInteger以及Boolean

  • 输出端口(RealInteger以及Boolean

  • 增益模块、加法器模块、乘法模块

  • 积分与微分模块

  • 死区以及滞回模块

  • 逻辑及关系运算模块

  • 多路复用器和多路分配器模块

Blocks包里包含了相当多种对信号进行操作的模块。这样的模块常用于描述控制系统和控制策略内的功能模块。

电气

Modelica.Electrical包内有数个子包,分别用于描述模拟、数字以及多相的电子系统。相当多种对信号进行操作的模块。此包内还包括一个描述基本电机的模型。在这个库中,你会发现以下形式的部件:

  • 电阻、电容、电感

  • 电压源和电流源

  • 电压和电流传感器

  • 晶体管以及其他半导体相关模型

  • 二极管与开关

  • 逻辑门

  • 星形与三角连接(多相位)

  • 同步电机与异步电机

  • 电机模型(直流电机、永磁电机等)

  • Spice3模型

机械

Modelica.Mechanics库包含三个主要的库。

Translational(平移)

平移库包含用于模拟的一维平移运动的组件模型。这个库包含了以下组件:

  • 弹簧、减震器以及间隙

  • 质点

  • 传感器和执行器

  • 摩擦

Rotational(转动)

旋转库包含用于模拟一维旋转运动的组件模型。这个库包含了以下组件:

  • 弹簧、减震器以及间隙

  • 惯量

  • 离合器和制动器

  • 齿轮机构

  • 传感器和执行器

MultiBody(多体)

多体库包含用于模拟三维机械系统的组件模型。这个库包含了以下组件:

  • 物体(包括相关的惯性张量和3D CAD几何结构)

  • 关节(如棱形关节、回转关节、万向关节)

  • 传感器和执行器

流体与介质

Modelica标准库中有两个包与流体系统建模有关。首先是Modelica.Media。此库包括各种介质的属性模型,如:

  • 理想气体(基于NASA格伦系数)

  • 空气(干燥空气、参考状态空气、潮湿空气)

  • 水(简单,含盐,两相)

  • 一般不可压缩流体

  • R134a(四氟乙烷)制冷剂

这些属性模型为计算各种纯液体和混合物的流体性质如焓,密度和比热比提供了函数。

除了这些介质模型, Modelica标准库还包括Modelica.Fluid库,流体库提供了一系列组件用以描述流体装置,如:

  • 容积、水箱与合流点

  • 管道

  • 压力损失

  • 热交换器

  • 源以及环境条件

Modelica.Magnetic库包含两个子包。其一是用以构造的磁性元件集总网络模型的FluxTubes包。这包括了一系列组件用以表示基本圆柱形和棱柱形元件的磁特性形状、相关的传感器以及执行器。其二则是被用于模拟在旋转电机电场的FundamentalWave库。

Modelica.Thermal库有两个子包:

HeatTransfer(热传递)

HeatTransfer用以模拟集总模型的热传递。这个库中的模型可以用于建立集总热网络模型,如:

  • 集总热容

  • 热传导

  • 热对流

  • 热辐射

  • 环境条件

  • 传感器

FluidHeatFlow(流体传热)

一般而言,模拟热流体系统开发者应当使用Modelica.FluidModelica.Media,因为它们能够处理各种各样的涉及复杂媒介和多个相的问题。然而,对于某些特定的简单问题,FluidHeatFlow库可以用来构建简单的热流体网络。

工具

Utilities库为其他库以及模型开发者提供了支持功能。此库包括几个子包以处理建模里和数学无关的方面的问题。

Files(文件)

Modelica.Utilities.Files库提供了函数用于访问和操作计算机的文件系统。以下函数提供了Files包:

  • list - 列举一个文件或目录的内容

  • copy - 复制一个文件或目录

  • move - 移动一个文件或目录

  • remove - 删除文件或目录

  • createDirectory - 创建一个目录

  • exist - 确定给定文件或目录是否已存在

  • fullPathName - 得到给定文件或目录的完整路径

  • splitPathName - 按路径分割的文件名

  • temporaryFileName - 返回一个不存在的临时文件的名字。

  • loadResource - 将Modelica URL地址转换成一个文件系统的绝对路径(用于不接受Modelica的URL的函数)。

Streams(流)

Streams包用于从终端或文件读取和写入数据。此包括以下函数:

  • print - 向终端或文件写入数据。

  • readFile - 从文件中读取数据,并返回一个字符串向量以表示文件中各行的内容。

  • readLine - 从文件中读取一行文字。

  • countLines - 返回的文件的总行数。

  • error - 用于打印错误信息。

  • close - 关闭文件。

Strings(字符串)

Strings包中包含对字符串进行操作的函数。这个库的基本功能包括:

  • 确定字符串的长度

  • 构建和提取字符串

  • 比较字符串

  • 解析和搜索字符串

System(系统)

System包用于与底层操作系统的交互。它包括以下功能:

  • getWorkingDirectory - 获取当前工作目录。

  • setWorkingDirectory - 设置当前工作目录。

  • getEnvironmentVariable - 获取特定环境变量的值。

  • setEnvironmentVariable - 设置特定环境变量的值。

  • command - 让操作系统来执行一个命令。

  • exit - 终止执行。