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 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.
An importance multiplier of 10 is applied to the plant requests
and reset requests generated from the valve position.
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 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"))
;
Fluid.HeatExchangers.SensibleCooler_T loaHeaWat(
redeclare final package Medium=
Medium,
final m_flow_nominal=pla.mHeaWat_flow_nominal,
show_T=true,
final dp_nominal=0,
final energyDynamics=energyDynamics,
tau=300,
QMin_flow=- pla.capHea_nominal)
;
Fluid.HeatExchangers.Heater_T loaChiWat(
redeclare final package Medium=
Medium,
final m_flow_nominal=pla.mChiWat_flow_nominal,
show_T=true,
final dp_nominal=0,
final energyDynamics=energyDynamics,
tau=300,
QMax_flow=pla.capCoo_nominal)
if have_chiWat
;
Fluid.Actuators.Valves.TwoWayEqualPercentage valDisHeaWat(
redeclare final package Medium=
Medium,
m_flow_nominal=pla.mHeaWat_flow_nominal,
dpValve_nominal=3E4,
dpFixed_nominal=datAll.pla.ctl.dpHeaWatRemSet_max[1] - 3E4)
;
Fluid.Actuators.Valves.TwoWayEqualPercentage valDisChiWat(
redeclare final package Medium=
Medium,
m_flow_nominal=pla.mChiWat_flow_nominal,
dpValve_nominal=3E4,
dpFixed_nominal=datAll.pla.ctl.dpChiWatRemSet_max[1] - 3E4)
if have_chiWat
;
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 ratFlo(
table=[
0, 0, 0;
5, 0, 0;
7, 1, 0;
12, 0.2, 0.2;
16, 0, 1;
22, 0.1, 0.1;
24, 0, 0],
timeScale=3600)
;
Buildings.Controls.OBC.CDL.Reals.PID ctlEquZon[
if have_chiWat
then 2
else 1](
each k=0.1,
each Ti=60,
each final reverseActing=true)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter norFlo[
if have_chiWat
then 2
else 1](
k=
if have_chiWat
then {1 / pla.mHeaWat_flow_nominal, 1 / pla.mChiWat_flow_nominal}
else {1 / pla.mHeaWat_flow_nominal})
;
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.Reals.AddParameter TChiWatRet(
p=pla.TChiWatRet_nominal - pla.TChiWatSup_nominal)
if have_chiWat
;
Buildings.Controls.OBC.CDL.Reals.AddParameter THeaWatRet(
p=pla.THeaWatRet_nominal - pla.THeaWatSup_nominal)
;
Buildings.Controls.OBC.CDL.Reals.Max max2
;
Buildings.Controls.OBC.CDL.Reals.Min min1
if have_chiWat
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt[4]
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant cst[4](
each k=10)
;
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
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con(
k=293.15)
;
Controls.Utilities.PlaceholderInteger ph[2](
each final have_inp=have_chiWat,
each final u_internal=0)
;
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(pla.port_bChiWat, loaChiWat.port_a);
connect(loaChiWat.port_b, valDisChiWat.port_a);
connect(loaHeaWat.port_b, valDisHeaWat.port_a);
connect(pla.port_bHeaWat, loaHeaWat.port_a);
connect(loaChiWat.port_a, dpChiWatRem[1].port_a);
connect(dpHeaWatRem[1].port_a, loaHeaWat.port_a);
connect(TDum.y, reqPlaRes.TAirSup);
connect(TDum.y, reqPlaRes.TAirSupSet);
connect(busAirHan, pla.busAirHan[1]);
connect(pla.bus, busPla);
connect(valDisChiWat.y_actual, reqPlaRes.uCooCoiSet);
connect(valDisHeaWat.y_actual, reqPlaRes.uHeaCoiSet);
connect(valDisChiWat.port_b, mChiWat_flow.port_a);
connect(mChiWat_flow.port_b, dpChiWatRem[1].port_b);
connect(valDisHeaWat.port_b, mHeaWat_flow.port_a);
connect(mHeaWat_flow.port_b, dpHeaWatRem[1].port_b);
connect(mHeaWat_flow.m_flow, norFlo[1].u);
connect(mChiWat_flow.m_flow, norFlo[2].u);
connect(norFlo.y, ctlEquZon.u_m);
connect(ratFlo.y[1:(
if have_chiWat
then 2
else 1)], ctlEquZon.u_s);
connect(ctlEquZon[2].y, valDisChiWat.y);
connect(ctlEquZon[1].y, valDisHeaWat.y);
connect(busPla.THeaWatPriSup, THeaWatRet.u);
connect(busPla.TChiWatPriSup, TChiWatRet.u);
connect(TChiWatRet.y, min1.u1);
connect(min1.y, loaChiWat.TSet);
connect(max2.y, loaHeaWat.TSet);
connect(cst.y, mulInt.u1);
connect(mulInt[1].y, busAirHan.reqResHeaWat);
connect(mulInt[2].y, busAirHan.reqPlaHeaWat);
connect(pipHeaWat.port_b, pla.port_aHeaWat);
connect(pipChiWat.port_b, pla.port_aChiWat);
connect(mChiWat_flow.port_b, pipChiWat.port_a);
connect(mHeaWat_flow.port_b, pipHeaWat.port_a);
connect(con.y, min1.u2);
connect(con.y, max2.u1);
connect(THeaWatRet.y, max2.u2);
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);
end AirToWater;