This package contains validation models.
model AirToWaterReversibleHeatRecovery
final parameter Real capHea_nominal(
final unit="W") =
sum(
cat(1, ctl.capHeaHp_nominal, ctl.capHeaPhp_nominal))
;
parameter Real THeaWatSup_nominal(unit="K", displayUnit="degC") = 323.15
;
parameter Real THeaWatRet_nominal(unit="K", displayUnit="degC") = 315.15
;
parameter Real VHeaWat_flow_nominal(unit="m3/s") = capHea_nominal /
abs(
THeaWatSup_nominal - THeaWatRet_nominal) / ctl.cp_default / ctl.rho_default
;
final parameter Real capCoo_nominal(
final unit="W") =
sum(
cat(1, ctl.capCooHp_nominal, ctl.capCooPhp_nominal))
;
parameter Real TChiWatSup_nominal(unit="K", displayUnit="degC") = 280.15
;
parameter Real TChiWatRet_nominal(unit="K", displayUnit="degC") = 285.15
;
parameter Real VChiWat_flow_nominal(unit="m3/s") = capCoo_nominal /
abs(
TChiWatSup_nominal - TChiWatRet_nominal) / ctl.cp_default / ctl.rho_default
;
Buildings.Templates.Plants.Controls.HeatPumps.AirToWater ctl(
typ=Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversibleHeatRecovery,
nHp_select=3,
have_valHpInlIso=true,
have_valHpOutIso=true,
have_pumChiWatPriDedHp_select=true,
have_pumPriHdr=false,
is_priOnl=false,
have_pumHeaWatPriVar_select=false,
have_pumChiWatPriVar_select=false,
have_senDpHeaWatRemWir=false,
nSenDpHeaWatRem=1,
have_senDpChiWatRemWir=false,
nSenDpChiWatRem=1,
final THeaWatSup_nominal=THeaWatSup_nominal,
THeaWatSupSet_min=298.15,
VHeaWatHp_flow_nominal=1.1 * ctl.capHeaHp_nominal / capHea_nominal *
VHeaWat_flow_nominal,
VHeaWatHp_flow_min=0.6 * ctl.VHeaWatHp_flow_nominal,
final VHeaWatSec_flow_nominal=VHeaWat_flow_nominal,
capHeaHp_nominal=
fill(350E3, ctl.nHp),
dpHeaWatRemSet_max={5E4},
final TChiWatSup_nominal=TChiWatSup_nominal,
TChiWatSupSet_max=288.15,
VChiWatHp_flow_nominal=1.1 * ctl.capCooHp_nominal / capCoo_nominal *
VChiWat_flow_nominal,
VChiWatHp_flow_min=0.6 * ctl.VChiWatHp_flow_nominal,
final VChiWatSec_flow_nominal=VChiWat_flow_nominal,
capCooHp_nominal=(1 - 1 / Buildings.Templates.Data.Defaults.COPHpAwHea) *
ctl.capHeaHp_nominal,
yPumHeaWatPriDedHpSet=0.8,
yPumChiWatPriDedHpSet=0.7,
dpChiWatRemSet_max={5E4},
staHp=[1 / 3, 1 / 3, 1 / 3; 2 / 3, 2 / 3, 2 / 3; 1, 1, 1],
idxAltHp_select={1, 2, 3},
TChiWatSupHrc_min=277.15,
THeaWatSupHrc_max=333.15,
COPHeaHrc_nominal=2.8,
capCooHrc_min=ctl.capHeaHrc_min * (1 - 1 / ctl.COPHeaHrc_nominal),
capHeaHrc_min=0.3 * 0.5 *
sum(ctl.capHeaHp_nominal))
;
Buildings.Controls.OBC.CDL.Reals.Sources.TimeTable ratV_flow(
table=[
0, 0, 0;
5, 0, 0;
6, 1, 0;
12, 0.2, 0.2;
15, 0, 1;
22, 0.1, 0.1;
24, 0, 0],
timeScale=3600)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant dTHeaWat(
final k=(THeaWatRet_nominal - THeaWatSup_nominal) * (
if ctl.have_hrc
then 0.5
else 1))
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant dTChiWat(
final k=(TChiWatRet_nominal - TChiWatSup_nominal) * (
if ctl.have_hrc
then 0.5
else 1))
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter VHeaWat_flow(
final k=VHeaWat_flow_nominal)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter VChiWat_flow(
final k=VChiWat_flow_nominal)
;
Components.Controls.StatusEmulator y1Hp_actual[ctl.nHp]
if ctl.have_hp
;
Components.Controls.StatusEmulator y1PumHeaWatPriHdr_actual[ctl.nPumHeaWatPri]
if ctl.have_pumHeaWatPri
and ctl.have_pumPriHdr
;
Components.Controls.StatusEmulator y1PumChiWatPriHdr_actual[ctl.nPumChiWatPri]
if ctl.have_pumChiWatPri
and ctl.have_pumPriHdr
;
Components.Controls.StatusEmulator y1PumHeaWatSec_actual[ctl.nPumHeaWatSec]
if ctl.have_heaWat
and ctl.have_pumHeaWatSec
;
Components.Controls.StatusEmulator y1PumChiWatSec_actual[ctl.nPumChiWatSec]
if ctl.have_chiWat
and ctl.have_pumChiWatSec
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin TOut(
amplitude=10,
freqHz=0.5 / 24 / 3600,
phase=-0.43633231299858,
offset=10 + 273.15)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold isDemHea(t=1E-2, h=0.5E-2)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold isDemCoo(t=1E-2, h=0.5E-2)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqPlaHeaWat
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger reqPlaChiWat
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai[2](
each k=5)
;
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reqResHeaWat
;
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reqResChiWat
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin[1](
amplitude=0.1 * ctl.dpHeaWatRemSet_max,
freqHz={4 / 8000},
each phase=3.1415926535898)
if ctl.have_heaWat
;
Buildings.Controls.OBC.CDL.Reals.Add dpHeaWatRem[1]
if ctl.have_heaWat
;
Buildings.Controls.OBC.CDL.Reals.Add dpChiWatRem[1]
if ctl.have_chiWat
;
Pumps.Generic.ResetLocalDifferentialPressure resDpHeaWatLoc[1](
each dpLocSet_max=20E4)
if ctl.have_heaWat
;
Pumps.Generic.ResetLocalDifferentialPressure resDpChiWatLoc[1](
each dpLocSet_max=15E4)
if ctl.have_chiWat
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin1[1](
amplitude=0.1 * ctl.dpChiWatRemSet_max,
freqHz={3 / 8000},
each phase=3.1415926535898)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter dpHeaWatLoc(
final k=4)
if ctl.have_heaWat
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter dpChiWatLoc(
final k=3)
if ctl.have_chiWat
;
Components.Controls.StatusEmulator y1Hrc_actual
if ctl.have_hrc
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant dTHeaWatUpsHrc(
final k=THeaWatRet_nominal - THeaWatSup_nominal)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant dTChiWatUpsHrc(
final k=TChiWatRet_nominal - TChiWatSup_nominal)
;
Buildings.Controls.OBC.CDL.Reals.Add THeaWatRet
if ctl.have_heaWat
;
Buildings.Controls.OBC.CDL.Reals.Add THeaWatRetUpsHrc
if ctl.have_heaWat
;
Buildings.Controls.OBC.CDL.Reals.Add TChiWatRet
if ctl.have_chiWat
;
Buildings.Controls.OBC.CDL.Reals.Add TChiWatRetUpsHrc
if ctl.have_chiWat
;
Components.Controls.StatusEmulator y1PumChiWatPriDedHp_actual[ctl.nPumChiWatPriDedHp]
if ctl.have_pumChiWatPriDedHp
;
Components.Controls.StatusEmulator y1PumChiWatPriPhp_actual[ctl.nPumChiWatPriDedPhp]
if ctl.have_pumChiWatPri
and not ctl.have_pumPriHdr
and ctl.have_php
;
Components.Controls.StatusEmulator y1PumHeaWatPriDedHp_actual[ctl.nPumHeaWatPriDedHp]
if ctl.have_pumHeaWatPri
and not ctl.have_pumPriHdr
and ctl.have_hp
;
Components.Controls.StatusEmulator y1PumHeaWatPriDedPhp_actual[ctl.nPumHeaWatPriDedPhp]
if ctl.have_pumHeaWatPri
and not ctl.have_pumPriHdr
and ctl.have_php
;
equation
connect(ratV_flow.y[1], VHeaWat_flow.u);
connect(ratV_flow.y[2], VChiWat_flow.u);
connect(ctl.y1Hp, y1Hp_actual.y1);
connect(y1Hp_actual.y1_actual, ctl.u1Hp_actual);
connect(ctl.y1PumHeaWatPriHdr, y1PumHeaWatPriHdr_actual.y1);
connect(y1PumHeaWatPriHdr_actual.y1_actual, ctl.u1PumHeaWatPriHdr_actual);
connect(ctl.y1PumHeaWatPriDedHp, y1PumHeaWatPriDedHp_actual.y1);
connect(y1PumHeaWatPriDedHp_actual.y1_actual, ctl.u1PumHeaWatPriDedHp_actual);
connect(ctl.y1PumHeaWatPriDedPhp, y1PumHeaWatPriDedPhp_actual.y1);
connect(y1PumHeaWatPriDedPhp_actual.y1_actual, ctl.u1PumHeaWatPriDedPhp_actual);
connect(ctl.y1PumHeaWatSec, y1PumHeaWatSec_actual.y1);
connect(ctl.y1PumChiWatSec, y1PumChiWatSec_actual.y1);
connect(y1PumHeaWatSec_actual.y1_actual, ctl.u1PumHeaWatSec_actual);
connect(y1PumChiWatPriHdr_actual.y1_actual, ctl.u1PumChiWatPriHdr_actual);
connect(y1PumChiWatPriDedHp_actual.y1_actual, ctl.u1PumChiWatPriDedHp_actual);
connect(y1PumChiWatPriPhp_actual.y1_actual, ctl.u1PumChiWatPriDedPhp_actual);
connect(y1PumChiWatSec_actual.y1_actual, ctl.u1PumChiWatSec_actual);
connect(TOut.y, ctl.TOut);
connect(ratV_flow.y[1], isDemHea.u);
connect(ratV_flow.y[2], isDemCoo.u);
connect(isDemCoo.y, reqPlaChiWat.u);
connect(isDemHea.y, reqPlaHeaWat.u);
connect(reqPlaHeaWat.y, ctl.nReqPlaHeaWat);
connect(reqPlaChiWat.y, ctl.nReqPlaChiWat);
connect(VHeaWat_flow.y, ctl.VHeaWatPri_flow);
connect(VHeaWat_flow.y, ctl.VHeaWatLooOrSec_flow);
connect(VChiWat_flow.y, ctl.VChiWatPri_flow);
connect(VChiWat_flow.y, ctl.VChiWatLooOrSec_flow);
connect(ratV_flow.y, gai.u);
connect(gai[1].y, reqResHeaWat.u);
connect(gai[2].y, reqResChiWat.u);
connect(reqResHeaWat.y, ctl.nReqResHeaWat);
connect(reqResChiWat.y, ctl.nReqResChiWat);
connect(sin.y, dpHeaWatRem.u2);
connect(dpChiWatRem.y, ctl.dpChiWatRem);
connect(dpHeaWatRem.y, ctl.dpHeaWatRem);
connect(ctl.dpHeaWatRemSet, dpHeaWatRem.u1);
connect(ctl.dpChiWatRemSet, dpChiWatRem.u1);
connect(sin1.y, dpChiWatRem.u2);
connect(dpHeaWatRem[1].y, dpHeaWatLoc.u);
connect(ctl.dpHeaWatRemSet, resDpHeaWatLoc.dpRemSet);
connect(dpChiWatRem[1].y, dpChiWatLoc.u);
connect(ctl.dpChiWatRemSet, resDpChiWatLoc.dpRemSet);
connect(dpHeaWatRem.y, resDpHeaWatLoc.dpRem);
connect(dpChiWatRem.y, resDpChiWatLoc.dpRem);
connect(resDpChiWatLoc.dpLocSet, ctl.dpChiWatLocSet);
connect(dpChiWatLoc.y, ctl.dpChiWatLoc);
connect(dpHeaWatLoc.y, ctl.dpHeaWatLoc);
connect(resDpHeaWatLoc.dpLocSet, ctl.dpHeaWatLocSet);
connect(ctl.y1Hrc, y1Hrc_actual.y1);
connect(y1Hrc_actual.y1_actual, ctl.u1Hrc_actual);
connect(ctl.TChiWatSupSet, ctl.TChiWatSecSup);
connect(ctl.TChiWatSupSet, ctl.TChiWatPriSup);
connect(ctl.THeaWatSupSet, ctl.THeaWatPriSup);
connect(ctl.THeaWatSupSet, ctl.THeaWatSecSup);
connect(ctl.THeaWatSupSet, THeaWatRet.u1);
connect(dTHeaWat.y, THeaWatRet.u2);
connect(ctl.TChiWatSupSet, TChiWatRet.u2);
connect(dTChiWat.y, TChiWatRet.u1);
connect(dTChiWatUpsHrc.y, TChiWatRetUpsHrc.u1);
connect(TChiWatRetUpsHrc.u2, ctl.TChiWatSupSet);
connect(THeaWatRetUpsHrc.u2, ctl.THeaWatSupSet);
connect(dTHeaWatUpsHrc.y, THeaWatRetUpsHrc.u1);
connect(THeaWatRet.y, ctl.THeaWatPriRet);
connect(THeaWatRet.y, ctl.THeaWatLooOrSecRet);
connect(TChiWatRet.y, ctl.TChiWatLooOrSecRet);
connect(TChiWatRet.y, ctl.TChiWatPriRet);
connect(TChiWatRetUpsHrc.y, ctl.TChiWatRetUpsHrc);
connect(THeaWatRetUpsHrc.y, ctl.THeaWatRetUpsHrc);
connect(ctl.y1PumChiWatPriDedHp, y1PumChiWatPriDedHp_actual.y1);
connect(ctl.y1PumChiWatPriHdr, y1PumChiWatPriHdr_actual.y1);
connect(ctl.y1PumChiWatPriDedPhp, y1PumChiWatPriPhp_actual.y1);
end AirToWaterReversibleHeatRecovery;