Buildings.Fluid.HeatPumps.ModularReversible.Examples

Collection of models that illustrate model use and test models

Information

This package contains examples for the use of models that can be found in Buildings.Fluid.HeatPumps.ModularReversible.

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

Name Description
Buildings.Fluid.HeatPumps.ModularReversible.Examples.AirToWater2D_OneRoomRadiator AirToWater2D_OneRoomRadiator Reversible heat pump with EN 2D data connected to a simple room model with radiator
Buildings.Fluid.HeatPumps.ModularReversible.Examples.CarnotWithLosses_OneRoomRadiator CarnotWithLosses_OneRoomRadiator Reversible heat pump with Carnot approach connected to a simple room model with radiator
Buildings.Fluid.HeatPumps.ModularReversible.Examples.LargeScaleWaterToWater_OneRoomRadiator LargeScaleWaterToWater_OneRoomRadiator Large scale water to water heat pump connected to a simple room model with radiator
Buildings.Fluid.HeatPumps.ModularReversible.Examples.Modular_OneRoomRadiator Modular_OneRoomRadiator Modular reversible heat pump connected to a simple room model with radiator
Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDep TableData2DLoadDep Validation model for heat pump component with ideal controls
Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1And2 TableData2DLoadDepSHC1And2 Example of a primary-secondary plant with four-pipe heat pump
Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1Only TableData2DLoadDepSHC1Only Example of a primary-only plant with four-pipe heat pump
Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses BaseClasses Bases package for examples

Buildings.Fluid.HeatPumps.ModularReversible.Examples.AirToWater2D_OneRoomRadiator Buildings.Fluid.HeatPumps.ModularReversible.Examples.AirToWater2D_OneRoomRadiator

Reversible heat pump with EN 2D data connected to a simple room model with radiator

Buildings.Fluid.HeatPumps.ModularReversible.Examples.AirToWater2D_OneRoomRadiator

Information

This example demonstrates how to use the Buildings.Fluid.HeatPumps.ModularReversible.AirToWaterTableData2D heat pump model. Please check the associated documentation for further information.

Please check the documentation of Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator for further information on the example.

Extends from Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator (Simple room model with radiator, without a heat pump), Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
replaceable package MediumAirAirMedium model for air
replaceable package MediumWatWaterMedium model for water
replaceable package MediumEvaWaterMedium model for evaporator-side fluid
HeatFlowRateQ_flow_nominal20000Nominal heat flow rate of radiator [W]
TemperatureTRadSup_nominal273.15 + 50Radiator nominal supply water temperature [K]
TemperatureTRadRet_nominal273.15 + 45Radiator nominal return water temperature [K]
MassFlowRatemCon_flow_nominalheaPum.mCon_flow_nominalHeat pump nominal mass flow rate in condenser [kg/s]
MassFlowRatemEva_flow_nominalheaPum.mEva_flow_nominalHeat pump nominal mass flow rate in evaporator [kg/s]
VolumeV6*10*3Room volume [m3]
MassFlowRatemAirRoo_flow_nominalV*1.2*6/3600Nominal mass flow rate of room air [kg/s]
HeatFlowRateQRooInt_flowQ_flow_nominal/5Internal heat gains of the room [W]
BooleanwitCootrue=true to simulate cooling behaviour

Connectors

TypeNameDescription
replaceable package MediumEvaMedium model for evaporator-side fluid
BusweaBusWeather data bus

Modelica definition

model AirToWater2D_OneRoomRadiator "Reversible heat pump with EN 2D data connected to a simple room model with radiator" extends Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator ( redeclare package MediumEva = MediumAir, mEva_flow_nominal=heaPum.mEva_flow_nominal, mCon_flow_nominal=heaPum.mCon_flow_nominal, sin(nPorts=1), booToReaPumEva(realTrue=heaPum.mEva_flow_nominal), pumHeaPumSou( dp_nominal=heaPum.dpEva_nominal), sou(use_T_in=true), pumHeaPum(dp_nominal=heaPum.dpCon_nominal)); Buildings.Fluid.HeatPumps.ModularReversible.AirToWaterTableData2D heaPum( redeclare package MediumCon = MediumWat, redeclare package MediumEva = MediumEva, TCon_start=TRadSup_nominal, QHea_flow_nominal=Q_flow_nominal, use_intSafCtr=true, dpCon_nominal(displayUnit="Pa") = 2000, dpEva_nominal(displayUnit="Pa") = 200, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, TConHea_nominal=rad.TRad_nominal, TEvaHea_nominal=283.15, TConCoo_nominal=oneRooRadHeaPumCtr.TRadMinSup, TEvaCoo_nominal=303.15, redeclare Buildings.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511.Vitocal251A08 datTabHea, redeclare Buildings.Fluid.Chillers.ModularReversible.Data.TableData2D.EN14511.Vitocal251A08 datTabCoo, redeclare Buildings.Fluid.HeatPumps.ModularReversible.Controls.Safety.Data.Wuellhorst2021 safCtrPar( use_minOnTime=true, minOnTime=300, use_minOffTime=true, minOffTime=300, use_maxCycRat=true)) "Reversible heat pump based on 2D table data"; extends Modelica.Icons.Example; Modelica.Blocks.Sources.Pulse TAirSouSte( amplitude=20, width=10, period=86400, offset=283.15, startTime=86400/2) if witCoo "Air source temperature step for cooling phase"; equation connect(heaPum.port_b2, sin.ports[1]); connect(heaPum.port_a2, pumHeaPumSou.port_b); connect(heaPum.port_b1, pumHeaPum.port_a); connect(heaPum.port_a1, temRet.port_b); connect(oneRooRadHeaPumCtr.ySet, heaPum.ySet); connect(heaPum.hea, oneRooRadHeaPumCtr.hea); connect(TAirSouSte.y, sou.T_in); end AirToWater2D_OneRoomRadiator;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.CarnotWithLosses_OneRoomRadiator Buildings.Fluid.HeatPumps.ModularReversible.Examples.CarnotWithLosses_OneRoomRadiator

Reversible heat pump with Carnot approach connected to a simple room model with radiator

Buildings.Fluid.HeatPumps.ModularReversible.Examples.CarnotWithLosses_OneRoomRadiator

Information

This example demonstrates how to use the Buildings.Fluid.HeatPumps.ModularReversible.CarnotWithLosses heat pump model. Please check the associated documentation for further information.

Please check the documentation of Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator for further information on the example.

Extends from Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator (Simple room model with radiator, without a heat pump), Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
replaceable package MediumAirAirMedium model for air
replaceable package MediumWatWaterMedium model for water
replaceable package MediumEvaWaterMedium model for evaporator-side fluid
HeatFlowRateQ_flow_nominal20000Nominal heat flow rate of radiator [W]
TemperatureTRadSup_nominal273.15 + 50Radiator nominal supply water temperature [K]
TemperatureTRadRet_nominal273.15 + 45Radiator nominal return water temperature [K]
MassFlowRatemCon_flow_nominalheaPum.mCon_flow_nominalHeat pump nominal mass flow rate in condenser [kg/s]
MassFlowRatemEva_flow_nominalheaPum.mEva_flow_nominalHeat pump nominal mass flow rate in evaporator [kg/s]
VolumeV6*10*3Room volume [m3]
MassFlowRatemAirRoo_flow_nominalV*1.2*6/3600Nominal mass flow rate of room air [kg/s]
HeatFlowRateQRooInt_flowQ_flow_nominal/5Internal heat gains of the room [W]
BooleanwitCootrue=true to simulate cooling behaviour
RealperHeaLos0.01Percentage of heat losses in the heat exchangers to the nominal heating output

Connectors

TypeNameDescription
BusweaBusWeather data bus

Modelica definition

model CarnotWithLosses_OneRoomRadiator "Reversible heat pump with Carnot approach connected to a simple room model with radiator" extends Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator( mEva_flow_nominal=heaPum.mEva_flow_nominal, mCon_flow_nominal=heaPum.mCon_flow_nominal, sin(nPorts=1), booToReaPumEva(realTrue=heaPum.mEva_flow_nominal), pumHeaPumSou(dp_nominal=heaPum.dpEva_nominal), pumHeaPum(dp_nominal=heaPum.dpCon_nominal)); extends Modelica.Icons.Example; parameter Real perHeaLos=0.01 "Percentage of heat losses in the heat exchangers to the nominal heating output"; Buildings.Fluid.HeatPumps.ModularReversible.CarnotWithLosses heaPum( redeclare package MediumCon = MediumWat, redeclare package MediumEva = MediumEva, QHea_flow_nominal=Q_flow_nominal, use_rev=true, use_intSafCtr=true, TConHea_nominal=TRadSup_nominal, dTCon_nominal=TRadSup_nominal - TRadRet_nominal, dpCon_nominal(displayUnit="Pa") = 2000, CCon=5000, GConOut=perHeaLos*Q_flow_nominal/(TRadSup_nominal - temAmbBas.k), GConIns=20000, TEvaHea_nominal=sou.T, dTEva_nominal=5, dpEva_nominal(displayUnit="Pa") = 2000, CEva=5000, GEvaOut=perHeaLos*Q_flow_nominal/(temAmbBas.k - sou.T), GEvaIns=20000, TConCoo_nominal=oneRooRadHeaPumCtr.TRadMinSup, TEvaCoo_nominal=sou.T + 10, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, redeclare Buildings.Fluid.HeatPumps.ModularReversible.Controls.Safety.Data.Wuellhorst2021 safCtrPar, etaCarnot_nominal=0.4) "Reversible heat pump with losses and Carnot approach"; Modelica.Blocks.Sources.Constant temAmbBas(final k( final unit="K", displayUnit="degC") = 291.15) "Ambient temperature in basement of building"; equation connect(heaPum.port_b2, sin.ports[1]); connect(heaPum.port_a2, pumHeaPumSou.port_b); connect(heaPum.port_b1, pumHeaPum.port_a); connect(heaPum.port_a1, temRet.port_b); connect(temAmbBas.y, heaPum.TEvaAmb); connect(temAmbBas.y, heaPum.TConAmb); connect(oneRooRadHeaPumCtr.hea, heaPum.hea); connect(oneRooRadHeaPumCtr.ySet, heaPum.ySet); end CarnotWithLosses_OneRoomRadiator;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.LargeScaleWaterToWater_OneRoomRadiator Buildings.Fluid.HeatPumps.ModularReversible.Examples.LargeScaleWaterToWater_OneRoomRadiator

