Package of models for subsystems of fifth generation DHC ETS
Information
This package contains models for subsystems composing energy transfer stations in
fifth generation district heating and cooling systems.
Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).
Package Content
| Name |
Description |
DHWConsumption
|
DHW tank, HX, thermostatic mixing valve, and sink |
HeatExchanger
|
Base subsystem with district heat exchanger |
HeatPump
|
Base subsystem with water-to-water heat pump |
HeatPumpDHWTank
|
Base subsystem with water-to-water heat pump with storage tank for domestic hot water |
HeatPumpModular
|
Base subsystem with modular heat recovery heat pump |
StorageTankWithExternalHeatExchanger
|
A model of a storage tank with external heat exchanger to produce hot water |
StratifiedTankWithCommand
|
Stratified buffer tank model |
SwitchBox
|
Model for mass flow rate redirection with three-port two-position directional valves |
WatersideEconomizer
|
Base subsystem with waterside economizer |
Validation
|
Collection of validation models |
BaseClasses
|
Contains base classes for Subsystems |
DHW tank, HX, thermostatic mixing valve, and sink
Information
Model with fresh water station and domestic hot water load.
This model integrates a fresh water station, using
Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger
with a domestic hot water load.
The load is served at a specified temperature, using
Buildings.DHC.Loads.HotWater.ThermostaticMixingValve
to mix cold and hot water in order to meet the required hot water load.
The hot water load is specified through the input QReqHotWat_flow,
rather than the hot water mass flow rate, in order to take into account the actual
temperature of the hot water after the heat exchanger of the fresh water station.
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium in the component |
| GenericDomesticHotWaterWithHeatExchanger | dat | | Performance data |
| Nominal condition |
| HeatFlowRate | QHotWat_flow_nominal | | Nominal capacity of heat pump condenser for hot water production system (>=0) [W] |
| TemperatureDifference | dT_nominal | | Nominal temperature difference from the condenser [K] |
| Assumptions |
| Boolean | allowFlowReversal | true | = false to simplify equations, assuming, but not enforcing, no flow reversal |
| Initialization |
| Temperature | T_start | Medium.T_default | Temperature start value of the tank [K] |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium in the component |
| FluidPort_a | port_a | Fluid connector a (positive design flow direction is from port_a to port_b) |
| FluidPort_b | port_b | Fluid connector b (positive design flow direction is from port_a to port_b) |
| input RealInput | THotWatSupSet | Domestic hot water temperature set point for supply to fixtures [K] |
| input RealInput | TColWat | Cold water temperature [K] |
| input RealInput | QReqHotWat_flow | Service hot water load [W] |
| output RealOutput | PEle | Electric power required for pumping equipment [W] |
| output BooleanOutput | charge | Output true if tank needs to be charged, false if it is sufficiently charged |
| output RealOutput | TTanTop | Top temperature of tank [K] |
| output RealOutput | dHFlo | Enthalpy flow rate [W] |
Modelica definition
model DHWConsumption
replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium
;
parameter Boolean allowFlowReversal = true
;
parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger
dat ;
parameter Modelica.Units.SI.HeatFlowRate QHotWat_flow_nominal(min=0)
;
parameter Modelica.Units.SI.TemperatureDifference dT_nominal(min=Modelica.Constants.eps)
;
final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=QHotWat_flow_nominal/4200/dT_nominal
;
parameter Medium.Temperature T_start=Medium.T_default
;
Modelica.Fluid.Interfaces.FluidPort_a port_a(
redeclare final package Medium =
Medium,
m_flow(min=
if allowFlowReversal
then -Modelica.Constants.inf
else 0),
h_outflow(
start = Medium.h_default,
nominal = Medium.h_default),
Xi_outflow(
each nominal=0.01))
;
Modelica.Fluid.Interfaces.FluidPort_b port_b(
redeclare final package Medium =
Medium,
m_flow(max=
if allowFlowReversal
then +Modelica.Constants.inf
else 0),
h_outflow(
start = Medium.h_default,
nominal = Medium.h_default),
Xi_outflow(
each nominal=0.01))
;
Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger
domHotWatTan(
redeclare final package MediumDom =
Medium,
redeclare final package MediumHea =
Medium,
final dat=dat,
final TTan_start=T_start)
;
Buildings.DHC.Loads.HotWater.ThermostaticMixingValve theMixVal(
redeclare final package Medium =
Medium, mMix_flow_nominal=1.2*dat.mDom_flow_nominal)
;
Buildings.Fluid.Sources.Boundary_pT souDCW(
redeclare final package Medium =
Medium,
use_T_in=true,
nPorts=1) ;
Buildings.DHC.ETS.BaseClasses.Junction dcwSpl(
redeclare final package Medium =
Medium,
portFlowDirection_1=Modelica.Fluid.Types.PortFlowDirection.Entering,
portFlowDirection_2=Modelica.Fluid.Types.PortFlowDirection.Leaving,
portFlowDirection_3=Modelica.Fluid.Types.PortFlowDirection.Leaving,
final m_flow_nominal=m_flow_nominal*{1,-1,-1})
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput THotWatSupSet(
final unit="K",
displayUnit="degC")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TColWat(
final unit="K",
displayUnit="degC")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput QReqHotWat_flow(
final unit="W")
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai(k=1/QHotWat_flow_nominal)
;
Modelica.Blocks.Interfaces.RealOutput PEle(unit="W")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput TTanTop(
final unit="K",
displayUnit="degC")
;
Modelica.Blocks.Sources.RealExpression expTTanTop(
y=domHotWatTan.TTanTop.T) ;
Buildings.DHC.Networks.BaseClasses.DifferenceEnthalpyFlowRate dHFlow(
redeclare final package Medium1 =
Medium,
redeclare final package Medium2 =
Medium,
final m_flow_nominal=m_flow_nominal,
allowFlowReversal=false)
;
Modelica.Blocks.Interfaces.RealOutput dHFlo(unit="W") ;
equation
connect(port_a, domHotWatTan.port_aHea);
connect(domHotWatTan.port_bHea, port_b);
connect(souDCW.ports[1], dcwSpl.port_1);
connect(dcwSpl.port_2, theMixVal.port_col);
connect(souDCW.T_in, TColWat);
connect(theMixVal.yMixSet, gai.y);
connect(QReqHotWat_flow, gai.u);
connect(THotWatSupSet, theMixVal.TMixSet);
connect(THotWatSupSet, domHotWatTan.TDomSet);
connect(domHotWatTan.PEle, PEle);
connect(domHotWatTan.charge, charge);
connect(expTTanTop.y, TTanTop);
connect(domHotWatTan.port_bDom, dHFlow.port_a1);
connect(dHFlow.port_b1, theMixVal.port_hot);
connect(dcwSpl.port_3, dHFlow.port_a2);
connect(dHFlow.port_b2, domHotWatTan.port_aDom);
connect(dHFlow.dH_flow, dHFlo);
end DHWConsumption;
Base subsystem with district heat exchanger
Information
This is a model for a district heat exchanger system with a variable speed
pump on the secondary side, and a variable speed pump (in case of a passive
network) or a two-way modulating valve (in case of an active network)
on the primary side.
The system is controlled based on the logic described in
Buildings.Obsolete.DHC.ETS.Combined.Controls.HeatExchanger.
The pump flow rate is considered proportional to the pump speed
under the assumption of a constant flow resistance in both the primary and
the secondary loops.
Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by many models).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium1 | PartialMedium | Medium 1 in the component |
| replaceable package Medium2 | PartialMedium | Medium 2 in the component |
| ConnectionConfiguration | conCon | | District connection configuration |
| Nominal condition |
| MassFlowRate | m1_flow_nominal | abs(Q_flow_nominal/4200/(T_b... | Nominal mass flow rate [kg/s] |
| MassFlowRate | m2_flow_nominal | abs(Q_flow_nominal/4200/(T_b... | Nominal mass flow rate [kg/s] |
| PressureDifference | dp1Hex_nominal | | Nominal pressure drop across heat exchanger on district side [Pa] |
| PressureDifference | dp2Hex_nominal | | Nominal pressure drop across heat exchanger on building side [Pa] |
| PressureDifference | dpVal1_nominal | dp1Hex_nominal/2 | Nominal pressure drop of primary control valve [Pa] |
| PressureDifference | dpVal2_nominal | dp2Hex_nominal/2 | Nominal pressure drop of secondary control valve [Pa] |
| HeatFlowRate | Q_flow_nominal | | Nominal heat flow rate (from district to building) [W] |
| Temperature | T_a1_nominal | | Nominal water inlet temperature on district side [K] |
| Temperature | T_b1_nominal | | Nominal water outlet temperature on district side [K] |
| Temperature | T_a2_nominal | | Nominal water inlet temperature on building side [K] |
| Temperature | T_b2_nominal | | Nominal water outlet temperature on building side [K] |
| Controls |
| Real | spePum1Min | 0.1 | Heat exchanger primary pump minimum speed (fractional) [1] |
| Real | spePum2Min | 0.1 | Heat exchanger secondary pump minimum speed (fractional) [1] |
| Assumptions |
| Boolean | allowFlowReversal1 | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1 |
| Boolean | allowFlowReversal2 | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2 |
| Advanced |
| MassFlowRate | m1_flow_small | 1E-4*abs(m1_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| MassFlowRate | m2_flow_small | 1E-4*abs(m2_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| Diagnostics |
| Boolean | show_T | false | = true, if actual temperature at port is computed |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a1 | Fluid connector a1 (positive design flow direction is from port_a1 to port_b1) |
| FluidPort_b | port_b1 | Fluid connector b1 (positive design flow direction is from port_a1 to port_b1) |
| FluidPort_a | port_a2 | Fluid connector a2 (positive design flow direction is from port_a2 to port_b2) |
| FluidPort_b | port_b2 | Fluid connector b2 (positive design flow direction is from port_a2 to port_b2) |
| input BooleanInput | on | Control signal for secondary side (from supervisory). Set to true to operate subsystem |
| output RealOutput | PPum | Power drawn by pump motors [W] |
Modelica definition
model HeatExchanger
extends Buildings.Fluid.Interfaces.PartialFourPortInterface(
final m1_flow_nominal=
abs(Q_flow_nominal/4200/(T_b1_nominal - T_a1_nominal)),
final m2_flow_nominal=
abs(Q_flow_nominal/4200/(T_b2_nominal - T_a2_nominal)));
parameter DHC.ETS.Types.ConnectionConfiguration conCon
;
parameter Modelica.Units.SI.PressureDifference dp1Hex_nominal(displayUnit=
"Pa") ;
parameter Modelica.Units.SI.PressureDifference dp2Hex_nominal(displayUnit=
"Pa") ;
parameter Modelica.Units.SI.PressureDifference dpVal1_nominal(displayUnit=
"Pa") = dp1Hex_nominal/2
;
parameter Modelica.Units.SI.PressureDifference dpVal2_nominal(displayUnit=
"Pa") = dp2Hex_nominal/2
;
parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal
;
parameter Modelica.Units.SI.Temperature T_a1_nominal
;
parameter Modelica.Units.SI.Temperature T_b1_nominal
;
parameter Modelica.Units.SI.Temperature T_a2_nominal
;
parameter Modelica.Units.SI.Temperature T_b2_nominal
;
parameter Real spePum1Min(unit="1")=0.1
;
parameter Real spePum2Min(unit="1")=0.1
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput on
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum(
final unit="W")
;
Buildings.Fluid.HeatExchangers.PlateHeatExchangerEffectivenessNTU hex(
redeclare final package Medium1 =
Medium1,
redeclare final package Medium2 =
Medium2,
show_T=true,
final use_Q_flow_nominal=true,
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow,
final allowFlowReversal1=allowFlowReversal1,
final allowFlowReversal2=allowFlowReversal2,
final dp1_nominal=
if have_val1
then 0
else dp1Hex_nominal,
final dp2_nominal=0,
final m1_flow_nominal=m1_flow_nominal,
final m2_flow_nominal=m2_flow_nominal,
final Q_flow_nominal=Q_flow_nominal,
final T_a1_nominal=T_a1_nominal,
final T_a2_nominal=T_a2_nominal)
;
DHC.ETS.BaseClasses.Pump_m_flow pum1(
redeclare final package Medium =
Medium1,
final m_flow_nominal=m1_flow_nominal,
final dp_nominal=dp1Hex_nominal,
final allowFlowReversal=allowFlowReversal1)
if not have_val1
;
DHC.ETS.BaseClasses.Pump_m_flow pum2(
redeclare final package Medium =
Medium2,
final m_flow_nominal=m2_flow_nominal,
final dp_nominal=dp2Hex_nominal,
final allowFlowReversal=allowFlowReversal2)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatEnt(
redeclare final package Medium =
Medium2,
final m_flow_nominal=m2_flow_nominal,
final allowFlowReversal=allowFlowReversal2)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatLvg(
redeclare final package Medium =
Medium2,
final m_flow_nominal=m2_flow_nominal,
final allowFlowReversal=allowFlowReversal2)
;
Fluid.Actuators.Valves.TwoWayPressureIndependent val1(
redeclare final package Medium =
Medium1,
final m_flow_nominal=m1_flow_nominal,
from_dp=true,
final dpValve_nominal=dpVal1_nominal,
use_strokeTime=false,
final dpFixed_nominal=dp1Hex_nominal)
if have_val1
;
Buildings.Controls.OBC.CDL.Reals.MultiSum totPPum(
final nin=
if have_val1
then
1
else
2)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal mPum1_flow(
realTrue=m1_flow_nominal)
if not have_val1
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal mPum2_flow2(
realTrue=m2_flow_nominal)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal yVal(realTrue=1)
if have_val1
;
protected
parameter Boolean have_val1=
conCon == DHC.ETS.Types.ConnectionConfiguration.TwoWayValve
;
equation
if have_val1
then
connect(port_a1, hex.port_a1);
else
connect(hex.port_b1, port_b1);
end if;
connect(port_a1,pum1.port_a);
connect(val1.port_b,port_b1);
connect(pum2.port_b,senT2WatEnt.port_a);
connect(senT2WatEnt.port_b,hex.port_a2);
connect(pum1.P,totPPum.u[2]);
connect(pum2.P,totPPum.u[1]);
connect(totPPum.y,PPum);
connect(hex.port_b2,senT2WatLvg.port_a);
connect(hex.port_b1, val1.port_a);
connect(pum1.port_b, hex.port_a1);
connect(pum1.m_flow_in, mPum1_flow.y);
connect(pum2.m_flow_in, mPum2_flow2.y);
connect(yVal.y, val1.y);
connect(port_a2, pum2.port_a);
connect(senT2WatLvg.port_b, port_b2);
connect(on, yVal.u);
connect(on, mPum2_flow2.u);
connect(mPum1_flow.u, on);
end HeatExchanger;
Base subsystem with water-to-water heat pump
Information
This model represents a water-to-water heat pump, an evaporator water pump,
and a condenser water pump.
The heat pump model is described in
Buildings.Fluid.HeatPumps.Carnot_TCon.
By default, a variable speed condenser pump is considered, but a constant speed
pump may also be represented by setting have_varFloCon to false.
The evaporator hydronics and control are described in
Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump.
Condenser Controls
The system is enabled when the input control signal uEna switches to
true.
When enabled, on the condenser side,
-
the condenser water pumps are commanded on and supply either
the condenser mass flow rate set point provided as an input in the case of the variable speed condenser pump,
or the nominal mass flow rate in the case of the constant speed condenser pump,
-
the heat pump controller—idealized in this model—tracks the
supply temperature set point at the condenser outlet.
Extends from Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump (Partial base class for subsystems containing a heat pump).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium1 | PartialMedium | Medium model on condenser side |
| replaceable package Medium2 | PartialMedium | Medium model on evaporator side |
| Boolean | have_varFloCon | true | Set to true for a variable condenser flow |
| Nominal condition |
| Real | COP_nominal | | Heat pump COP [1] |
| Temperature | TCon_nominal | | Condenser outlet temperature used to compute COP_nominal [K] |
| Temperature | TEva_nominal | | Evaporator outlet temperature used to compute COP_nominal [K] |
| TemperatureDifference | dT_nominal | 5 | Water temperature drop/increase accross load and source-side HX (always positive) [K] |
| Pressure | dp1_nominal | | Pressure difference over condenser [Pa] |
| Pressure | dp2_nominal | | Pressure difference over evaporator [Pa] |
| HeatFlowRate | Q1_flow_nominal | | Heating heat flow rate [W] |
| Initialization |
| BooleanInput | uEna.start | false | Enable signal |
| Assumptions |
| Boolean | allowFlowReversal1 | false | Set to true to allow flow reversal on condenser side |
| Boolean | allowFlowReversal2 | false | Set to true to allow flow reversal on evaporator side |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a2 | Fluid port for entering evaporator water |
| FluidPort_b | port_b2 | Fluid port for leaving evaporator water |
| FluidPort_a | port_a1 | Fluid port for cold domestic water |
| FluidPort_b | port_b1 | Fluid port for heated domestic hot water |
| output RealOutput | PHea | Heat pump power [W] |
| output RealOutput | PPum | Pump power [W] |
| output RealOutput | mEva_flow | Evaporator water mass flow rate [kg/s] |
| input RealInput | TSupSet | Supply temperature set point [K] |
| input RealInput | m1_flow | Condenser mass flow rate [kg/s] |
| Initialization |
| input BooleanInput | uEna | Enable signal |
Modelica definition
model HeatPump
extends Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump
(
heaPum(QCon_flow_nominal=Q1_flow_nominal));
parameter Boolean have_varFloCon = true
;
parameter Modelica.Units.SI.HeatFlowRate Q1_flow_nominal(min=0)
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TSupSet(
final unit="K",
displayUnit="degC")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput m1_flow(
final unit="kg/s")
if have_varFloCon
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant floConNom(
final k=mCon_flow_nominal)
if not have_varFloCon
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea;
Buildings.Controls.OBC.CDL.Reals.Multiply floCon
;
equation
connect(booToRea.y, floCon.u1);
connect(m1_flow, floCon.u2);
connect(floConNom.y, floCon.u2);
connect(port_a1, heaPum.port_a1);
connect(pumCon.port_b, port_b1);
connect(TSupSet, heaPum.TSet);
connect(floCon.y, pumCon.m_flow_in);
connect(conPI.trigger, floEva.u);
connect(addPPum.y, PPum);
connect(uEna, booToRea.u);
connect(uEna, floEva.u);
end HeatPump;
Base subsystem with water-to-water heat pump with storage tank for domestic hot water
Information
Model of a water-to-water heat pump with temperature control on evaporator side, with the heat pump
being connected to a domestic hot water tank with fresh water stations.
The heat pump model with storage tank is described in
Buildings.DHC.Loads.HotWater.StorageTankWithExternalHeatExchanger.
The evaporator hydronics and control are described in
Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump.
Condenser Controls
The system is enabled when the tank charge control signal switches to
true.
When enabled,
-
the condenser pump is commanded on and supplies the nominal mass flow rate
to the tank and domestic hot water system,
-
the heat pump evaporator supplies a constant temperature increase from the return to
the supply equal to
dT_nominal.
Extends from Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump (Partial base class for subsystems containing a heat pump).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium1 | PartialMedium | Medium model on condenser side |
| replaceable package Medium2 | PartialMedium | Medium model on evaporator side |
| GenericDomesticHotWaterWithHeatExchanger | datWatHea | | Performance data |
| Nominal condition |
| Real | COP_nominal | | Heat pump COP [1] |
| Temperature | TCon_nominal | | Condenser outlet temperature used to compute COP_nominal [K] |
| Temperature | TEva_nominal | | Evaporator outlet temperature used to compute COP_nominal [K] |
| TemperatureDifference | dT_nominal | 5 | Water temperature drop/increase accross load and source-side HX (always positive) [K] |
| Pressure | dp1_nominal | | Pressure difference over condenser [Pa] |
| Pressure | dp2_nominal | | Pressure difference over evaporator [Pa] |
| HeatFlowRate | QHotWat_flow_nominal | | Nominal capacity of heat pump condenser for hot water production system (>=0) [W] |
| Initialization |
| BooleanInput | uEna.start | false | Enable signal |
| Assumptions |
| Boolean | allowFlowReversal1 | false | Set to true to allow flow reversal on condenser side |
| Boolean | allowFlowReversal2 | false | Set to true to allow flow reversal on evaporator side |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a2 | Fluid port for entering evaporator water |
| FluidPort_b | port_b2 | Fluid port for leaving evaporator water |
| FluidPort_a | port_a1 | Fluid port for cold domestic water |
| FluidPort_b | port_b1 | Fluid port for heated domestic hot water |
| output RealOutput | PHea | Heat pump power [W] |
| output RealOutput | PPum | Pump power [W] |
| output RealOutput | mEva_flow | Evaporator water mass flow rate [kg/s] |
| Initialization |
| input BooleanInput | uEna | Enable signal |
Modelica definition
model HeatPumpDHWTank
extends Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump
(
heaPum(
QCon_flow_nominal=QHotWat_flow_nominal,
QCon_flow_max=QHotWat_flow_nominal),
pumCon(use_riseTime=true),
pumEva(use_riseTime=true));
parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger
datWatHea ;
parameter Modelica.Units.SI.HeatFlowRate QHotWat_flow_nominal(min=0)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal floCon(realTrue=
mCon_flow_nominal) ;
Buildings.DHC.Loads.HotWater.StorageTankWithExternalHeatExchanger heaPumTan(
redeclare package MediumDom =
Medium1,
redeclare package MediumHea =
Medium2,
final dat=datWatHea)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant THotSouSet(
k=datWatHea.TDom_nominal)
;
Buildings.Fluid.Sources.Boundary_pT preRef(
redeclare package Medium =
Medium2,
p(displayUnit="bar"),
nPorts=1) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemHeaPumRet(
redeclare package Medium =
Medium1,
allowFlowReversal=false,
m_flow_nominal=mCon_flow_nominal,
tau=0) ;
Buildings.Controls.OBC.CDL.Reals.AddParameter addPar(
p=dT_nominal) ;
Modelica.Blocks.Math.Add addPPum1 ;
Buildings.Controls.OBC.CDL.Logical.And and2
;
equation
connect(THotSouSet.y, heaPumTan.TDomSet);
connect(heaPumTan.port_bHea, senTemHeaPumRet.port_a);
connect(senTemHeaPumRet.T, addPar.u);
connect(floCon.y, pumCon.m_flow_in);
connect(heaPumTan.port_aHea, pumCon.port_b);
connect(senTemHeaPumRet.port_b, heaPum.port_a1);
connect(addPPum.y, addPPum1.u1);
connect(heaPumTan.PEle, addPPum1.u2);
connect(addPPum1.y, PPum);
connect(addPar.y, heaPum.TSet);
connect(heaPumTan.port_bDom, port_b1);
connect(port_a1, heaPumTan.port_aDom);
connect(uEna, and2.u1);
connect(heaPumTan.charge, and2.u2);
connect(and2.y, floEva.u);
connect(and2.y, floCon.u);
connect(and2.y, conPI.trigger);
connect(preRef.ports[1], heaPum.port_b1);
end HeatPumpDHWTank;
Base subsystem with modular heat recovery heat pump
Information
This is a model for a heat pump system with constant speed evaporator and
condenser pumps, and mixing valves modulated to maintain a minimum
condenser inlet temperature (resp. maximum evaporator inlet temperature).
The system is controlled based on the logic described in
Buildings.DHC.ETS.Combined.Controls.HeatPumpModular.
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium model |
| GenericHeatPump | dat | | Heat pump performance data |
| TemperatureDifference | dTOffSetHea | | Temperature to be added to the set point in order to be slightly above what the heating load requires [K] |
| TemperatureDifference | dTOffSetCoo | | Temperature to be added to the set point in order to be slightly below what the cooling load requires [K] |
| Nominal condition |
| PressureDifference | dpCon_nominal | | Nominal pressure drop accross condenser [Pa] |
| PressureDifference | dpEva_nominal | | Nominal pressure drop accross evaporator [Pa] |
| Pressure | dpValCon_nominal | dpCon_nominal/2 | Nominal pressure drop accross control valve on condenser side [Pa] |
| Pressure | dpValEva_nominal | dpEva_nominal/2 | Nominal pressure drop accross control valve on evaporator side [Pa] |
| Controls |
| Real | THeaWatSupSetMin | | Minimum value of heating water supply temperature set point [K] |
| Real | TChiWatSupSetMax | | Maximum value of chilled water supply temperature set point [K] |
| Assumptions |
| Boolean | allowFlowReversal | false | = true to allow flow reversal, false restricts to design direction (port_a -> port_b) |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium model |
| input BooleanInput | uHeaSpa | True if space heating is required from tank |
| input BooleanInput | uHeaDhw | True if domestic hot water heating is required from tank |
| input BooleanInput | uCoo | True if cooling is required from tank |
| input RealInput | TChiWatSupSet | Chilled water supply temperature set point (may be reset down) [K] |
| FluidPort_a | port_aChiWat | Fluid port for chilled water return |
| FluidPort_b | port_bChiWat | Fluid port for chilled water supply |
| FluidPort_a | port_aHeaWat | Fluid port for heating water return |
| FluidPort_b | port_bHeaWat | Fluid port for heating water supply |
| output RealOutput | PChi | Chiller power [W] |
| output RealOutput | PPum | Pump power [W] |
| input RealInput | THeaWatSupSet | Heating water supply temperature set point [K] |
Modelica definition
model HeatPumpModular
replaceable package Medium=
Modelica.Media.Interfaces.PartialMedium
;
parameter Boolean allowFlowReversal=false
;
parameter Buildings.DHC.ETS.Combined.Data.GenericHeatPump dat
;
parameter Modelica.Units.SI.PressureDifference dpCon_nominal(displayUnit="Pa")
;
parameter Modelica.Units.SI.PressureDifference dpEva_nominal(displayUnit="Pa")
;
parameter Modelica.Units.SI.Pressure dpValCon_nominal=dpCon_nominal/2
;
parameter Modelica.Units.SI.Pressure dpValEva_nominal=dpEva_nominal/2
;
parameter Real THeaWatSupSetMin(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC")
;
parameter Real TChiWatSupSetMax(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC")
;
parameter Modelica.Units.SI.TemperatureDifference dTOffSetHea(
min=0.5,
displayUnit="K")
;
parameter Modelica.Units.SI.TemperatureDifference dTOffSetCoo(
max=-0.5,
displayUnit="K")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHeaSpa
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHeaDhw
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uCoo
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatSupSet(
final unit="K",
displayUnit="degC")
;
Modelica.Fluid.Interfaces.FluidPort_a port_aChiWat(
redeclare final package Medium=
Medium,
m_flow(
min=
if allowFlowReversal
then
-Modelica.Constants.inf
else
0),
h_outflow(
start=Medium.h_default,
nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_b port_bChiWat(
redeclare final package Medium=
Medium,
m_flow(
max=
if allowFlowReversal
then
+Modelica.Constants.inf
else
0),
h_outflow(
start=Medium.h_default,
nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_a port_aHeaWat(
redeclare final package Medium=
Medium,
m_flow(
min=
if allowFlowReversal
then
-Modelica.Constants.inf
else
0),
h_outflow(
start=Medium.h_default,
nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_b port_bHeaWat(
redeclare final package Medium=
Medium,
m_flow(
max=
if allowFlowReversal
then
+Modelica.Constants.inf
else
0),
h_outflow(
start=Medium.h_default,
nominal=Medium.h_default))
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput PChi(
final unit="W")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum(
final unit="W")
;
Buildings.Fluid.HeatPumps.ModularReversible.Modular heaPum(
redeclare package MediumCon =
Medium,
redeclare package MediumEva =
Medium,
redeclare model RefrigerantCycleHeatPumpCooling =
Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.NoCooling,
redeclare model RefrigerantCycleHeatPumpHeating =
Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.TableData2D
(
redeclare final Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Frosting.NoFrosting
iceFacCal,
mCon_flow_nominal=dat.mCon_flow_nominal,
mEva_flow_nominal=dat.mEva_flow_nominal,
final smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments,
final extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints,
final datTab=dat.datHeaSca),
redeclare model RefrigerantCycleInertia =
Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Inertias.NoInertia,
final use_rev=false,
final allowDifferentDeviceIdentifiers=true,
final allowFlowReversalEva=allowFlowReversal,
final allowFlowReversalCon=allowFlowReversal,
final dTCon_nominal=dat.dTCon_nominal,
final dTEva_nominal=dat.dTEva_nominal,
final QHea_flow_nominal=dat.QHeaDes_flow_nominal,
final TConHea_nominal=dat.THeaConLvg_nominal,
final TEvaHea_nominal=dat.THeaEvaLvg_nominal,
final TConCoo_nominal=dat.TCooConLvg_nominal,
final TEvaCoo_nominal=dat.TCooEvaLvg_nominal,
mCon_flow_nominal=dat.mCon_flow_nominal,
mEva_flow_nominal=dat.mEva_flow_nominal,
final dpCon_nominal(displayUnit="Pa") = dpCon_nominal,
final dpEva_nominal(displayUnit="Pa") = dpEva_nominal,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
GEvaIns=0,
GEvaOut=0,
CEva=0,
use_evaCap=false,
GConIns=0,
GConOut=0,
CCon=0,
use_conCap=false,
show_T=true,
use_intSafCtr=false,
limWarSca=0.98) ;
Buildings.DHC.ETS.BaseClasses.Pump_m_flow pumCon(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
use_riseTime=true,
final m_flow_nominal=dat.mCon_flow_nominal,
final dp_nominal=dpCon_nominal + dpValCon_nominal + 2*0.05*dpValCon_nominal,
dpMax=5*(dpCon_nominal + dpValCon_nominal + 2*0.05*dpValCon_nominal))
;
Buildings.DHC.ETS.BaseClasses.Pump_m_flow pumEva(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
use_riseTime=true,
final m_flow_nominal=dat.mEva_flow_nominal,
final dp_nominal=dpEva_nominal + dpValEva_nominal + dpEva_nominal*0.05,
dpMax=5*(dpEva_nominal + dpValEva_nominal + dpEva_nominal*0.05))
;
Buildings.DHC.ETS.Combined.Controls.HeatPumpModular con(
final PLRMin=dat.PLRMin,
THeaWatSupSetMin=THeaWatSupSetMin,
TChiWatSupSetMax=TChiWatSupSetMax,
final dTOffSetHea=dTOffSetHea,
final dTOffSetCoo=dTOffSetCoo) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTConLvg(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
final m_flow_nominal=dat.mCon_flow_nominal)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTConEnt(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
final m_flow_nominal=dat.mCon_flow_nominal)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTEvaEnt(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
final m_flow_nominal=dat.mEva_flow_nominal)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTEvaLvg(
redeclare final package Medium=
Medium,
final allowFlowReversal=allowFlowReversal,
final m_flow_nominal=dat.mEva_flow_nominal)
;
Buildings.DHC.ETS.BaseClasses.Junction splEva(
redeclare final package Medium=
Medium,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
final portFlowDirection_1=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
final portFlowDirection_2=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
final portFlowDirection_3=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
m_flow_nominal=dat.mEva_flow_nominal*{1,-1,-1})
;
Buildings.DHC.ETS.BaseClasses.Junction splConMix(
redeclare final package Medium=
Medium,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
final portFlowDirection_1=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
final portFlowDirection_2=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
final portFlowDirection_3=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
m_flow_nominal=dat.mCon_flow_nominal*{1,-1,-1})
;
Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valEva(
redeclare final package Medium =
Medium,
final portFlowDirection_1=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
final portFlowDirection_2=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
final portFlowDirection_3=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
from_dp=false,
use_strokeTime=false,
final m_flow_nominal=dat.mEva_flow_nominal,
final dpValve_nominal=dpValEva_nominal,
linearized={true,true})
;
Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valCon(
redeclare final package Medium =
Medium,
final portFlowDirection_1=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
final portFlowDirection_2=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Leaving,
final portFlowDirection_3=
if allowFlowReversal
then Modelica.Fluid.Types.PortFlowDirection.Bidirectional
else Modelica.Fluid.Types.PortFlowDirection.Entering,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
from_dp=false,
use_strokeTime=false,
final m_flow_nominal=dat.mCon_flow_nominal,
final dpValve_nominal=dpValCon_nominal,
linearized={true,true})
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea
;
Buildings.Controls.OBC.CDL.Reals.Add add2;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
final k=dat.mCon_flow_nominal)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(
final k=dat.mEva_flow_nominal)
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaWatSupSet(
final unit="K",
displayUnit="degC") ;
Fluid.Sensors.TemperatureTwoPort senTHeaWatRet(
redeclare package Medium =
Medium,
allowFlowReversal=true,
final m_flow_nominal=dat.mCon_flow_nominal)
;
Fluid.Sensors.TemperatureTwoPort senTChiWatRet(
redeclare package Medium =
Medium,
allowFlowReversal=true,
final m_flow_nominal=dat.mCon_flow_nominal)
;
protected
final parameter Medium.ThermodynamicState sta_default=
Medium.setState_pTX(
T=Medium.T_default,
p=Medium.p_default,
X=Medium.X_default[1:Medium.nXi])
;
final parameter Modelica.Units.SI.SpecificHeatCapacity cp_default=
Medium.specificHeatCapacityCp(sta_default)
;
initial equation
assert(dat.QCooAct_flow_nominal <= dat.QCooDes_flow_nominal,
"In " +
getInstanceName() + ": The heat pump is sized for heating.
However, at the cooling design conditions,
this results in a cooling capacity of QCooAct_flow_nominal = " +
String(dat.QCooAct_flow_nominal) + " W,
but the desired cooling capacity is QCooDes_flow_nominal = " +
String(dat.QCooDes_flow_nominal) + " W.
You need to size the heat pump for a bigger heating load.",
level=AssertionLevel.warning);
equation
connect(splConMix.port_3,valCon.port_3);
connect(valCon.port_2,pumCon.port_a);
connect(pumEva.port_b,splEva.port_1);
connect(splEva.port_3,valEva.port_3);
connect(con.yValEva,valEva.y);
connect(con.yValCon,valCon.y);
connect(uHeaSpa, con.uHeaSpa);
connect(uCoo,con.uCoo);
connect(splConMix.port_2,port_bHeaWat);
connect(splEva.port_2,port_bChiWat);
connect(valEva.port_2,senTEvaEnt.port_a);
connect(senTEvaLvg.port_b,pumEva.port_a);
connect(senTEvaLvg.port_a, heaPum.port_b2);
connect(senTEvaEnt.port_b, heaPum.port_a2);
connect(heaPum.port_b1, senTConLvg.port_a);
connect(senTConLvg.port_b,splConMix.port_1);
connect(pumCon.port_b,senTConEnt.port_a);
connect(senTConEnt.port_b, heaPum.port_a1);
connect(heaPum.P, PChi);
connect(add2.y,PPum);
connect(pumEva.P,add2.u2);
connect(pumCon.P,add2.u1);
connect(con.yPum,booToRea.u);
connect(booToRea.y,gai2.u);
connect(gai2.y,pumEva.m_flow_in);
connect(gai1.y,pumCon.m_flow_in);
connect(booToRea.y,gai1.u);
connect(con.TChiWatSupSet, TChiWatSupSet);
connect(con.TEvaWatLvg, senTEvaLvg.T);
connect(con.yCom, heaPum.ySet);
connect(con.THeaWatSupSet, THeaWatSupSet);
connect(senTConLvg.T, con.TConWatLvg);
connect(con.uHeaDhw, uHeaDhw);
connect(senTHeaWatRet.port_a, port_aHeaWat);
connect(senTHeaWatRet.port_b, valCon.port_1);
connect(port_aChiWat, senTChiWatRet.port_a);
connect(senTChiWatRet.port_b, valEva.port_1);
end HeatPumpModular;
A model of a storage tank with external heat exchanger to produce hot water
Information
This model implements a heating hot water tank with external heat exchanger that heats domestic hot water.
The storage tank model is described in
Buildings.Fluid.Storage.StratifiedEnhancedInternalHex.
The heat pump and storage tank system should be parameterized altogether using
Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger.
It is based on Fig. 3 in Evaluations of different domestic hot water
preparing methods with ultra-low-temperature district heating by X. Yang,
H. Li, and S. Svendsen at
doi.org/10.1016/j.energy.2016.04.109, as well as the
Advanced Energy Design Guide for Multifamily Buildings-Achieving Zero Energy
published by ASHRAE in 2022 at
https://www.ashrae.org/technical-resources/aedgs/zero-energy-aedg-free-download.
For a model that connects this hot water system to a heat pump, see
Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank.
Extends from Buildings.DHC.Loads.HotWater.BaseClasses.PartialFourPortDHW (A partial model for domestic water heating).
Parameters
| Type | Name | Default | Description |
| replaceable package MediumDom | PartialMedium | Medium for domestic water in the component |
| replaceable package MediumHea | PartialMedium | Medium for heating source in the component |
| GenericDomesticHotWaterWithHeatExchanger | dat | | Performance data |
| Real | k | 0.1 | Proportional gain of circulation pump controller |
| Real | Ti | 60 | Integrator time constant of circulation pump controller |
| Assumptions |
| Boolean | allowFlowReversalDom | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for domestic water |
| Boolean | allowFlowReversalHea | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for heating water |
| Initialization |
| Temperature | TTan_start | 323.15 | Start value of tank temperature [K] |
Connectors
| Type | Name | Description |
| FluidPort_a | port_aDom | Fluid connector for cold water (or recirculation water) |
| FluidPort_b | port_bDom | Fluid connector for heated domestic hot water |
| FluidPort_a | port_aHea | Fluid connector for heating water (positive design flow direction is from port_a to port_b) |
| FluidPort_b | port_bHea | Fluid connector b for heating water (positive design flow direction is from port_a to port_b) |
| input RealInput | TDomSet | Temperature setpoint for heated domestic water [K] |
| output RealOutput | PEle | Electric power required for pumping equipment [W] |
| output BooleanOutput | charge | Output true if tank needs to be charged, false if it is sufficiently charged |
Modelica definition
model StorageTankWithExternalHeatExchanger
extends Buildings.DHC.Loads.HotWater.BaseClasses.PartialFourPortDHW;
parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger
dat ;
parameter Real k=0.1 ;
parameter Real Ti=60 ;
parameter Modelica.Media.Interfaces.Types.Temperature TTan_start=323.15
;
final parameter Real eps =
dat.QHex_flow_nominal / CMin_flow_nominal / ( dat.TDom_nominal + dat.dTHexApp_nominal - dat.TCol_nominal)
;
Buildings.Fluid.Movers.Preconfigured.FlowControlled_dp pumHex(
redeclare package Medium =
MediumHea,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
riseTime=10,
m_flow_nominal=dat.mHex_flow_nominal,
dp_nominal=dat.dpHexHea_nominal) ;
Buildings.Fluid.Storage.Stratified tan(
redeclare package Medium =
MediumHea,
kIns=dat.kIns,
final T_start=TTan_start,
hTan=dat.hTan,
dIns=dat.dIns,
VTan=dat.VTan,
nSeg=dat.nSeg,
m_flow_nominal=dat.mHex_flow_nominal)
;
Modelica.Blocks.Interfaces.RealOutput PEle(unit="W")
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemHot(
redeclare package Medium =
MediumDom,
final allowFlowReversal=allowFlowReversalDom,
m_flow_nominal=dat.mDom_flow_nominal)
;
Buildings.Fluid.HeatExchangers.ConstantEffectiveness hex(
redeclare package Medium1 =
MediumDom,
redeclare package Medium2 =
MediumHea,
final allowFlowReversal1=allowFlowReversalDom,
m1_flow_nominal=dat.mDom_flow_nominal,
m2_flow_nominal=dat.mHex_flow_nominal,
dp1_nominal=dat.dpHexHea_nominal,
from_dp2=true,
dp2_nominal=dat.dpHexDom_nominal,
eps=eps);
Buildings.Fluid.FixedResistances.Junction junTop(
redeclare package Medium =
MediumHea,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
m_flow_nominal=dat.mHex_flow_nominal*{1,1,1},
dp_nominal=
zeros(3)) ;
Buildings.Fluid.Sensors.MassFlowRate senMasFlo(
redeclare package Medium =
MediumDom)
;
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor TTanTop(
T(displayUnit="degC"))
;
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor TTanBot(
T(displayUnit="degC"))
;
Buildings.DHC.Loads.HotWater.BaseClasses.HeatExchangerPumpController conPum(
final mDom_flow_nominal=dat.mDom_flow_nominal,
final dpPum_nominal=dat.dpHexHea_nominal)
;
Buildings.DHC.Loads.HotWater.BaseClasses.TankChargingController conCha ;
Buildings.Fluid.Actuators.Valves.ThreeWayLinear divVal(
redeclare package Medium =
MediumHea,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
m_flow_nominal=dat.mHex_flow_nominal,
dpValve_nominal=1000) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemRet(
redeclare package Medium =
MediumHea,
m_flow_nominal=dat.mHex_flow_nominal)
;
Buildings.DHC.Loads.HotWater.BaseClasses.TankValveController conVal ;
Buildings.Controls.OBC.CDL.Reals.AddParameter dTHexApp(p=dat.dTHexApp_nominal)
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemHeaSup(
redeclare package Medium =
MediumHea,
final allowFlowReversal=allowFlowReversalHea,
final m_flow_nominal=dat.mHex_flow_nominal)
;
protected
parameter Modelica.Units.SI.SpecificHeatCapacity cpHea_default =
MediumHea.specificHeatCapacityCp(
MediumHea.setState_pTX(
MediumHea.p_default,
MediumHea.T_default,
MediumHea.X_default))
;
parameter Modelica.Units.SI.SpecificHeatCapacity cpDom_default =
MediumDom.specificHeatCapacityCp(
MediumDom.setState_pTX(
MediumDom.p_default,
MediumDom.T_default,
MediumDom.X_default))
;
parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal =
min(dat.mHex_flow_nominal*cpHea_default, dat.mDom_flow_nominal*cpDom_default)
;
initial equation
assert(eps < 1, "In " +
getInstanceName() + ": Heat exchanger effectivness must be below 1, received eps = " +
String(eps) + ". Check sizing.");
equation
connect(tan.port_a, junTop.port_3);
connect(pumHex.P, PEle);
connect(hex.port_b1, senMasFlo.port_a);
connect(senMasFlo.port_b, senTemHot.port_a);
connect(TTanTop.port, tan.heaPorVol[1]);
connect(senMasFlo.m_flow, conPum.mDom_flow);
connect(senTemHot.T, conPum.TDom);
connect(conPum.TDomSet, TDomSet);
connect(conCha.TTanTop, TTanTop.T);
connect(conCha.charge, charge);
connect(senTemHot.port_b, port_bDom);
connect(conPum.dpPumHex, pumHex.dp_in);
connect(port_aDom, hex.port_a1);
connect(junTop.port_1, hex.port_a2);
connect(hex.port_b2, pumHex.port_a);
connect(senTemRet.port_b, divVal.port_2);
connect(divVal.port_1, tan.fluPorVol[
integer(dat.nSeg/2)]);
connect(senTemRet.T, conVal.TRet);
connect(conVal.y, divVal.y);
connect(TTanBot.port, tan.heaPorVol[dat.nSeg]);
connect(conCha.TTanTopSet, dTHexApp.y);
connect(dTHexApp.u, TDomSet);
connect(divVal.port_3, tan.fluPorVol[dat.nSeg]);
connect(tan.port_b, port_bHea);
connect(pumHex.port_b, senTemRet.port_a);
connect(TTanBot.T, conCha.TTanBot);
connect(junTop.port_2, senTemHeaSup.port_b);
connect(senTemHeaSup.port_a, port_aHea);
end StorageTankWithExternalHeatExchanger;
Stratified buffer tank model
Information
This is a four-port tank model based on
Buildings.Fluid.Storage.Stratified
which includes the following features.
-
The two fluid ports suffixed with
Top are connected
to the fluid volume at the top of the tank.
-
The two fluid ports suffixed with
Bot are connected
to the fluid volume at the bottom of the tank.
-
A unique heat port is exposed as an external connector. It is
meant to provide a uniform temperature boundary condition at
the external surface of the tank (outside insulation).
-
The model outputs the temperature of the fluid volumes at the top
and at the bottom of the tank.
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium model |
| Volume | VTan | | Tank volume [m3] |
| Length | hTan | | Height of tank (without insulation) [m] |
| Length | dIns | | Thickness of insulation [m] |
| ThermalConductivity | kIns | 0.04 | Specific heat conductivity of insulation [W/(m.K)] |
| Integer | nSeg | 3 | Number of volume segments |
| Boolean | isHotWat | | True if the tank supplies hot water, false for chilled water |
| TemperatureDifference | dTOffSet | if tanCha.isHotWat then +1 e... | Offset for set point to have a slightly higher (or lower) temperature than the required supply from the load [K] |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate [kg/s] |
| Initialization |
| Temperature | T_start | Medium.T_default | Temperature start value [K] |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium model |
| FluidPort_a | port_genTop | Tank top port on generation side |
| FluidPort_b | port_genBot | Tank bottom port on generation side |
| FluidPort_a | port_loaBot | Tank bottom port on load side |
| FluidPort_b | port_loaTop | Tank top port on load side |
| output RealOutput | Ql_flow | Heat loss of tank (positive if heat flows from tank to ambient) [W] |
| output RealOutput | TTop | Fluid temperature at tank top [K] |
| output RealOutput | TBot | Fluid temperature at tank bottom [K] |
| HeatPort_a | heaPorAmb | Heat port at interface with ambient (outside insulation) |
| input RealInput | TTanSet | Tank temperature set point, top for hot tank and bottom for cold tank [K] |
| output BooleanOutput | charge | Outputs true if tank should be charged |
Modelica definition
model StratifiedTankWithCommand
replaceable package Medium=
Modelica.Media.Interfaces.PartialMedium
;
final parameter Boolean allowFlowReversal=true
;
parameter Modelica.Units.SI.Volume VTan ;
parameter Modelica.Units.SI.Length hTan ;
parameter Modelica.Units.SI.Length dIns ;
parameter Modelica.Units.SI.ThermalConductivity kIns=0.04
;
parameter Integer nSeg(
min=2)=3
;
parameter Modelica.Units.SI.MassFlowRate m_flow_nominal
;
parameter Medium.Temperature T_start=Medium.T_default
;
parameter Boolean isHotWat
;
parameter Modelica.Units.SI.TemperatureDifference dTOffSet=
if tanCha.isHotWat
then +1
else -1
;
Modelica.Fluid.Interfaces.FluidPort_a port_genTop(
redeclare final package Medium =
Medium,
m_flow(min=
if allowFlowReversal
then -Modelica.Constants.inf
else 0),
h_outflow(start=Medium.h_default, nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_b port_genBot(
redeclare final package Medium =
Medium,
m_flow(max=
if allowFlowReversal
then +Modelica.Constants.inf
else 0),
h_outflow(start=Medium.h_default, nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_a port_loaBot(
redeclare final package Medium =
Medium,
m_flow(min=
if allowFlowReversal
then -Modelica.Constants.inf
else 0),
h_outflow(start=Medium.h_default, nominal=Medium.h_default))
;
Modelica.Fluid.Interfaces.FluidPort_b port_loaTop(
redeclare final package Medium =
Medium,
m_flow(max=
if allowFlowReversal
then +Modelica.Constants.inf
else 0),
h_outflow(start=Medium.h_default, nominal=Medium.h_default))
;
Modelica.Blocks.Interfaces.RealOutput Ql_flow(
final unit="W")
;
Modelica.Blocks.Interfaces.RealOutput TTop(
final unit="K",
displayUnit="degC")
;
Modelica.Blocks.Interfaces.RealOutput TBot(
final unit="K",
displayUnit="degC")
;
Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heaPorAmb
;
Buildings.Fluid.Storage.Stratified tan(
redeclare final package Medium =
Medium,
final m_flow_nominal=m_flow_nominal,
final VTan=VTan,
final hTan=hTan,
final dIns=dIns,
final kIns=kIns,
final nSeg=nSeg,
final T_start=T_start) ;
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTBot
;
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTTop
;
Buildings.DHC.ETS.Combined.Controls.TankChargingController tanCha(
final
dTOffSet=dTOffSet,
final isHotWat=isHotWat) ;
Modelica.Blocks.Interfaces.RealInput TTanSet(
final unit="K",
displayUnit="degC")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge
;
Buildings.Fluid.FixedResistances.Junction junTop(
redeclare package Medium =
Medium,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
T_start=T_start,
m_flow_nominal=m_flow_nominal*{1,-1,-1},
dp_nominal=
zeros(3)) ;
Buildings.Fluid.FixedResistances.Junction junBot(
redeclare package Medium =
Medium,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
T_start=T_start,
m_flow_nominal=m_flow_nominal*{1,-1,1},
dp_nominal=
zeros(3)) ;
protected
Modelica.Thermal.HeatTransfer.Components.ThermalCollector theCol(
m=3)
;
equation
connect(tan.Ql_flow,Ql_flow);
connect(tan.heaPorVol[nSeg],senTBot.port);
connect(tan.heaPorVol[1],senTTop.port);
connect(senTTop.T,TTop);
connect(senTBot.T,TBot);
connect(heaPorAmb,theCol.port_b);
connect(theCol.port_a[1],tan.heaPorTop);
connect(theCol.port_a[2],tan.heaPorSid);
connect(theCol.port_a[3],tan.heaPorBot);
connect(senTTop.T, tanCha.TTanTop);
connect(senTBot.T, tanCha.TTanBot);
connect(tanCha.charge, charge);
connect(junTop.port_3, tan.port_a);
connect(tan.port_b, junBot.port_3);
connect(port_loaBot, junBot.port_1);
connect(junBot.port_2, port_genBot);
connect(port_loaTop, junTop.port_2);
connect(junTop.port_1, port_genTop);
connect(TTanSet, tanCha.TTanSet);
end StratifiedTankWithCommand;
Model for mass flow rate redirection with three-port two-position directional valves
Information
This model represents a hydronic arrangement avoid flow reversal in the service line,
for instance when connecting an energy transfer station such as the one modeled in
Buildings.DHC.ETS.Combined.HeatPumpHeatExchanger.
For that intent, two three-port two-position directional valves are used. The valves are
actuated based on the logic described in
Buildings.DHC.ETS.Combined.Controls.SwitchBox.
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium model |
| Real | trueHoldDuration | 60 | true hold duration [s] |
| Real | falseHoldDuration | trueHoldDuration | false hold duration [s] |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate [kg/s] |
| PressureDifference | dpValve_nominal | 5000 | Valve pressure drop at nominal conditions [Pa] |
| Dynamics |
| Conservation equations |
| Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Type of energy balance (except for the pump always modeled in steady state) |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium model |
| FluidPort_b | port_bSup | Supply line outlet port |
| FluidPort_b | port_bRet | Return line outlet port |
| FluidPort_a | port_aSup | Supply line inlet port |
| FluidPort_a | port_aRet | Return line inlet port |
| input RealInput | mRev_flow | Service water mass flow rate in reverse direction [kg/s] |
| input RealInput | mPos_flow | Service water mass flow rate in positive direction [kg/s] |
Modelica definition
model SwitchBox
replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium
;
parameter Modelica.Units.SI.MassFlowRate m_flow_nominal
;
parameter Modelica.Units.SI.PressureDifference dpValve_nominal(
min=0,
displayUnit="Pa") = 5000 ;
parameter Real trueHoldDuration(
final unit="s") = 60
;
parameter Real falseHoldDuration(
final unit="s") = trueHoldDuration
;
parameter Modelica.Fluid.Types.Dynamics energyDynamics=
Modelica.Fluid.Types.Dynamics.FixedInitial
;
Modelica.Fluid.Interfaces.FluidPort_b port_bSup(
redeclare package Medium =
Medium)
;
Modelica.Fluid.Interfaces.FluidPort_b port_bRet(
redeclare final package Medium =
Medium)
;
Modelica.Fluid.Interfaces.FluidPort_a port_aSup(
redeclare final package Medium =
Medium)
;
Modelica.Fluid.Interfaces.FluidPort_a port_aRet(
redeclare final package Medium =
Medium)
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput mRev_flow(
final unit="kg/s")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput mPos_flow(
final unit="kg/s")
;
Buildings.DHC.ETS.BaseClasses.Junction splSup(
redeclare final package Medium =
Medium,
m_flow_nominal={1,1,1}*m_flow_nominal)
;
Buildings.DHC.ETS.BaseClasses.Junction splRet(
redeclare final package Medium =
Medium,
m_flow_nominal={1,1,1}*m_flow_nominal)
;
Buildings.DHC.ETS.Combined.Controls.SwitchBox con(
final m_flow_nominal=m_flow_nominal,
final trueHoldDuration=trueHoldDuration,
final falseHoldDuration=falseHoldDuration)
;
Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valSup(
redeclare package Medium =
Medium,
dpValve_nominal=dpValve_nominal,
use_strokeTime=false,
m_flow_nominal=m_flow_nominal,
linearized={true,true},
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState)
;
Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valRet(
redeclare package Medium =
Medium,
dpValve_nominal=dpValve_nominal,
use_strokeTime=false,
m_flow_nominal=m_flow_nominal,
linearized={true,true},
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState)
;
equation
connect(port_bSup, splSup.port_2);
connect(mRev_flow, con.mRev_flow);
connect(splRet.port_1, port_aRet);
connect(valSup.port_1, splSup.port_1);
connect(valSup.port_3, splRet.port_3);
connect(splRet.port_2, valRet.port_1);
connect(splSup.port_3, valRet.port_3);
connect(valRet.port_2, port_bRet);
connect(valSup.port_2, port_aSup);
connect(con.y, valRet.y);
connect(mPos_flow, con.mPos_flow);
connect(con.y, valSup.y);
end SwitchBox;
Base subsystem with waterside economizer
Information
This is a model for a waterside economizer for sidestream integration (in
series with the chillers).
The primary side is typically connected to the service line.
The primary flow rate is modulated either with a variable speed pump or
with a two-way valve.
The secondary side is typically connected to the chilled water return,
using a three-port two-position directional control valve.
The system is controlled based on the logic described in
Buildings.DHC.ETS.Combined.Controls.WatersideEconomizer.
Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by many models).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium1 | PartialMedium | Medium 1 in the component |
| replaceable package Medium2 | PartialMedium | Medium 2 in the component |
| ConnectionConfiguration | conCon | | District connection configuration |
| Nominal condition |
| MassFlowRate | m1_flow_nominal | abs(Q_flow_nominal/4200/(T_b... | Nominal mass flow rate [kg/s] |
| MassFlowRate | m2_flow_nominal | abs(Q_flow_nominal/4200/(T_b... | Nominal mass flow rate [kg/s] |
| PressureDifference | dp1Hex_nominal | | Nominal pressure drop across heat exchanger on district side [Pa] |
| PressureDifference | dp2Hex_nominal | | Nominal pressure drop across heat exchanger on building side [Pa] |
| PressureDifference | dpVal1_nominal | if have_val1 then dp1Hex_nom... | Nominal pressure drop of primary control valve [Pa] |
| PressureDifference | dpVal2_nominal | dp2Hex_nominal/10 | Nominal pressure drop of heat exchanger bypass valve [Pa] |
| HeatFlowRate | Q_flow_nominal | | Nominal heat flow rate (from district to building) [W] |
| Temperature | T_a1_nominal | | Nominal water inlet temperature on district side [K] |
| Temperature | T_b1_nominal | | Nominal water outlet temperature on district side [K] |
| Temperature | T_a2_nominal | | Nominal water inlet temperature on building side [K] |
| Temperature | T_b2_nominal | | Nominal water outlet temperature on building side [K] |
| Controls |
| Real | y1Min | 0.05 | Minimum pump flow rate or valve opening for temperature measurement (fractional) [1] |
| TemperatureDifference | dTEna | 1 | Minimum delta-T above predicted heat exchanger leaving water temperature to enable WSE [K] |
| TemperatureDifference | dTDis | 0.5 | Minimum delta-T across heat exchanger before disabling WSE [K] |
| Real | k | 1 | Gain of controller |
| Time | Ti | 60 | Time constant of integrator block [s] |
| Assumptions |
| Boolean | allowFlowReversal1 | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1 |
| Boolean | allowFlowReversal2 | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2 |
| Advanced |
| MassFlowRate | m1_flow_small | 1E-4*abs(m1_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| MassFlowRate | m2_flow_small | 1E-4*abs(m2_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| Diagnostics |
| Boolean | show_T | false | = true, if actual temperature at port is computed |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a1 | Fluid connector a1 (positive design flow direction is from port_a1 to port_b1) |
| FluidPort_b | port_b1 | Fluid connector b1 (positive design flow direction is from port_a1 to port_b1) |
| FluidPort_a | port_a2 | Fluid connector a2 (positive design flow direction is from port_a2 to port_b2) |
| FluidPort_b | port_b2 | Fluid connector b2 (positive design flow direction is from port_a2 to port_b2) |
| output RealOutput | PPum | Power drawn by pump motors [W] |
| input BooleanInput | uCoo | Cooling enable signal |
| input RealInput | yValIsoEva_actual | Return position of evaporator to ambient loop isolation valve [1] |
Modelica definition
model WatersideEconomizer
extends Buildings.Fluid.Interfaces.PartialFourPortInterface(
final m1_flow_nominal=
abs(Q_flow_nominal/4200/(T_b1_nominal - T_a1_nominal)),
final m2_flow_nominal=
abs(Q_flow_nominal/4200/(T_b2_nominal - T_a2_nominal)));
parameter DHC.ETS.Types.ConnectionConfiguration conCon
;
parameter Modelica.Units.SI.PressureDifference dp1Hex_nominal(displayUnit=
"Pa") ;
parameter Modelica.Units.SI.PressureDifference dp2Hex_nominal(displayUnit=
"Pa") ;
parameter Modelica.Units.SI.PressureDifference dpVal1_nominal(displayUnit=
"Pa") =
if have_val1
then dp1Hex_nominal/2
else 0
;
parameter Modelica.Units.SI.PressureDifference dpVal2_nominal(displayUnit=
"Pa") = dp2Hex_nominal/10
;
parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal
;
parameter Modelica.Units.SI.Temperature T_a1_nominal
;
parameter Modelica.Units.SI.Temperature T_b1_nominal
;
parameter Modelica.Units.SI.Temperature T_a2_nominal
;
parameter Modelica.Units.SI.Temperature T_b2_nominal
;
parameter Real y1Min(
final unit="1")=0.05
;
parameter Modelica.Units.SI.TemperatureDifference dTEna=1
;
parameter Modelica.Units.SI.TemperatureDifference dTDis=0.5
;
parameter Real k(
min=0)=1
;
parameter Modelica.Units.SI.Time Ti(min=Buildings.Controls.OBC.CDL.Constants.small)=
60 ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum(
final unit="W")
if not have_val1
;
Buildings.DHC.ETS.Combined.Controls.WatersideEconomizer conWSE(
final m2_flow_nominal=m2_flow_nominal,
final y1Min=y1Min,
final T_a1_nominal=T_a1_nominal,
final T_b2_nominal=T_b2_nominal,
final dTEna=dTEna,
final dTDis=dTDis)
;
Buildings.Fluid.HeatExchangers.PlateHeatExchangerEffectivenessNTU hex(
redeclare final package Medium1 =
Medium1,
redeclare final package Medium2 =
Medium2,
final use_Q_flow_nominal=true,
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow,
final allowFlowReversal1=allowFlowReversal1,
final allowFlowReversal2=allowFlowReversal2,
final dp1_nominal=
if have_val1
then 0
else dp1Hex_nominal,
final dp2_nominal=0,
final m1_flow_nominal=m1_flow_nominal,
final m2_flow_nominal=m2_flow_nominal,
final Q_flow_nominal=Q_flow_nominal,
final T_a1_nominal=T_a1_nominal,
final T_a2_nominal=T_a2_nominal)
;
DHC.ETS.BaseClasses.Pump_m_flow pum1(
redeclare final package Medium =
Medium1,
final m_flow_nominal=m1_flow_nominal,
final dp_nominal=dp1Hex_nominal,
final allowFlowReversal=allowFlowReversal1)
if not have_val1
;
Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatEnt(
redeclare final package Medium =
Medium2,
final m_flow_nominal=m2_flow_nominal,
final allowFlowReversal=allowFlowReversal2)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatLvg(
redeclare final package Medium =
Medium2,
final m_flow_nominal=m2_flow_nominal,
final allowFlowReversal=allowFlowReversal2)
;
Buildings.Fluid.Actuators.Valves.TwoWayPressureIndependent val1(
redeclare final package Medium =
Medium1,
final m_flow_nominal=m1_flow_nominal,
from_dp=true,
final dpValve_nominal=dpVal1_nominal,
final dpFixed_nominal=dp1Hex_nominal,
use_strokeTime=false)
if have_val1 ;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
final k=
m1_flow_nominal)
if not have_val1 ;
Buildings.Fluid.Actuators.Valves.ThreeWayLinear val2(
redeclare final package Medium =
Medium2,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
use_strokeTime=false,
final m_flow_nominal=m2_flow_nominal,
final dpValve_nominal=dpVal2_nominal,
final dpFixed_nominal={dp2Hex_nominal,0},
fraK=1) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senT1WatEnt(
redeclare final package Medium =
Medium1,
final m_flow_nominal=m1_flow_nominal,
final allowFlowReversal=allowFlowReversal1)
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uCoo
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput yValIsoEva_actual(
final unit="1")
;
Buildings.Fluid.Sensors.MassFlowRate senMasFlo2(
redeclare final package
Medium =
Medium2,
final allowFlowReversal=allowFlowReversal2)
;
protected
parameter Boolean have_val1=
conCon ==Buildings.DHC.ETS.Types.ConnectionConfiguration.TwoWayValve
;
equation
if not have_val1
then
connect(hex.port_b1, port_b1);
else
connect(port_a1, senT1WatEnt.port_a);
end if;
connect(port_a1,pum1.port_a);
connect(val1.port_b,port_b1);
connect(conWSE.y1, val1.y);
connect(conWSE.y1, gai1.u);
connect(gai1.y,pum1.m_flow_in);
connect(PPum, pum1.P);
connect(conWSE.yVal2, val2.y);
connect(port_a2, senT2WatEnt.port_a);
connect(senT1WatEnt.port_b, hex.port_a1);
connect(senT1WatEnt.port_a, pum1.port_b);
connect(hex.port_b1, val1.port_a);
connect(uCoo, conWSE.uCoo);
connect(senT1WatEnt.T, conWSE.T1WatEnt);
connect(conWSE.T2WatEnt, senT2WatEnt.T);
connect(senT2WatLvg.T, conWSE.T2WatLvg);
connect(yValIsoEva_actual, conWSE.yValIsoEva_actual);
connect(port_b2, senMasFlo2.port_b);
connect(senMasFlo2.port_a, senT2WatLvg.port_b);
connect(senMasFlo2.m_flow, conWSE.m2_flow);
connect(val2.port_2, senT2WatLvg.port_a);
connect(val2.port_3, senT2WatEnt.port_b);
connect(val2.port_1, hex.port_b2);
connect(hex.port_a2, senT2WatEnt.port_b);
end WatersideEconomizer;