Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5

Package of models for fifth generation DHC energy transfer stations

Information

This package contains models for energy transfer stations used in fifth generation district heating and cooling systems.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.ChillerBorefield ChillerBorefield ETS model for 5GDHC systems with heat recovery chiller and optional borefield
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.HeatPumpHeatExchanger HeatPumpHeatExchanger Model of a substation with heat pump and compressor-less cooling
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Controls Controls Package of control blocks for fifth generation DHC ETS
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Subsystems Subsystems Package of models for subsystems of fifth generation DHC ETS
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Examples Examples Example models integrating multiple components
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Validation Validation Collection of validation models
Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.BaseClasses BaseClasses Package with base classes

Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.ChillerBorefield Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.ChillerBorefield

ETS model for 5GDHC systems with heat recovery chiller and optional borefield

Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.ChillerBorefield

Information

This model represents an energy transfer station as illustrated in the schematics below.

Note that the heating and cooling enable signals (uHea and uCoo) connected to this model should be switched to false when the building has no corresponding demand (e.g., based on the requests yielded by the terminal unit controllers, in conjunction with a schedule). This will significantly improve the system performance as it is a necessary condition for the chiller to be operated at a lower lift, see Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Controls.Reset.

System schematics

Extends from BaseClasses.PartialParallel (Partial ETS model with district heat exchanger and parallel connection of production systems).

Parameters

