Collection of validation models
Information
This package contains validation models.
Package Content
Name |
Description |
EquipmentAvailability
|
Validation model for the evaluation of equipment availability |
EquipmentEnable
|
Validation model for equipment enable logic |
EventSequencing
|
Validation model for event sequencing logic |
FailsafeCondition
|
Validation model for failsafe staging logic |
LoadAverage
|
Validation model for heating and cooling load calculation |
SortRuntime
|
Validation model for equipment runtime sorting logic |
StageAvailability
|
Validation model for the evaluation of stage availability |
StageChangeCommand
|
Validation model for stage change logic |
StageCompletion
|
Validation model for the evaluation of stage completion |
Validation model for the evaluation of equipment availability
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentAvailability
for heating-only applications (component avaHeaCoo
) and heating and cooling
applications (component avaHea
).
Modelica definition
model EquipmentAvailability
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentAvailability
avaHeaCoo(have_heaWat=true, have_chiWat=true)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1Ava(
table=[
0, 1;
8, 0;
9, 1],
timeScale=1000,
period=10000)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1_actual(
table=[
0, 1;
1, 0;
2.5, 1;
4.2, 0;
5, 1;
7, 1;
8, 0;
9, 1],
timeScale=1000,
period=10000)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1Hea_actual(
table=[
0, 1;
1, 1;
2, 1;
5, 0;
8.5, 1;
9.7, 0],
timeScale=1000,
period=10000)
;
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentAvailability
avaHea(have_heaWat=true, have_chiWat=false)
;
equation
connect(u1Hea_actual.y[1], avaHeaCoo.u1Hea);
connect(u1_actual.y[1], avaHeaCoo.u1);
connect(u1_actual.y[1], avaHea.u1);
connect(u1Ava.y[1], avaHeaCoo.u1Ava);
connect(u1Ava.y[1], avaHea.u1Ava);
end EquipmentAvailability;
Validation model for equipment enable logic
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentEnable
in a configuration with three equally sized units (component equEnaEqu
)
and in a configuration with one small unit and two large equally sized
units (component equEnaOneTwo
).
Only the units of the same size are lead/lag alternated.
Modelica definition
model EquipmentEnable
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1AvaEqu(
table=[
0, 1, 1, 1;
6, 0, 0, 1;
8, 0, 1, 1;
10, 1, 0, 1;
15, 1, 1, 0;
18, 0, 1, 1;
22, 1, 1, 1],
timeScale=1,
period=25)
;
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentEnable equEnaOneTwo(
staEqu=[
1, 0, 0;
0, 1 / 2, 1 / 2;
1, 1 / 2, 1 / 2;
0, 1, 1;
1, 1, 1])
;
Buildings.Controls.OBC.CDL.Integers.Sources.TimeTable uSta(
table=[
0, 1;
5, 2;
10, 3;
15, 4;
20, 5],
timeScale=1,
period=25)
;
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentEnable equEnaEqu(
staEqu=[
1 / 3, 1 / 3, 1 / 3;
2 / 3, 2 / 3, 2 / 3;
1, 1, 1])
;
Buildings.Controls.OBC.CDL.Integers.Sources.TimeTable uSta1(
table=[
0, 1;
10, 2;
20, 3],
timeScale=1,
period=25)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea[3]
;
Buildings.Controls.OBC.CDL.Reals.Sort sort(
ascending=false,
nin=3)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1[2]
;
Buildings.Controls.OBC.CDL.Reals.Sort sort1(
ascending=false,
nin=2)
;
Buildings.Controls.OBC.CDL.Integers.AddParameter addPar[2](
each final p=1)
;
equation
connect(u1AvaEqu.y, equEnaOneTwo.u1Ava);
connect(uSta.y[1], equEnaOneTwo.uSta);
connect(uSta1.y[1], equEnaEqu.uSta);
connect(u1AvaEqu.y, equEnaEqu.u1Ava);
connect(u1AvaEqu.y, booToRea.u);
connect(booToRea.y, sort.u);
connect(sort.yIdx, equEnaEqu.uIdxAltSor);
connect(u1AvaEqu.y[2:3], booToRea1.u);
connect(booToRea1.y, sort1.u);
connect(sort1.yIdx, addPar.u);
connect(addPar.y, equEnaOneTwo.uIdxAltSor);
end EquipmentEnable;
Validation model for event sequencing logic
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.EventSequencing
for the following configurations.
-
Heating-only plant with primary-secondary distribution (component
seqEveHea
)
-
Heating and cooling plant with primary-only distribution (component
seqEveHeaCoo
)
Modelica definition
model EventSequencing
Buildings.Templates.Plants.Controls.StagingRotation.EventSequencing seqEveHea(
have_heaWat=true,
have_chiWat=false,
have_valInlIso=true,
have_valOutIso=false,
have_pumHeaWatPri=true,
have_pumHeaWatSec=true)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1(
table=[0,0,0; 1,1,0; 2,0,0; 3,0,1; 4,0,0; 5,0,0],
timeScale=900,
period=4500)
;
Buildings.Templates.Plants.Controls.StagingRotation.EventSequencing seqEveHeaCoo(
have_heaWat=true,
have_chiWat=true,
have_valInlIso=true,
have_valOutIso=true,
have_pumHeaWatPri=true,
have_pumChiWatPri=false,
have_pumHeaWatSec=false,
have_pumChiWatSec=false)
;
Components.Controls.StatusEmulator y1Pum_actual ;
Components.Controls.StatusEmulator y1Pum_actual1 ;
equation
connect(u1.y[1], seqEveHea.u1Hea);
connect(u1.y[1], seqEveHea.u1PumHeaWatSec_actual);
connect(u1.y[1], seqEveHeaCoo.u1Hea);
connect(u1.y[2], seqEveHeaCoo.u1Coo);
connect(seqEveHea.y1PumHeaWatPri, y1Pum_actual.y1);
connect(y1Pum_actual.y1_actual, seqEveHea.u1PumHeaWatPri_actual);
connect(seqEveHeaCoo.y1PumHeaWatPri, y1Pum_actual1.y1);
connect(y1Pum_actual1.y1_actual, seqEveHeaCoo.u1PumHeaWatPri_actual);
end EventSequencing;
Validation model for failsafe staging logic
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.FailsafeCondition
for the following configurations.
-
Heating plant with primary-secondary distribution (component
faiSafHea
)
-
Cooling plant with primary-only distribution (component
faiSafCoo
)
-
Cooling plant with primary-only distribution (component
faiSafCooPri
)
Modelica definition
model FailsafeCondition
Buildings.Templates.Plants.Controls.StagingRotation.FailsafeCondition faiSafHea(
typ=Buildings.Templates.Plants.Controls.Types.Application.Heating,
have_pumSec=true,
dT=2.5)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant THeaWatSupSet(
k=60 + 273.15)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin THeaWatPriSup(
amplitude=5,
freqHz=1 / 3000,
offset=THeaWatSupSet.k)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin THeaWatSecSup(
amplitude=5,
freqHz=1 / 3000,
phase=1.7453292519943,
offset=THeaWatSupSet.k)
;
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul(
width=1 / 2000,
period=2000,
shift=100)
;
Buildings.Templates.Plants.Controls.StagingRotation.FailsafeCondition faiSafCooPri(
typ=Buildings.Templates.Plants.Controls.Types.Application.Cooling,
have_pumSec=false,
dT=1)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant TChiWatSupSet(
k=7 + 273.15)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin TChiWatPriSup(
amplitude=3,
freqHz=1 / 3000,
offset=TChiWatSupSet.k)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin TChiWatSecSup(
amplitude=3,
freqHz=1 / 3000,
phase=1.7453292519943,
offset=TChiWatSupSet.k)
;
Buildings.Templates.Plants.Controls.StagingRotation.FailsafeCondition faiSafCoo(
typ=Buildings.Templates.Plants.Controls.Types.Application.Cooling,
have_pumSec=true,
dT=1)
;
equation
connect(THeaWatSupSet.y, faiSafHea.TSupSet);
connect(THeaWatPriSup.y, faiSafHea.TPriSup);
connect(THeaWatSecSup.y, faiSafHea.TSecSup);
connect(booPul.y, faiSafHea.reset);
connect(TChiWatSupSet.y, faiSafCooPri.TSupSet);
connect(TChiWatPriSup.y, faiSafCooPri.TPriSup);
connect(booPul.y, faiSafCooPri.reset);
connect(TChiWatSupSet.y, faiSafCoo.TSupSet);
connect(booPul.y, faiSafCoo.reset);
connect(TChiWatPriSup.y, faiSafCoo.TPriSup);
connect(TChiWatSecSup.y, faiSafCoo.TSecSup);
end FailsafeCondition;
Validation model for heating and cooling load calculation
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.LoadAverage
for heating and cooling applications.
Modelica definition
model LoadAverage
Buildings.Templates.Plants.Controls.StagingRotation.LoadAverage loaHea(
typ=Buildings.Templates.Plants.Controls.Types.Application.Heating,
cp_default=4186,
rho_default=1000)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant THeaWatSupSet(
k=60 + 273.15)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin THeaWatRet(
amplitude=10,
freqHz=2 / 3000,
phase=3.1415926535898,
offset=THeaWatSupSet.k)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Ramp V_flow(
height=- 0.1,
duration=100,
offset=0.1,
startTime=1200)
;
Buildings.Templates.Plants.Controls.StagingRotation.LoadAverage loaCoo(
typ=Buildings.Templates.Plants.Controls.Types.Application.Cooling,
cp_default=4186,
rho_default=1000)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant TChiWatSupSet(
k=7 + 273.15)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Sin TChiWatRet(
amplitude=5,
freqHz=2 / 3000,
phase=3.1415926535898,
offset=TChiWatSupSet.k)
;
equation
connect(THeaWatSupSet.y, loaHea.TSupSet);
connect(TChiWatSupSet.y, loaCoo.TSupSet);
connect(THeaWatRet.y, loaHea.TRet);
connect(V_flow.y, loaHea.V_flow);
connect(TChiWatRet.y, loaCoo.TRet);
connect(V_flow.y, loaCoo.V_flow);
end LoadAverage;
Validation model for equipment runtime sorting logic
Information
The simulation shows that even wear is achieved among available equipment.
When it becomes unavailable, equipment #1 is sent to last position
(sorRunTim.yIdx[3]=1
),
and automatically moves up in the staging order only if another
equipment (#3) becomes unavailable
(sorRunTim.yIdx[3]=3
and sorRunTim.yIdx[2]=1
).
We can verify that no equipment gets "hot swapped".
Modelica definition
model SortRuntime
Buildings.Templates.Plants.Controls.StagingRotation.SortRuntime sorRunTim(nin=3)
;
Utilities.TrueArrayConditional u1Ena(
nin=3)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1AvaEqu(
table=[0,1,1,1; 1500,0,1,1; 2500,0,1,0; 3000,1,1,1],
timeScale=1,
period=5000)
;
Utilities.StageIndex idxSta(
nSta=3,
dtRun=60);
Buildings.Controls.OBC.CDL.Logical.Sources.Constant u1Lea(
k=true)
;
Buildings.Controls.OBC.CDL.Logical.Sources.SampleTrigger upPul(
period=60)
;
Buildings.Controls.OBC.CDL.Logical.Sources.SampleTrigger dowPul(
period=60)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable booTimTab(
table=[
0, 0, 0;
60, 1, 0;
300, 0, 1],
period=500)
;
Buildings.Controls.OBC.CDL.Logical.And up
;
Buildings.Controls.OBC.CDL.Logical.And dow
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant u1AvaSta[3](
each k=true)
;
Buildings.Controls.OBC.CDL.Logical.And run[3]
;
Components.Controls.StatusEmulator y1_actual[3] ;
equation
connect(sorRunTim.yIdx, u1Ena.uIdx);
connect(u1AvaEqu.y[1:3], sorRunTim.u1Ava[1:3]);
connect(u1Lea.y, idxSta.u1Lea);
connect(upPul.y, up.u2);
connect(booTimTab.y[2], dow.u1);
connect(booTimTab.y[1], up.u1);
connect(dowPul.y, dow.u2);
connect(up.y, idxSta.u1Up);
connect(dow.y, idxSta.u1Dow);
connect(u1AvaSta.y, idxSta.u1AvaSta);
connect(idxSta.y, u1Ena.u);
connect(u1Ena.y1, run.u1);
connect(u1AvaEqu.y[1:3], run.u2);
connect(run.y, y1_actual.y1);
connect(y1_actual.y1_actual, sorRunTim.u1Run);
end SortRuntime;
Validation model for the evaluation of stage availability
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.StageAvailability
in a configuration with three equally sized units (component avaStaEqu
)
and in a configuration with one small unit and two large equally sized
units (component avaStaOneTwo
).
Only the units of the same size are lead/lag alternated.
Modelica definition
model StageAvailability
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1AvaEqu(
table=[
0, 0, 0, 0;
1, 1, 0, 0;
2, 0, 1, 0;
3, 0, 0, 1;
4, 1, 1, 0;
5, 0, 1, 1;
6, 1, 1, 1;
7, 0, 0, 0],
timeScale=1,
period=7)
;
Buildings.Templates.Plants.Controls.StagingRotation.StageAvailability avaStaEqu(
staEqu=[
1 / 3, 1 / 3, 1 / 3;
2 / 3, 2 / 3, 2 / 3;
1, 1, 1])
;
Buildings.Templates.Plants.Controls.StagingRotation.StageAvailability avaStaOneTwo(
staEqu=[
1, 0, 0;
0, 1 / 2, 1 / 2;
1, 1 / 2, 1 / 2;
0, 1, 1;
1, 1, 1])
;
equation
connect(u1AvaEqu.y, avaStaEqu.u1Ava);
connect(u1AvaEqu.y, avaStaOneTwo.u1Ava);
end StageAvailability;
Validation model for stage change logic
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.StageChangeCommand
in a configuration with one small unit and two large equally sized
units (component avaStaOneTwo
).
In response to a varying flow rate, the variation of the
required capacity chaSta.capReq.y
triggers stage change
events.
The block
Buildings.Templates.Plants.Controls.Utilities.StageIndex
is used to illustrate how these events translate into
a varying plant stage index idxSta.y
.
Parameters
Type | Name | Default | Description |
Configuration |
Real | cp_default | 4184 | Default specific heat capacity [J/(kg.K)] |
Real | rho_default | 996 | Default specific heat capacity [kg/m3] |
Nominal condition |
Real | THeaWatSup_nominal | 50 + 273.15 | Design HW supply temperature [K] |
Real | VHeaWat_flow_nominal | capHea_nominal/(THeaWatSup_n... | Design primary HW volume flow rate [m3/s] |
Modelica definition
model StageChangeCommand
parameter Real cp_default(
final unit="J/(kg.K)")=4184
;
parameter Real rho_default(
final unit="kg/m3")=996
;
final parameter Real capHea_nominal(
final unit="W")=
sum(chaSta.capEqu)
;
parameter Real THeaWatSup_nominal(
final unit="K",
displayUnit="degC")=50 + 273.15
;
final parameter Real THeaWatRet_nominal(
final unit="K",
displayUnit="degC")=42 + 273.15
;
parameter Real VHeaWat_flow_nominal(
final unit="m3/s")=capHea_nominal /(THeaWatSup_nominal - THeaWatRet_nominal) /
cp_default / rho_default
;
final parameter Integer nSta=
size(chaSta.staEqu, 1)
;
Buildings.Controls.OBC.CDL.Reals.Sources.TimeTable ratV_flow(
table=[
0, 0;
1, 0;
5, 0.2;
6, 0.01;
11, 1;
12, 1;
18, 0],
timeScale=1000)
;
Buildings.Templates.Plants.Controls.StagingRotation.StageChangeCommand chaSta(
typ=Buildings.Templates.Plants.Controls.Types.Application.Heating,
have_pumSec=false,
plrSta=0.9,
staEqu=[1,0,0; 0,1/2,1/2; 1,1/2,1/2; 0,1,1; 1,1,1],
capEqu=1E3*{100,450,450},
cp_default=cp_default,
rho_default=rho_default,
dT=2.5) ;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant TSupSet(
final k=THeaWatSup_nominal)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant TRet(
final k=THeaWatRet_nominal)
;
Utilities.StageIndex idxSta(
final nSta=nSta, dtRun=900)
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant u1Lea(
k=true)
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant u1AvaSta[nSta](
each k=true)
;
Buildings.Controls.OBC.CDL.Logical.TrueFalseHold y1UpHol(
final falseHoldDuration=0, trueHoldDuration=1)
;
Buildings.Controls.OBC.CDL.Logical.TrueFalseHold y1DowHol(
final falseHoldDuration=0, trueHoldDuration=1)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter V_flow(
final k=VHeaWat_flow_nominal)
;
Buildings.Templates.Plants.Controls.StagingRotation.EquipmentEnable enaEqu(
final staEqu=chaSta.staEqu)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant idxEquLeaLag[2](
final k={2, 3})
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant u1AvaEqu[3](
each final k=true)
;
Components.Controls.StatusEmulator staEqu[3](
each delayTime=15)
;
Buildings.Templates.Plants.Controls.StagingRotation.StageCompletion comSta(
nin=3)
;
equation
connect(TRet.y, chaSta.TRet);
connect(TSupSet.y, chaSta.TSupSet);
connect(chaSta.y1Up, idxSta.u1Up);
connect(chaSta.y1Dow, idxSta.u1Dow);
connect(u1Lea.y, idxSta.u1Lea);
connect(u1AvaSta.y, idxSta.u1AvaSta);
connect(idxSta.y, chaSta.uSta);
connect(chaSta.y1Up, y1UpHol.u);
connect(chaSta.y1Dow, y1DowHol.u);
connect(u1AvaSta.y, chaSta.u1AvaSta);
connect(ratV_flow.y[1], V_flow.u);
connect(V_flow.y, chaSta.V_flow);
connect(idxSta.y, enaEqu.uSta);
connect(idxEquLeaLag.y, enaEqu.uIdxAltSor);
connect(u1AvaEqu.y, enaEqu.u1Ava);
connect(enaEqu.y1, staEqu.y1);
connect(comSta.y1, chaSta.u1StaPro);
connect(enaEqu.y1, comSta.u1);
connect(staEqu.y1_actual, comSta.u1_actual);
connect(idxSta.y, comSta.uSta);
connect(TSupSet.y, chaSta.TPriSup);
end StageChangeCommand;
Validation model for the evaluation of stage completion
Information
This model validates
Buildings.Templates.Plants.Controls.StagingRotation.StageCompletion
in a configuration with one small unit and two large equally sized
units (component avaStaOneTwo
).
In response to a varying flow rate, the variation of the
required capacity chaSta.capReq.y
triggers stage change
events.
The block
Buildings.Templates.Plants.Controls.Utilities.StageIndex
is used to illustrate how these events translate into
a varying plant stage index idxSta.y
.
Modelica definition
model StageCompletion
Buildings.Templates.Plants.Controls.StagingRotation.StageCompletion comSta(
nin=2)
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable booTimTab(
table=[
0, 0, 0, 0, 0;
1, 0, 0, 0, 0;
3, 1, 0, 0, 0;
6, 1, 0, 1, 0;
21, 1, 0, 1, 0;
22, 0, 0, 1, 0;
24, 0, 0, 0, 0],
timeScale=60,
period=1800)
;
Buildings.Controls.OBC.CDL.Logical.TrueFalseHold y1ComSta(
final falseHoldDuration=0, trueHoldDuration=1)
;
Buildings.Controls.OBC.CDL.Integers.Sources.TimeTable idxSta(
table=[
0, 0;
1, 1;
21, 0],
timeScale=60,
period=1800)
;
initial equation
Modelica.Utilities.Streams.print("At initialization: comSta.y1End = " +
String(comSta.y1End));
equation
when initial()
then
Modelica.Utilities.Streams.print("When initial(): comSta.y1End = " +
String(comSta.y1End));
end when;
connect(comSta.y1End, y1ComSta.u);
connect(booTimTab.y[1:2], comSta.u1[1:2]);
connect(booTimTab.y[3:4], comSta.u1_actual[1:2]);
connect(idxSta.y[1], comSta.uSta);
end StageCompletion;