传热组件¶
我们会以建立传热领域组件模型来开始对组件模型的讨论。这些模型能让我们重构之前看到的模型。这次可以使用组件模型去表示各种不同的效应。投入时间建立组件模型将允许我们轻易地结合底层物理行为,去为各种热系统创建模型。
热连接器¶
在此前简单领域的讨论里,我们描述了如何编写热连接器。对于本节中的组件模型,我们将使用Modelica标准库内的热连接器模型。这些连接器定义如下:
within Modelica.Thermal.HeatTransfer;
package Interfaces "Connectors and partial models"
partial connector HeatPort "Thermal port for 1-dim. heat transfer"
Modelica.SIunits.Temperature T "Port temperature";
flow Modelica.SIunits.HeatFlowRate Q_flow
"Heat flow rate (positive if flowing from outside into the component)";
end HeatPort;
connector HeatPort_a "Thermal port for 1-dim. heat transfer (filled rectangular icon)"
extends HeatPort;
annotation(...,
Icon(coordinateSystem(preserveAspectRatio=true,
extent={{-100,-100},{100,100}}),
graphics={Rectangle(
extent={{-100,100},{100,-100}},
lineColor={191,0,0},
fillColor={191,0,0},
fillPattern=FillPattern.Solid)}));
end HeatPort_a;
connector HeatPort_b "Thermal port for 1-dim. heat transfer (unfilled rectangular icon)"
extends HeatPort;
annotation(...,
Icon(coordinateSystem(preserveAspectRatio=true,
extent={{-100,-100},{100,100}}),
graphics={Rectangle(
extent={{-100,100},{100,-100}},
lineColor={191,0,0},
fillColor={255,255,255},
fillPattern=FillPattern.Solid)}));
end HeatPort_b;
end Interfaces;
仔细检查这些接口的定义表明,HeatPort_a
和HeatPort_b
在其内容上与HeatPort
模型是相同的。唯一的区别在于,HeatPort_a
和HeatPort_b
的图标有所不同。
本节其余部分的组件模型都将会利用这些接口定义。
组件模型¶
在构建组件模型时,创建组件模型的目标是(仅)实现一个物理效应(例如热容、对流)。通过以此方式中建立组件模型,我们将看到,模型就可以在无数不同的配置中任意组合,而不需要添加任何更多的方程。这种方程的重用使得模型的开发更有效率,并避免引入错误的可能。
热容¶
我们的首个组件模型是温度分布均匀的集总热容模型。我们希望与此组件模型相关联的公式是:
表示这个公式Modelica模型(去掉了Icon
标注)很简单:
within ModelicaByExample.Components.HeatTransfer;
model ThermalCapacitance "A model of thermal capacitance"
parameter Modelica.SIunits.HeatCapacity C "Thermal capacitance";
parameter Modelica.SIunits.Temperature T0 "Initial temperature";
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a node
annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
initial equation
node.T = T0;
equation
C*der(node.T) = node.Q_flow;
end ThermalCapacitance;
其中C
为热容,T0
是初始温度。
请注意在这个模型中带有node
连接器。这是ThermalCapacitance
组件模型与“外面的世界”进行交互的地方。我们将使用node
的温度node.T
去代表热容的温度。flow
变量node.Q_flow
表示热在流入热容。我们可以在热容的公式看到这点:
C*der(node.T) = node.Q_flow;
注意,当node.Q_flow
为正时,热容的温度node.T
会增加。这证实了我们遵循了Modelica的约定。连接器flow
变量代表到组件的守恒量的流(在稍候我们会对核算进行更详细的讨论)。这里的守恒量为热。
仅仅使用这个模型,我们就已经可以构建一个如下的简单“系统”模型:
within ModelicaByExample.Components.HeatTransfer.Examples;
model Adiabatic "A model without any heat transfer"
ThermalCapacitance cap(C=0.12, T0(displayUnit="K") = 363.15)
"Thermal capacitance component"
annotation (Placement(transformation(extent={{-30,-10},{-10,10}})));
end Adiabatic;
这种模式只包含热容元件(正如ThermalCapacitance
类型的变量cap
其声明所示),而没有其它传热元件(例如传导、对流、辐射)。请暂时忽略Placement
标注,我们会在后面关于组件模型标注的章节中对其提供完整的解释。
模型中使用的图形标注(其中一部分没有在上面列举出来)可以显示为:
由于没有热量进入或离开热容元件cap
。热容的温度保持恒定,如下图所示:
ConvectionToAmbient¶
要快速添加热传递,我们可以定义另一个组件模型,去表示到与环境温度的传热。这样的模型可以在Modelica表示(再次,去掉了Icon
标注)如下:
within ModelicaByExample.Components.HeatTransfer;
model ConvectionToAmbient "An overly specialized model of convection"
parameter Modelica.SIunits.CoefficientOfHeatTransfer h;
parameter Modelica.SIunits.Area A;
parameter Modelica.SIunits.Temperature T_amb "Ambient temperature";
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a port_a
annotation (Placement(transformation(extent={{-110,-10},{-90,10}})));
equation
port_a.Q_flow = h*A*(port_a.T-T_amb) "Heat transfer equation";
end ConvectionToAmbient;
该模型包括了传热系数h
作为参数,表示表面积的参数A
以及环境温度T_amb
。模式通过连接器port_a
连接到其它传热元件。
同样,我们必须密切注意的正负号约定。请回想我们此前对热容的讨论。Modelica遵从如下的正负号约定:flow
变量的正值表示正在流入部件。特别是,让我们来仔细看一下ConvectionToAmbient
模型内的公式:
port_a.Q_flow = h*A*(port_a.T-T_amb) "Heat transfer equation";
注意,当port_a.T
大于T_amb
时,port_a.Q_flow
的符号为正。这意味着热量正流入这个组件。换句话说,当port_a.T
大于T_amb
时,这个组件将从port_a
抽走热量(相反,当T_amb
大于port_a.T
时,此组件会向port_a
注入热能)。
有了这样的组件模型,可让我们将其与ThermalCapacitance
模型相结合,并像我们的一些早期的热传递的例子一样,用以下Modelica代码进行系统模拟:
within ModelicaByExample.Components.HeatTransfer.Examples;
model CoolingToAmbient "A model using convection to an ambient condition"
ThermalCapacitance cap(C=0.12, T0(displayUnit="K") = 363.15)
"Thermal capacitance component"
annotation (Placement(transformation(extent={{-30,-10},{-10,10}})));
ConvectionToAmbient conv(h=0.7, A=1.0, T_amb=298.15)
"Convection to an ambient temprature"
annotation (Placement(transformation(extent={{20,-10},{40,10}})));
equation
connect(cap.node, conv.port_a) annotation (Line(
points={{-20,0},{20,0}},
color={191,0,0},
smooth=Smooth.None));
end CoolingToAmbient;
在模型中,我们看到了两个组件的声明:cap
和conv
。每个组件的参数也在声明时指定了。下面为CoolingToAmbient
模型的示意图:
但是,本模型特别的地方在于其方程区域:
equation
connect(cap.node, conv.port_a) annotation (Line(
points={{-20,0},{20,0}},
color={191,0,0},
smooth=Smooth.None));
此语句引入Modelica语言最重要的其中一个特性。请注意语句出现在equation
区域。虽然connect
操作符看起来像一个函数,其实其功能不止如此。操作符代表了表述两个指定连接器cap.node
和conv.port_a
间相互作用的公式。
在这种情况下,连接完成了两件重要的事情。第一件事就是产生让两连接器上“横跨”变量相等的等式。在这种情况下,这意味着下面的等式:
cap.node.T = conv.port_a.T "Equating across variables";
此外,连接也会为所有的贯通变量生成一个等式。生成的方程为守恒方程。你可以认为此守恒方程是基尔霍夫电流定律对所有守恒量的推广。基本上,它代表该连接本身事实上没有“存储”能力。无论有多少守恒量(这里是热量)从某部件里流出,那么这些量必然会进入另一个(些)部件。因此在这种情况下,连接语句会为flow
变量生成以下方程:
cap.node.Q_flow + conv.port_a.Q_flow = 0 "Sum of heat flows must be zero";
注意这里的正负号约定。所有的flow
变量相加在一起。我们将在稍候研究有多个组件进行交互的更复杂的情况。但因为这个简单的例子只带有两个部件。所以,我们可清楚看到,若Q_flow
有一个值为正,则另一个必须为负。换句话说,如果热从一个部件里流出,就必定会流入另一个不见。这些守恒方程确保我们对网络内守恒量进行恰当的追踪,避免任何守恒量的“丢失”。
在热学问题背景下,有一个很简单的方法可以概括连接行为。我们可以认为连接是一个没有热容完美的导热元件。
如果我们对上述CoolingToAmbient
模型进行仿真,我们会得到以下的温度轨迹:
进一步研究¶
CoolingToAmbient
模型中有个小问题。我们前面提到了,在建立组件模型时,最好是每个物理效应单独地隔离到一个组件中。但我们这里实际上在一个组件里集成了两种不同的效应。我们会马上看到,这限制了组件模型的可重用性。但首先,让我们通过重构代码将两个效应分开。然后,我们会使用这些新组件再次建立系统级模型。
对流¶
第一个新组件是Convection
模型。在这种情况下,我们将不对左右两端的温度作任何假设。相反,我们只假设连接到每个模型都拥有适当的热连接器。其结果就是如下的一个模型:
within ModelicaByExample.Components.HeatTransfer;
model Convection "Modeling convection between port_a and port_b"
parameter Modelica.SIunits.CoefficientOfHeatTransfer h;
parameter Modelica.SIunits.Area A;
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a port_a
annotation (Placement(transformation(extent={{-110,-10},{-90,10}})));
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_b port_b
annotation (Placement(transformation(extent={{90,-10},{110,10}})));
equation
port_a.Q_flow + port_b.Q_flow = 0 "Conservation of energy";
port_a.Q_flow = h*A*(port_a.T-port_b.T) "Heat transfer equation";
end Convection;
这个模型包含两个等式。第一个等式:
port_a.Q_flow + port_b.Q_flow = 0 "Conservation of energy";
表明该组件并不存储热量。方程实施了所有从某个连接器流入热量必须从其它连接器流出这一约束(这也正是我们在本节前面的connect
语句所看到的相同行为)。下一个公式:
port_a.Q_flow = h*A*(port_a.T-port_b.T) "Heat transfer equation";
通过表达穿过该组件的热流和两端的温度之间的关系,描述了对流的热传递关系。
环境条件¶
现在,我们有对流模型,我们需要另一个模型来代表环境条件。我们需要一个类似热容的模型。但这个模型需要保持恒定的温度。试想一下,如果我们使用ThermalCapacitance
模型,并为热容C
赋一个非常大的值。然后我们就会有一个温度变化非常缓慢的模型。但我们需要的模型完全不改变温度。模型如同有一个无限大的C
值。
这种模型的出现得相当频繁。它通常被称为“无限大容器”模型。一般而言,这种模型的特征在于:无论多少的守恒量(这里为热)流入或流出组件,横跨变量都会保持恒定。在电气领域,这样的模型代表电气接地。在机械方面,这种模型代表一个机械地面(不管施加多大的力都不改变位置的物体)。
我们将使用AmbientConditions
模型去描述环境条件:
within ModelicaByExample.Components.HeatTransfer;
model AmbientCondition
"Model of an \"infinite reservoir\" at some ambient temperature"
parameter Modelica.SIunits.Temperature T_amb "Ambient temperature";
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a node annotation (
Placement(transformation(extent={{-10,-10},{10,10}}), iconTransformation(
extent={{-10,-10},{10,10}})));
equation
node.T = T_amb;
end AmbientCondition;
由于我们正在谈论传热领域,这个模型是一个无限储热容器。不管有多少热量流入或流出该组件,其温度均保持不变。
灵活性¶
使用这些新的Convection
和AmbientCondition
模型,我们可以使用重建此前的简单传热系统模型,如下:
within ModelicaByExample.Components.HeatTransfer.Examples;
model Cooling "A model using generic convection to ambient conditions"
ThermalCapacitance cap(C=0.12, T0(displayUnit="K") = 363.15)
"Thermal capacitance component"
annotation (Placement(transformation(extent={{-30,-10},{-10,10}})));
Convection convection(h=0.7, A=1.0)
annotation (Placement(transformation(extent={{10,-10},{30,10}})));
AmbientCondition amb(T_amb(displayUnit="K") = 298.15)
annotation (Placement(transformation(extent={{50,-10},{70,10}})));
equation
connect(convection.port_a, cap.node) annotation (Line(
points={{10,0},{-20,0}},
color={191,0,0},
smooth=Smooth.None));
connect(amb.node, convection.port_b) annotation (Line(
points={{60,0},{30,0}},
color={191,0,0},
smooth=Smooth.None));
end Cooling;
该模型显示如下:
这看起来可能没有什么大不了的改善。虽然我们费心去将ConvectionToAmbient
分拆成单独的Convection
和AmbientTemperature
模型,我们最终还是得到了相同的基本行为,即:
将ConvectionToAmbient
分拆成Convection
和AmbientTemperature
模型的一大好处在于,现在我们可以将它们以不同的方式重新组合。下面的示意图展示了一个例子,说明我们使用到目前为止建立的数个基本组件,就可以重新组合成一个全新(和更复杂)的模型:
其实,我们现在可以使用这些组件去建立任意复杂的组件网,而不需要费心写出相关联的动力学方程。所需要做的一切已包括在组件模型里。这让我们能够专注于创建和设计系统的过程,而忽略背后繁琐、耗时且容易出错的方程变换工作。