版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Modelica语法详解模型重用哈工大计算学部-工业软件中心哈工大重庆研究院-无人装备中心曲明成
博士/副教授
qumingcheng@2025年4月23日目录1.
继承重用2.实例化重用3.重声明重用4.本章回顾modelResistorimportSI=Modelica.Siuints;ParameterSI.ResistanceR(start=1)=1;SI.Voltagev;SI.Currenti;…Interfaces.PositivePinp;…Interfaces.NegativePinn;equationV=p.v-n.v;0=p.i+n.i;i=p.i;R*i=v;endResistor仔细观察下面的三个模型的代码,有何特点?三个组件模型,绝大部分代码是相同的,出现大量的重复代码,给后期代码的修改和维护造成很大的不便。冗余是一切罪恶的根源电阻电感电容1.继承重用modelCapacitorimportSI=Modelica.Siuints;ParameterSI.ResistanceC(start=1)=1;SI.Voltagev;SI.Currenti;…Interfaces.PositivePinp;…Interfaces.NegativePinn;equationV=p.v-n.v;0=p.i+n.i;i=p.i;i=C*der(v);endCapacitormodelInductorimportSI=Modelica.Siuints;ParameterSI.ResistanceL=1;SI.Voltagev;SI.Currenti;…Interfaces.PositivePinp;…Interfaces.NegativePinn;equationV=p.v-n.v;0=p.i+n.i;i=p.i;L*der(i)=v;endInductor再阅读下面的代码,和前面的代码进行比较,有何不同?电阻电感电容基类通过继承重用的方式,大大简化组件模型代码,避免不必要的冗余,避免了模型维护和修改时的繁琐。1.继承重用继承connector,设计不同的图标和连接线继承partial类,完善模型行为方程场景1:继承connector,设计不同的图标和连接线原始接口入口出口1.继承重用-使用场景管网中准一维流体流动的接口(不可压缩或可压缩,一个或多个相,一种或多种物质)场景2:继承partial类,完善模型行为方程每个模型都需要一个入口和一个出口,并且都需要选择流过模型的介质1.继承重用-使用场景一般结构:extends+基类路径(参数/变量变型)recordColorData
parameter
Realred=0.2;//默认初值
parameter
Realblue=0.6;
Realgreen;endColorData;modelColor
extends
ColorData;equation
red+blue+green=1;endColor;modelColor
parameter
Realred=0.2;
parameter
Realblue=0.6;
Realgreen;equation
red+blue+green=1;endColor;等价recordColorData
parameter
Realred=0.2;//默认初值
parameter
Realblue=0.6;
Realgreen;endColorData;modelColor
extends
ColorData(red=0.3);equation
red+blue+green=1;endColor;modelColor
parameter
Realred=0.3;
parameter
Realblue=0.6;
Realgreen;equation
red+blue+green=1;endColor;等价继承时要改变值怎么办?1.继承重用-一般结构model
AccessDemo
parameter
Real
a
=
2;protected
parameter
Real
b
=
3;
Real
c;equation
c
=
a
+
b;end
AccessDemo;用于限制类中元素的调用范围——public、protected
public:——类中元素在内外部均可访问——一般情况,public可以省略不写,默认为内外部均可访问protected:——类中元素仅在内部可访问,外部不可访问model
AccessDemo
parameter
Real
a
=
2;
parameter
Real
b
=
3;
Real
c;equation
c
=
a
+
b;end
AccessDemo;model
AccessTest
//类的实例化应用
AccessDemo
access;
Real
x1;
Real
x2;
Real
x3;equation
x1
=
access.a;
x2
=
access.b;
x3
=
access.c;end
AccessTest;model
AccessDemo
parameter
Real
a
=
2;protected
parameter
Real
b
=
3;public
Real
c;equation
c
=
a
+
b;end
AccessDemo;举例:写个模型,实现c=a+b,其中a、b为参数。是不是Soeasy!怎么c也不让调用呢?如何让参数b不被外部调用?注意:protected
作用域:protected
parameter
Real
b
=
3;……
Real
c;……equation(algorithm)
回忆:数据的前缀用法-访问限制前缀1.继承保护model
AccessDemo
extends
ModelicaGrammar.Reuse.Public;
extendsModelicaGrammar.Reuse.Protected;equation
a1+a2=3;a3+a2=5;a1+a3=4;endCalProtected;modelProtected
Reala2;protected
Reala3;endProtected;modelPublic
Reala1;endPublic;x=access.a1;访问数据x=access.a2;x=access.a3;modelAccessTestAccessDemoaccess;Realx;equation
x=access.a1;endAccessTest;注意:继承父类有保护声明的变量、参数、常量,可以在子类中直接使用;将extends继承语句放在protected关键字的作用区域中,那么继承后,该基类中的所有元素在派生类中也是protected访问权限。实例化具有保护属性的基类,在实例化模型中不能访问基类的保护元素。1.继承重用-注意事项(继承与实例化的区别)recordColorData
parameter
Realred=0.2;
parameter
Realblue=0.6;
Realgreen;endColorData;modelColor
extends
ColorData;
parameter
Realred=0.2;
parameter
Realblue=0.6;equation
red+blue+green=1;endColor;modelColor
extends
ColorData;
parameter
Realred=0.2;
parameter
Realblue=0.3;equation
red+blue+green=1;endColor;思考:如下两种声明方式是否会报错?声明单一继承规则:继承后如果有多个相同的声明,只保留一个声明。继承后如果对同一个元素有多个不同的声明,会报错。2.单一继承1.继承重用-注意事项第一种声明方式第二种声明方式基类派生类packagefunctiontyperecordconnectorblockmodelpackage√function√type√record√connector√√√block√√model√√√recordRecordA...endRecordA;modelModelAextends
RecordA;//正确endModelA;packagePackageA...endPackageA;modelModelBextends
PackageA;//错误endModelB;打√为派生类可继承的基类3.继承限制1.继承重用-注意事项目录1.
继承重用2.实例化重用3.重声明重用4.本章回顾2.实例化重用-使用场景接口实例化模型封装系统仿真模型构建场景1:接口实例化新开发的模型中需要接口,可直接通过实例化的方式进行引用具有惯性和两个刚性连接法兰的旋转部件2.实例化重用-使用场景场景2:模型封装PID控制器,由比例单元(P)、积分单元(I)和微分单元(D)组成2.实例化重用-使用场景场景3:系统仿真模型构建蔡氏电路:一种简单的非线性电子电路设计,它可以表现出标准的混沌理论行为。2.实例化重用-一般结构Interfaces.FluidInterfaces.FluidPort_aport_a(p(start=p_start));Modelica.Media.Water.WaterIF97_base.ThermodynamicStatestate;Modelica.Electrical.Analog.Basic.ResistorR3(R=1.e-3);connector重用record重用model重用一般结构:父类模型路径+实例化名(参数、变量、特殊类变型)Modelica.SIunits.Pressurep(displayUnit="MPa");type重用2.实例化重用-一般结构父类模型路径:待实例化的类在模型库中的路径,可通过拖拽类的方式直接生成实例化名:符合Modelica命名规则,并能形象描述实例化类的作用变型:对实例化后的类参数、变量初始值、变量、显示单位、特殊类(replaceable/redeclare单独讲解)进行变型一般结构:
父类模型路径+实例化名(参数、变量、特殊类变型)modelCauerLowPassAnalog
extends
Modelica.Icons.Example;
Modelica.Electrical.Analog.Basic.CapacitorC1(C=c1,v(start=0,fixed=true))
annotation(…);
Modelica.Electrical.Analog.Basic.CapacitorC2(C=c2)
annotation(…);
Modelica.Electrical.Analog.Basic.CapacitorC3(C=c3,v(start=0,fixed=true))
annotation(…);
Modelica.Electrical.Analog.Basic.CapacitorC4(C=c4)
annotation(…);
Modelica.Electrical.Analog.Basic.CapacitorC5(C=c5,v(start=0,fixed=true))
annotation(…);…endCauerLowPassAnalog;2.实例化重用-使用方式先定义各个电容值参数,然后实例化C1、C2、C3、C4、C5,通过变型设置电容值,这样就不必因为电容参数的不同而建立多个电容模型。注意:目前遇到的大多数示例中,被变型的组件属性都是参数。尽管Modelica规范中没有明确禁止对变量、常量等进行变型,但鉴于Modelica参数的设计意图,不推荐对变量、常量等进行变型。1.参数变型2.实例化重用-使用方式modelArray
parameter
Realx[2];
parameter
Realy;endArray;modelArrayUse
ArrayA1[2](x=[1,2;1,2],y={2,5});endArrayUse;modelArrayUse
ArrayA1[2](eachx={1,2},y={2,5});endArrayUse;modelArrayUseError
ArrayA1[2](x=[1,2;1,2],y[1]=2);endArrayUse;注意:使用“each”对所有数组元素中的某个属性赋相同的值。必须对整个数组进行变型,不可以对单个数组元素进行变型。2.数组变型2.实例化重用-使用方式在一次变型中,不能对一个元素的同一个属性进行两次赋值修改modelM1
Realx[3];endM1;ModelicaGrammar.Reuse.M1M2(x=ones(3));正确ModelicaGrammar.Reuse.M1M3(x=ones(3),x[2]=2);错误3.单一变型2.实例化重用-注意事项modelC1
parameter
Reala;endC1;modelC2
parameter
Realb,c;endC2;modelC3finalparameter
Realx1=1;
parameter
Realx2=2; C1x3[2](eacha=33); C2x4(b=4); C1x5(a=5);
extends
C1;
extends
C2(b=6,c=77); endC3;modelC4
extends
C3(x2=22,x4(c=44),a=55,a=56,b=66);endC4;变量结果x11x222x3[1].a33x3[2].a33x4.b4x4.c44x5.ax3.aa55b66c77C4变量赋值结果注意:每个元素只能赋值一次;final元素不能进行赋值;each表示数组中的每个变量均赋相同的值;变形按照外层覆盖内层的原则进行合并;变型合并目录1.
继承重用2.实例化重用3.重声明重用4.本章回顾架构模型设计介质数据库场景1:架构模型设计如何快速的替换控制器?可替换重申明(replaceable/redeclare)是其中一种快速替换模型的方法。①.观察该系统的控制器,有三个接口,两个输入,一个输出,那么我们替换的控制器需要具有相同的接口数量和接口类型。②.设计一个架构模型,它只包含了接口,两个输入、一个输出3.重声明重用-使用场景恒液位控制系统。我们通过触摸屏设置水池里需要到达的液位高度,当PLC接到我们设置的命令之后,通过传感器反馈实际的液位高度与我们设定的液位高度相比较,得到差值。如果低于我们设定的液位值,则驱动变频器带动水泵往水池里加水,当高于我们设定的液位值,变频器则停止加水。在恒压控制系统中,设定一个压力(10MPa),那么这个系统就需要稳定在我设定的压力值10MPa左右;在空调系统中,我们设定好了一个温度(26℃)之后,我们当然希望室内的温度就一直稳定在26℃左右嘛。在我们设定好了参数之后,设备如何自动调节呢?就是通过PID控制功能进行调节的!现在我们接到一个任务,需要骑一辆自行车沿着直线走1000米。那么直线走1000米就是“给定环节”了,因为我预先就知道了需要走多少米距离并且走的是直线。骑车的是“人”,人由大脑控制,那么大脑就是“控制器”了,大脑不能直接控制车辆,然后大脑发命令的方式去控制我们的手和脚从而控制自行车,那么手和脚就是“执行机构了”,而最终我们控制的是自行车,那么自行车就是“被控对象”了。那么在骑车的过程中,可能会出现一阵风或者路上出现石头或者坑等,那么这些石头或者坑呢,就是“扰动”。我们在走直线的过程中,到底有没有沿着直线走呢?我们可以通过眼睛看,那么眼睛把自行车的信息收集起来(是否走歪了),这个过程就是“反馈环节”。仅仅知道是否走歪了还不行,需要及时调整,如何调整呢?就是通过预期设定(给定环节)与实际路线(反馈环节)相比较,得到的差值进行修正。③.
继承架构模型,开发不同的控制器模型控制器1控制器23.重声明重用-使用场景④.封装一个控制器模型,用于系统模型构建⑤.采用封装后的控制器模型替代原系统模型中的控制组件3.重声明重用-使用场景场景2:介质数据库设想一个场景,用Modelica语言开发了一个水管模型,如果想把水管中流动的水改变为油液,用于油路系统中,该如何处理?采用可替换重申明(replaceable/redeclare)的方法,将设备模型与介质模型分离,开发设备模型时调用介质模型模板,实例化设备模型时,将具体介质与设备关联,得到带有介质的实例化设备模型。①.介质模板②.水介质物性计算3.重声明重用-使用场景③.设备模型开发时与介质模板关联,并调用介质模板函数进行代码编写④.实例化管道模型,并替换介质模板,得到带有介质的管道实例化模型3.重声明重用-使用场景
重申明重用,在语法中通过replaceable/redeclare关键字实现,根据Modelica标准语法语义的规定可以对所有的类、参数、变量进行重申明,但是在实际的使用中以model、package、function这三种类的重申明为主,以实现通用化模型的开发。关键字:replaceable:表示类型或组件可以被替换
redeclare:表示替换类型或组件3.重声明重用-使用方法modelPartialGeometry
Modelica.SIunits.AreaA"横截面积";
Modelica.SIunits.Lengthl"周长";endPartialGeometry;基类模型modelcycle
"圆形"extendsPartialGeometry;parameterModelica.SIunits.Diameterd=
0.01;equation
A=Modelica.Constants.pi*d^2/4;
l=Modelica.Constants.pi*d;endcycle;modeltriangle
"三角形"extendsPartialGeometry;parameterModelica.SIunits.Lengtha=0.01;equation
A=0.5*a*a*sqrt(3)/2;
l=3*a;endtriangle;modelsquare
"正方形"extendsPartialGeometry;parameterModelica.SIunits.Lengtha=0.01;equation
A=a^2;
l=4*a;endsquare;圆形三角形正方形modelTest_GeometryreplaceablemodelGeometry=cycleconstrainedbyPartialGeometryannotation(choicesAllMatching=true);
Geometry
geometry;
Modelica.SIunits.AreaA
"横截面积";
Modelica.SIunits.Lengthl
"周长";equation
A=geometry.A;l=geometry.l;endTest_Geometry;1.model重申明3.重声明重用-使用方法实例化后使用模型典型应用场景:模型的几何结构、不同换热计算方法、不同流阻计算方法等典型应用案例:标准库中DynamicPipe模型换热模式和流阻计算公式的切换,模型路径: Modelica.Fluid.Pipes.DynamicPipe3.重声明重用-使用方法1.model重申明packagePartialSolidMedium
"固体介质基类"replaceablepartialfunctionCp_T
"返回定压比热"inputSI.Temperature
T;outputSI.SpecificHeatCapacity
Cp
"定压比热";endCp_T;replaceablepartialfunctionthermalConductivity_T
"计算导热系数"inputSI.Temperature
T;outputSI.ThermalConductivity
lambda
"导热系数";endthermalConductivity_T;replaceablepartialfunctionrho_T
"返回密度"inputSI.Temperature
T;outputSI.Density
rho
"密度";endrho_T;endPartialSolidMedium;packageGraphite
"石墨,没有受过辐射"extendsPartialSolidMedium;constantReal
c1(unit="J/(kg.K)")=-143.9883;constantReal
c2(unit="J/(kg.K2)")=3.6677;constantReal
c3(unit="J/(kg.K3)")=-0.0022;constantReal
c4(unit="J/(kg.K4)")=4.6251e-7;redeclarefunctionextendsrho_T
"计算密度"algorithm
rho:=
1776.66;endrho_T;redeclarefunctionextendsCp_T
"计算比热容"algorithm
Cp:=c1+c2*T+c3*T^2
+c4*T^3;endCp_T;redeclarefunctionextendsthermalConductivity_T
"计算导热系数"algorithmlambda:=169.245-1.24890e-1*T+3.28248e-5*T^2;endthermalConductivity_T;endGraphite;packageB4C
"碳化硼"extendsPartialSolidMedium;redeclarefunctionextendsrho_T
"计算密度"algorithm
rho:=1800;endrho_T;redeclarefunctionextendsCp_T
"计算比热容"algorithm
Cp:=713;endCp_T;redeclarefunctionextendsthermalConductivity_T"计算导热系数"algorithm
lambda:=(-1.873e-10)*T^4+(5.792e-07)*T^3+(-0.0005904)*T^2+0.1406*T+119.7;endthermalConductivity_T;endB4C;基类模型模型1模型22.package和function重声明3.重声明重用-使用方法modelTest_packagefunctionreplaceablepackagesolid=GraphiteconstrainedbyPartialSolidMediumannotation(choicesAllMatching=true);
Modelica.SIunits.Temperature
T=
300
"温度";
Modelica.SIunits.Densityrho;
Modelica.SIunits.SpecificHeatCapacityCp;
Modelica.SIunits.ThermalConductivitylamda;equationrho=solid.rho_T(T);Cp=solid.Cp_T(T);lamda=solid.thermalConductivity_T(T);endTest_packagefunction;应用模型3.重声明重用-使用方法2.package和function重声明典型应用场景:流体系统中,设备模型与介质模型的分离,通过基于package和function的
重申明,实现设备模型中不同类型的介质选择;典型应用案例:Modelica标准库中Media介质库的开发和调用方式;3.重声明重用-使用方法2.package和function重声明modelOil"液压油"
replaceablemodelOil=PreDefinedOil.EquationBased.Constant
constrainedbyOilMedia.Interfaces.Base"油液类型选择"
annotation(choicesAllMatching=true);annotation(...);endOil;modelConstant"常特性油液"
extends
OilMedia.Interfaces.Base(…);annotation(...);endConstant;modelMIL_H_5606"MIL-H-5606牌号油液"
extends
OilMedia.Interfaces.Base(…);annotation(...);endMIL_H_5606;modelTabular"基于插值表油液模板"
extends
OilMedia.Interfaces.Base(…);annotation(...);endTabular;说明:“constrainedby基类路径”用来筛选所有继承此基类的模型“choicesAllMatching=true”表示所有符合筛选条件的模型均可在参数框中进行选取重声明1.重声明约束3.重声明重用-注意事项modelOil"液压油"
replaceable
modelOil=PreDefined.EquationBased.Constant
constrainedbyPreDefinedOil.EquationBased.Constant"油液类型选择"
annotation(choices(choice(redeclaremodelOil=OilMedia.PreDefined.EquationBased.Constant"常特性油液"),choice(redeclaremodelOil=OilMedia.PreDefined.Tabu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国国际货运航空股份有限公司机务维修工程部副总经理岗位社会招聘1人考试备考试题及答案解析
- 2026年楚雄市工会系统事业单位人员招聘考试备考试题及答案详解
- 2026年度伊春市第二社会福利院面向全市公开选调事业单位工作人员考试模拟试题及答案解析
- 2026年鄂州市交通运输系统事业单位人员招聘考试备考试题及答案详解
- 2026上半年北京市体育局所属事业单位招聘运动员47人考试备考试题及答案解析
- 2026安徽马鞍山市人民医院博望分院(博望区人民医院)招聘派遣制工作人员6人考试参考题库及答案解析
- 企业管理-病案科岗位职责
- 2026年佛山市医疗保障系统事业单位人员招聘考试备考试题及答案详解
- 浙江温州市瑞安市2025-2026学年四年级下学期英语阶段性素养评价材料(4月)(解析版)
- 职业规划师发言稿
- 总审计师评价制度
- 广东省广州市2026年中考一模英语试题附答案
- 2026校招:陕西投资集团面试题及答案
- 2025年郴电国际校园招聘74人笔试历年难易错考点试卷带答案解析
- 2025年上海铁路局24届笔试真题及答案
- DB45-T 2885-2024 生活无着的流浪乞讨人员接送返乡工作规范
- 养老院护士长培训课件
- 2026年青马工程笔试试题及答案
- (2025)党员应知应会基础知识试题及答案
- 疥疮预防控制措施
- 2025年教育科技数字化校园建设方案
评论
0/150
提交评论