Large scale water to water heat pump connected to a simple room model with radiator

Buildings.Fluid.HeatPumps.ModularReversible.Examples.LargeScaleWaterToWater_OneRoomRadiator

Information

This example demonstrates how to use the Buildings.Fluid.HeatPumps.ModularReversible.LargeScaleWaterToWater heat pump model. Please check the associated documentation for further information.

Contrary to the other models, parameters for heat exchanger inertia (tau) and mass flow rates are calculated automatically based on the heat demand.

Furthermore, this example demonstrates the warnings which are raised if two devices are combined with different sizes, leading to different scaling factors for heating and cooling operation. If the default QCoo_flow_nominal is used (leading to the same scaling factors), the mass flow rates will differ. Setting the parameter allowDifferentDeviceIdentifiers to false, an additional warning is raised, indicating that the table data for cooling and heating operation do not originate from the same real device.

Please check the documentation of Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator for further information on the example.

Extends from Modelica.Icons.Example (Icon for runnable examples), Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator (Simple room model with radiator, without a heat pump).

Parameters

TypeNameDefaultDescription
replaceable package MediumAirAirMedium model for air
replaceable package MediumWatWaterMedium model for water
replaceable package MediumEvaWaterMedium model for evaporator-side fluid
HeatFlowRateQ_flow_nominal200000Nominal heat flow rate of radiator [W]
TemperatureTRadSup_nominal273.15 + 50Radiator nominal supply water temperature [K]
TemperatureTRadRet_nominal273.15 + 45Radiator nominal return water temperature [K]
MassFlowRatemCon_flow_nominalheaPum.mCon_flow_nominalHeat pump nominal mass flow rate in condenser [kg/s]
MassFlowRatemEva_flow_nominalheaPum.mEva_flow_nominalHeat pump nominal mass flow rate in evaporator [kg/s]
VolumeV6*100*3Room volume [m3]
MassFlowRatemAirRoo_flow_nominalV*1.2*6/3600*10Nominal mass flow rate of room air [kg/s]
HeatFlowRateQRooInt_flowQ_flow_nominal/5Internal heat gains of the room [W]
BooleanwitCootrue=true to simulate cooling behaviour

Connectors

TypeNameDescription
BusweaBusWeather data bus

Modelica definition

model LargeScaleWaterToWater_OneRoomRadiator "Large scale water to water heat pump connected to a simple room model with radiator" extends Modelica.Icons.Example; extends Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator( mEva_flow_nominal=heaPum.mEva_flow_nominal, mCon_flow_nominal=heaPum.mCon_flow_nominal, V=6*100*3, witCoo=true, mAirRoo_flow_nominal=V*1.2*6/3600*10, Q_flow_nominal=200000, sin(nPorts=1), booToReaPumEva(realTrue=heaPum.mEva_flow_nominal), pumHeaPumSou(dp_nominal=150000), pumHeaPum(dp_nominal=150000), sou(use_T_in=true)); Buildings.Fluid.HeatPumps.ModularReversible.LargeScaleWaterToWater heaPum( allowDifferentDeviceIdentifiers=true, QHea_flow_nominal=Q_flow_nominal, use_intSafCtr=true, QCoo_flow_nominal=-Q_flow_nominal/2, TConHea_nominal=TRadSup_nominal, dpCon_nominal(displayUnit="Pa"), TEvaHea_nominal=sou.T, dpEva_nominal(displayUnit="Pa"), energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, redeclare Buildings.Fluid.HeatPumps.ModularReversible.Controls.Safety.Data.Wuellhorst2021 safCtrPar, TConCoo_nominal=oneRooRadHeaPumCtr.TRadMinSup, TEvaCoo_nominal=sou.T + 30, redeclare Buildings.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511.WAMAK_WaterToWater_220kW datTabHea, redeclare Buildings.Fluid.Chillers.ModularReversible.Data.TableData2D.EN14511.Carrier30XWP1012_1MW datTabCoo) "Large scale water to water heat pump"; Modelica.Blocks.Sources.Pulse TAirSouSte( amplitude=20, width=10, period=86400, offset=283.15, startTime=86400/2) if witCoo "Air source temperature step for cooling phase"; equation connect(heaPum.port_b2, sin.ports[1]); connect(heaPum.port_a2, pumHeaPumSou.port_b); connect(heaPum.port_b1, pumHeaPum.port_a); connect(heaPum.port_a1, temRet.port_b); connect(oneRooRadHeaPumCtr.ySet, heaPum.ySet); connect(oneRooRadHeaPumCtr.hea, heaPum.hea); connect(TAirSouSte.y, sou.T_in); end LargeScaleWaterToWater_OneRoomRadiator;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.Modular_OneRoomRadiator Buildings.Fluid.HeatPumps.ModularReversible.Examples.Modular_OneRoomRadiator

Modular reversible heat pump connected to a simple room model with radiator

Buildings.Fluid.HeatPumps.ModularReversible.Examples.Modular_OneRoomRadiator

Information

This example demonstrates how to use the Buildings.Fluid.HeatPumps.ModularReversible.Modular heat pump model directly. Please check the associated documentation for further information.

Correct replacement of the replaceable submodels and, thus, flexible aggregation to a new model approach is demonstrated.

Please check the documentation of Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator for further information on the example.

Extends from Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator (Simple room model with radiator, without a heat pump), Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
replaceable package MediumAirAirMedium model for air
replaceable package MediumWatWaterMedium model for water
replaceable package MediumEvaWaterMedium model for evaporator-side fluid
HeatFlowRateQ_flow_nominal20000Nominal heat flow rate of radiator [W]
TemperatureTRadSup_nominal273.15 + 50Radiator nominal supply water temperature [K]
TemperatureTRadRet_nominal273.15 + 45Radiator nominal return water temperature [K]
MassFlowRatemCon_flow_nominalQ_flow_nominal/4200/5Heat pump nominal mass flow rate in condenser [kg/s]
MassFlowRatemEva_flow_nominalheaPum.mEva_flow_nominalHeat pump nominal mass flow rate in evaporator [kg/s]
VolumeV6*10*3Room volume [m3]
MassFlowRatemAirRoo_flow_nominalV*1.2*6/3600Nominal mass flow rate of room air [kg/s]
HeatFlowRateQRooInt_flowQ_flow_nominal/5Internal heat gains of the room [W]
BooleanwitCootrue=true to simulate cooling behaviour

Connectors

TypeNameDescription
replaceable package MediumEvaMedium model for evaporator-side fluid
BusweaBusWeather data bus

Modelica definition

model Modular_OneRoomRadiator "Modular reversible heat pump connected to a simple room model with radiator" extends Buildings.Fluid.HeatPumps.ModularReversible.Examples.BaseClasses.PartialOneRoomRadiator ( redeclare package MediumEva = MediumAir, mEva_flow_nominal=heaPum.mEva_flow_nominal, sin(nPorts=1), pumHeaPumSou( dp_nominal=heaPum.dpEva_nominal), booToReaPumEva(realTrue=heaPum.mEva_flow_nominal), pumHeaPum(dp_nominal=heaPum.dpCon_nominal)); extends Modelica.Icons.Example; Buildings.Fluid.HeatPumps.ModularReversible.Modular heaPum( redeclare package MediumCon = MediumWat, redeclare package MediumEva = MediumAir, use_rev=true, allowDifferentDeviceIdentifiers=true, QHea_flow_nominal=Q_flow_nominal, redeclare model RefrigerantCycleInertia = Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Inertias.NoInertia, use_intSafCtr=true, TConHea_nominal=TRadSup_nominal, TConCoo_nominal=oneRooRadHeaPumCtr.TRadMinSup, dTCon_nominal=TRadSup_nominal - TRadRet_nominal, dpCon_nominal(displayUnit="Pa") = 2000, use_conCap=true, CCon=3000, GConOut=100, GConIns=1000, TEvaHea_nominal=sou.T, TEvaCoo_nominal=303.15, dTEva_nominal=2, dpEva_nominal(displayUnit="Pa") = 200, use_evaCap=false, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, redeclare model RefrigerantCycleHeatPumpHeating = Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.ConstantCarnotEffectiveness( redeclare Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Frosting.NoFrosting iceFacCal, TAppCon_nominal=0, TAppEva_nominal=0), redeclare model RefrigerantCycleHeatPumpCooling = Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2D( redeclare Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Frosting.NoFrosting iceFacCal, mCon_flow_nominal=heaPum.mCon_flow_nominal, mEva_flow_nominal=heaPum.mEva_flow_nominal, datTab=Buildings.Fluid.Chillers.ModularReversible.Data.TableData2D.EN14511.Vitocal251A08()), redeclare Buildings.Fluid.HeatPumps.ModularReversible.Controls.Safety.Data.Wuellhorst2021 safCtrPar( use_TConOutHea=true, use_TEvaOutHea=false, use_antFre=true, TAntFre=275.15), QCoo_flow_nominal=-Q_flow_nominal*0.5) "Modular reversible heat pump"; Modelica.Blocks.Sources.Constant temAmbBas( final k( final unit="K", displayUnit="degC") = 291.15) "Ambient temperature in basement of building"; equation connect(heaPum.port_b2, sin.ports[1]); connect(heaPum.port_a2, pumHeaPumSou.port_b); connect(heaPum.port_b1, pumHeaPum.port_a); connect(heaPum.port_a1, temRet.port_b); connect(temAmbBas.y, heaPum.TConAmb); connect(heaPum.hea, oneRooRadHeaPumCtr.hea); connect(oneRooRadHeaPumCtr.ySet, heaPum.ySet); end Modular_OneRoomRadiator;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDep Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDep

Validation model for heat pump component with ideal controls

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDep

Information

This model illustrates the use of Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDep in a configuration in which water-to-water heat pump components are exposed to a constant differential pressure and a varying return temperature on the load side.

