注:以下内容仅供参考学习,禁止以一切形式以商用为目的传播。
建模内容均基于MWorks软件。
从本篇开始准备介绍一下modelica建模语言的相关语法,准备了一些资料,主要有公司的内部培训教材、ModelicaByExample和modelica语言规范(下载途径:MWorks软件帮助文档和modelica官网-Documents — Modelica Association),语言规范讲的过于详细,对新接触的同学不是很友好,后面如果遇到毕竟疑难的语法可以查阅语言规范,因此主要参考ModelicaByExample和整理过的培训教材。
类的基本概念
类:具有相同或相似性质的对象的抽象。在modelica语言中,一切实物都是类,从预定义的Integer和Real,到庞大的package,如Modelica标准库。对象(object)是类(class)的抽象化,对象是类的具体化,这里同其他编程原因类的理解大同小异。以下图为例,猫代表一个类,而将类进行具体化,则猫包含kitty猫、加菲猫、叮当猫。
特殊类
特殊类[以前称为受限类] record, type, model, block, package, function, connector,operator, operator function 除了受某些限制之外,都具有普通类的属性。另外,它们的属性还有某些额外的增强。下面的表格总结了这些特殊类的定义:
record | 记录 | 在record及其任何组件中,只允许有public部分(即在方程、算法、方程初始化、算法初始化节,不允许有protected部分)。不能在连接(connections)中使用。record中的元素不能有前缀input、output、inner、outer或flow。增强的性质是隐含地具有record构造函数.另外,record组件能在表达式中用作组件引用,能用在赋值表达式的左边,服从一般类型的兼容规则。 | 数据结构 | 类似C语言中的结构体,作为数据集使用,方便对类进行统一管理 |
type | 类型 | 仅能扩展预定义类型、枚举、type的数组、或由type扩展的类。增强之处在于对预定义类型进行扩展。[其它特殊类都没有这个特性] | 类型别名 | 用于定义新的数据类型 |
model | 模型 | 与class完全相同,没有限制也没有增强。 | 定义组件模型 | 最常用类 |
block | 框图 | 与model相同,另外增加的限制为:block的每个连接器组件必须有前缀input或/和output。[这是为了方便对有输出/输出的方块图建模。正是因为有了input/output前缀这个限制,使得只有按方块图的语义才能连接blocks。 | 兼容基于框图的因果建模 | 一般用于建立因果关系模型 |
package | 包 | 只能包含类的声明和常量定义。增强之处是:可以用import导入packages的元素。 | 消除名字冲突和组织模型层次,本质上相当于一个文件夹 | 组织模型库树形图 |
function | 函数 | 函数类,后续会进行详细阐述 | 通过算法实现过程式建模 | 一般涉及算法的内容尽量写成方程,对求解效率有提升,也方便函数的复用 |
connnector | 连接器 | 在其定义或其任何组件中不允许有方程。增强之处是:允许connect(…)用于连接器类型的组件。 | 定义组件之间的连接接口 | 连接件类 |
类的一般结构
以下为类定义的一般结构,Example为类的名称,在变量声明区域声明需要用到的变量,modelica变量包含连续变量(实性:Real)和离散变量(整形:Integer、布尔型:Boolean、字符串:String、enumeration),方程和算法段采用equation和algorithm标记,后面的表达式用于描述类的行为(方程段和算法段区别后面内容介绍)。
class Example
Real x; //变量声明
Real y;
equation/algorithm //方程或者算法段
x=1; //表达式、用于描述类的行为
x + time = y;
end Example;
类定义前缀
除了一般的定义类型,MWorks支持在类和变量定义前添加前缀,前缀包含可变性前缀、因果前缀、流变量前缀、变形前缀、Partial前缀、实例层次查找。
- 可变性前缀
参数parameter:表示在每次仿真过程中不变的常量,在仿真之前可以修改其值;
parameter Real mass = 20;
常量constant:常值变量的值一旦给定就不能再改变;
constant Real PI=3.141592653589;
离散变量discrete:discrete仅用于Real型变量,表示声明的变量是离散型的变量;
离散变量一般用于系统采样计算,也就是离散系统,比如计算机控制系统(0或1)、数字电路。
discrete Real y;
连续变量continious:缺省值,可省略。
- 访问限制前缀
在某些应用场景需要对声明的变量进行保护,禁止外部访问。
公开public:类的内部和外部均可访问,默认为public;
保护protected:只能在类的内部访问;
class AccessDemo
“Illustration of access prefixes”
Real a;
public //公开段
Real x;
Real y,z;
protected //保护段
Real w,u;
Real u2;
end AccessDemo;
- 因果前缀
表示数据的输入输出关系,只用于限制类function中;
输入变量input
输出变量output
function add
input Real a;
input Real b;
output Real res;
algorithm
res := a + b;
end add;
- 流变量前缀
流变量flow:流变量前缀只用于connector类中,表示该变量为流变量,一旦变量被定义为流变量,则在连接器连接后支持广义的基尔霍夫定律,并且遵循正负号规则,流变量的正值表示守恒量在流入某个组件,反之流出某个组件为负值;流变量是区分因果连接器和非因果连接器显著的特征,常用的流变量领域及单位如下表所示
领域 | 势变量 | 流变量 |
电气 | 电流A | 电压V |
热学 | 热W | 温度K |
平移 | 力N | 位置m |
旋转 | 力矩N.m | 角rad |
/***电气连接器***/
connector Electrical
Modelica.SIunits.Voltage v;
flow Modelica.SIunits.Current i;
end Electrical;
/***热学连接器***/
connector Thermal
Modelica.SIunits.Temperature T;
flow Modelica.SIunits.HeatFlowRate q;
end Thermal;
/***平移连接器***/
connector Translational
Modelica.SIunits.Position x;
flow Modelica.SIunits.Force f;
end Translational;
/***旋转连接器***/
connector Rotational
Modelica.SIunits.Angle phi;
flow Modelica.SIunits.Torque tau;
end Rotational;
- 变形前缀
允许替换replaceable:表示允许类型或组件允许被替换;
重声明redeclare:与replaceable组合使用,用于替换类型或组件;
不可变形final:不能变形及重声明。
模型变形的目的是为了使模型库架构变得更加简洁高效,熟练的使用能够使模型库开发更灵活而且极大的减少模型库代码开发和维护工作,后续总结模型继承和重用内容可以详细介绍。
- Partial前缀
表示当前类为抽象类,再mworks中抽象类可以不满足模型方程局部平衡编译,带此前缀的模型一般作为完成模型的子模块使用,如接口模型;
- 实例层次查找
inner/outer:实例继承查找前缀,以前缀outer声明的元素,引用的是同名的、使用inner声明的、在封闭实例层次结构(enclosing instance hierarchy)中最近的元素。对一个outer元素,至少要存在一个对应的inner元素声明。[inner/outer组件可用于对简单的场(fields)建模,其中一些物理数量,例如地心引力、环境温度或环境压力,可被特定的分层模型结构中的所有组件访问。如果没有在分层模型结构的嵌套层中被相应的non-inner声明所掩盖,则inner组件在整个模型中都可被访问。]
- 以前缀outer声明的元素引用的元素实例是使用前缀inner声明的同名元素,该实例最接近于封装outer元素声明的实例层次中;
- 对一个outer元素引用来说,应至少存在一个对应的inner元素声明;
- inner组件应作为outer组件的子类型;
- 变形只用于inner声明。
//在下面示例中to=b.to=b.a1.to=b.a2.to
model test
class a
outer Real to;
end a;
class b
inner Real to;
a a1;
a a2;
end b;
end test;
类型属性
基本数据类型(除枚举外)的内置属性包括:
关键词 | 意义 |
quantity | 物理量纲 |
unit | 单位(仅Real类型) |
displayUnit | 显示单位(仅Real类型) |
min | 最小值(仅数值类型) |
max | 最大值(仅数值类型) |
start | 仿真初始值 |
fixed | 变量值是否固定不变 |
type Angle = Real(
final quantity = "Angle",
final unit = "rad",
displayUnit = "deg");
fixed-用于设定初始值的性质
- lfixed=true,表示该初始值是既定初始值,必须得到满足,即变量的初始值必须等于由start指定的值。
- lfixed=false或者缺省时,表示该初始值是备选初始值,可以不满足。
备选初始值有两个方面的作用:
- 在求解初值时,若初值系统缺少约束条件,取备选初始值进行补充;
在求解非连续系统时,将该值当作变量的迭代起始值。