文章目录
第四章 组件重用
目标:提升模型的可重用性——非因果建模的本质利于重用1
4.1 概述
Modelica中实现模型重用的途径
- 创建连接器:连接联合工作的组件,共享信息
- 扩展现有模型:模型之间共享方程集、参数集、算法集等
4.2 公共代码开发
4.2.1 识别和定义公共代码
避免重复——关键词partial
限定的partial2 model
example: Modelica.Electrical.Analog包中的OnePort模型
4.2.2 使用公共代码定义模型
- 继承OnePort模型,增加电阻类型参数R
- 欧姆定律
i*R=v
描述i与v的本构关系
4.3 构建可重用的块
4.3.1 建立控制器模型
- 对于每一个需要PI控制器的系统,建立一个通用的PI控制器模型,能够将其置于任一需要它的模型中
- 基于其他模型建立的新模型可视化的两种途径
* 原理图:展现内部连接细节
* 图标视图(icon):从外部看模型,“黑盒” - 将子组件模型作为构成块,使建立和增强系统复杂性更容易
4.3.2 传递信息
当利用一系列子组件创建一个新模型时,必须将连接及参数向下传递到子组件层
4.3.3 小结
利用其他“构建块”创建组件的步骤:
- 确定外部连接和参数
- 对内部组件进行声明和连接
- 将外部参数及连接器–>传递到子组件
4.4 允许替换的组件
模型相互替换的前提是两者必须兼容,即两种模型拥有相同的连接器以及参数,也即新模型必须是旧模型的子类型
4.4.1 通用控制器接口
确保控制器兼容性:运用通用partial块扩展定义
- 确定一个通用接口:确定控制器通用属性、创建partial块、基于partial块扩展得到控制器
- 通用模型:输入、输出、参数
4.4.2 特定控制器模型
4.4.2.1 比例控制器
4.4.2.2 比例微分控制器
扩展建模:每一个扩展而来的模型自动成为被扩展模型的一个子集/子类型/特例,它包含了被扩展模型的全部组件
4.4.3 使用可替换组件
model ControllerAndMotor
...
replaceable PIController con(Kp = 0.4) extends Controller;
...
end ControllerAndMotor;
- 声明一个PIController叫做con,它可以被任一Controller子类型的组件替换
- 限定词extend:限制模型可以被那些模型替换
三个不同控制器类型组成的实例–>redeclare
定义
model CompareControllers
ControllerAndMotor pic;
ControllerAndMotor pc(
redeclare PController con(Kp=1.1));
ControllerAndMotor pdc(
redeclare PDController con(Kp=1.1,Kd=0.2));
end CompareControllers;
4.4.4 小结
使用一个模型替换另一个模型的方法来设计组件或系统
4.5 其他可替换的实体
关键词replaceable
除了使得组件可替换,还可以使得组件类型可替换,并允许重新声明多个组件
- Modelica中的简短定义——模型扩展的简化方法
...
Analog.Basic.Resistor R1(R=15);
Analog.Basic.Resistor R2(R=5000);
...
//等效声明:定义一个本地模型,利用其对R1,R2进行声明
...
model ResModel
extends Analog.Basic.Resistor;
end ResModel;
ResModel R1(R=15);
ResModel R2(R=5000);
...
//等效声明-简短定义
...
model ResModel =Analog.Basic.Resistor;
ResModel R1(R=15);
ResModel R2(R=5000);
...
- 实现一个可替换对象类型
model RLC5
import Modelica.Electrical.Analog;
replaceable model ResModel =Analog.Basic.Resistor;
ResModel R1(R=15);
ResModel R2(R=5000);
...
end RLC5;
// 使用本地模型的优势在于所有此模型的实例均可以同时进行重新声明
model MyRLC = RLC5(redeclare model Resmodel = MyResistor);
4.6 对灵活性的限制
当利用已有模型实例创建一个新模型时,可能需要新模型作为一个黑盒,即不允许模型使用者或其他开发人员深入模型内部,并更改一些默认条件。
关键字final
可以用来禁止这样的更改
model Gear
...
parameter Real gear_ratio=1;
...
end Gear;
// 重用Gear模型创建皮带模型TimingBelt
model TimingBelt = Gear(final gear ratio=2);
//关键字final通过实例化或特例化阻止了对传动比的任何并发的更改
model Engine
TimingBelt belt (gear ratio=3); //error
model OddTimingBelt = TimingBelt ( gear ratio=2.25); //error
end Engine;
4.7 其他注意事项
4.7.1 参数
一般,不希望数字直接出现在方程中,设置参数可以使模型更易理解和重用。
4.7.2 通用性
通过重用一个已存在的、更通用的模型并添加约束的方式去构建 VS 直接创建
- 重用性最高的模型时那些假设条件很少的模型
- 一个模型越通用,模型本身越趋向于抽象和复杂
- 当开发一个可重用模型时,需要弄清其如何被重用
- 模型应具备足够通用性,使其可以作为开发其他模型的基础;同时该模型也足够简单,使得后续开发的模型简单易懂
4.7.3 注释
模型开发者对模型的解释
- “… …” 描述性文本
- // 注释
- 嵌入HTML代码
4.8语言基础
4.8.1 模型的扩展
extends
关键字:允许将一个模型的内容“复制粘贴”到另一个模型中
- 应用场合:当许多模型拥有相同变量、连接器、方程时
- 限制条件:不能替换扩展模型中的任一方程
model A
Real x;
equation
x=5;
end A;
model B1
extends A;
equation
x=3;
end A;
//将B1展开得
model B2
Real x;
equation
x=5;
x=3;
end B2;
//一个未知数,两个方程,方程超定
- 当开发partial模型时,为了保证衍生模型创建方程时有足够的灵活性,partial模型应包含最少数量的方程
4.8.2 简短定义
- 应用场景:新模型与已有模型非常相似,即新模型没有引入任何新的子组件
model MyRLC
extends RLC5(R1(R=12));
end MyRLC;
//等价于
model MyRLC = RLC5(R1(R=12));
//本质上是用等号并在语句末尾用分号来替换关键词extends
4.8.3 子类型
定义:若B包含与A相同的所有组件(相同名称),则B为A的子类型
4.8.4 partial定义
关键字partial
表明,此模型可以扩展,但不能实例化,其本身并不是一个严格意义上的模型(通常因为其缺少本构方程)。
4.8.5 创建可替换的模型元素
4.8.5.1 可替换的子组件
标准声明与可替换声明的不同
- 可替换声明前有关键字
replaceable
- 可替换声明可跟extends语句,作为约束类型,限制可以被什么组件替换
4.8.5.2 使用可替换类型定义
- 可替换类型定义在同一时刻可以同时更改很多组件的类型
- 可替换类型定义通常包含一个本地类型定义(即此类型尽在指定模型的上下文中应用)
4.8.6 final 类型组件
final
关键字通过禁止进一步更改以限制灵活性,增强模型的鲁棒性