TypeNameDefaultDescription
replaceable package MediumSerWaterService side medium
replaceable package MediumSerHea_aWaterService side medium at heating inlet
replaceable package MediumBuiWaterBuilding side medium
Genericfue[nFue] Fuel type
ConnectionConfigurationconConEnergyTransferStations.Types...District connection configuration
IntegernSysHea1Number of heating systems
IntegernSysCoonSysHeaNumber of cooling systems
IntegernSouAmbif have_borFie then 2 else 1Number of ambient sources
Booleanhave_borFiefalseSet to true in case a borefield is used in addition of the district HX
Configuration
Booleanhave_hotWatfalseSet to true if the ETS supplies hot water
Booleanhave_fanfalseSet to true if fan power is computed
Booleanhave_eleHeafalseSet to true if the ETS has electric heating system
IntegernFue0Number of fuel types (0 means no combustion system)
Booleanhave_eleCootrueSet to true if the ETS has electric cooling system
Booleanhave_weaBusfalseSet to true to use a weather bus
Nominal condition
HeatFlowRateQHeaWat_flow_nominal0Nominal capacity of heating system (>=0) [W]
HeatFlowRateQHotWat_flow_nominal0Nominal capacity of hot water production system (>=0) [W]
HeatFlowRateQChiWat_flow_nominal0Nominal capacity of cooling system (<=0) [W]
PressureDifferencedpValIso_nominal2E3Nominal pressure drop of ambient circuit isolation valves [Pa]
District heat exchanger
PressureDifferencedp1Hex_nominal Nominal pressure drop across heat exchanger on district side [Pa]
PressureDifferencedp2Hex_nominal Nominal pressure drop across heat exchanger on building side [Pa]
HeatFlowRateQHex_flow_nominal Nominal heat flow rate through heat exchanger (from district to building) [W]
TemperatureT_a1Hex_nominal Nominal water inlet temperature on district side [K]
TemperatureT_b1Hex_nominal Nominal water outlet temperature on district side [K]
TemperatureT_a2Hex_nominal Nominal water inlet temperature on building side [K]
TemperatureT_b2Hex_nominal Nominal water outlet temperature on building side [K]
TemperatureDifferencedT1HexSet[2]abs(T_b1Hex_nominal - T_a1He...Primary side deltaT set point schedule (index 1 for heat rejection) [K]
RealspePum1HexMin0.1Heat exchanger primary pump minimum speed (fractional) [1]
RealyVal1HexMin0.1Minimum valve opening for temperature measurement (fractional) [1]
RealspePum2HexMin0.1Heat exchanger secondary pump minimum speed (fractional) [1]
GenericperPum1Hexredeclare parameter Building...Record with performance data for primary pump
GenericperPum2Hexredeclare parameter Building...Record with performance data for secondary pump
Buffer Tank
VolumeVTanHeaWatdatChi.PLRMin*datChi.mCon_fl...Heating water tank volume [m3]
LengthhTanHeaWat(VTanHeaWat*16/Modelica.Cons...Heating water tank height (assuming twice the diameter) [m]
LengthdInsTanHeaWat0.1Heating water tank insulation thickness [m]
VolumeVTanChiWatdatChi.PLRMin*datChi.mEva_fl...Chilled water tank volume [m3]
LengthhTanChiWat(VTanChiWat*16/Modelica.Cons...Chilled water tank height (without insulation) [m]
LengthdInsTanChiWat0.1Chilled water tank insulation thickness [m]
IntegernSegTan3Number of volume segments for tanks
Chiller
PressureDifferencedpCon_nominal Nominal pressure drop accross condenser [Pa]
PressureDifferencedpEva_nominal Nominal pressure drop accross evaporator [Pa]
GenericdatChiredeclare parameter Fluid.Ch...Chiller performance data
GenericperPumConperPumCon(motorCooledByFluid...Record with performance data for condenser pump
GenericperPumEvaperPumEva(motorCooledByFluid...Record with performance data for evaporator pump
Chillerchichi(redeclare final package ...Chiller
Borefield
TemperatureTBorWatEntMax313.15Maximum value of borefield water entering temperature [K]
RealspePumBorMin0.1Borefield pump minimum speed [1]
PressuredpBorFie_nominal5E4Pressure losses for the entire borefield (control valve excluded) [Pa]
ExampledatBorFieredeclare parameter Fluid.Ge...Borefield parameters
GenericperPumBorFieperPumBorFie(motorCooledByFl...Record with performance data for borefield pump
BorefieldborFieborFie(redeclare final packa...Borefield
Supervisory controller
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
RealkHot0.05Gain of controller on hot side
RealkCol0.1Gain of controller on cold side
TimeTiHot300Time constant of integrator block on hot side [s]
TimeTiCol120Time constant of integrator block on cold side [s]
TemperatureTHeaWatSupSetMindatChi.TConEntMin + 5Minimum value of heating water supply temperature set point [K]
TemperatureTChiWatSupSetMindatChi.TEvaLvgMinMinimum value of chilled water supply temperature set point [K]
Assumptions
BooleanallowFlowReversalSerfalseSet to true to allow flow reversal on service side
BooleanallowFlowReversalBuifalseSet to true to allow flow reversal on building side

Connectors

TypeNameDescription
FluidPorts_aports_aHeaWat[nPorts_aHeaWat]Fluid connectors for heating water return (from building)
FluidPorts_bports_bHeaWat[nPorts_bHeaWat]Fluid connectors for heating water supply (to building)
FluidPorts_aports_aChiWat[nPorts_aChiWat]Fluid connectors for chilled water return (from building)
FluidPorts_bports_bChiWat[nPorts_bChiWat]Fluid connectors for chilled water supply (to building)
FluidPort_aport_aSerAmbFluid connector for ambient water service supply line
FluidPort_bport_bSerAmbFluid connector for ambient water service return line
FluidPort_aport_aSerHeaFluid connector for heating service supply line
FluidPort_bport_bSerHeaFluid connector for heating service return line
FluidPort_aport_aSerCooFluid connector for cooling service supply line
FluidPort_bport_bSerCooFluid connector for cooling service return line
output RealOutputPHeaPower drawn by heating system [W]
output RealOutputPCooPower drawn by cooling system [W]
output RealOutputPFanPower drawn by fan motors [W]
output RealOutputPPumPower drawn by pump motors [W]
output RealOutputQFue_flow[nFue]Fuel energy input rate [W]
BusweaBusWeather data bus
input BooleanInputuHeaHeating enable signal
input BooleanInputuCooCooling enable signal
input RealInputTHeaWatSupSetHeating water supply temperature set point [K]
input RealInputTChiWatSupSetChilled water supply temperature set point [K]
output RealOutputdHHeaWat_flowHeating water distributed energy flow rate [W]
output RealOutputdHChiWat_flowChilled water distributed energy flow rate [W]

Modelica definition

model ChillerBorefield "ETS model for 5GDHC systems with heat recovery chiller and optional borefield" extends BaseClasses.PartialParallel( final have_eleCoo=true, final have_fan=false, redeclare replaceable Controls.Supervisory conSup constrainedby Controls.Supervisory( final controllerType=controllerType, final kHot=kHot, final kCol=kCol, final TiHot=TiHot, final TiCol=TiCol, final THeaWatSupSetMin=THeaWatSupSetMin, final TChiWatSupSetMin=TChiWatSupSetMin), nSysHea=1, nSouAmb= if have_borFie then 2 else 1, dT1HexSet=abs( T_b1Hex_nominal-T_a1Hex_nominal) .* {1+1/datChi.COP_nominal,1}, VTanHeaWat=datChi.PLRMin*datChi.mCon_flow_nominal*5*60/1000, VTanChiWat=datChi.PLRMin*datChi.mEva_flow_nominal*5*60/1000, colChiWat( mCon_flow_nominal={colAmbWat.mDis_flow_nominal,datChi.mEva_flow_nominal}), colHeaWat( mCon_flow_nominal={colAmbWat.mDis_flow_nominal,datChi.mCon_flow_nominal}), colAmbWat( mCon_flow_nominal= if have_borFie then {hex.m2_flow_nominal,datBorFie.conDat.mBorFie_flow_nominal} else {hex.m2_flow_nominal}), totPPum( nin=3), totPHea( nin=1), totPCoo( nin=1)); parameter Boolean have_borFie=false "Set to true in case a borefield is used in addition of the district HX"; parameter Modelica.SIunits.PressureDifference dpCon_nominal( displayUnit="Pa") "Nominal pressure drop accross condenser"; parameter Modelica.SIunits.PressureDifference dpEva_nominal( displayUnit="Pa") "Nominal pressure drop accross evaporator"; replaceable parameter Fluid.Chillers.Data.ElectricEIR.Generic datChi "Chiller performance data"; replaceable parameter Buildings.Fluid.Movers.Data.Generic perPumCon( motorCooledByFluid=false) constrainedby Buildings.Fluid.Movers.Data.Generic "Record with performance data for condenser pump"; replaceable parameter Buildings.Fluid.Movers.Data.Generic perPumEva( motorCooledByFluid=false) constrainedby Buildings.Fluid.Movers.Data.Generic "Record with performance data for evaporator pump"; parameter Modelica.SIunits.Temperature TBorWatEntMax=313.15 "Maximum value of borefield water entering temperature"; parameter Real spePumBorMin( final unit="1")=0.1 "Borefield pump minimum speed"; parameter Modelica.SIunits.Pressure dpBorFie_nominal( displayUnit="Pa")=5E4 "Pressure losses for the entire borefield (control valve excluded)"; replaceable parameter Fluid.Geothermal.Borefields.Data.Borefield.Example datBorFie constrainedby Fluid.Geothermal.Borefields.Data.Borefield.Template "Borefield parameters"; replaceable parameter Buildings.Fluid.Movers.Data.Generic perPumBorFie( motorCooledByFluid=false) constrainedby Buildings.Fluid.Movers.Data.Generic "Record with performance data for borefield pump"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real kHot( min=0)=0.05 "Gain of controller on hot side"; parameter Real kCol( min=0)=0.1 "Gain of controller on cold side"; parameter Modelica.SIunits.Time TiHot( min=Buildings.Controls.OBC.CDL.Constants.small)=300 "Time constant of integrator block on hot side"; parameter Modelica.SIunits.Time TiCol( min=Buildings.Controls.OBC.CDL.Constants.small)=120 "Time constant of integrator block on cold side"; parameter Modelica.SIunits.Temperature THeaWatSupSetMin( displayUnit="degC")=datChi.TConEntMin+5 "Minimum value of heating water supply temperature set point"; parameter Modelica.SIunits.Temperature TChiWatSupSetMin( displayUnit="degC")=datChi.TEvaLvgMin "Minimum value of chilled water supply temperature set point"; replaceable Subsystems.Chiller chi( redeclare final package Medium=MediumBui, final perPumCon=perPumCon, final perPumEva=perPumEva, final dpCon_nominal=dpCon_nominal, final dpEva_nominal=dpEva_nominal, final dat=datChi) "Chiller"; replaceable Subsystems.Borefield borFie( redeclare final package Medium=MediumBui, final datBorFie=datBorFie, final perPum=perPumBorFie, final TBorWatEntMax=TBorWatEntMax, final spePumBorMin=spePumBorMin, final dp_nominal=dpBorFie_nominal) if have_borFie "Borefield"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerPPum( final k=0) if not have_borFie "Zero power"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerPHea( final k=0) "Zero power"; equation connect(chi.port_bHeaWat,colHeaWat.ports_aCon[2]); connect(chi.port_aHeaWat,colHeaWat.ports_bCon[2]); connect(chi.port_bChiWat,colChiWat.ports_aCon[2]); connect(colChiWat.ports_bCon[2],chi.port_aChiWat); connect(conSup.TChiWatSupSet,chi.TChiWatSupSet); connect(chi.PPum,totPPum.u[2]); connect(colAmbWat.ports_aCon[2],borFie.port_b); connect(colAmbWat.ports_bCon[2],borFie.port_a); connect(conSup.yAmb[1],borFie.u); connect(valIsoCon.y_actual,borFie.yValIso_actual[1]); connect(valIsoEva.y_actual,borFie.yValIso_actual[2]); connect(borFie.PPum,totPPum.u[3]); connect(zerPPum.y,totPPum.u[3]); connect(zerPHea.y,totPHea.u[1]); connect(chi.PChi,totPCoo.u[1]); connect(uHea,conSup.uHea); connect(conSup.yHea,chi.uHea); connect(conSup.yCoo,chi.uCoo); connect(valIsoCon.y_actual,conSup.yValIsoCon_actual); connect(valIsoEva.y_actual,conSup.yValIsoEva_actual); end ChillerBorefield;

Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.HeatPumpHeatExchanger Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.HeatPumpHeatExchanger

Model of a substation with heat pump and compressor-less cooling

Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.HeatPumpHeatExchanger

Information

This model represents an energy transfer station as described in Sommer (2020).

Controls

Heating (resp. cooling) is enabled based on the input signal uHea (resp. uCoo) which is held for 15 minutes, meaning that, when enabled, the mode remains active for at least 15 minutes and, when disabled, the mode cannot be enabled again for at least 15 minutes. The heating and cooling enable signals should be computed externally based on a schedule (to lock out the system during off-hours), ideally in conjunction with the number of requests yielded by the terminal unit controllers, or any other signal representative of the load.

When enabled,

Modeling considerations

There is a control volume at each of the two fluid ports that serve as inlet and outlet of the heating and cooling systems. These approximate the dynamics of the substation, and they also generally avoid nonlinear systems of equations if multiple substations are connected to each other.

References

Sommer T., Sulzer M., Wetter M., Sotnikov A., Mennel S., Stettler C. The reservoir network: A new network topology for district heating and cooling. Energy, Volume 199, 15 May 2020, 117418.

Extends from DHC.EnergyTransferStations.BaseClasses.PartialETS (Partial class for modeling an energy transfer station).

Parameters

TypeNameDefaultDescription
replaceable package MediumSerWaterService side medium
replaceable package MediumSerHea_aWaterService side medium at heating inlet
replaceable package MediumBuiWaterBuilding side medium
Genericfue[nFue] Fuel type
Booleanhave_varFloContrueSet to true for heat pumps with variable condenser flow
Booleanhave_varFloEvatrueSet to true for heat pumps with variable evaporator flow
RealratFloMin0.3Minimum condenser or evaporator mass flow rate (ratio to nominal) [1]
Configuration
DistrictSystemTypetypDHC.Types.DistrictSystemType...Type of district system
Booleanhave_heaWattrueSet to true if the ETS supplies heating water
Booleanhave_hotWatfalseSet to true if the ETS supplies hot water
Booleanhave_chiWattrueSet to true if the ETS supplies chilled water
Booleanhave_fanfalseSet to true if fan power is computed
Booleanhave_pumtrueSet to true if pump power is computed
Booleanhave_eleHeatrueSet to true if the ETS has electric heating system
IntegernFue0Number of fuel types (0 means no combustion system)
Booleanhave_eleCoofalseSet to true if the ETS has electric cooling system
Booleanhave_weaBusfalseSet to true to use a weather bus
Nominal condition
HeatFlowRateQHeaWat_flow_nominal0Nominal capacity of heating system (>=0) [W]
HeatFlowRateQHotWat_flow_nominal0Nominal capacity of hot water production system (>=0) [W]
HeatFlowRateQChiWat_flow_nominal0Nominal capacity of cooling system (<=0) [W]
TemperatureDifferencedT_nominal5Water temperature drop/increase accross load and source-side HX (always positive) [K]
TemperatureTHeaWatSup_nominal313.15Heating water supply temperature [K]
TemperatureTHotWatSup_nominal336.15Hot water supply temperature [K]
TemperatureTColWat_nominal288.15Cold water temperature (for hot water production) [K]
Pressuredp_nominal50000Pressure difference at nominal flow rate (for each flow leg) [Pa]
RealCOPHeaWat_nominal COP of heat pump for heating water production [1]
RealCOPHotWat_nominal COP of heat pump for hot water production [1]
DHC system
TemperatureTDisWatMin District water minimum temperature [K]
TemperatureTDisWatMax District water maximum temperature [K]
Nominal conditions
TemperatureTChiWatSup_nominal291.15Chilled water supply temperature [K]
Assumptions
BooleanallowFlowReversalSerfalseSet to true to allow flow reversal on service side
BooleanallowFlowReversalBuifalseSet to true to allow flow reversal on building side
Dynamics
DynamicsmixingVolumeEnergyDynamicsModelica.Fluid.Types.Dynamic...Formulation of energy balance for mixing volume at inlet and outlet

Connectors

TypeNameDescription
FluidPorts_aports_aHeaWat[nPorts_aHeaWat]Fluid connectors for heating water return (from building)
FluidPorts_bports_bHeaWat[nPorts_bHeaWat]Fluid connectors for heating water supply (to building)
FluidPorts_aports_aChiWat[nPorts_aChiWat]Fluid connectors for chilled water return (from building)
FluidPorts_bports_bChiWat[nPorts_bChiWat]Fluid connectors for chilled water supply (to building)
FluidPort_aport_aSerAmbFluid connector for ambient water service supply line
FluidPort_bport_bSerAmbFluid connector for ambient water service return line
FluidPort_aport_aSerHeaFluid connector for heating service supply line
FluidPort_bport_bSerHeaFluid connector for heating service return line
FluidPort_aport_aSerCooFluid connector for cooling service supply line
FluidPort_bport_bSerCooFluid connector for cooling service return line
output RealOutputPHeaPower drawn by heating system [W]
output RealOutputPCooPower drawn by cooling system [W]
output RealOutputPFanPower drawn by fan motors [W]
output RealOutputPPumPower drawn by pump motors [W]
output RealOutputQFue_flow[nFue]Fuel energy input rate [W]
BusweaBusWeather data bus
input BooleanInputuCooCooling enable signal
input BooleanInputuHeaHeating enable signal
input BooleanInputuSHWSHW production enable signal
input RealInputTHeaWatSupSetHeating water supply temperature set point [K]
input RealInputTHotWatSupSetService hot water supply temperature set point [K]
input RealInputTColWatCold water temperature [K]
input RealInputloaSHWService hot water load [W]
input RealInputTChiWatSupSetChilled water supply temperature set point [K]
output RealOutputmHea_flowDistrict water mass flow rate used for heating service [kg/s]
output RealOutputmCoo_flowDistrict water mass flow rate used for cooling service [kg/s]

Modelica definition

model HeatPumpHeatExchanger "Model of a substation with heat pump and compressor-less cooling" extends DHC.EnergyTransferStations.BaseClasses.PartialETS( final typ=DHC.Types.DistrictSystemType.CombinedGeneration5, final have_weaBus=false, final have_chiWat=true, final have_heaWat=true, have_hotWat=false, final have_eleHea=true, final nFue=0, final have_eleCoo=false, final have_pum=true, final have_fan=false, nPorts_aHeaWat=1, nPorts_aChiWat=1); // SYSTEM GENERAL parameter Boolean have_varFloCon = true "Set to true for heat pumps with variable condenser flow"; parameter Boolean have_varFloEva = true "Set to true for heat pumps with variable evaporator flow"; parameter Real ratFloMin( final unit="1", final min=0, final max=1)=0.3 "Minimum condenser or evaporator mass flow rate (ratio to nominal)"; parameter Modelica.SIunits.Temperature TDisWatMin "District water minimum temperature"; parameter Modelica.SIunits.Temperature TDisWatMax "District water maximum temperature"; parameter Modelica.SIunits.TemperatureDifference dT_nominal(min=0) = 5 "Water temperature drop/increase accross load and source-side HX (always positive)"; parameter Modelica.SIunits.Temperature TChiWatSup_nominal=291.15 "Chilled water supply temperature"; final parameter Modelica.SIunits.Temperature TChiWatRet_nominal= TChiWatSup_nominal + dT_nominal "Chilled water return temperature"; parameter Modelica.SIunits.Temperature THeaWatSup_nominal=313.15 "Heating water supply temperature"; final parameter Modelica.SIunits.Temperature THeaWatRet_nominal= THeaWatSup_nominal - dT_nominal "Heating water return temperature"; parameter Modelica.SIunits.Temperature THotWatSup_nominal=336.15 "Hot water supply temperature"; parameter Modelica.SIunits.Temperature TColWat_nominal=288.15 "Cold water temperature (for hot water production)"; parameter Modelica.SIunits.Pressure dp_nominal(displayUnit="Pa") = 50000 "Pressure difference at nominal flow rate (for each flow leg)"; final parameter Modelica.SIunits.MassFlowRate mHeaWat_flow_nominal(min=0)= abs(QHeaWat_flow_nominal / cpBui_default / (THeaWatSup_nominal - THeaWatRet_nominal)) "Heating water mass flow rate"; final parameter Modelica.SIunits.MassFlowRate mChiWat_flow_nominal(min=0)= abs(QChiWat_flow_nominal / cpBui_default / (TChiWatSup_nominal - TChiWatRet_nominal)) "Chilled water mass flow rate"; final parameter Modelica.SIunits.MassFlowRate mEvaHotWat_flow_nominal(min=0)= QHotWat_flow_nominal * (COPHotWat_nominal - 1) / COPHotWat_nominal / cpSer_default / dT_nominal "Evaporator water mass flow rate of heat pump for hot water production"; final parameter Modelica.SIunits.MassFlowRate mDisWat_flow_nominal(min=0)= max(proHeaWat.m2_flow_nominal + mEvaHotWat_flow_nominal, hexChi.m1_flow_nominal) "District water mass flow rate"; constant Modelica.SIunits.SpecificHeatCapacity cpBui_default= MediumBui.specificHeatCapacityCp(MediumBui.setState_pTX( p = MediumBui.p_default, T = MediumBui.T_default)) "Specific heat capacity of the fluid"; constant Modelica.SIunits.SpecificHeatCapacity cpSer_default= MediumBui.specificHeatCapacityCp(MediumSer.setState_pTX( p = MediumSer.p_default, T = MediumSer.T_default)) "Specific heat capacity of the fluid"; // Heat pump for heating water production parameter Real COPHeaWat_nominal(final unit="1") "COP of heat pump for heating water production"; // Heat pump for hot water production parameter Real COPHotWat_nominal(final unit="1") "COP of heat pump for hot water production"; // District HX final parameter Modelica.SIunits.MassFlowRate m1HexChi_flow_nominal(min=0)= abs(QChiWat_flow_nominal / cpSer_default / dT_nominal) "CHW HX primary mass flow rate"; final parameter Modelica.SIunits.MassFlowRate m2HexChi_flow_nominal(min=0)= abs(QChiWat_flow_nominal / cpSer_default / (THeaWatSup_nominal - THeaWatRet_nominal)) "CHW HX secondary mass flow rate"; // Dynamics parameter Modelica.Fluid.Types.Dynamics mixingVolumeEnergyDynamics= Modelica.Fluid.Types.Dynamics.FixedInitial "Formulation of energy balance for mixing volume at inlet and outlet"; // IO CONNECTORS Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uCoo "Cooling enable signal"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHea "Heating enable signal"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uSHW if have_hotWat "SHW production enable signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaWatSupSet( final unit="K", displayUnit="degC") "Heating water supply temperature set point"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THotWatSupSet( final unit="K", displayUnit="degC") if have_hotWat "Service hot water supply temperature set point"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TColWat( final unit="K", displayUnit="degC") if have_hotWat "Cold water temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput loaSHW( final unit="W") if have_hotWat "Service hot water load"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatSupSet(final unit="K", displayUnit="degC") "Chilled water supply temperature set point"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput mHea_flow(final unit="kg/s") "District water mass flow rate used for heating service"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput mCoo_flow(final unit="kg/s") "District water mass flow rate used for cooling service"; // COMPONENTS Buildings.Fluid.Delays.DelayFirstOrder volMix_a( redeclare final package Medium = MediumSer, final nPorts=if have_hotWat then 4 else 3, final m_flow_nominal=mDisWat_flow_nominal, tau=600, final energyDynamics=mixingVolumeEnergyDynamics) "Mixing volume to break algebraic loops and to emulate the delay of the substation"; Buildings.Fluid.Delays.DelayFirstOrder volMix_b( redeclare final package Medium = MediumSer, final nPorts=if have_hotWat then 4 else 3, final m_flow_nominal=mDisWat_flow_nominal, tau=600, final energyDynamics=mixingVolumeEnergyDynamics) "Mixing volume to break algebraic loops and to emulate the delay of the substation"; DHC.EnergyTransferStations.BaseClasses.Pump_m_flow pum1HexChi( redeclare final package Medium = MediumSer, final m_flow_nominal=m1HexChi_flow_nominal, final allowFlowReversal=allowFlowReversalSer) "Chilled water HX primary pump"; Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexChi( redeclare final package Medium1 = MediumSer, redeclare final package Medium2 = MediumBui, final m1_flow_nominal=m1HexChi_flow_nominal, final m2_flow_nominal=m2HexChi_flow_nominal, final dp1_nominal=dp_nominal/2, final dp2_nominal=dp_nominal/2, configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow, final Q_flow_nominal=QChiWat_flow_nominal, final T_a1_nominal=TDisWatMax, final T_a2_nominal=TChiWatRet_nominal, final allowFlowReversal1=allowFlowReversalSer, final allowFlowReversal2=allowFlowReversalBui) "Chilled water HX"; Buildings.Fluid.Delays.DelayFirstOrder volHeaWatRet( redeclare final package Medium = MediumBui, final m_flow_nominal=proHeaWat.m1_flow_nominal, tau=60, final energyDynamics=mixingVolumeEnergyDynamics, T_start=THeaWatSup_nominal, nPorts=3) "Mixing volume representing building HHW primary"; Buildings.Fluid.Sensors.MassFlowRate senMasFloHeaWat( redeclare final package Medium = MediumBui, final allowFlowReversal=allowFlowReversalBui) "Heating water mass flow rate"; Buildings.Fluid.Delays.DelayFirstOrder volChiWat( redeclare final package Medium = MediumBui, final m_flow_nominal=m1HexChi_flow_nominal, tau=60, final energyDynamics=mixingVolumeEnergyDynamics, T_start=TChiWatSup_nominal, nPorts=3) "Mixing volume representing building CHW primary"; Buildings.Fluid.Sensors.MassFlowRate senMasFloChiWat( redeclare final package Medium = MediumBui, final allowFlowReversal=allowFlowReversalBui) "Chilled water mass flow rate"; Buildings.Controls.OBC.CDL.Continuous.Gain gai2( final k=m1HexChi_flow_nominal); DHC.EnergyTransferStations.Combined.Generation5.Controls.PIDWithEnable conTChiWat( k=0.05, Ti=120, yMax=1, controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, reverseActing=false, yMin=0) "PI controller for district HX primary side"; Buildings.Controls.OBC.CDL.Continuous.MultiSum PPumHeaTot(final nin=2) "Total pump power for heating applications"; Buildings.Fluid.Sources.Boundary_pT bouHeaWat( redeclare final package Medium = MediumBui, nPorts=1) "Pressure boundary condition representing the expansion vessel"; Buildings.Fluid.Sources.Boundary_pT bouChiWat( redeclare final package Medium = MediumBui, nPorts=1) "Pressure boundary condition representing the expansion vessel"; Buildings.Controls.OBC.CDL.Continuous.MultiSum PPumCooTot(nin=1) "Total pump power for space cooling"; Buildings.Controls.OBC.CDL.Continuous.MultiSum PPumTot(nin=2) "Total pump power"; Buildings.Fluid.Sensors.TemperatureTwoPort senTHeaWatSup( redeclare final package Medium=MediumBui, final allowFlowReversal=allowFlowReversalBui, final m_flow_nominal=mHeaWat_flow_nominal) "Heating water supply temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senTChiWatSup( redeclare final package Medium=MediumBui, final allowFlowReversal=allowFlowReversalBui, final m_flow_nominal=mChiWat_flow_nominal) "Chilled water supply temperature"; Buildings.Experimental.DHC.EnergyTransferStations.Combined.Generation5.Subsystems.SwitchBox swiFlo( redeclare final package Medium = MediumSer, final m_flow_nominal=mDisWat_flow_nominal) "Flow switch box"; DHC.EnergyTransferStations.BaseClasses.Junction bypHeaWatSup(redeclare final package Medium = MediumBui, final m_flow_nominal=proHeaWat.m1_flow_nominal *{1,-1,-1}) "Bypass heating water (supply)"; DHC.EnergyTransferStations.BaseClasses.Junction bypHeaWatRet( redeclare final package Medium = MediumBui, final m_flow_nominal=proHeaWat.m1_flow_nominal*{1,-1,1}) "Bypass heating water (return)"; Buildings.Controls.OBC.CDL.Logical.TrueFalseHold enaHea( trueHoldDuration=15*60) "Enable heating"; Subsystems.HeatPump proHeaWat( redeclare final package Medium1 = MediumBui, redeclare final package Medium2 = MediumSer, final have_varFloCon=have_varFloCon, final have_varFloEva=have_varFloEva, final COP_nominal=COPHeaWat_nominal, final TCon_nominal=THeaWatSup_nominal, final TEva_nominal=TDisWatMin-dT_nominal, final Q1_flow_nominal=QHeaWat_flow_nominal, final allowFlowReversal1=allowFlowReversalBui, final allowFlowReversal2=allowFlowReversalSer, final dT1_nominal=dT_nominal, final dT2_nominal=-dT_nominal, final dp1_nominal=dp_nominal, final dp2_nominal=dp_nominal) "Subsystem for heating water production"; Subsystems.HeatPump proHotWat( redeclare final package Medium1 = MediumBui, redeclare final package Medium2 = MediumSer, final have_pumCon=false, final have_varFloEva=have_varFloEva, final COP_nominal=COPHotWat_nominal, final TCon_nominal=THotWatSup_nominal, final TEva_nominal=TDisWatMin-dT_nominal, final Q1_flow_nominal=QHotWat_flow_nominal, final allowFlowReversal1=allowFlowReversalBui, final allowFlowReversal2=allowFlowReversalSer, final dT1_nominal=THotWatSup_nominal - TColWat_nominal, final dT2_nominal=-dT_nominal, final dp1_nominal=dp_nominal, final dp2_nominal=dp_nominal) if have_hotWat "Subsystem for hot water production"; Fluid.Sources.Boundary_pT sinSHW( redeclare final package Medium = MediumBui, nPorts=1) if have_hotWat "Sink for service hot water"; Fluid.Sources.MassFlowSource_T souColWat( redeclare final package Medium = MediumBui, use_m_flow_in=true, use_T_in=true, nPorts=1) if have_hotWat "Source for cold water"; Buildings.Controls.OBC.CDL.Continuous.Division div1 if have_hotWat "Compute mass flow rate from load"; Buildings.Controls.OBC.CDL.Continuous.Gain gai(final k=cpBui_default) if have_hotWat "Times Cp"; Buildings.Controls.OBC.CDL.Continuous.MultiSum masFloHeaTot(final nin=2) "Compute district water mass flow rate used for heating service"; Modelica.Blocks.Sources.Constant zer(final k=0) if not have_hotWat "Replacement variable"; Fluid.Sensors.TemperatureTwoPort senTHeaWatRet( redeclare final package Medium = MediumBui, final allowFlowReversal=allowFlowReversalBui, final m_flow_nominal=mHeaWat_flow_nominal) "Heating water return temperature"; Fluid.Sensors.TemperatureTwoPort senTChiWatRet( redeclare final package Medium = MediumBui, final allowFlowReversal=allowFlowReversalBui, final m_flow_nominal=mChiWat_flow_nominal) "Chilled water return temperature"; Buildings.Controls.OBC.CDL.Continuous.Add delT(final k2=-1) if have_hotWat "Compute DeltaT needed on condenser side"; Fluid.Sensors.MassFlowRate senMasFloHeaWatPri(redeclare final package Medium = MediumBui, final allowFlowReversal=allowFlowReversalBui) "Primary heating water mass flow rate"; Buildings.Controls.OBC.CDL.Logical.TrueFalseHold enaSHW(trueHoldDuration=15* 60) if have_hotWat "Enable SHW production"; Modelica.Blocks.Sources.Constant zer1(k=0) if not have_hotWat "Replacement variable"; Buildings.Controls.OBC.CDL.Continuous.Add masFloHea "Service water mass flow rate for heating applications"; Buildings.Controls.OBC.CDL.Continuous.MultiSum PHeaTot(final nin=2) "Total power used for heating and hot water production"; Buildings.Controls.OBC.CDL.Continuous.Add heaFloEvaSHW if have_hotWat and have_varFloEva "Heat flow rate at evaporator"; Buildings.Controls.OBC.CDL.Continuous.Add dTHHW(k2=-1) if have_hotWat and have_varFloEva "Heating hot water DeltaT"; Buildings.Controls.OBC.CDL.Continuous.Gain capFloHHW( final k=cpBui_default) if have_varFloEva or have_varFloCon "Capacity flow rate"; Buildings.Controls.OBC.CDL.Continuous.Add heaFloEvaHHW if have_varFloEva "Heat flow rate at evaporator"; Controls.PrimaryVariableFlow conFloEvaSHW( final Q_flow_nominal=-QHotWat_flow_nominal*(1 + 1/COPHotWat_nominal), final dT_nominal=-dT_nominal, final ratFloMin=ratFloMin, final cp=cpSer_default) if have_hotWat and have_varFloEva "Mass flow rate control"; Controls.PrimaryVariableFlow conFloConHHW( final Q_flow_nominal=QHeaWat_flow_nominal, final dT_nominal=dT_nominal, final ratFloMin=ratFloMin, final cp=cpBui_default) if have_varFloCon "Mass flow rate control"; Controls.PrimaryVariableFlow conFloEvaHHW( final Q_flow_nominal=-QHeaWat_flow_nominal*(1 + 1/COPHeaWat_nominal), final dT_nominal=-dT_nominal, final ratFloMin=ratFloMin, final cp=cpSer_default) if have_varFloEva "Mass flow rate control"; Buildings.Controls.OBC.CDL.Continuous.Max priOve "Ensure primary overflow"; Buildings.Controls.OBC.CDL.Continuous.Product loaHHW "Heating load"; equation connect(TChiWatSupSet, conTChiWat.u_s); connect(pum1HexChi.P, PPumCooTot.u[1]); connect(PPumHeaTot.y, PPumTot.u[1]); connect(PPumCooTot.y, PPumTot.u[2]); connect(pum1HexChi.port_b, hexChi.port_a1); connect(pum1HexChi.m_flow_actual, mCoo_flow); connect(volMix_a.ports[1], swiFlo.port_bSup); connect(swiFlo.port_aRet, volMix_b.ports[1]); connect(volMix_b.ports[2], pum1HexChi.port_a); connect(hexChi.port_b1, volMix_a.ports[2]); connect(pum1HexChi.m_flow_actual, swiFlo.mRev_flow); connect(gai2.y, pum1HexChi.m_flow_in); connect(PPumTot.y, PPum); connect(ports_aHeaWat[1], senMasFloHeaWat.port_a); connect(bypHeaWatSup.port_2, senTHeaWatSup.port_a); connect(senTHeaWatSup.port_b, ports_bHeaWat[1]); connect(bypHeaWatRet.port_2, volHeaWatRet.ports[1]); connect(bouHeaWat.ports[1], volHeaWatRet.ports[2]); connect(ports_aChiWat[1], senMasFloChiWat.port_a); connect(senTChiWatSup.port_b, ports_bChiWat[1]); connect(bypHeaWatRet.port_3, bypHeaWatSup.port_3); connect(volHeaWatRet.ports[3], proHeaWat.port_a1); connect(proHeaWat.port_b2, volMix_b.ports[3]); connect(volMix_a.ports[3], proHeaWat.port_a2); connect(enaHea.y, proHeaWat.uEna); connect(THeaWatSupSet, proHeaWat.TSupSet); connect(proHeaWat.PPum, PPumHeaTot.u[1]); connect(volMix_a.ports[4], proHotWat.port_a2); connect(proHotWat.port_b2, volMix_b.ports[4]); connect(THotWatSupSet, proHotWat.TSupSet); connect(sinSHW.ports[1], proHotWat.port_b1); connect(TColWat, souColWat.T_in); connect(gai.y, div1.u2); connect(loaSHW, div1.u1); connect(masFloHeaTot.y, mHea_flow); connect(proHotWat.mEva_flow, masFloHeaTot.u[2]); connect(zer.y, masFloHeaTot.u[2]); connect(proHotWat.PPum, PPumHeaTot.u[2]); connect(proHeaWat.mEva_flow, masFloHeaTot.u[1]); connect(zer.y, PPumHeaTot.u[2]); connect(senMasFloHeaWat.port_b, senTHeaWatRet.port_a); connect(senTHeaWatRet.port_b, bypHeaWatRet.port_1); connect(senMasFloChiWat.port_b, senTChiWatRet.port_a); connect(souColWat.ports[1], proHotWat.port_a1); connect(delT.y, gai.u); connect(TColWat, delT.u2); connect(THotWatSupSet, delT.u1); connect(proHeaWat.port_b1, senMasFloHeaWatPri.port_a); connect(senMasFloHeaWatPri.port_b, bypHeaWatSup.port_1); connect(port_aSerAmb, swiFlo.port_aSup); connect(swiFlo.port_bRet, port_bSerAmb); connect(uHea, enaHea.u); connect(conTChiWat.y, gai2.u); connect(uCoo, conTChiWat.uEna); connect(uSHW, enaSHW.u); connect(enaSHW.y, proHotWat.uEna); connect(div1.y, souColWat.m_flow_in); connect(senTChiWatRet.port_b, volChiWat.ports[1]); connect(volChiWat.ports[2], hexChi.port_a2); connect(hexChi.port_b2, senTChiWatSup.port_a); connect(bouChiWat.ports[1], volChiWat.ports[3]); connect(senTChiWatSup.T, conTChiWat.u_m); connect(zer1.y, masFloHea.u2); connect(proHotWat.mEva_flow, masFloHea.u2); connect(proHeaWat.mEva_flow, masFloHea.u1); connect(masFloHea.y, swiFlo.mPos_flow); connect(proHeaWat.PHea, PHeaTot.u[1]); connect(proHotWat.PHea, PHeaTot.u[2]); connect(zer.y, PHeaTot.u[2]); connect(PHeaTot.y, PHea); connect(loaSHW, heaFloEvaSHW.u1); connect(proHotWat.PHea, heaFloEvaSHW.u2); connect(senTHeaWatRet.T, dTHHW.u2); connect(senTHeaWatSup.T, dTHHW.u1); connect(senMasFloHeaWat.m_flow, capFloHHW.u); connect(proHeaWat.PHea, heaFloEvaHHW.u2); connect(conFloEvaSHW.m_flow, proHotWat.m2_flow); connect(conFloEvaHHW.m_flow, proHeaWat.m2_flow); connect(senMasFloHeaWat.m_flow, priOve.u1); connect(conFloConHHW.m_flow, priOve.u2); connect(priOve.y, proHeaWat.m1_flow); connect(heaFloEvaSHW.y, conFloEvaSHW.loa); connect(heaFloEvaHHW.y, conFloEvaHHW.loa); connect(capFloHHW.y, loaHHW.u2); connect(dTHHW.y, loaHHW.u1); connect(loaHHW.y, conFloConHHW.loa); connect(loaHHW.y, heaFloEvaHHW.u1); end HeatPumpHeatExchanger;