The models also illustrate parameter propagation from the top-level
HVAC system record datAll.
Three equally sized heat pumps are modeled, which can all be lead/lag alternated.
A heat recovery chiller is included (pla.have_hrc_select=true)
and connected to the HW and CHW return pipes (sidestream integration).
A unique aggregated load is modeled on each loop using a heat exchanger component
exposed to conditioned space air, and a two-way modulating valve.
An importance multiplier of 10 is applied to the plant requests
and reset requests generated from the valve position.
Note that the HRC model does not explicitly represent compressor cycling.
As a result, the cycling-based disabling condition specified in
Buildings.Templates.Plants.Controls.HeatRecoveryChillers.Enable
is never triggered.
This limitation may lead to overestimating the HRC operating time.
By default, all valves within the plant are modeled considering a linear
variation of the pressure drop with the flow rate (pla.linearized=true),
as opposed to the quadratic relationship usually considered for
a turbulent flow regime.
By limiting the size of the system of nonlinear equations, this setting
reduces the risk of solver failure and the time to solution for testing
various plant configurations.
model AirToWater
extends Modelica.Icons.Example;
replaceable package Medium=
Buildings.Media.Water
constrainedby Modelica.Media.Interfaces.PartialMedium
;
parameter Boolean have_chiWat=true
;
inner parameter UserProject.Data.AllSystems datAll(
pla(
final cfg=pla.cfg)) ;
parameter Modelica.Units.SI.PressureDifference dpTer_nominal(
displayUnit="Pa")=3E4
;
parameter Modelica.Units.SI.PressureDifference dpValve_nominal(
displayUnit="Pa")=dpTer_nominal
;
parameter Boolean allowFlowReversal=true
;
parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial
;
BoundaryConditions.WeatherData.ReaderTMY3 weaDat(
filNam=
Modelica.Utilities.Files.loadResource(
"modelica://Buildings/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos"))
;
Buildings.Templates.Plants.HeatPumps.AirToWater pla(
redeclare final package MediumHeaWat=
Medium,
have_hrc_select=true,
final dat=datAll.pla,
final have_chiWat=have_chiWat,
nHp=3,
typPumHeaWatPri_select1=Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.Constant,
final allowFlowReversal=allowFlowReversal,
linearized=true,
show_T=true,
ctl(
nAirHan=1,
nEquZon=0),
is_dpBalYPumSetCal=true)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant TDum(
k=293.15,
y(
final unit="K",
displayUnit="degC"))
;
Fluid.Sensors.RelativePressure dpHeaWatRem[1](
redeclare each final package Medium=
Medium)
;
Fluid.Sensors.RelativePressure dpChiWatRem[1](
redeclare each final package Medium=
Medium)
if have_chiWat
;
Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.PlantRequests reqPlaRes(
final heaCoi=Buildings.Controls.OBC.ASHRAE.G36.Types.HeatingCoil.WaterBased,
final cooCoi=
if have_chiWat
then Buildings.Controls.OBC.ASHRAE.G36.Types.CoolingCoil.WaterBased
else Buildings.Controls.OBC.ASHRAE.G36.Types.CoolingCoil.None)
;
AirHandlersFans.Interfaces.Bus busAirHan
;
Interfaces.Bus busPla ;
Buildings.Controls.OBC.CDL.Reals.Sources.TimeTable ratLoa(
table=[
0, 0, 0;
5, 0, 0;
7, 1, 0;
10, 0.5, 0;
14, 0, 0.6;
16, 0, 1;
18, 0, 0.6;
22, 0.1, 0.1;
24, 0, 0],
timeScale=3600)
;
Fluid.Sensors.MassFlowRate mChiWat_flow(
redeclare final package Medium=
Medium)
if have_chiWat
;
Fluid.Sensors.MassFlowRate mHeaWat_flow(
redeclare final package Medium=
Medium)
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt[4]
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant cst[4](
each k=10) ;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant enaLoa(k=true)
;
Buildings.Fluid.FixedResistances.PressureDrop pipHeaWat(
redeclare final package Medium=
Medium,
final m_flow_nominal=pla.mHeaWat_flow_nominal,
final dp_nominal=Buildings.Templates.Data.Defaults.dpHeaWatLocSet_max -
max(datAll.pla.ctl.dpHeaWatRemSet_max))
;
Buildings.Fluid.FixedResistances.PressureDrop pipChiWat(
redeclare final package Medium=
Medium,
final m_flow_nominal=pla.mChiWat_flow_nominal,
final dp_nominal=Buildings.Templates.Data.Defaults.dpChiWatLocSet_max -
max(datAll.pla.ctl.dpChiWatRemSet_max))
if have_chiWat
;
Controls.Utilities.PlaceholderInteger ph[2](
each final have_inp=have_chiWat,
each final u_internal=0)
;
Buildings.Templates.Components.Loads.LoadTwoWayValve loaCoo(
redeclare final package MediumLiq =
Medium,
final energyDynamics=energyDynamics,
final typ=Buildings.Fluid.HydronicConfigurations.Types.Control.Cooling,
final mLiq_flow_nominal=pla.mChiWat_flow_nominal,
final dpTer_nominal=dpTer_nominal,
final dpValve_nominal=dpValve_nominal,
final dpBal1_nominal=datAll.pla.ctl.dpChiWatRemSet_max[1] - dpTer_nominal - dpValve_nominal,
final TLiqEnt_nominal=pla.TChiWatSup_nominal,
final TLiqLvg_nominal=pla.TChiWatRet_nominal,
con(val(y_start=0)),
loa(coi(show_T=true)))
if have_chiWat
;
Buildings.Templates.Components.Loads.LoadTwoWayValve loaHea(
redeclare final package MediumLiq =
Medium,
final energyDynamics=energyDynamics,
final typ=Buildings.Fluid.HydronicConfigurations.Types.Control.Heating,
final mLiq_flow_nominal=pla.mHeaWat_flow_nominal,
final dpTer_nominal=dpTer_nominal,
final dpValve_nominal=dpValve_nominal,
final dpBal1_nominal=datAll.pla.ctl.dpHeaWatRemSet_max[1] - dpTer_nominal - dpValve_nominal,
final TLiqEnt_nominal=pla.THeaWatSup_nominal,
final TLiqLvg_nominal=pla.THeaWatRet_nominal,
con(val(y_start=0))) ;
Buildings.Fluid.MixingVolumes.MixingVolume volHeaWat(
energyDynamics=energyDynamics,
final m_flow_nominal=pla.mHeaWat_flow_nominal,
V=Buildings.Templates.Data.Defaults.ratVLiqByCap*pla.capHea_nominal,
redeclare package Medium =
Medium,
nPorts=2) ;
Buildings.Fluid.MixingVolumes.MixingVolume volChiWat(
energyDynamics=energyDynamics,
final m_flow_nominal=pla.mChiWat_flow_nominal,
V=Buildings.Templates.Data.Defaults.ratVLiqByCap*pla.capCoo_nominal,
redeclare package Medium =
Medium,
nPorts=2)
if have_chiWat ;
equation
if have_chiWat
then
connect(mulInt[3].y, busAirHan.reqResChiWat);
connect(mulInt[4].y, busAirHan.reqPlaChiWat);
end if;
connect(weaDat.weaBus, pla.busWea);
connect(TDum.y, reqPlaRes.TAirSup);
connect(TDum.y, reqPlaRes.TAirSupSet);
connect(busAirHan, pla.busAirHan[1]);
connect(pla.bus, busPla);
connect(mChiWat_flow.port_b, dpChiWatRem[1].port_b);
connect(mHeaWat_flow.port_b, dpHeaWatRem[1].port_b);
connect(cst.y, mulInt.u1);
connect(mulInt[1].y, busAirHan.reqResHeaWat);
connect(mulInt[2].y, busAirHan.reqPlaHeaWat);
connect(mChiWat_flow.port_b, pipChiWat.port_a);
connect(mHeaWat_flow.port_b, pipHeaWat.port_a);
connect(reqPlaRes.yChiWatResReq, ph[1].u);
connect(reqPlaRes.yChiPlaReq, ph[2].u);
connect(reqPlaRes.yHotWatResReq, mulInt[1].u2);
connect(reqPlaRes.yHotWatPlaReq, mulInt[2].u2);
connect(ph[1].y, mulInt[3].u2);
connect(ph[2].y, mulInt[4].u2);
connect(dpChiWatRem.p_rel, busPla.dpChiWatRem);
connect(dpHeaWatRem.p_rel, busPla.dpHeaWatRem);
connect(loaCoo.port_b, mChiWat_flow.port_a);
connect(dpChiWatRem[1].port_a, loaCoo.port_a);
connect(loaCoo.yVal_actual, reqPlaRes.uCooCoiSet);
connect(loaHea.port_b, mHeaWat_flow.port_a);
connect(dpHeaWatRem[1].port_a, loaHea.port_a);
connect(ratLoa.y[2], loaCoo.u);
connect(ratLoa.y[1], loaHea.u);
connect(loaHea.yVal_actual, reqPlaRes.uHeaCoiSet);
connect(enaLoa.y, loaCoo.u1);
connect(enaLoa.y, loaHea.u1);
connect(pla.port_bHeaWat, volHeaWat.ports[1]);
connect(volHeaWat.ports[2], loaHea.port_a);
connect(pipHeaWat.port_b, pla.port_aHeaWat);
connect(pla.port_bChiWat, volChiWat.ports[1]);
connect(volChiWat.ports[2], loaCoo.port_a);
connect(pipChiWat.port_b, pla.port_aChiWat);
end AirToWater;