The heat pump components are configured to represent either a non-reversible heat pump (component hpNrv) or a reversible heat pump (component hp) that switches between cooling and heating mode.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
replaceable package MediumBuildings.Media.WaterHW or CHW medium
GenericHeatPumpdatHeadatHea(fileName=Modelica.Uti...Heat pump performance data
GenericdatCoodatCoo(fileName=Modelica.Uti...Chiller performance data
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
replaceable package MediumHW or CHW medium

Modelica definition

model TableData2DLoadDep "Validation model for heat pump component with ideal controls" extends Modelica.Icons.Example; replaceable package Medium=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "HW or CHW medium"; parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; final parameter Modelica.Units.SI.Temperature THeaWatRet_nominal=hp.TConHea_nominal - hp.dTCon_nominal; final parameter Modelica.Units.SI.Temperature TChiWatRet_nominal=hp.TConCoo_nominal + hp.dTEva_nominal; Buildings.Controls.OBC.CDL.Reals.Sources.Constant TChiWatSupSet( k=hp.TConCoo_nominal, y(final unit="K", displayUnit="degC")) "CHWST setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant THeaWatSupSet( k=hp.TConHea_nominal, y(final unit="K", displayUnit="degC")) "HW supply temperature setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Sin THeaWatRet( amplitude=hp.TConHea_nominal - THeaWatRet_nominal, freqHz=3 / 3000, y(final unit="K", displayUnit="degC"), offset=THeaWatRet_nominal, startTime=0) "HW return temperature value"; Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable y1( table=[ 0, 1, 1; 30, 0, 1; 45, 1, 0; 75, 0, 0], timeScale=60, period=5400) "Heat pump enable and heating mode command"; Buildings.Controls.OBC.CDL.Reals.Sources.Sin TChiWatRet( amplitude=TChiWatRet_nominal - hp.TConCoo_nominal, freqHz=3 / 3000, y(final unit="K", displayUnit="degC"), offset=TChiWatRet_nominal, startTime=0) "CHW return temperature value"; Fluid.Sources.Boundary_pT inlHp( redeclare final package Medium=Medium, use_p_in=true, use_T_in=true, nPorts=1) "Boundary conditions of CHW/HW at HP inlet"; Buildings.Controls.OBC.CDL.Reals.Switch TRetAct "Active return temperature"; Buildings.Controls.OBC.CDL.Reals.Switch pInl_rel "Active inlet gauge pressure"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant pHeaWatInl( k=sup.p + hp.dpCon_nominal) "HW inlet pressure"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant pChiWatInl( k=sup.p + hp.dpCon_nominal *(hp.mEva_flow_nominal / hp.mCon_flow_nominal) ^ 2) "CHW inlet pressure"; Fluid.Sensors.TemperatureTwoPort TRet( redeclare final package Medium=Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Return temperature"; Fluid.Sensors.TemperatureTwoPort TSup( redeclare final package Medium=Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Supply temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Ramp TAmbHea( y(final unit="K", displayUnit="degC"), height=4, duration=500, offset=hp.TEvaHea_nominal, startTime=2400) "Ambient fluid supply temperature value"; Buildings.Controls.OBC.CDL.Reals.Sources.Ramp TAmbCoo( y(final unit="K", displayUnit="degC"), height=- 4, duration=500, offset=hp.TEvaCoo_nominal, startTime=1400) "Ambient-side fluid supply temperature value"; Buildings.Controls.OBC.CDL.Reals.Switch TAmbAct "Active ambient-side fluid supply temperature"; Buildings.Controls.OBC.CDL.Reals.Switch pInl_rel1 "Active inlet gauge pressure"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant pAmbInlHea( k=retAmb.p + hp.dpEva_nominal) "Ambient fluid inlet pressure"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant pAmbInlCoo( k=retAmb.p + hp.dpCon_nominal) "Ambient-side fluid inlet pressure"; Fluid.Sources.Boundary_pT inlHpAmb( redeclare final package Medium=Medium, use_p_in=true, use_T_in=true, nPorts=1) "Boundary conditions of ambient-side fluid at HP inlet"; Fluid.Sources.Boundary_pT retAmb( redeclare final package Medium=Medium, p=Buildings.Templates.Data.Defaults.pHeaWat_rel_nominal + 101325, nPorts=2) "Boundary conditions of ambient-side fluid at HP outlet"; Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDep hp( show_T=true, redeclare final package MediumCon=Medium, redeclare final package MediumEva=Medium, use_rev=true, use_intSafCtr=false, mCon_flow_nominal=datHea.mCon_flow_nominal, QHea_flow_nominal=890E3, QCoo_flow_nominal=- 630E3, datCoo=datCoo, P_min=50, TConHea_nominal=336.15, CCon=0, GConOut=0, GConIns=0, TEvaHea_nominal=279.15, mEva_flow_nominal=datHea.mEva_flow_nominal, use_conCap=false, CEva=0, GEvaOut=0, GEvaIns=0, TEva_start=290.15, use_evaCap=false, final energyDynamics=energyDynamics, final datHea=datHea, TConCoo_nominal=279.15, TEvaCoo_nominal=336.15) "Heat pump"; parameter Data.TableData2DLoadDep.GenericHeatPump datHea( fileName=Modelica.Utilities.Files.loadResource( "modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/Examples/TableData2DLoadDep_HP.txt"), PLRSup={0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.9,1.0}, PLRCyc_min=0.2, mCon_flow_nominal=45, mEva_flow_nominal=30, dpCon_nominal=40E3, dpEva_nominal=37E3, devIde="30XW852", use_TEvaOutForTab=true, use_TConOutForTab=true, tabUppBou=[ 276.45, 336.15; 303.15, 336.15], use_TConOutForOpeEnv=true, use_TEvaOutForOpeEnv=true) "Heat pump performance data"; Sources.Boundary_pT sup( redeclare final package Medium=Medium, p=Buildings.Templates.Data.Defaults.pHeaWat_rel_nominal + 101325, nPorts=2) "Boundary condition at distribution system supply"; parameter Buildings.Fluid.Chillers.ModularReversible.Data.TableData2DLoadDep.Generic datCoo( fileName=Modelica.Utilities.Files.loadResource( "modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/Examples/TableData2DLoadDep_Chiller.txt"), PLRSup={0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.9,1.0}, PLRCyc_min=0.2, mCon_flow_nominal=45, mEva_flow_nominal=30, dpCon_nominal=40E3, dpEva_nominal=37E3, devIde="30XW852", use_TEvaOutForTab=true, use_TConOutForTab=true, tabLowBou=[ 292.15, 276.45; 336.15, 276.45], use_TConOutForOpeEnv=true, use_TEvaOutForOpeEnv=true) "Chiller performance data"; Sources.Boundary_pT inlHp1( redeclare final package Medium=Medium, p=pHeaWatInl.k, use_T_in=true, nPorts=1) "Boundary conditions of CHW/HW at HP inlet"; Sensors.TemperatureTwoPort TRet1( redeclare final package Medium=Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Return temperature"; Sensors.TemperatureTwoPort TSup1( redeclare final package Medium=Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Supply temperature"; Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDep hpNrv( show_T=true, redeclare final package MediumCon=Medium, redeclare final package MediumEva=Medium, use_rev=false, use_intSafCtr=false, mCon_flow_nominal=datHea.mCon_flow_nominal, QHea_flow_nominal=890E3, P_min=50, TConHea_nominal=336.15, CCon=0, GConOut=0, GConIns=0, TEvaHea_nominal=279.15, mEva_flow_nominal=datHea.mEva_flow_nominal, use_conCap=false, CEva=0, GEvaOut=0, GEvaIns=0, TEva_start=290.15, use_evaCap=false, final energyDynamics=energyDynamics, final datHea=datHea) "Non reversible heat pump"; Sources.Boundary_pT inlHpAmb1( redeclare final package Medium=Medium, p=pAmbInlHea.k, use_T_in=true, nPorts=1) "Boundary conditions of ambient-side fluid at HP inlet"; equation connect(THeaWatRet.y, TRetAct.u1); connect(TChiWatRet.y, TRetAct.u3); connect(TRetAct.y, inlHp.T_in); connect(pInl_rel.y, inlHp.p_in); connect(pHeaWatInl.y, pInl_rel.u1); connect(pChiWatInl.y, pInl_rel.u3); connect(TAmbHea.y,TAmbAct. u1); connect(TAmbCoo.y,TAmbAct. u3); connect(pAmbInlHea.y, pInl_rel1.u1); connect(pAmbInlCoo.y, pInl_rel1.u3); connect(TAmbAct.y,inlHpAmb. T_in); connect(pInl_rel1.y,inlHpAmb. p_in); connect(TRet.port_b, hp.port_a1); connect(TSup.port_a, hp.port_b1); connect(TSup.port_b, sup.ports[1]); connect(inlHpAmb.ports[1], hp.port_a2); connect(retAmb.ports[1], hp.port_b2); connect(y1.y[1], hp.on); connect(inlHp.ports[1], TRet.port_a); connect(TRet1.port_b, hpNrv.port_a1); connect(TSup1.port_a, hpNrv.port_b1); connect(y1.y[1], hpNrv.on); connect(inlHp1.ports[1], TRet1.port_a); connect(TSup1.port_b, sup.ports[2]); connect(inlHpAmb1.ports[1], hpNrv.port_a2); connect(hpNrv.port_b2,retAmb. ports[2]); connect(TAmbHea.y,inlHpAmb1. T_in); connect(THeaWatRet.y, inlHp1.T_in); connect(THeaWatSupSet.y, hpNrv.THwSet); connect(y1.y[2], TRetAct.u2); connect(y1.y[2], pInl_rel.u2); connect(y1.y[2], pInl_rel1.u2); connect(y1.y[2], hp.hea); connect(y1.y[2],TAmbAct. u2); connect(TChiWatSupSet.y, hp.TChwSet); connect(THeaWatSupSet.y, hp.THwSet); end TableData2DLoadDep;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1And2 Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1And2

Example of a primary-secondary plant with four-pipe heat pump

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1And2

Information

This model illustrates the use of Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDepSHC to model a primary-secondary heating and cooling plant. The simulation covers a 24-hour period with overlapping heating and cooling loads. The heating loads reach their peak value first, the cooling loads reach it last.

The plant model includes the following components:

A unique aggregated load is modeled on each loop by means of a cooling or heating component controlled to maintain a constant ΔT and a modulating valve controlled to track a prescribed flow rate.

The closed-loop controls use mostly the same logic as the one described in Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1Only. Only the logic that differs is presented below.

Simulating this model shows how the plant responds to a varying load by

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
Genericdatdat(PLRHeaSup={1}, PLRCooSup...Performance data
Nominal condition
HeatFlowRateQHea_flow_nominal1500E3Heating heat flow rate [W]
HeatFlowRateQCoo_flow_nominal-1500E3Cooling heat flow rate [W]
MassFlowRatemHwSec_flow_nominalabs(QHea_flow_nominal/(THwSu...Secondary HW mass flow rate [kg/s]
MassFlowRatemChwSec_flow_nominalabs(QCoo_flow_nominal/(TChwS...Secondary CHW mass flow rate [kg/s]
MassFlowRatemHwPri_flow_nominalmHwSec_flow_nominal/0.9Primary HW mass flow rate [kg/s]
MassFlowRatemChwPri_flow_nominalmChwSec_flow_nominal/0.9Primary CHW mass flow rate [kg/s]
TemperatureTHwSup_nominalBuildings.Templates.Data.Def...HW supply temperature [K]
TemperatureTChwSup_nominalBuildings.Templates.Data.Def...CHW supply temperature [K]
TemperatureTHwRet_nominalBuildings.Templates.Data.Def...HW return temperature [K]
TemperatureTChwRet_nominalBuildings.Templates.Data.Def...CHW return temperature [K]
PressureDifferencedpHwRemSet_maxBuildings.Templates.Data.Def...Maximum HW differential pressure setpoint - At remote location [Pa]
PressureDifferencedpChwRemSet_maxBuildings.Templates.Data.Def...Maximum CHW differential pressure setpoint - At remote location [Pa]
PressureDifferencedpHwLocSet_maxBuildings.Templates.Data.Def...Maximum HW differential pressure setpoint - local to the plant [Pa]
PressureDifferencedpChwLocSet_maxBuildings.Templates.Data.Def...Maximum CHW differential pressure setpoint - local to the plant [Pa]
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
BusbusPumChwPriPrimary CHW pump control bus
BusbusPumHwPriPrimary HW pump control bus
BusbusPumHwSecSecondary HW pump control bus
BusbusPumChwPri1Primary CHW pump control bus

Modelica definition

model TableData2DLoadDepSHC1And2 "Example of a primary-secondary plant with four-pipe heat pump" extends Modelica.Icons.Example; package Medium=Buildings.Media.Water "Main medium (common for CHW and HW)"; parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=1500E3 "Heating heat flow rate"; parameter Modelica.Units.SI.HeatFlowRate QCoo_flow_nominal=-1500E3 "Cooling heat flow rate"; parameter Modelica.Units.SI.MassFlowRate mHwSec_flow_nominal=abs( QHea_flow_nominal/(THwSup_nominal - THwRet_nominal))/Buildings.Utilities.Psychrometrics.Constants.cpWatLiq "Secondary HW mass flow rate"; parameter Modelica.Units.SI.MassFlowRate mChwSec_flow_nominal=abs( QCoo_flow_nominal/(TChwSup_nominal - TChwRet_nominal))/Buildings.Utilities.Psychrometrics.Constants.cpWatLiq "Secondary CHW mass flow rate"; parameter Modelica.Units.SI.MassFlowRate mHwPri_flow_nominal= mHwSec_flow_nominal / 0.9 "Primary HW mass flow rate"; parameter Modelica.Units.SI.MassFlowRate mChwPri_flow_nominal= mChwSec_flow_nominal / 0.9 "Primary CHW mass flow rate"; parameter Modelica.Units.SI.Temperature THwSup_nominal= Buildings.Templates.Data.Defaults.THeaWatSupMed "HW supply temperature"; parameter Modelica.Units.SI.Temperature TChwSup_nominal= Buildings.Templates.Data.Defaults.TChiWatSup "CHW supply temperature"; parameter Modelica.Units.SI.Temperature THwRet_nominal= Buildings.Templates.Data.Defaults.THeaWatRetMed "HW return temperature"; parameter Modelica.Units.SI.Temperature TChwRet_nominal= Buildings.Templates.Data.Defaults.TChiWatRet "CHW return temperature"; parameter Modelica.Units.SI.PressureDifference dpHwRemSet_max= Buildings.Templates.Data.Defaults.dpHeaWatRemSet_max "Maximum HW differential pressure setpoint - At remote location"; parameter Modelica.Units.SI.PressureDifference dpChwRemSet_max= Buildings.Templates.Data.Defaults.dpChiWatRemSet_max "Maximum CHW differential pressure setpoint - At remote location"; parameter Modelica.Units.SI.PressureDifference dpHwLocSet_max= Buildings.Templates.Data.Defaults.dpHeaWatLocSet_max "Maximum HW differential pressure setpoint - local to the plant"; parameter Modelica.Units.SI.PressureDifference dpChwLocSet_max= Buildings.Templates.Data.Defaults.dpChiWatLocSet_max "Maximum CHW differential pressure setpoint - local to the plant"; parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.FixedInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; BoundaryConditions.WeatherData.ReaderTMY3 weaDat( filNam=Modelica.Utilities.Files.loadResource( "modelica://Buildings/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos")) "Outdoor conditions"; Fluid.HeatExchangers.SensibleCooler_T loaHw( redeclare final package Medium = Medium, final m_flow_nominal=mHwSec_flow_nominal, show_T=true, final dp_nominal=0, final energyDynamics=energyDynamics, tau=300, QMin_flow=-QHea_flow_nominal) "HW system approximated by prescribed return temperature"; Fluid.HeatExchangers.Heater_T loaChw( redeclare final package Medium = Medium, final m_flow_nominal=mChwSec_flow_nominal, show_T=true, final dp_nominal=0, final energyDynamics=energyDynamics, tau=300, QMax_flow=-QCoo_flow_nominal) "CHW system system approximated by prescribed return temperature"; Fluid.Actuators.Valves.TwoWayEqualPercentage valDisHw( redeclare final package Medium = Medium, m_flow_nominal=mHwSec_flow_nominal, dpValve_nominal=3E4, y_start=0, dpFixed_nominal=dpHwRemSet_max - 3E4) "Distribution system approximated by variable flow resistance"; Fluid.Actuators.Valves.TwoWayEqualPercentage valDisChw( redeclare final package Medium = Medium, m_flow_nominal=mChwSec_flow_nominal, dpValve_nominal=3E4, y_start=0, dpFixed_nominal=dpChwRemSet_max - 3E4) "Distribution system approximated by variable flow resistance"; Fluid.Sensors.RelativePressure dpHwRem( redeclare final package Medium = Medium) "HW differential pressure at one remote location"; Fluid.Sensors.RelativePressure dpChwRem( redeclare final package Medium = Medium) "CHW differential pressure at one remote location"; Buildings.Controls.OBC.CDL.Reals.Sources.TimeTable ratFlo(table=[0,0,0; 5,0,0; 7,1,0; 12,0.4,0.4; 16,0,1; 22,0.1,0.1; 24,0,0], timeScale=3600) "Source signal for flow rate ratio – Index 1 for HW, 2 for CHW"; Buildings.Controls.OBC.CDL.Reals.PID ctlEquZon[2]( each k=0.1, each Ti=60, each final reverseActing=true) "Zone equipment controller"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter norFlo[2](k={1/ mHwSec_flow_nominal,1/mChwSec_flow_nominal}) "Normalize flow rate"; Fluid.Sensors.MassFlowRate mChw_flow( redeclare final package Medium=Medium) "CHW mass flow rate"; Fluid.Sensors.MassFlowRate mHw_flow( redeclare final package Medium=Medium) "HW mass flow rate"; Buildings.Controls.OBC.CDL.Reals.AddParameter TChwRetPre(p=TChwRet_nominal - TChwSup_nominal) "Prescribed CHW return temperature"; Buildings.Controls.OBC.CDL.Reals.AddParameter THwRetPre(p=THwRet_nominal - THwSup_nominal) "Prescribed HW return temperature"; Buildings.Controls.OBC.CDL.Reals.Max max2 "Limit prescribed HWRT"; Buildings.Controls.OBC.CDL.Reals.Min min1 "Limit prescribed CHWRT"; Buildings.Fluid.FixedResistances.PressureDrop pipHw( redeclare final package Medium = Medium, final m_flow_nominal=mHwSec_flow_nominal, final dp_nominal=dpHwLocSet_max - dpHwRemSet_max) "Piping"; Buildings.Fluid.FixedResistances.PressureDrop pipChw( redeclare final package Medium = Medium, final m_flow_nominal=mChwSec_flow_nominal, final dp_nominal=dpChwLocSet_max - dpChwRemSet_max) "Piping"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( k=293.15) "Constant limiting prescribed return temperature"; Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDepSHC hp( redeclare final package MediumCon = Medium, redeclare final package MediumEva = Medium, final energyDynamics=energyDynamics, final mCon_flow_nominal=mHwPri_flow_nominal, final mEva_flow_nominal=mChwPri_flow_nominal, nUni=3, final use_preDro=false, QHeaShc_flow_nominal=QHea_flow_nominal, QCooShc_flow_nominal=QCoo_flow_nominal, final dat=dat, final QHea_flow_nominal=QHea_flow_nominal, final QCoo_flow_nominal=QCoo_flow_nominal, final TConHea_nominal=THwSup_nominal, TEvaHea_nominal=Buildings.Templates.Data.Defaults.TOutHpHeaLow, final TConCoo_nominal=TChwSup_nominal, TEvaCoo_nominal=Buildings.Templates.Data.Defaults.TOutHpCoo, dpHw_nominal=30000, dpChw_nominal=40000) "Modular heat pump"; parameter Data.TableData2DLoadDepSHC.Generic dat( PLRHeaSup={1}, PLRCooSup={1}, PLRShcSup={1}, fileNameHea=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_Heating.txt"), fileNameCoo=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_Cooling.txt"), fileNameShc=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_SHC.txt"), mCon_flow_nominal=1.7, mEva_flow_nominal=3.5, dpCon_nominal=30E3, dpEva_nominal=40E3, devIde="", use_TEvaOutForTab=true, use_TConOutForTab=true) "Performance data"; Sensors.TemperatureTwoPort TChwSup( redeclare final package Medium = Medium, final m_flow_nominal=mChwSec_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=TChwSup_nominal) "CHW supply temperature"; Sensors.TemperatureTwoPort THwSup( redeclare final package Medium = Medium, final m_flow_nominal=mHwSec_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=THwSup_nominal) "HW supply temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant TSupSet[2](k={ THwSup_nominal,TChwSup_nominal}) "Supply temperature setpoints"; Sources.Boundary_pT pChwRet( redeclare final package Medium = Medium, p=Buildings.Templates.Data.Defaults.pChiWat_rel_nominal + 101325, nPorts=1) "Pressure boundary conditions at HP inlet"; Sources.Boundary_pT pHwRet( redeclare final package Medium = Medium, p=Buildings.Templates.Data.Defaults.pHeaWat_rel_nominal + 101325, nPorts=1) "Pressure boundary condition at HP inlet"; Actuators.Valves.TwoWayTable valHwIso( redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal, flowCharacteristics=hp.chaValHwIso, dpValve_nominal=hp.dpValIso_nominal, init=Modelica.Blocks.Types.Init.InitialState, dpFixed_nominal=hp.dpHw_nominal) "Equivalent actuator for modules' condenser barrels and HW isolation valves"; Actuators.Valves.TwoWayTable valChwIso( redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal, dpValve_nominal=hp.dpValIso_nominal, init=Modelica.Blocks.Types.Init.InitialState, dpFixed_nominal=hp.dpChw_nominal, flowCharacteristics=hp.chaValChwIso) "Equivalent actuator for modules' evaporator barrels and CHW isolation valves"; Buildings.Controls.OBC.CDL.Integers.MultiSum sumNumUni(nin=3) "Total number of enabled modules"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( message="Number of enabled modules exceeds number of modules") "Assert condition on number of enabled modules"; Buildings.Controls.OBC.CDL.Integers.LessEqualThreshold intLesEquThr(t=hp.nUni) "True if number of enabled modules lower or equal to number of modules"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant dpHeaSet[2](k={hp.dpHw_nominal, hp.dpChw_nominal}) "Module header dp setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant dpRemSet[2](k={ dpHwRemSet_max,dpChwRemSet_max}) "Remote dp setpoint"; Sensors.TemperatureTwoPort THwRetPla(redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Plant HW return temperature"; Sensors.TemperatureTwoPort TChwRetPla(redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal) "Plant CHW return temperature"; Sensors.TemperatureTwoPort TChwRet(redeclare final package Medium = Medium, final m_flow_nominal=mChwSec_flow_nominal) "CHW return temperature"; Sensors.TemperatureTwoPort THwRet(redeclare final package Medium = Medium, final m_flow_nominal=mHwSec_flow_nominal) "HW return temperature"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold valChwReq(t=1E-1, h=5E-2) "CHW plant request from terminal valve"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold valHwReq(t=1E-1, h=5E-2) "HW plant request from terminal valve"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqHea "Heating plant request"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqCoo "Cooling plant request"; Templates.Plants.Controls.Enabling.Enable enaHea(typ=Buildings.Templates.Plants.Controls.Types.Application.Heating, TOutLck=295.15) "Enable heating"; Templates.Plants.Controls.Enabling.Enable enaCoo(typ=Buildings.Templates.Plants.Controls.Types.Application.Cooling, TOutLck=290.15) "Enable cooling"; Templates.Components.Routing.SingleToMultiple inlPumChwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwPri.nPum, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW pumps suction header"; Templates.Components.Pumps.Multiple pumChwPri( have_var=false, redeclare final package Medium=Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(hp.mEva_flow_nominal/pumChwPri.nPum, pumChwPri.nPum), dp_nominal=fill(valChwIso.dpValve_nominal + valChwIso.dpFixed_nominal, pumChwPri.nPum) .+ pumChwPri.dpValChe_nominal, rho_default=Medium.d_const), final nPum=hp.nUni) "Primary CHW pumps"; Templates.Components.Interfaces.Bus busPumChwPri "Primary CHW pump control bus"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumChwPri( is_pri=true, is_hdr=true, is_ctlDp=false, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumChwPri.nPum, nSenDp=1, V_flow_nominal=hp.mEva_flow_nominal/Medium.d_const, dtRun=5*60) "Primary CHW pump staging"; Templates.Components.Routing.SingleToMultiple inlPumHwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwPri.nPum, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW pumps suction header"; Templates.Components.Pumps.Multiple pumHwPri( have_var=false, redeclare final package Medium = Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(hp.mCon_flow_nominal/pumHwPri.nPum, pumHwPri.nPum), dp_nominal=fill(valHwIso.dpValve_nominal + valHwIso.dpFixed_nominal, pumHwPri.nPum) .+ pumHwPri.dpValChe_nominal, rho_default=Medium.d_const), final nPum=hp.nUni) "Primary HW pumps"; Templates.Components.Routing.MultipleToSingle outPumHwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwPri.nPum, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW pumps discharge header"; Sensors.VolumeFlowRate VHwPri(redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW flow"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumHwPri( is_pri=true, is_hdr=true, is_ctlDp=false, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumHwPri.nPum, nSenDp=1, V_flow_nominal=hp.mCon_flow_nominal/Medium.d_const, dtRun=5*60) "Primary HW pump staging"; Templates.Components.Interfaces.Bus busPumHwPri "Primary HW pump control bus"; Templates.Components.Pumps.Multiple pumHwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(mHwSec_flow_nominal/pumHwSec.nPum, pumHwSec.nPum), dp_nominal=fill(dpHwLocSet_max, pumHwSec.nPum), rho_default=Medium.d_const), final nPum=hp.nUni) "Secondary HW pumps"; Templates.Plants.Controls.Pumps.Generic.ControlDifferentialPressure ctlPumHwSec( have_senDpRemWir=true, nPum=pumHwSec.nPum, nSenDpRem=1, k=0.1) "Secondary HW pump control"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumHwSec( is_pri=false, is_hdr=true, is_ctlDp=true, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumHwSec.nPum, nSenDp=1, V_flow_nominal=mHwSec_flow_nominal/Medium.d_const, dtRun=5*60) "Secondary HW pump staging"; Templates.Components.Interfaces.Bus busPumHwSec "Secondary HW pump control bus"; Templates.Components.Routing.SingleToMultiple inlPumHwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwSec.nPum, final m_flow_nominal=mHwSec_flow_nominal) "Secondary HW pumps suction header"; Templates.Components.Routing.MultipleToSingle outPumHwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwSec.nPum, final m_flow_nominal=mHwSec_flow_nominal) "Secondary HW pumps discharge header"; Templates.Components.Routing.SingleToMultiple inlPumChwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwSec.nPum, final m_flow_nominal=mChwSec_flow_nominal) "Secondary CHW pumps suction header"; Templates.Components.Pumps.Multiple pumChwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(mChwSec_flow_nominal/pumChwSec.nPum, pumChwSec.nPum), dp_nominal=fill(dpChwLocSet_max, pumChwSec.nPum), rho_default=Medium.d_const), final nPum=hp.nUni) "Secondary CHW pumps"; Templates.Components.Routing.MultipleToSingle outPumChwSec( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwSec.nPum, final m_flow_nominal=mChwSec_flow_nominal) "Secondary CHW pumps discharge header"; Templates.Plants.Controls.Pumps.Generic.ControlDifferentialPressure ctlPumChwSec( have_senDpRemWir=true, nPum=pumChwSec.nPum, nSenDpRem=1, k=0.1) "Secondary CHW pump control"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumChwSec( is_pri=false, is_hdr=true, is_ctlDp=true, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumChwSec.nPum, nSenDp=1, V_flow_nominal=mChwSec_flow_nominal/Medium.d_const, dtRun=5*60) "Secondary CHW pump staging"; Templates.Components.Interfaces.Bus busPumChwPri1 "Primary CHW pump control bus"; Sensors.VolumeFlowRate VChwSec(redeclare final package Medium = Medium, final m_flow_nominal=mChwSec_flow_nominal) "Secondary CHW flow"; Sensors.VolumeFlowRate VHwSec(redeclare final package Medium = Medium, final m_flow_nominal=mHwSec_flow_nominal) "Secondary HW flow (plant side)"; Sensors.VolumeFlowRate VChwPri(redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW flow"; Sensors.TemperatureTwoPort TChwSupPri( redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=TChwSup_nominal) "Primary CHW supply temperature"; Sensors.TemperatureTwoPort THwSupPri( redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=THwSup_nominal) "Primary HW supply temperature"; FixedResistances.Junction junChwBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mChwPri_flow_nominal*{1,-1,-1}, final dp_nominal=fill(0, 3)) "CHW bypass supply junction"; FixedResistances.Junction junChwBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mChwPri_flow_nominal*{1,-1,1}, final dp_nominal=fill(0, 3)) "CHW bypass return junction"; FixedResistances.Junction junHwBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mHwPri_flow_nominal*{1,-1,-1}, final dp_nominal=fill(0, 3)) "HW bypass supply junction"; FixedResistances.Junction junHwBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mHwPri_flow_nominal*{1,-1,1}, final dp_nominal=fill(0, 3)) "HW bypass return junction"; Templates.Components.Routing.MultipleToSingle outPumChwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwPri.nPum, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW pumps discharge header"; equation connect(loaChw.port_b, valDisChw.port_a); connect(loaHw.port_b, valDisHw.port_a); connect(valDisChw.port_b, mChw_flow.port_a); connect(valDisHw.port_b, mHw_flow.port_a); connect(mHw_flow.m_flow, norFlo[1].u); connect(mChw_flow.m_flow, norFlo[2].u); connect(norFlo.y, ctlEquZon.u_m); connect(ctlEquZon[2].y, valDisChw.y); connect(ctlEquZon[1].y, valDisHw.y); connect(TChwRetPre.y, min1.u1); connect(min1.y, loaChw.TSet); connect(max2.y, loaHw.TSet); connect(con.y, min1.u2); connect(con.y, max2.u1); connect(THwRetPre.y, max2.u2); connect(weaDat.weaBus, hp.weaBus); connect(ratFlo.y, ctlEquZon.u_s); connect(TSupSet[1].y, hp.THwSet); connect(TSupSet[2].y, hp.TChwSet); connect(dpChwRem.port_a, loaChw.port_a); connect(dpChwRem.port_b, pipChw.port_a); connect(dpHwRem.port_b, pipHw.port_a); connect(dpHwRem.port_a, loaHw.port_a); connect(pHwRet.ports[1], hp.port_a1); connect(hp.port_b1, valHwIso.port_a); connect(hp.yValHwIso, valHwIso.y); connect(hp.port_b2, valChwIso.port_a); connect(hp.yValChwIso, valChwIso.y); connect(sumNumUni.y,intLesEquThr. u); connect(intLesEquThr.y,assMes. u); connect(hp.nUniShc, sumNumUni.u[1]); connect(hp.nUniCoo, sumNumUni.u[2]); connect(hp.nUniHea, sumNumUni.u[3]); connect(pChwRet.ports[1], hp.port_a2); connect(THwRetPla.port_b, hp.port_a1); connect(TChwRetPla.port_b, hp.port_a2); connect(mChw_flow.port_b, TChwRet.port_a); connect(TChwRet.port_b, pipChw.port_a); connect(mHw_flow.port_b, THwRet.port_a); connect(THwRet.port_b, pipHw.port_a); connect(TChwSup.T, TChwRetPre.u); connect(THwSup.T, THwRetPre.u); connect(valDisChw.y_actual, valChwReq.u); connect(valDisHw.y_actual, valHwReq.u); connect(valHwReq.y, reqHea.u); connect(valChwReq.y, reqCoo.u); connect(reqHea.y, enaHea.nReqPla); connect(reqCoo.y, enaCoo.nReqPla); connect(con.y, enaHea.TOut); connect(con.y, enaCoo.TOut); connect(inlPumChwPri.ports_b, pumChwPri.ports_a); connect(busPumChwPri, pumChwPri.bus); connect(staPumChwPri.y1, busPumChwPri.y1); connect(hp.y1ChwValIsoPumPri, staPumChwPri.u1ValOutIso); connect(busPumChwPri.y1_actual, staPumChwPri.u1Pum_actual); connect(inlPumHwPri.ports_b, pumHwPri.ports_a); connect(pumHwPri.ports_b, outPumHwPri.ports_a); connect(inlPumHwPri.port_a, VHwPri.port_b); connect(staPumHwPri.y1, busPumHwPri.y1); connect(busPumHwPri, pumHwPri.bus); connect(busPumHwPri.y1_actual, staPumHwPri.u1Pum_actual); connect(hp.y1HwValIsoPumPri, staPumHwPri.u1ValOutIso); connect(ctlPumHwSec.y, busPumHwSec.y); connect(staPumHwSec.y1, busPumHwSec.y1); connect(busPumHwSec, pumHwSec.bus); connect(busPumHwSec.y1_actual, ctlPumHwSec.y1_actual); connect(busPumHwSec.y, staPumHwSec.y); connect(busPumHwSec.y1_actual, staPumHwSec.u1Pum_actual); connect(dpHwRem.p_rel, ctlPumHwSec.dpRem[1]); connect(dpHwRem.p_rel, staPumHwSec.dp[1]); connect(hp.y1HwValIsoPumPri, staPumHwPri.u1Pum); connect(pumHwSec.ports_b, outPumHwSec.ports_a); connect(inlPumHwSec.ports_b, pumHwSec.ports_a); connect(inlPumChwSec.ports_b, pumChwSec.ports_a); connect(pumChwSec.ports_b, outPumChwSec.ports_a); connect(hp.y1ChwValIsoPumPri, staPumChwPri.u1Pum); connect(ctlPumChwSec.y, busPumChwPri1.y); connect(busPumChwPri1.y1_actual,ctlPumChwSec. y1_actual); connect(dpChwRem.p_rel,ctlPumChwSec. dpRem[1]); connect(staPumChwSec.y1, busPumChwPri1.y1); connect(busPumChwPri1.y1_actual, staPumChwSec.u1Pum_actual); connect(busPumChwPri1.y, staPumChwSec.y); connect(dpChwRem.p_rel, staPumChwSec.dp[1]); connect(outPumChwSec.port_b, VChwSec.port_a); connect(VChwSec.V_flow, staPumChwSec.V_flow); connect(outPumHwSec.port_b, VHwSec.port_a); connect(inlPumChwPri.port_a, VChwPri.port_b); connect(dpRemSet[2].y, staPumChwSec.dpSet[1]); connect(dpRemSet[2].y,ctlPumChwSec. dpRemSet[1]); connect(dpRemSet[1].y, staPumHwSec.dpSet[1]); connect(dpRemSet[1].y, ctlPumHwSec.dpRemSet[1]); connect(busPumChwPri1, pumChwSec.bus); connect(VHwSec.V_flow, staPumHwSec.V_flow); connect(VChwSec.port_b, TChwSup.port_a); connect(TChwSup.port_b, loaChw.port_a); connect(VHwSec.port_b, THwSup.port_a); connect(THwSup.port_b, loaHw.port_a); connect(valChwIso.port_b, TChwSupPri.port_a); connect(TChwSupPri.port_b, VChwPri.port_a); connect(valHwIso.port_b, THwSupPri.port_a); connect(THwSupPri.port_b, VHwPri.port_a); connect(pipChw.port_b, junChwBypRet.port_1); connect(junChwBypRet.port_2, TChwRetPla.port_a); connect(pumChwPri.ports_b, outPumChwPri.ports_a); connect(outPumHwPri.port_b, junHwBypSup.port_1); connect(inlPumHwSec.port_a, junHwBypSup.port_2); connect(outPumChwPri.port_b, junChwBypSup.port_1); connect(inlPumChwSec.port_a, junChwBypSup.port_2); connect(pipHw.port_b, junHwBypRet.port_1); connect(junHwBypRet.port_2, THwRetPla.port_a); connect(junChwBypSup.port_3, junChwBypRet.port_3); connect(junHwBypSup.port_3, junHwBypRet.port_3); connect(enaHea.y1, hp.onHea); connect(enaCoo.y1, hp.onCoo); connect(enaCoo.y1, staPumChwSec.u1Pla); connect(enaHea.y1, staPumHwSec.u1Pla); end TableData2DLoadDepSHC1And2;

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1Only Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1Only

Example of a primary-only plant with four-pipe heat pump

Buildings.Fluid.HeatPumps.ModularReversible.Examples.TableData2DLoadDepSHC1Only

Information

This model illustrates the use of Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDepSHC to model a primary-only heating and cooling plant. The simulation covers a 24-hour period with overlapping heating and cooling loads. The heating loads reach their peak value first, the cooling loads reach it last.

The plant model includes the following components.

A unique aggregated load is modeled on each loop by means of a cooling or heating component controlled to maintain a constant ΔT and a modulating valve controlled to track a prescribed flow rate.

The closed-loop controls includes the following logic.

Simulating this model shows how the plant responds to a varying load by

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
Genericdatdat(PLRHeaSup={1}, PLRCooSup...Performance data
Nominal condition
HeatFlowRateQHea_flow_nominal1500E3Heating heat flow rate [W]
HeatFlowRateQCoo_flow_nominal-1500E3Cooling heat flow rate [W]
MassFlowRatemHw_flow_nominalabs(QHea_flow_nominal/(THwSu...HW mass flow rate [kg/s]
MassFlowRatemChw_flow_nominalabs(QCoo_flow_nominal/(TChwS...CHW mass flow rate [kg/s]
TemperatureTHwSup_nominalBuildings.Templates.Data.Def...HW supply temperature [K]
TemperatureTChwSup_nominalBuildings.Templates.Data.Def...CHW supply temperature [K]
TemperatureTHwRet_nominalBuildings.Templates.Data.Def...HW return temperature [K]
TemperatureTChwRet_nominalBuildings.Templates.Data.Def...CHW return temperature [K]
PressureDifferencedpHwRemSet_maxBuildings.Templates.Data.Def...Maximum HW differential pressure setpoint - At remote location [Pa]
PressureDifferencedpChwRemSet_maxBuildings.Templates.Data.Def...Maximum CHW differential pressure setpoint - At remote location [Pa]
PressureDifferencedpHwLocSet_maxBuildings.Templates.Data.Def...Maximum HW differential pressure setpoint - local to the plant [Pa]
PressureDifferencedpChwLocSet_maxBuildings.Templates.Data.Def...Maximum CHW differential pressure setpoint - local to the plant [Pa]
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
BusbusPumChwPriPrimary CHW pump control bus
BusbusPumHwPriPrimary HW pump control bus

Modelica definition

model TableData2DLoadDepSHC1Only "Example of a primary-only plant with four-pipe heat pump" extends Modelica.Icons.Example; package Medium=Buildings.Media.Water "Main medium (common for CHW and HW)"; parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=1500E3 "Heating heat flow rate"; parameter Modelica.Units.SI.HeatFlowRate QCoo_flow_nominal=-1500E3 "Cooling heat flow rate"; parameter Modelica.Units.SI.MassFlowRate mHw_flow_nominal= abs(QHea_flow_nominal / (THwSup_nominal - THwRet_nominal)) / Buildings.Utilities.Psychrometrics.Constants.cpWatLiq "HW mass flow rate"; parameter Modelica.Units.SI.MassFlowRate mChw_flow_nominal= abs(QCoo_flow_nominal / (TChwSup_nominal - TChwRet_nominal)) / Buildings.Utilities.Psychrometrics.Constants.cpWatLiq "CHW mass flow rate"; parameter Modelica.Units.SI.Temperature THwSup_nominal= Buildings.Templates.Data.Defaults.THeaWatSupMed "HW supply temperature"; parameter Modelica.Units.SI.Temperature TChwSup_nominal= Buildings.Templates.Data.Defaults.TChiWatSup "CHW supply temperature"; parameter Modelica.Units.SI.Temperature THwRet_nominal= Buildings.Templates.Data.Defaults.THeaWatRetMed "HW return temperature"; parameter Modelica.Units.SI.Temperature TChwRet_nominal= Buildings.Templates.Data.Defaults.TChiWatRet "CHW return temperature"; parameter Modelica.Units.SI.PressureDifference dpHwRemSet_max= Buildings.Templates.Data.Defaults.dpHeaWatRemSet_max "Maximum HW differential pressure setpoint - At remote location"; parameter Modelica.Units.SI.PressureDifference dpChwRemSet_max= Buildings.Templates.Data.Defaults.dpChiWatRemSet_max "Maximum CHW differential pressure setpoint - At remote location"; parameter Modelica.Units.SI.PressureDifference dpHwLocSet_max= Buildings.Templates.Data.Defaults.dpHeaWatLocSet_max "Maximum HW differential pressure setpoint - local to the plant"; parameter Modelica.Units.SI.PressureDifference dpChwLocSet_max= Buildings.Templates.Data.Defaults.dpChiWatLocSet_max "Maximum CHW differential pressure setpoint - local to the plant"; parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.FixedInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; BoundaryConditions.WeatherData.ReaderTMY3 weaDat( filNam=Modelica.Utilities.Files.loadResource( "modelica://Buildings/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos")) "Outdoor conditions"; Fluid.HeatExchangers.SensibleCooler_T loaHw( redeclare final package Medium=Medium, final m_flow_nominal=mHw_flow_nominal, show_T=true, final dp_nominal=0, final energyDynamics=energyDynamics, tau=300, QMin_flow=-QHea_flow_nominal) "HW system approximated by prescribed return temperature"; Fluid.HeatExchangers.Heater_T loaChw( redeclare final package Medium=Medium, final m_flow_nominal=mChw_flow_nominal, show_T=true, final dp_nominal=0, final energyDynamics=energyDynamics, tau=300, QMax_flow=-QCoo_flow_nominal) "CHW system system approximated by prescribed return temperature"; Fluid.Actuators.Valves.TwoWayEqualPercentage valDisHw( redeclare final package Medium=Medium, m_flow_nominal=mHw_flow_nominal, dpValve_nominal=3E4, y_start=0, dpFixed_nominal=dpHwRemSet_max - 3E4) "Distribution system approximated by variable flow resistance"; Fluid.Actuators.Valves.TwoWayEqualPercentage valDisChw( redeclare final package Medium=Medium, m_flow_nominal=mChw_flow_nominal, dpValve_nominal=3E4, y_start=0, dpFixed_nominal=dpChwRemSet_max - 3E4) "Distribution system approximated by variable flow resistance"; Fluid.Sensors.RelativePressure dpHwRem( redeclare final package Medium = Medium) "HW differential pressure at one remote location"; Fluid.Sensors.RelativePressure dpChwRem( redeclare final package Medium = Medium) "CHW differential pressure at one remote location"; Buildings.Controls.OBC.CDL.Reals.Sources.TimeTable ratFlo(table=[0,0,0; 5,0,0; 7,1,0; 12,0.4,0.4; 16,0,1; 22,0.1,0.1; 24,0,0], timeScale=3600) "Source signal for flow rate ratio – Index 1 for HW, 2 for CHW"; Buildings.Controls.OBC.CDL.Reals.PID ctlEquZon[2]( each k=0.1, each Ti=60, each final reverseActing=true) "Zone equipment controller"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter norFlo[2]( k={1/mHw_flow_nominal, 1/mChw_flow_nominal}) "Normalize flow rate"; Fluid.Sensors.MassFlowRate mChw_flow( redeclare final package Medium=Medium) "CHW mass flow rate"; Fluid.Sensors.MassFlowRate mHw_flow( redeclare final package Medium=Medium) "HW mass flow rate"; Buildings.Controls.OBC.CDL.Reals.AddParameter TChwRetPre(p=TChwRet_nominal - TChwSup_nominal) "Prescribed CHW return temperature"; Buildings.Controls.OBC.CDL.Reals.AddParameter THwRetPre(p=THwRet_nominal - THwSup_nominal) "Prescribed HW return temperature"; Buildings.Controls.OBC.CDL.Reals.Max max2 "Limit prescribed HWRT"; Buildings.Controls.OBC.CDL.Reals.Min min1 "Limit prescribed CHWRT"; Buildings.Fluid.FixedResistances.PressureDrop pipHw( redeclare final package Medium=Medium, final m_flow_nominal=mHw_flow_nominal, final dp_nominal=dpHwLocSet_max - dpHwRemSet_max) "Piping"; Buildings.Fluid.FixedResistances.PressureDrop pipChw( redeclare final package Medium=Medium, final m_flow_nominal=mChw_flow_nominal, final dp_nominal=dpChwLocSet_max - dpChwRemSet_max) "Piping"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( k=293.15) "Constant limiting prescribed return temperature"; Buildings.Fluid.HeatPumps.ModularReversible.TableData2DLoadDepSHC hp( redeclare final package MediumCon=Medium, redeclare final package MediumEva=Medium, final energyDynamics=energyDynamics, final mCon_flow_nominal=mHw_flow_nominal, final mEva_flow_nominal=mChw_flow_nominal, nUni=3, final use_preDro=false, QHeaShc_flow_nominal=QHea_flow_nominal, QCooShc_flow_nominal=QCoo_flow_nominal, final dat=dat, final QHea_flow_nominal=QHea_flow_nominal, final QCoo_flow_nominal=QCoo_flow_nominal, final TConHea_nominal=THwSup_nominal, TEvaHea_nominal=Buildings.Templates.Data.Defaults.TOutHpHeaLow, final TConCoo_nominal=TChwSup_nominal, TEvaCoo_nominal=Buildings.Templates.Data.Defaults.TOutHpCoo, dpHw_nominal=30000, dpChw_nominal=40000) "Modular heat pump"; parameter Data.TableData2DLoadDepSHC.Generic dat( PLRHeaSup={1}, PLRCooSup={1}, PLRShcSup={1}, fileNameHea=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_Heating.txt"), fileNameCoo=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_Cooling.txt"), fileNameShc=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/Fluid/HeatPumps/ModularReversible/RefrigerantCycle/BaseClasses/Validation/AWHP_SHC.txt"), mCon_flow_nominal=1.7, mEva_flow_nominal=3.5, dpCon_nominal=30E3, dpEva_nominal=40E3, devIde="", use_TEvaOutForTab=true, use_TConOutForTab=true) "Performance data"; Sensors.TemperatureTwoPort TChwSup( redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=TChwSup_nominal) "CHW supply temperature"; Sensors.TemperatureTwoPort THwSup( redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialOutput, T_start=THwSup_nominal) "HW supply temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant TSupSet[2](k={ THwSup_nominal,TChwSup_nominal}) "Supply temperature setpoints"; Sources.Boundary_pT pChwRet( redeclare final package Medium = Medium, p=Buildings.Templates.Data.Defaults.pChiWat_rel_nominal + 101325, nPorts=1) "Pressure boundary conditions at HP inlet"; Sources.Boundary_pT pHwRet( redeclare final package Medium = Medium, p=Buildings.Templates.Data.Defaults.pHeaWat_rel_nominal + 101325, nPorts=1) "Pressure boundary condition at HP inlet"; Actuators.Valves.TwoWayTable valHwIso( redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal, flowCharacteristics=hp.chaValHwIso, dpValve_nominal=hp.dpValIso_nominal, init=Modelica.Blocks.Types.Init.InitialState, dpFixed_nominal=hp.dpHw_nominal) "Equivalent actuator for modules' condenser barrels and HW isolation valves"; Actuators.Valves.TwoWayTable valChwIso( redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal, dpValve_nominal=hp.dpValIso_nominal, init=Modelica.Blocks.Types.Init.InitialState, dpFixed_nominal=hp.dpChw_nominal, flowCharacteristics=hp.chaValChwIso) "Equivalent actuator for modules' evaporator barrels and CHW isolation valves"; Buildings.Controls.OBC.CDL.Integers.MultiSum sumNumUni(nin=3) "Total number of enabled modules"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes(message="Number of enabled modules exceeds number of modules") "Assert condition on number of enabled modules"; Buildings.Controls.OBC.CDL.Integers.LessEqualThreshold intLesEquThr(t=hp.nUni) "True if number of enabled modules lower or equal to number of modules"; Sensors.RelativePressure dpChwHea(redeclare final package Medium = Medium) "Module CHW header differential pressure"; Sensors.RelativePressure dpHwHea(redeclare final package Medium = Medium) "Module HW header differential pressure"; Actuators.Valves.TwoWayLinear valChwByp( redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal/hp.nUni, from_dp=true, dpValve_nominal=hp.dpChw_nominal, init=Modelica.Blocks.Types.Init.InitialState) "CHW minimum flow bypass valve"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant dpHeaSet[2](k={hp.dpHw_nominal, hp.dpChw_nominal}) "Module header dp setpoint"; Buildings.Controls.OBC.Utilities.PIDWithEnable ctlValChwByp( k=1, Ti=60, r=hp.dpChw_nominal, y_reset=1, y_neutral=1) "CHW minimum flow bypass valve controller"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant dpRemSet[2](k={ dpHwRemSet_max,dpChwRemSet_max}) "Remote dp setpoint"; Sensors.TemperatureTwoPort THwRetPla(redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Plant HW return temperature"; Sensors.TemperatureTwoPort TChwRetPla(redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal) "Plant CHW return temperature"; Actuators.Valves.TwoWayLinear valHwByp( redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal/hp.nUni, from_dp=true, dpValve_nominal=hp.dpHw_nominal, init=Modelica.Blocks.Types.Init.InitialState) "HW minimum flow bypass valve"; Buildings.Controls.OBC.Utilities.PIDWithEnable ctlValHwByp( k=1, Ti=60, r=hp.dpHw_nominal, y_reset=1, y_neutral=1) "HW minimum flow bypass valve controller"; Sensors.TemperatureTwoPort TChwRet(redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal) "CHW return temperature"; Sensors.TemperatureTwoPort THwRet(redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal) "HW return temperature"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold valChwReq(t=1E-1, h=5E-2) "CHW plant request from terminal valve"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold valHwReq(t=1E-1, h=5E-2) "HW plant request from terminal valve"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqHea "Heating plant request"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqCoo "Cooling plant request"; Templates.Plants.Controls.Enabling.Enable enaHea(typ=Buildings.Templates.Plants.Controls.Types.Application.Heating, TOutLck=295.15) "Enable heating"; Templates.Plants.Controls.Enabling.Enable enaCoo(typ=Buildings.Templates.Plants.Controls.Types.Application.Cooling, TOutLck=290.15) "Enable cooling"; Templates.Components.Routing.SingleToMultiple inlPumChwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwPri.nPum, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW pumps suction header"; Templates.Components.Pumps.Multiple pumChwPri( redeclare final package Medium=Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(hp.mEva_flow_nominal/pumChwPri.nPum, pumChwPri.nPum), dp_nominal=fill(dpChwLocSet_max + valChwIso.dpFixed_nominal + valChwIso.dpValve_nominal, pumChwPri.nPum) .+ pumChwPri.dpValChe_nominal, rho_default=Medium.d_const), final nPum=hp.nUni) "Primary CHW pumps"; Templates.Components.Routing.MultipleToSingle outPumChwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumChwPri.nPum, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW pumps discharge header"; Templates.Plants.Controls.Pumps.Generic.ControlDifferentialPressure ctlPumChwPri( have_senDpRemWir=true, nPum=pumChwPri.nPum, nSenDpRem=1, k=0.1) "Primary CHW pump control"; Templates.Components.Interfaces.Bus busPumChwPri "Primary CHW pump control bus"; Sensors.VolumeFlowRate VChwPri(redeclare final package Medium = Medium, final m_flow_nominal=hp.mEva_flow_nominal) "Primary CHW flow (plant side)"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumChwPri( is_pri=true, is_hdr=true, is_ctlDp=true, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumChwPri.nPum, nSenDp=1, V_flow_nominal=hp.mEva_flow_nominal/Medium.d_const, dtRun=5*60) "Primary CHW pump staging"; Templates.Components.Routing.SingleToMultiple inlPumHwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwPri.nPum, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW pumps suction header"; Templates.Components.Pumps.Multiple pumHwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, dat( m_flow_nominal=fill(hp.mCon_flow_nominal/pumHwPri.nPum, pumHwPri.nPum), dp_nominal=fill(dpHwLocSet_max + valHwIso.dpFixed_nominal + valHwIso.dpFixed_nominal, pumHwPri.nPum) .+ pumHwPri.dpValChe_nominal, rho_default=Medium.d_const), final nPum=hp.nUni) "Primary HW pumps"; Templates.Components.Routing.MultipleToSingle outPumHwPri( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final nPorts=pumHwPri.nPum, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW pumps discharge header"; Sensors.VolumeFlowRate VHwPri(redeclare final package Medium = Medium, final m_flow_nominal=hp.mCon_flow_nominal) "Primary HW flow (plant side)"; Templates.Plants.Controls.Pumps.Generic.ControlDifferentialPressure ctlPumHwPri( have_senDpRemWir=true, nPum=pumHwPri.nPum, nSenDpRem=1, k=0.1) "Primary HW pump control"; Templates.Plants.Controls.Pumps.Generic.StagingHeadered staPumHwPri( is_pri=true, is_hdr=true, is_ctlDp=true, have_valInlIso=false, have_valOutIso=true, nEqu=hp.nUni, nPum=pumHwPri.nPum, nSenDp=1, V_flow_nominal=hp.mCon_flow_nominal/Medium.d_const, dtRun=5*60) "Primary HW pump staging"; Templates.Components.Interfaces.Bus busPumHwPri "Primary HW pump control bus"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumHwPri(nin=pumHwPri.nPum) "True if any primary HW pump is proven on"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumChwPri(nin=pumChwPri.nPum) "True if any primary CHW pump is proven on"; FixedResistances.Junction junChwBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mChw_flow_nominal*{1,-1,-1}, final dp_nominal=fill(0, 3)) "CHW bypass supply junction"; FixedResistances.Junction junChwBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mChw_flow_nominal*{1,-1,1}, final dp_nominal=fill(0, 3)) "CHW bypass return junction"; FixedResistances.Junction junHwBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mHw_flow_nominal*{1,-1,-1}, final dp_nominal=fill(0, 3)) "HW bypass supply junction"; FixedResistances.Junction junHwBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final m_flow_nominal=mHw_flow_nominal*{1,-1,1}, final dp_nominal=fill(0, 3)) "HW bypass return junction"; equation connect(loaChw.port_b, valDisChw.port_a); connect(loaHw.port_b, valDisHw.port_a); connect(valDisChw.port_b, mChw_flow.port_a); connect(valDisHw.port_b, mHw_flow.port_a); connect(mHw_flow.m_flow, norFlo[1].u); connect(mChw_flow.m_flow, norFlo[2].u); connect(norFlo.y, ctlEquZon.u_m); connect(ctlEquZon[2].y, valDisChw.y); connect(ctlEquZon[1].y, valDisHw.y); connect(TChwRetPre.y, min1.u1); connect(min1.y, loaChw.TSet); connect(max2.y, loaHw.TSet); connect(con.y, min1.u2); connect(con.y, max2.u1); connect(THwRetPre.y, max2.u2); connect(weaDat.weaBus, hp.weaBus); connect(ratFlo.y, ctlEquZon.u_s); connect(TSupSet[1].y, hp.THwSet); connect(TSupSet[2].y, hp.TChwSet); connect(dpChwRem.port_a, loaChw.port_a); connect(dpChwRem.port_b, pipChw.port_a); connect(dpHwRem.port_b, pipHw.port_a); connect(dpHwRem.port_a, loaHw.port_a); connect(pHwRet.ports[1], hp.port_a1); connect(hp.port_b1, valHwIso.port_a); connect(valHwIso.port_b, THwSup.port_a); connect(hp.yValHwIso, valHwIso.y); connect(valChwIso.port_b, TChwSup.port_a); connect(hp.port_b2, valChwIso.port_a); connect(hp.yValChwIso, valChwIso.y); connect(sumNumUni.y,intLesEquThr. u); connect(intLesEquThr.y,assMes. u); connect(hp.nUniShc, sumNumUni.u[1]); connect(hp.nUniCoo, sumNumUni.u[2]); connect(hp.nUniHea, sumNumUni.u[3]); connect(dpHeaSet[2].y, ctlValChwByp.u_s); connect(ctlValChwByp.y, valChwByp.y); connect(dpChwHea.p_rel, ctlValChwByp.u_m); connect(pChwRet.ports[1], hp.port_a2); connect(THwRetPla.port_b, hp.port_a1); connect(TChwRetPla.port_b, hp.port_a2); connect(dpHwHea.p_rel, ctlValHwByp.u_m); connect(ctlValHwByp.y, valHwByp.y); connect(dpHeaSet[1].y, ctlValHwByp.u_s); connect(dpChwHea.port_a, TChwRetPla.port_a); connect(valChwIso.port_b, dpChwHea.port_b); connect(dpHwHea.port_a, THwRetPla.port_a); connect(valHwIso.port_b, dpHwHea.port_b); connect(mChw_flow.port_b, TChwRet.port_a); connect(TChwRet.port_b, pipChw.port_a); connect(mHw_flow.port_b, THwRet.port_a); connect(THwRet.port_b, pipHw.port_a); connect(TChwSup.T, TChwRetPre.u); connect(THwSup.T, THwRetPre.u); connect(valDisChw.y_actual, valChwReq.u); connect(valDisHw.y_actual, valHwReq.u); connect(valHwReq.y, reqHea.u); connect(valChwReq.y, reqCoo.u); connect(reqHea.y, enaHea.nReqPla); connect(reqCoo.y, enaCoo.nReqPla); connect(con.y, enaHea.TOut); connect(con.y, enaCoo.TOut); connect(ctlPumChwPri.y, busPumChwPri.y); connect(busPumChwPri, pumChwPri.bus); connect(busPumChwPri.y1_actual, ctlPumChwPri.y1_actual); connect(TChwSup.port_b, VChwPri.port_a); connect(VChwPri.port_b, inlPumChwPri.port_a); connect(dpRemSet[2].y, ctlPumChwPri.dpRemSet[1]); connect(dpChwRem.p_rel, ctlPumChwPri.dpRem[1]); connect(staPumChwPri.y1, busPumChwPri.y1); connect(hp.y1ChwValIsoPumPri, staPumChwPri.u1ValOutIso); connect(VChwPri.V_flow, staPumChwPri.V_flow); connect(dpRemSet[2].y, staPumChwPri.dpSet[1]); connect(busPumChwPri.y1_actual, staPumChwPri.u1Pum_actual); connect(busPumChwPri.y, staPumChwPri.y); connect(dpChwRem.p_rel, staPumChwPri.dp[1]); connect(inlPumHwPri.ports_b, pumHwPri.ports_a); connect(pumHwPri.ports_b, outPumHwPri.ports_a); connect(inlPumHwPri.port_a, VHwPri.port_b); connect(THwSup.port_b, VHwPri.port_a); connect(ctlPumHwPri.y, busPumHwPri.y); connect(staPumHwPri.y1, busPumHwPri.y1); connect(busPumHwPri, pumHwPri.bus); connect(busPumHwPri.y1_actual, ctlPumHwPri.y1_actual); connect(busPumHwPri.y, staPumHwPri.y); connect(busPumHwPri.y1_actual, staPumHwPri.u1Pum_actual); connect(hp.y1HwValIsoPumPri, staPumHwPri.u1ValOutIso); connect(VHwPri.V_flow, staPumHwPri.V_flow); connect(dpHwRem.p_rel, ctlPumHwPri.dpRem[1]); connect(dpHwRem.p_rel, staPumHwPri.dp[1]); connect(dpRemSet[1].y, staPumHwPri.dpSet[1]); connect(dpRemSet[1].y, ctlPumHwPri.dpRemSet[1]); connect(staPumHwPri.y1_actual, anyPumHwPri.u); connect(anyPumHwPri.y, ctlValHwByp.uEna); connect(staPumChwPri.y1_actual, anyPumChwPri.u); connect(anyPumChwPri.y, ctlValChwByp.uEna); connect(valChwByp.port_a, junChwBypSup.port_3); connect(outPumChwPri.port_b, junChwBypSup.port_1); connect(junChwBypSup.port_2, loaChw.port_a); connect(pipChw.port_b, junChwBypRet.port_1); connect(junChwBypRet.port_3, valChwByp.port_b); connect(junChwBypRet.port_2, TChwRetPla.port_a); connect(outPumHwPri.port_b, junHwBypSup.port_1); connect(valHwByp.port_a, junHwBypSup.port_3); connect(junHwBypSup.port_2, loaHw.port_a); connect(valHwByp.port_b, junHwBypRet.port_3); connect(pipHw.port_b, junHwBypRet.port_1); connect(junHwBypRet.port_2, THwRetPla.port_a); connect(inlPumChwPri.ports_b, pumChwPri.ports_a); connect(outPumChwPri.ports_a, pumChwPri.ports_b); connect(enaCoo.y1, hp.onCoo); connect(enaHea.y1, hp.onHea); end TableData2DLoadDepSHC1Only;