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 |
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]
;
Utilities.SortWithIndices sort(
ascending=false,
nin=3)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1[2]
;
Utilities.SortWithIndices 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.Controls.OBC.CDL.Conversions.BooleanToReal booToRea
;
Buildings.Controls.OBC.CDL.Discrete.ZeroOrderHold zerOrdHol(samplePeriod=1)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr
;
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)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1
;
Buildings.Controls.OBC.CDL.Discrete.ZeroOrderHold zerOrdHol1(samplePeriod=1)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1
;
equation
connect(u1.y[1], seqEveHea.u1Hea);
connect(u1.y[1], seqEveHea.u1PumHeaWatSec_actual);
connect(booToRea.y,zerOrdHol. u);
connect(zerOrdHol.y,greThr. u);
connect(seqEveHea.y1PumHeaWatPri, booToRea.u);
connect(greThr.y, seqEveHea.u1PumHeaWatPri_actual);
connect(u1.y[1], seqEveHeaCoo.u1Hea);
connect(booToRea1.y, zerOrdHol1.u);
connect(zerOrdHol1.y, greThr1.u);
connect(seqEveHeaCoo.y1PumHeaWatPri, booToRea1.u);
connect(greThr1.y, seqEveHeaCoo.u1PumHeaWatPri_actual);
connect(u1.y[2], seqEveHeaCoo.u1Coo);
end EventSequencing;
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,
and automatically moves up in the staging order only if another
equipment (#3) becomes unavailable.
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.Conversions.BooleanToReal booToRea[3]
;
Buildings.Controls.OBC.CDL.Discrete.ZeroOrderHold zerOrdHol[3](
each samplePeriod=1)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr[3]
;
Buildings.Controls.OBC.CDL.Logical.Sources.TimeTable u1AvaEqu(
table=[
0, 1, 1, 1;
2000, 0, 1, 1;
2500, 0, 1, 0;
3000, 1, 1, 1],
timeScale=1,
period=3000)
;
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]
;
equation
connect(sorRunTim.yIdx, u1Ena.uIdx);
connect(booToRea.y, zerOrdHol.u);
connect(zerOrdHol.y, greThr.u);
connect(greThr.y, sorRunTim.u1Run);
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, booToRea.u);
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(
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)
;
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.TrueHold y1UpHol(duration=1)
;
Buildings.Controls.OBC.CDL.Logical.TrueHold y1DowHol(duration=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 riseTime=60)
;
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);
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.TrueHold y1ComSta(duration=1)
;
Buildings.Controls.OBC.CDL.Integers.Sources.TimeTable idxSta(
table=[
0, 0;
1, 1;
21, 0],
timeScale=60,
period=1800)
;
equation
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;