diff --git a/Buildings/Controls/OBC/RadiantSystems/Cooling/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/Cooling/Validation/package.mo
index 28d6998f1a6..ecf2a3bc8a4 100644
--- a/Buildings/Controls/OBC/RadiantSystems/Cooling/Validation/package.mo
+++ b/Buildings/Controls/OBC/RadiantSystems/Cooling/Validation/package.mo
@@ -1,4 +1,8 @@
+<<<<<<< HEAD:Buildings/Fluid/FixedResistances/BaseClasses/Validation/package.mo
+within Buildings.Fluid.FixedResistances.BaseClasses;
+=======
within Buildings.Controls.OBC.RadiantSystems.Cooling;
+>>>>>>> origin:Buildings/Controls/OBC/RadiantSystems/Cooling/Validation/package.mo
package Validation "Collection of validation models"
extends Modelica.Icons.ExamplesPackage;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/ControlPlusLockouts.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/ControlPlusLockouts.mo
new file mode 100644
index 00000000000..298695aac76
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/ControlPlusLockouts.mo
@@ -0,0 +1,200 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating;
+block ControlPlusLockouts "Full radiant control"
+ parameter Real TZonHigSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ parameter Real TZonLowSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+ parameter Real TWatSetLow(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ parameter Real cooLocDurWatTem(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=1800 "Time for which cooling is locked if CHW return is too cold";
+ parameter Real heaLocDurAftCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ parameter Real cooLocDurAftHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ parameter Real TDeaRel(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="TemperatureDifference")=2.22 "Difference from slab temp setpoint required to trigger alarm during occupied hours";
+ parameter Real TDeaNor(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="TemperatureDifference")=0.28
+ "Difference from slab temp setpoint required to trigger alarm during unoccupied hours";
+ parameter Real k(min=0,max=24)=18 "Last occupied hour";
+ parameter Boolean offWitDea=true "If flow should turn off when slab setpoint is within deadband, set to true. Otherwise, set to false";
+
+ Controls.OBC.CDL.Logical.And and2 "Final Heating Signal"
+ annotation (Placement(transformation(extent={{20,40},{40,60}})));
+ Controls.OBC.CDL.Logical.And and1 "Final cooling signal"
+ annotation (Placement(transformation(extent={{20,-20},{40,0}})));
+ Controls.OBC.CDL.Interfaces.RealInput TRooAir "Room air temperature"
+ annotation (Placement(transformation(extent={{-140,-60},{-100,-20}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSla "Measured slab temperature"
+ annotation (Placement(transformation(extent={{-140,60},{-100,100}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSlaWatRet "Water return temperature"
+ annotation (Placement(transformation(extent={{-140,-100},{-100,-60}})));
+ SlabTemperatureSignal.Error err "Slab temperature error"
+ annotation (Placement(transformation(extent={{-58,40},{-38,60}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSlaSet "Slab temperature setpoint"
+ annotation (Placement(transformation(extent={{-140,20},{-100,60}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uNigFlu
+ "Night flush signal- true if night flush on; false if not"
+ annotation (Placement(transformation(extent={{-140,-20},{-100,20}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yHea
+ "True if heating is called for; false if not"
+ annotation (Placement(transformation(extent={{100,24},{140,64}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yCoo
+ "True if cooling is called for; false if not"
+ annotation (Placement(transformation(extent={{100,-50},{140,-10}})));
+ Lockouts.AllLockouts allLoc(
+ TZonHigSet=TZonHigSet,
+ TZonLowSet=TZonLowSet,
+ TWatSetLow=TWatSetLow,
+ cooLocDurWatTem=cooLocDurWatTem,
+ heaLocDurAftCoo=heaLocDurAftCoo,
+ cooLocDurAftHea=cooLocDurAftHea) "All lockouts, combined"
+ annotation (Placement(transformation(extent={{-20,0},{0,20}})));
+ SlabTemperatureSignal.DeadbandControl deaCon(
+ TDeaRel=TDeaRel,
+ TDeaNor=TDeaNor,
+ k=k) "Slab temperature deadband control"
+ annotation (Placement(transformation(extent={{-24,38},{6,68}})));
+ Controls.OBC.CDL.Logical.Pre pre "Breaks recursive loop"
+ annotation (Placement(transformation(extent={{60,-40},{80,-20}})));
+ Controls.OBC.CDL.Logical.Pre pre1 "Breaks recursive loop"
+ annotation (Placement(transformation(extent={{60,60},{80,80}})));
+equation
+ connect(err.TSlaSet, TSlaSet) annotation (Line(points={{-60,47},{-60,48},{-96,
+ 48},{-96,40},{-120,40}}, color={0,0,127}));
+ connect(err.TSla, TSla)
+ annotation (Line(points={{-60,51},{-60,80},{-120,80}}, color={0,0,127}));
+ connect(and1.y, yCoo) annotation (Line(points={{42,-10},{94,-10},{94,-30},{120,
+ -30}}, color={255,0,255}));
+ connect(and2.y, yHea) annotation (Line(points={{42,50},{94,50},{94,44},{120,
+ 44}}, color={255,0,255}));
+ connect(uNigFlu, allLoc.uNigFlu) annotation (Line(points={{-120,0},{-86,0},
+ {-86,19},{-22,19}}, color={255,0,255}));
+ connect(TRooAir, allLoc.TRooAir) annotation (Line(points={{-120,-40},{-78,-40},
+ {-78,7},{-22,7}}, color={0,0,127}));
+ connect(TSlaWatRet, allLoc.TSlaWatRet) annotation (Line(points={{-120,-80},{-40,-80},
+ {-40,3},{-22,3}}, color={0,0,127}));
+ connect(allLoc.yHea, and2.u2) annotation (Line(points={{2,13},{16,13},{16,
+ 42},{18,42}}, color={255,0,255}));
+ connect(allLoc.yCoo, and1.u2) annotation (Line(points={{2,5},{6,5},{6,-18},
+ {18,-18}}, color={255,0,255}));
+ connect(err.slaTemErr, deaCon.slaTemErr) annotation (Line(points={{-36,51},{-32,
+ 51},{-32,39.2},{-26.6,39.2}}, color={0,0,127}));
+ connect(deaCon.uCoo, and1.u1) annotation (Line(points={{8,44},{12,44},{12,-10},
+ {18,-10}}, color={255,0,255}));
+ connect(deaCon.uHea, and2.u1) annotation (Line(points={{8,54},{14,54},{14,
+ 50},{18,50}}, color={255,0,255}));
+ connect(and1.y, pre.u) annotation (Line(points={{42,-10},{50,-10},{50,-30},{
+ 58,-30}}, color={255,0,255}));
+ connect(pre.y, allLoc.uCoo) annotation (Line(points={{82,-30},{86,-30},{86,-60},
+ {-60,-60},{-60,11},{-22,11}}, color={255,0,255}));
+ connect(and2.y, pre1.u) annotation (Line(points={{42,50},{50,50},{50,70},{58,
+ 70}}, color={255,0,255}));
+ connect(pre1.y, allLoc.uHea) annotation (Line(points={{82,70},{84,70},{84,94},
+ {-74,94},{-74,15},{-22,15}}, color={255,0,255}));
+ annotation (defaultComponentName = "conPluLoc",Documentation(info="
+
+This encompasses full radiant control based on water return temperature, room air temperature, night flush signal, slab temperature, and slab setpoint.
+
+ Each day, a slab temperature setpoint for a perimeter zone should be determined based on a lookup table that references the forecast high outdoor air temperature.
+See
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.SlabSetpointPerimeter.
+
+
+Core zone setpoints are set to a constant value throughout the year (typically 70degF
).
+
+
+The user specifies a deadband for occupied hours TDeaNor
and one for unoccupied hours TDeaRel
.
+Each day, from midnight until the last occupied hour, a call for heating or cooling is produced if the setpoint is not met within the occupied deadband.
+After the last occupied hour, typically 18 (6PM), calls for heating or cooling are produced if the setpoint is not met within the unoccupied deadband.
+
+
+If there is a call for heating (ie, the slab temperature is below its setpoint minus a user-specified deadband) and heating is not locked out, a heating signal is generated, asking for hot water to be sent to the slab.
+If there is a call for cooling (ie, the slab temperature is above its setpoint plus a user-specified deadband) and cooling is not locked out, a cooling signal is generated, asing for cold water to be sent to the slab.
+
+
+When the slab is within its deadband, the user specifies whether the system should send no calls for heating or cooling (i.e. offWitDea
is set to true
),
+or whether it should continue to call for heating or cooling and then correct itself once the slab temperature goes out of range (i.e. offWitDea
is set to false
).
+
+
+Heating is locked out if room air temperature is too hot (above a user-specified value, TZonHigSet
), if night flush mode is on, or if cooling was on within a user-specified amount of time (heaLocDurAftCoo
).
+
+
+Cooling is locked out if room air temperature is too cold (below a user-specified value, TZonLowSet
), if chilled water return temperature is lower than a user-specified value
+(TWatSetLow
, typically 55degF
or the chilled water supply temperature), or if heating was on within a user-specified amount of time (cooLocDurAftHea
, typically one hour).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+Updated description.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}),graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Line(points={{-80,-70},{-40,-70},{31,38}}),
+ Polygon(lineColor = {191,0,0},
+ fillColor = {191,0,0},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{20,58},{100,-2},{20,-62},{20,58}}),
+ Text(
+ extent={{-72,78},{72,6}},
+ lineColor={0,0,0},
+ textString="R"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(coordinateSystem(
+ preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ extent={{-92,92},{284,76}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="Control Plus Lockouts:
+Full radiant control-
+slab error,
+deadband control,
+and lockouts")}));
+end ControlPlusLockouts;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/AllLockouts.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/AllLockouts.mo
new file mode 100644
index 00000000000..db5c026b6d1
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/AllLockouts.mo
@@ -0,0 +1,177 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts;
+block AllLockouts "Composite block of all lockouts: room air temperature, chilled water return, hysteresis, and night flush"
+ parameter Real TZonHigSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ parameter Real TZonLowSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+ parameter Real TWatSetLow(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ parameter Real cooLocDurWatTem(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=1800 "Time for which cooling is locked if CHW return is too cold";
+ parameter Real heaLocDurAftCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ parameter Real cooLocDurAftHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ Controls.OBC.CDL.Logical.And3 andHea
+ "Combines signals from heating lockouts to produce true signal if heating is allowed"
+ annotation (Placement(transformation(extent={{60,20},{80,40}})));
+ Controls.OBC.CDL.Logical.And3 andCoo
+ "Combines signals from cooling lockouts to produce true signal if cooling is allowed"
+ annotation (Placement(transformation(extent={{60,-60},{80,-40}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSlaWatRet
+ "Chilled water return temperature"
+ annotation (Placement(transformation(extent={{-140,-90},{-100,-50}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uHea
+ "Heating signal- true if heating is called for, false if not"
+ annotation (Placement(transformation(extent={{-140,30},{-100,70}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uCoo
+ "Cooling signal- true if cooling is called for, false if not"
+ annotation (Placement(transformation(extent={{-140,-10},{-100,30}})));
+ Controls.OBC.CDL.Interfaces.RealInput TRooAir "Room air temperature"
+ annotation (Placement(transformation(extent={{-140,-50},{-100,-10}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uNigFlu
+ "Night flush signal- true if night flush is on"
+ annotation (Placement(transformation(extent={{-140,70},{-100,110}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yHea
+ "True if heating allowed, false if locked out"
+ annotation (Placement(transformation(extent={{100,10},{140,50}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yCoo
+ "True if cooling allowed, false if cooling locked out"
+ annotation (Placement(transformation(extent={{100,-70},{140,-30}})));
+ SubLockouts.HysteresisLimit hysLim(heaLocDurAftCoo=heaLocDurAftCoo, cooLocDurAftHea=cooLocDurAftHea)
+ "Locks out heating (heating signal false) if cooling has just been on; locks out cooling (cooling signal false) if heating has just been on"
+ annotation (Placement(transformation(extent={{-40,-20},{-20,0}})));
+ SubLockouts.AirTemperatureLimit airTemLim(TZonHigSet=TZonHigSet, TZonLowSet=
+ TZonLowSet)
+ "Locks out heating (heating signal is false) if air is too hot; locks out cooling (cooling signal is false) if slab is too cold"
+ annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
+ SubLockouts.NightFlush nitFluLoc
+ "Locks out heating (heating signal is false) if night flush mode is on"
+ annotation (Placement(transformation(extent={{-40,60},{-20,80}})));
+ SubLockouts.ChilledWaterReturnLimit chwRetLim(TWatSetLow=TWatSetLow, cooLocDurWatTem=cooLocDurWatTem)
+ "Locks out cooling (cooling signal false) if chilled water return temperature is too low"
+ annotation (Placement(transformation(extent={{-40,-80},{-20,-60}})));
+equation
+ connect(andHea.y, yHea)
+ annotation (Line(points={{82,30},{120,30}}, color={255,0,255}));
+ connect(andCoo.y, yCoo)
+ annotation (Line(points={{82,-50},{120,-50}}, color={255,0,255}));
+ connect(uHea, hysLim.uHea) annotation (Line(points={{-120,50},{-80,50},{-80,
+ -5.8},{-42.2,-5.8}}, color={255,0,255}));
+ connect(uCoo, hysLim.uCoo) annotation (Line(points={{-120,10},{-84,10},{-84,
+ -18},{-42,-18}}, color={255,0,255}));
+ connect(TRooAir, airTemLim.TRoo) annotation (Line(points={{-120,-30},{-73,-30},
+ {-73,37.2},{-42,37.2}}, color={0,0,127}));
+ connect(airTemLim.yHeaTZon, andHea.u2) annotation (Line(points={{-18,33},
+ {20,33},{20,30},{58,30}}, color={255,0,255}));
+ connect(airTemLim.yCooTZon, andCoo.u1) annotation (Line(points={{-18,25},
+ {30,25},{30,-42},{58,-42}}, color={255,0,255}));
+ connect(uNigFlu, nitFluLoc.uNigFlu) annotation (Line(points={{-120,90},{-82,
+ 90},{-82,70},{-42.2,70}}, color={255,0,255}));
+ connect(TSlaWatRet, chwRetLim.TSlaRet) annotation (Line(points={{-120,-70},{-80,-70},
+ {-80,-68},{-42,-68}}, color={0,0,127}));
+ connect(chwRetLim.yCooTChiWatRetLim, andCoo.u3) annotation (Line(points={{-18,-69},
+ {20,-69},{20,-58},{58,-58}}, color={255,0,255}));
+ connect(nitFluLoc.yNigFluHea, andHea.u1) annotation (Line(points={{-18,70},{
+ 20,70},{20,38},{58,38}}, color={255,0,255}));
+ connect(hysLim.yHeaNotLoc, andHea.u3) annotation (Line(points={{-18,-8},{50,
+ -8},{50,22},{58,22}}, color={255,0,255}));
+ connect(hysLim.yCooNotLoc, andCoo.u2) annotation (Line(points={{-18,-18},{0,
+ -18},{0,-50},{58,-50}}, color={255,0,255}));
+ annotation (defaultComponentName = "allLoc",Documentation(info="
+
+This block encompasses all lockouts.
+
+
+
+Heating lockouts are as follows:
+
+
+
+- 1. Air Temperature Lockout: Heating is locked out if room air temperature is above a user-specified temperature threshold (typically 76
degF
).
+- 2. Night Flush Lockout: Heating is locked out if night flush mode is on, as night flush setpoints are typically below heating setpoint, but heating is not desired during night flush operation,
+as this would waste energy and negate the cooling effect of the flush.
+- 3. Hysteresis Lockout: Heating is locked out if cooling was on within a user-specified amount of time (typically one hour).
+
+
+Cooling lockouts are as follows:
+
+
+Output is expressed as a heating or cooling signal. If the heating signal is true
, heating is allowed (i.e., it is not locked out).
+If the cooling signal is true, cooling is allowed (ie, it is not locked out).
+
+A true signal indicates only that heating or cooling is permitted - it does not indicate the actual status
+ of the final heating or cooling signal, which depends on the slab temperature and slab setpoint
+ (see
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.SlabSetpointPerimeter for more information).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}),graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Text(
+ extent={{-56,90},{48,-88}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="L"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-64,100},{312,84}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="All Lockouts Combined")}));
+end AllLockouts;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/AirTemperatureLimit.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/AirTemperatureLimit.mo
new file mode 100644
index 00000000000..efa17ecc1a4
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/AirTemperatureLimit.mo
@@ -0,0 +1,103 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts;
+block AirTemperatureLimit "Locks out heating if room air is hotter than user-specified threshold; locks out cooling if room air is colder than user-specified threshold"
+ parameter Real TZonHigSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ parameter Real TZonLowSet(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which cooling is locked out";
+ Buildings.Controls.OBC.CDL.Logical.Not not2
+ "Negates hysteresis output to give heating signal"
+ annotation (Placement(transformation(extent={{40,20},{60,40}})));
+ Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yHeaTZon
+ "True if heating is allowed, false if heating is locked out because room air is too hot"
+ annotation (Placement(transformation(extent={{100,10},{140,50}})));
+ Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yCooTZon
+ "True if cooling allowed, false if cooling locked out because room air is too cold"
+ annotation (Placement(transformation(extent={{100,-70},{140,-30}})));
+ Buildings.Controls.OBC.CDL.Interfaces.RealInput TRoo(unit="K", displayUnit="K")
+ "Room air temperature"
+ annotation (Placement(transformation(extent={{-140,52},{-100,92}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys(uLow=TZonHigSet - 0.1, uHigh=
+ TZonHigSet) "If room air temp is above high threshold, lock out heating"
+ annotation (Placement(transformation(extent={{0,20},{20,40}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys1(uLow=TZonLowSet, uHigh=TZonLowSet
+ + 0.1) "If room air temp is below low threshold, lock out cooling"
+ annotation (Placement(transformation(extent={{0,-60},{20,-40}})));
+equation
+ connect(not2.y, yHeaTZon)
+ annotation (Line(points={{62,30},{120,30}}, color={255,0,255}));
+ connect(hys.y, not2.u)
+ annotation (Line(points={{22,30},{38,30}}, color={255,0,255}));
+ connect(TRoo, hys.u) annotation (Line(points={{-120,72},{-60,72},{-60,30},{-2,
+ 30}}, color={0,0,127}));
+ connect(hys1.y, yCooTZon)
+ annotation (Line(points={{22,-50},{120,-50}}, color={255,0,255}));
+ connect(TRoo, hys1.u) annotation (Line(points={{-120,72},{-60,72},{-60,-50},{
+ -2,-50}}, color={0,0,127}));
+ annotation (defaultComponentName = "airTemLim",Documentation(info="
+
+If room air temperature is above a specified temperature threshold (typically 76degF
), heating is looked out.
+If room air temperature is below a specified temperature threshold (typically 68degF
), cooling is locked out.
+
+
+Output is expressed as a heating or cooling signal. If the heating signal is true
, heating is allowed (ie, it is not locked out).
+
+
+If the cooling signal is true, cooling is allowed (ie, it is not locked out).
+A true signal indicates only that heating or cooling is permitted- it does not indicate the actual status
+of the final heating or cooling signal, which depends on the slab temperature and slab setpoint (see
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal for more info).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}),graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Text(
+ extent={{-56,90},{48,-88}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="A"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-70,96},{306,80}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="Air Temperature Lockout:
+Lock out heating if room air temperature is above user-specified high threshold
+Lock out cooling if room air temperature is below user specified low threshold")}));
+end AirTemperatureLimit;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/ChilledWaterReturnLimit.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/ChilledWaterReturnLimit.mo
new file mode 100644
index 00000000000..4c03e8dc982
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/ChilledWaterReturnLimit.mo
@@ -0,0 +1,97 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts;
+block ChilledWaterReturnLimit
+ "Locks out cooling if chilled water return temperature is below user-specified threshold"
+ parameter Real TWatSetLow(min=0,
+ final unit="K",
+ final displayUnit="degC",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ parameter Real cooLocDurWatTem(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=1800 "Time for which cooling is locked out if CHW return is too cold";
+ Controls.OBC.CDL.Logical.TrueHoldWithReset truHol(duration=cooLocDurWatTem)
+ "Holds signal for user-specified time threshhold"
+ annotation (Placement(transformation(extent={{20,0},{40,20}})));
+ Controls.OBC.CDL.Logical.Not not6
+ "Negates signal so that cooling is locked out if CHW return water temp is too low"
+ annotation (Placement(transformation(extent={{60,0},{80,20}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSlaRet "Slab water return temperature"
+ annotation (Placement(transformation(extent={{-140,0},{-100,40}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yCooTChiWatRetLim
+ "True if water temperature is above low threshhold, false if not"
+ annotation (Placement(transformation(extent={{100,-10},{140,30}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys1(
+ uLow=TWatSetLow,
+ uHigh=TWatSetLow + 1)
+ "Test if CHW is below low limit- output false if CHW temp is low, output true if not"
+ annotation (Placement(transformation(extent={{-60,0},{-40,20}})));
+ Controls.OBC.CDL.Logical.Not not1
+ "Negates signal so that cooling is locked out if CHW return water temp is too low"
+ annotation (Placement(transformation(extent={{-20,0},{0,20}})));
+equation
+ connect(truHol.y, not6.u)
+ annotation (Line(points={{42,10},{58,10}}, color={255,0,255}));
+ connect(not6.y,yCooTChiWatRetLim)
+ annotation (Line(points={{82,10},{120,10}}, color={255,0,255}));
+ connect(TSlaRet, hys1.u) annotation (Line(points={{-120,20},{-92,20},{-92,10},{-62,
+ 10}}, color={0,0,127}));
+ connect(hys1.y, not1.u)
+ annotation (Line(points={{-38,10},{-22,10}}, color={255,0,255}));
+ connect(not1.y, truHol.u)
+ annotation (Line(points={{2,10},{18,10}}, color={255,0,255}));
+ annotation (defaultComponentName = "chwRetLim",Documentation(info="
+
+If chilled water return temperature is below a user-specified threshold, cooling is locked out for a user-specified amount of time (typically 0.5 hours).
+ Output is expressed as a heating or cooling signal. If the heating signal is true, heating is allowed (ie, it is not locked out).
+ If the cooling signal is true, cooling is allowed (ie, it is not locked out).
+ A true signal indicates only that heating or cooling is *permitted*- it does *not* indicate the actual status
+ of the final heating or cooling signal, which depends on the slab temperature and slab setpoint (see SlabTempSignal for more info).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}),graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Text(
+ extent={{-56,90},{48,-88}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="C"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-68,82},{308,66}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="Chilled Water Return Lockout:
+Lock out cooling for user-specified time amount if CHW return temperature is below low limit")}));
+end ChilledWaterReturnLimit;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/HysteresisLimit.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/HysteresisLimit.mo
new file mode 100644
index 00000000000..b696f952f57
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/HysteresisLimit.mo
@@ -0,0 +1,250 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts;
+block HysteresisLimit
+ "Locks out heating if cooling occurred in the past hour; locks out cooling if heating occurred in the past hour"
+ parameter Real heaLocDurAftCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ parameter Real cooLocDurAftHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ Controls.OBC.CDL.Logical.LogicalSwitch logSwiHot
+ "Once simulation has been running for user-specified time duration, enables hysteresis prevention"
+ annotation (Placement(transformation(extent={{-100,20},{-80,40}})));
+ Buildings.Utilities.Time.ModelTime modTim "Model time"
+ annotation (Placement(transformation(extent={{-320,-40},{-300,-20}})));
+ Controls.OBC.CDL.Logical.Pre pre(pre_u_start=false)
+ "Breaks Boolean loop"
+ annotation (Placement(transformation(extent={{-260,80},{-240,100}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uHea
+ "Heating signal- true if heating is on; false if not"
+ annotation (Placement(
+ transformation(extent={{-380,40},{-340,80}}), iconTransformation(extent=
+ {{-142,22},{-102,62}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yCooNotLoc
+ "True if cooling allowed; false if cooling locked out" annotation (
+ Placement(transformation(extent={{100,-112},{140,-72}}),
+ iconTransformation(extent={{100,-100},{140,-60}})));
+ Controls.OBC.CDL.Interfaces.BooleanInput uCoo
+ "Cooling signal- true if cooling is on; false if not"
+ annotation (Placement(
+ transformation(extent={{-380,-140},{-340,-100}}), iconTransformation(
+ extent={{-140,-100},{-100,-60}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yHeaNotLoc
+ "True if heating allowed; false if heating locked out" annotation (
+ Placement(transformation(extent={{100,-26},{140,14}}), iconTransformation(
+ extent={{100,0},{140,40}})));
+ Controls.OBC.CDL.Logical.Pre pre1(pre_u_start=false)
+ "Breaks Boolean loop"
+ annotation (Placement(transformation(extent={{-260,-120},{-240,-100}})));
+ Controls.Continuous.OffTimer offTimCol
+ "Records time since cooling turned off"
+ annotation (Placement(transformation(extent={{-220,-120},{-200,-100}})));
+ Controls.OBC.CDL.Logical.LogicalSwitch logSwiCol
+ "Once simulation has been running for user-specified time duration, enables hysteresis prevention"
+ annotation (Placement(transformation(extent={{-100,-120},{-80,-100}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys(
+ uLow=cooLocDurAftHea - 0.1,
+ uHigh=cooLocDurAftHea,
+ pre_y_start=true)
+ "Checks if heating has been off for user-specified duration"
+ annotation (Placement(transformation(extent={{-178,80},{-158,100}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys1(
+ uLow=cooLocDurAftHea - 0.1,
+ uHigh=cooLocDurAftHea,
+ pre_y_start=false)
+ "Checks if simulation has been running for at least lockout duration: if not, no hysteresis lockouts"
+ annotation (Placement(transformation(extent={{-260,20},{-240,40}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys2(
+ uLow=heaLocDurAftCoo - 0.1,
+ uHigh=heaLocDurAftCoo,
+ pre_y_start=false)
+ "Checks if simulation has been running for at least lockout duration: if not, no hysteresis lockouts"
+ annotation (Placement(transformation(extent={{-260,-60},{-240,-40}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys3(
+ uLow=heaLocDurAftCoo - 0.1,
+ uHigh=heaLocDurAftCoo,
+ pre_y_start=true)
+ "Checks if cooling has been off for user-specified duration"
+ annotation (Placement(transformation(extent={{-180,-120},{-160,-100}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con(k=true)
+ "Constant true if time < threshhold"
+ annotation (Placement(transformation(extent={{-260,-20},{-240,0}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con1(k=true)
+ "Constant true if time < threshhold"
+ annotation (Placement(transformation(extent={{-260,-170},{-240,-150}})));
+ Controls.OBC.CDL.Logical.Not not3 "Negates cooling signal output"
+ annotation (Placement(transformation(extent={{-80,-160},{-60,-140}})));
+ Controls.OBC.CDL.Logical.And and3
+ "True (heating is allowed) if cooling signal is currently false AND cooling has been off for specified duration"
+ annotation (Placement(transformation(extent={{-40,-140},{-20,-120}})));
+ Controls.OBC.CDL.Logical.And and2
+ "True (cooling is allowed) if heating signal is currently false AND heating has been off for specified duration"
+ annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
+ Controls.OBC.CDL.Logical.Not not2 "Negates heating signal output"
+ annotation (Placement(transformation(extent={{-80,80},{-60,100}})));
+ Controls.Continuous.OffTimer offTimHot
+ "Records time since heating turned off"
+ annotation (Placement(transformation(extent={{-218,80},{-198,100}})));
+equation
+ connect(uHea, pre.u) annotation (Line(points={{-360,60},{-280,60},{-280,90},
+ {-262,90}}, color={255,0,255}));
+ connect(pre1.y, offTimCol.u)
+ annotation (Line(points={{-238,-110},{-222,-110}},
+ color={255,0,255}));
+ connect(uCoo, pre1.u) annotation (Line(points={{-360,-120},{-290,-120},{
+ -290,-110},{-262,-110}},
+ color={255,0,255}));
+ connect(modTim.y, hys1.u) annotation (Line(points={{-299,-30},{-280,-30},{
+ -280,30},{-262,30}}, color={0,0,127}));
+ connect(hys1.y, logSwiHot.u2)
+ annotation (Line(points={{-238,30},{-102,30}}, color={255,0,255}));
+ connect(hys.y, logSwiHot.u1) annotation (Line(points={{-156,90},{-120,90},{
+ -120,38},{-102,38}}, color={255,0,255}));
+ connect(hys2.y, logSwiCol.u2) annotation (Line(points={{-238,-50},{-120,-50},
+ {-120,-110},{-102,-110}}, color={255,0,255}));
+ connect(modTim.y, hys2.u) annotation (Line(points={{-299,-30},{-280.5,-30},{
+ -280.5,-50},{-262,-50}}, color={0,0,127}));
+ connect(offTimCol.y, hys3.u)
+ annotation (Line(points={{-199,-110},{-182,-110}},
+ color={0,0,127}));
+ connect(hys3.y, logSwiCol.u1) annotation (Line(points={{-158,-110},{-140,-110},
+ {-140,-102},{-102,-102}}, color={255,0,255}));
+ connect(con.y, logSwiHot.u3) annotation (Line(points={{-238,-10},{-170,-10},{
+ -170,22},{-102,22}}, color={255,0,255}));
+ connect(con1.y, logSwiCol.u3) annotation (Line(points={{-238,-160},{-122,-160},
+ {-122,-118},{-102,-118}}, color={255,0,255}));
+ connect(uCoo, not3.u) annotation (Line(points={{-360,-120},{-294,-120},{
+ -294,-176},{-112,-176},{-112,-150},{-82,-150}}, color={255,0,255}));
+ connect(logSwiCol.y, and3.u1) annotation (Line(points={{-78,-110},{-62,-110},
+ {-62,-130},{-42,-130}}, color={255,0,255}));
+ connect(not3.y, and3.u2) annotation (Line(points={{-58,-150},{-52,-150},{-52,
+ -138},{-42,-138}}, color={255,0,255}));
+ connect(and3.y, yHeaNotLoc) annotation (Line(points={{-18,-130},{60,-130},{60,
+ -6},{120,-6}}, color={255,0,255}));
+ connect(uHea, not2.u) annotation (Line(points={{-360,60},{-280,60},{-280,
+ 114},{-114,114},{-114,90},{-82,90}}, color={255,0,255}));
+ connect(not2.y, and2.u1) annotation (Line(points={{-58,90},{-46,90},{-46,30},
+ {-42,30}}, color={255,0,255}));
+ connect(logSwiHot.y, and2.u2) annotation (Line(points={{-78,30},{-62,30},{-62,
+ 22},{-42,22}}, color={255,0,255}));
+ connect(and2.y, yCooNotLoc) annotation (Line(points={{-18,30},{20,30},{20,-92},
+ {120,-92}}, color={255,0,255}));
+ connect(offTimHot.y, hys.u)
+ annotation (Line(points={{-197,90},{-180,90}}, color={0,0,127}));
+ connect(pre.y, offTimHot.u)
+ annotation (Line(points={{-238,90},{-220,90}}, color={255,0,255}));
+ annotation (defaultComponentName = "hysLim",Documentation(info="
+
+Cooling is locked out for a specified amount of time after heating turns off (typically 1hr).
+Heating is locked out for a specified amount of time after cooling turns off (typically 1hr).
+ Output is expressed as a heating or cooling signal. If the heating signal is true, heating is allowed (ie, it is not locked out).
+ If the cooling signal is true, cooling is allowed (ie, it is not locked out).
+ A true signal indicates only that heating or cooling is *permitted*- it does *not* indicate the actual status
+ of the final heating or cooling signal, which depends on the slab temperature and slab setpoint (see SlabTempSignal for more info).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Text(
+ extent={{-90,90},{90,-90}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="H"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(coordinateSystem(preserveAspectRatio=false,
+ extent={{-340,-180},{100,160}}), graphics={
+ Rectangle(
+ extent={{-300,120},{-80,-20}},
+ lineColor={28,108,200},
+ lineThickness=1),
+ Text(
+ extent={{-230,90},{194,-12}},
+ lineColor={28,108,200},
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="If model time is greater
+ than user-specified time threshold,
+check if heating has been off
+ for at least threshold amount of time.
+If model time < user-specified threshold,
+ output true. "),
+ Text(
+ extent={{-294,-56},{-248,-102}},
+ lineColor={238,46,47},
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="If model time is greater than user-specified time threshold,
+check if cooling has been off for at least threshold amount of time.
+If model time < user-specified threshold,
+ output true. "),
+ Rectangle(
+ extent={{-300,-40},{-80,-180}},
+ lineColor={238,46,47},
+ lineThickness=1),
+ Rectangle(
+ extent={{-80,120},{40,-20}},
+ lineColor={28,108,200},
+ lineThickness=1),
+ Rectangle(
+ extent={{-80,-40},{40,-180}},
+ lineColor={238,46,47},
+ lineThickness=1),
+ Text(
+ extent={{-42,122},{382,20}},
+ lineColor={28,108,200},
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="If heating has been off
+for specified amount of time
+AND is currently off,
+cooling is not locked out
+(cooling signal is true)"),
+ Text(
+ extent={{-70,-26},{354,-128}},
+ lineColor={238,46,47},
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="If cooling has been off
+for specified amount of time
+AND is currently off,
+heating is not locked out
+(heating signal is true)"),
+ Text(
+ extent={{-284,150},{92,134}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="Hysteresis Lockout:
+Locks out cooling if heating has been on within a user-specified time threshold;
+Locks out heating if cooling has been on within a user-specified time threshold")}));
+end HysteresisLimit;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/NightFlush.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/NightFlush.mo
new file mode 100644
index 00000000000..dbe028cdab8
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/NightFlush.mo
@@ -0,0 +1,74 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts;
+block NightFlush "Locks out heating if building is in night flush mode"
+ Controls.OBC.CDL.Interfaces.BooleanInput uNigFlu
+ "True if night flush mode is on; false otherwise"
+ annotation (Placement(transformation(extent={{-142,-20},{-102,20}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput yNigFluHea
+ "True if heating is allowed, false if heating is locked out"
+ annotation (Placement(transformation(extent={{100,-20},{140,20}})));
+ Controls.OBC.CDL.Logical.Not not1
+ "If night flush mode is on, heating should not be on"
+ annotation (Placement(transformation(extent={{-8,-10},{12,10}})));
+equation
+ connect(not1.y, yNigFluHea)
+ annotation (Line(points={{14,0},{120,0}}, color={255,0,255}));
+ connect(uNigFlu, not1.u)
+ annotation (Line(points={{-122,0},{-10,0}}, color={255,0,255}));
+ annotation (defaultComponentName = "nitFluLoc",Documentation(info="
+
+If night flush mode is on, heating is locked out.
+The purpose of this lockout is to allow the slab to be pre-cooled below its setpoint without the building's heating system turning on.
+ Output is expressed as a heating or cooling signal. If the heating signal is true, heating is allowed (i.e., it is not locked out).
+ If the cooling signal is true, cooling is allowed (i.e., it is not locked out).
+ A true signal indicates only that heating or cooling is permitted- it does not indicate the actual status
+ of the final heating or cooling signal, which depends on the slab temperature and slab setpoint
+ (see package
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal for more info).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}),graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-148,104},{152,144}},
+ textString="%name"),
+ Rectangle(extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,0},{68,0}}, color={192,192,192}),
+ Polygon(points={{90,0},{68,8}, {68,-8},{90,0}},
+ lineColor={192,192,192}, fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,0},{80,0}}),
+ Text(
+ extent={{-56,90},{48,-88}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="N"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-94,98},{282,82}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ textStyle={TextStyle.Bold},
+ textString="Night Flush Lockout:
+Locks out heating mode if night flush is on")}));
+end NightFlush;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mo
new file mode 100644
index 00000000000..c99604a4357
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mo
@@ -0,0 +1,86 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation;
+model AirTemperatureLockout
+ "Validation model for room air temperature lockouts"
+
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=20,
+ freqHz=1/7200,
+ phase(displayUnit="rad"),
+ offset=TZonHigLim) "Varying air temperature"
+ annotation (Placement(transformation(extent={{-82,-80},{-62,-60}})));
+ final parameter Real TZonHigLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ final parameter Real TZonLowLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+
+ Controls.OBC.CDL.Continuous.Sources.Constant THigRoo(k=TZonHigLim + 2)
+ "Temperature above high limit"
+ annotation (Placement(transformation(extent={{-80,40},{-60,60}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TLowRoo(k=TZonLowLim - 2)
+ "Temperature below high limit"
+ annotation (Placement(transformation(extent={{-80,-40},{-60,-20}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TMedRoo(k=TZonLowLim + 2)
+ "Temperature between limits"
+ annotation (Placement(transformation(extent={{-80,0},{-60,20}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.AirTemperatureLimit airTemLim(
+ final TZonHigSet=TZonHigLim,
+ final TZonLowSet=TZonLowLim) "Air temperature limit"
+ annotation (Placement(transformation(extent={{-20,40},{0,60}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.AirTemperatureLimit airTemLim1(
+ final TZonHigSet=TZonHigLim,
+ final TZonLowSet=TZonLowLim) "Air temperature limit"
+ annotation (Placement(transformation(extent={{-20,0},{0,20}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.AirTemperatureLimit airTemLim2(
+ final TZonHigSet=TZonHigLim,
+ final TZonLowSet=TZonLowLim) "Air temperature limit"
+ annotation (Placement(transformation(extent={{-20,-40},{0,-20}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.AirTemperatureLimit airTemLim3(
+ final TZonHigSet=TZonHigLim,
+ final TZonLowSet=TZonLowLim) "Air temperature limit"
+ annotation (Placement(transformation(extent={{-20,-80},{0,-60}})));
+equation
+ connect(sin.y, airTemLim3.TRoo) annotation (Line(points={{-60,-70},{-40,-70},
+ {-40,-62.8},{-22,-62.8}}, color={0,0,127}));
+ connect(TLowRoo.y, airTemLim2.TRoo) annotation (Line(points={{-58,-30},{-40,-30},
+ {-40,-22.8},{-22,-22.8}}, color={0,0,127}));
+ connect(TMedRoo.y, airTemLim1.TRoo) annotation (Line(points={{-58,10},{-40,10},
+ {-40,17.2},{-22,17.2}}, color={0,0,127}));
+ connect(THigRoo.y, airTemLim.TRoo) annotation (Line(points={{-58,50},{-40,50},
+ {-40,57.2},{-22,57.2}}, color={0,0,127}));
+ annotation (Documentation(info="
+
+ Validates the air temperature lockout model.
+ If room air temperature is above a specified temperature threshold, heating is locked out.
+ If room air temperature is below a specified temperature threshold, cooling is locked out.
+ Output is expressed as a heating or cooling signal. If the heating signal is true, heating is allowed (ie, it is not locked out).
+ If the cooling signal is true, cooling is allowed (ie, it is not locked out).
+ A true signal indicates only that heating or cooling is *permitted*- it does *not* indicate the actual status
+ of the final heating or cooling signal, which depends on the slab temperature and slab setpoint (see SlabTempSignal for more info).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StartTime=0, StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end AirTemperatureLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mo
new file mode 100644
index 00000000000..8edd5d140e6
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mo
@@ -0,0 +1,52 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation;
+model ChilledWaterReturnLockout
+ "Chilled water return lockout validation model"
+ final parameter Real TWatSetLow(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ final parameter Real cooLocDurWatTem(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=3600 "Time for which cooling is locked out if CHW return is too cold";
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=20,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=TWatSetLow) "Varying chilled water return temperature"
+ annotation (Placement(transformation(extent={{-80,40},{-60,60}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.ChilledWaterReturnLimit chwRetLim(
+ final TWatSetLow=TWatSetLow,
+ final cooLocDurWatTem=cooLocDurWatTem)
+ "Chilled water return limit"
+ annotation (Placement(transformation(extent={{-20,40},{0,60}})));
+equation
+ connect(sin.y,chwRetLim. TSlaRet) annotation (Line(points={{-58,50},{-40,50},{-40,
+ 52},{-22,52}}, color={0,0,127}));
+ annotation (Documentation(info="
+
+Validates the chilled water return temperature lockout.
+This model validates that cooling is locked out if CHW return temperature is below a user-specified threshold.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end ChilledWaterReturnLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mo
new file mode 100644
index 00000000000..7302c7444fe
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mo
@@ -0,0 +1,116 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation;
+model HysteresisLockout "Validation model for hysteresis lockout"
+ final parameter Real heaLocDurAftCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ final parameter Real cooLocDurAftHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{-20,20},{0,40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim1
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{-20,-60},{0,-40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim2
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{120,-60},{140,-40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim3
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{120,20},{140,40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim4
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{260,20},{280,40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.HysteresisLimit hysLim5
+ "Hysteresis limit"
+ annotation (Placement(transformation(extent={{262,-60},{282,-40}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul(period=1800)
+ "Varying heating signal"
+ annotation (Placement(transformation(extent={{200,40},{220,60}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul1(period=1800)
+ "Varying cooling signal"
+ annotation (Placement(transformation(extent={{200,0},{220,20}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul2(period=43000)
+ "Varying heating signal"
+ annotation (Placement(transformation(extent={{200,-40},{220,-20}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul3(period=43000)
+ "Varying cooling signal"
+ annotation (Placement(transformation(extent={{200,-80},{220,-60}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con(k=true)
+ "Constant cooling signal"
+ annotation (Placement(transformation(extent={{-80,0},{-60,20}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con1(k=true)
+ "Constant heating signal"
+ annotation (Placement(transformation(extent={{-80,40},{-60,60}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con2(k=false)
+ "Constant cooling signal"
+ annotation (Placement(transformation(extent={{-80,-80},{-60,-60}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con3(k=false)
+ "Constant heating signal"
+ annotation (Placement(transformation(extent={{-80,-40},{-60,-20}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con4(k=true)
+ "Constant heating signal"
+ annotation (Placement(transformation(extent={{60,40},{80,60}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con5(k=false)
+ "Constant cooling signal"
+ annotation (Placement(transformation(extent={{60,0},{80,20}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con6(k=false)
+ "Constant heating signal"
+ annotation (Placement(transformation(extent={{60,-40},{80,-20}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con7(k=true)
+ "Constant cooling signal"
+ annotation (Placement(transformation(extent={{60,-80},{80,-60}})));
+equation
+ connect(booPul2.y, hysLim5.uHea) annotation (Line(points={{222,-30},{242,
+ -30},{242,-45.8},{259.8,-45.8}}, color={255,0,255}));
+ connect(booPul3.y, hysLim5.uCoo) annotation (Line(points={{222,-70},{242,
+ -70},{242,-58},{260,-58}}, color={255,0,255}));
+ connect(booPul1.y, hysLim4.uCoo) annotation (Line(points={{222,10},{240,10},
+ {240,22},{258,22}}, color={255,0,255}));
+ connect(booPul.y, hysLim4.uHea) annotation (Line(points={{222,50},{240,50},
+ {240,34.2},{257.8,34.2}}, color={255,0,255}));
+ connect(con1.y, hysLim.uHea) annotation (Line(points={{-58,50},{-42,50},{
+ -42,34.2},{-22.2,34.2}}, color={255,0,255}));
+ connect(con.y, hysLim.uCoo) annotation (Line(points={{-58,10},{-40,10},{-40,
+ 22},{-22,22}}, color={255,0,255}));
+ connect(con2.y, hysLim1.uCoo) annotation (Line(points={{-58,-70},{-40,-70},
+ {-40,-58},{-22,-58}}, color={255,0,255}));
+ connect(con3.y, hysLim1.uHea) annotation (Line(points={{-58,-30},{-40,-30},
+ {-40,-45.8},{-22.2,-45.8}}, color={255,0,255}));
+ connect(con4.y, hysLim3.uHea) annotation (Line(points={{82,50},{100,50},{
+ 100,34.2},{117.8,34.2}}, color={255,0,255}));
+ connect(con5.y, hysLim3.uCoo) annotation (Line(points={{82,10},{102,10},{
+ 102,22},{118,22}}, color={255,0,255}));
+ connect(con6.y, hysLim2.uHea) annotation (Line(points={{82,-30},{102,-30},{
+ 102,-45.8},{117.8,-45.8}}, color={255,0,255}));
+ connect(con7.y, hysLim2.uCoo) annotation (Line(points={{82,-70},{100,-70},{
+ 100,-58},{118,-58}}, color={255,0,255}));
+ annotation (Documentation(info="
+
+Validates the hysteresis lockout.
+This model validates that cooling is locked out if heating has been on within a user-specified amount of time,
+and that heating is locked out if cooling has been on within a user-specified amount of time.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{340,100}})));
+end HysteresisLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mo
new file mode 100644
index 00000000000..04dd08daac7
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mo
@@ -0,0 +1,37 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation;
+model NightFlushLockout "Validation model for night flush"
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.NightFlush nigFluLoc
+ "Night flush"
+ annotation (Placement(transformation(extent={{0,0},{20,20}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul(period=43000)
+ "Varying night flush signal"
+ annotation (Placement(transformation(extent={{-60,0},{-40,20}})));
+equation
+ connect(booPul.y, nigFluLoc.uNigFlu)
+ annotation (Line(points={{-38,10},{-2.2,10}}, color={255,0,255}));
+ annotation (Documentation(info="
+
+Validates the night flush lockout.
+This model validates that heating is locked out if night flush mode is on.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StartTime=0,StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end NightFlushLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.mo
new file mode 100644
index 00000000000..093e910ed9d
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.mo
@@ -0,0 +1,16 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts;
+package Validation "Collection of validation models for individual lockouts"
+ annotation (preferredView="info", Documentation(info="
+
+This package contains validation models for each individual radiant slab lockout on its own. Lockouts are due to out-of-range room air temperature (for heating or cooling), hysteresis (for heating or cooling),
+chilled water return temperature (for cooling), and night flush (for heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Validation;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.order
new file mode 100644
index 00000000000..2c5d67b14a1
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/package.order
@@ -0,0 +1,4 @@
+AirTemperatureLockout
+ChilledWaterReturnLockout
+HysteresisLockout
+NightFlushLockout
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.mo
new file mode 100644
index 00000000000..4e2140867e8
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.mo
@@ -0,0 +1,16 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts;
+package SubLockouts "Individual lockouts as separate blocks"
+ annotation (preferredView="info", Documentation(info="
+
+This package contains each individual radiant slab lockout on its own. Lockouts are due to out-of-range room air temperature (for heating or cooling), hysteresis (for heating or cooling),
+chilled water return temperature (for cooling), and night flush (for heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end SubLockouts;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.order
new file mode 100644
index 00000000000..7052e4c32ed
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/package.order
@@ -0,0 +1,5 @@
+AirTemperatureLimit
+ChilledWaterReturnLimit
+HysteresisLimit
+NightFlush
+Validation
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mo
new file mode 100644
index 00000000000..2c869e5d845
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mo
@@ -0,0 +1,101 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.Validation;
+model AllLockout "Validation model for all lockouts"
+ final parameter Real TZonHigLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ final parameter Real TZonLowLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+ final parameter Real TempWaLoSet(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ final parameter Real LocDurCHW(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=3600 "Time for which cooling is locked out if CHW return is too cold";
+ final parameter Real LocDurHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ final parameter Real LocDurCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=20,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=TZonHigLim) "Varying room air temperature"
+ annotation (Placement(transformation(extent={{-80,-40},{-60,-20}})));
+ Controls.OBC.CDL.Continuous.Sources.Sine sin1(
+ amplitude=20,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=TempWaLoSet) "Varying chilled water return temperature"
+ annotation (Placement(transformation(extent={{-80,-80},{-60,-60}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.AllLockouts allLoc(
+ TZonHigSet=TZonHigLim,
+ TZonLowSet=TZonLowLim,
+ TWatSetLow=TempWaLoSet,
+ cooLocDurWatTem=LocDurCHW,
+ heaLocDurAftCoo=LocDurHea,
+ cooLocDurAftHea=LocDurCoo) "Combined lockouts"
+ annotation (Placement(transformation(extent={{-20,0},{0,20}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul(period=43000)
+ "Varying night flush signal"
+ annotation (Placement(transformation(extent={{-80,80},{-60,100}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul1(period=43000)
+ "Varying heating signal"
+ annotation (Placement(transformation(extent={{-80,40},{-60,60}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul2(period=43000)
+ "Varying cooling signal"
+ annotation (Placement(transformation(extent={{-80,0},{-60,20}})));
+equation
+ connect(sin.y, allLoc.TRooAir) annotation (Line(points={{-58,-30},{-40,-30},{-40,
+ 7},{-22,7}}, color={0,0,127}));
+ connect(sin1.y, allLoc.TSlaWatRet) annotation (Line(points={{-58,-70},{-40,-70},
+ {-40,3},{-22,3}}, color={0,0,127}));
+ connect(booPul2.y, allLoc.uCoo) annotation (Line(points={{-58,10},{-40,10},{-40,
+ 11},{-22,11}}, color={255,0,255}));
+ connect(booPul1.y, allLoc.uHea) annotation (Line(points={{-58,50},{-40,50},{-40,
+ 15},{-22,15}}, color={255,0,255}));
+ connect(booPul.y, allLoc.uNigFlu) annotation (Line(points={{-58,90},{-34,90},
+ {-34,19},{-22,19}}, color={255,0,255}));
+ annotation (Documentation(info="
+
+This model validates all lockouts.
+Heating is locked out if room air temperature is too hot,
+if night flush mode is on,
+or if cooling was on within a user-specified amount of time.
+Cooling is locked out if room air temperature is too cold,
+if chilled water return temperature is too cold,
+or if heating was on within a user-specified amount of time.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StopTime=172000.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end AllLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.mo
new file mode 100644
index 00000000000..772047387b0
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.mo
@@ -0,0 +1,18 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts;
+package Validation "Collection of validation models for grouped lockouts"
+ annotation (preferredView="info", Documentation(info="
+
+This package contains the validation model for the radiant slab lockout control block that combines all sublockouts to indicate when heating or cooling of the radiant slab is locked out.
+
+
+Lockouts are due to out-of-range room air temperature (for heating or cooling), hysteresis (for heating or cooling), chilled water return temperature (for cooling), and night flush (for heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Validation;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.order
new file mode 100644
index 00000000000..6bb3c83a6e7
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/package.order
@@ -0,0 +1 @@
+AllLockout
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.mo
new file mode 100644
index 00000000000..171b496defd
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.mo
@@ -0,0 +1,19 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating;
+package Lockouts "Blocks to lock out radiant slab"
+ annotation (preferredView="info", Documentation(info="
+
+This package contains the radiant slab lockout control blocks, which indicate when heating or cooling of the radiant slab is locked out.
+This includes a single block, which combines all lockouts, and a sublockouts package, which includes each individual lockout on its own.
+
+
+Lockouts are due to out-of-range room air temperature (for heating or cooling), hysteresis (for heating or cooling), chilled water return temperature (for cooling), and night flush (for heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Lockouts;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.order
new file mode 100644
index 00000000000..1a9ae1e63f3
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/package.order
@@ -0,0 +1,3 @@
+AllLockouts
+SubLockouts
+Validation
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/DeadbandControl.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/DeadbandControl.mo
new file mode 100644
index 00000000000..3954965d0c2
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/DeadbandControl.mo
@@ -0,0 +1,281 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal;
+block DeadbandControl
+ "Outputs call for heating or cooling based on slab temperature error, i.e. difference between slab setpoint and actual slab temp. No heating or cooling allowed if slab temp is within deadband"
+parameter Real TDeaRel(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=2.22 "Difference from slab temp setpoint required to trigger heating or cooling during occupied hours";
+parameter Real TDeaNor(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=0.28
+ "Difference from slab temp setpoint required to trigger heating or cooling during unoccpied hours";
+ parameter Real k(min=0,max=24)=18 "Last occupied hour";
+ parameter Boolean offWitDea=true "If flow should turn off when slab setpoint is within deadband, set to true. Otherwise, set to false";
+
+ Controls.OBC.CDL.Continuous.Hysteresis hysRel(uLow=-TDeaRel, uHigh=TDeaRel)
+ "Call for heating or cooling in times of relaxed deadband, i.e. during unoccupied hours. True indicates warm slab (call for cooling). False indicates cold slab (call for heating)"
+ annotation (Placement(transformation(extent={{-120,-140},{-100,-120}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys(uLow=-TDeaNor, uHigh=TDeaNor)
+ "Call for heating or cooling in times of tight deadband, i.e. during occupied hours. True indicates warm slab (call for cooling). False indicates cold slab (call for heating)"
+ annotation (Placement(transformation(extent={{-120,-62},{-100,-42}})));
+ Controls.OBC.CDL.Logical.Not not1
+ "Negates output for heating control"
+ annotation (Placement(transformation(extent={{40,-20},{60,0}})));
+ Controls.OBC.CDL.Interfaces.RealInput slaTemErr "Slab temperature error"
+ annotation (Placement(transformation(extent={{-196,-158},{-156,-118}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput uHea
+ "True if there is a call for heating; false if not"
+ annotation (Placement(transformation(extent={{150,-10},{190,30}})));
+ Controls.OBC.CDL.Interfaces.BooleanOutput uCoo
+ "True if there is a call for cooling; false if not"
+ annotation (Placement(transformation(extent={{150,-110},{190,-70}})));
+ Controls.OBC.CDL.Continuous.Abs abs
+ "Absolute value of difference between slab setpoint and slab temp"
+ annotation (Placement(transformation(extent={{-120,40},{-100,60}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys3(uLow=TDeaNor - 0.1,
+ uHigh=TDeaNor)
+ "Tests if absolute value of error is greater than occupied error threshhold (signal used during occ hours)"
+ annotation (Placement(transformation(extent={{-40,100},{-20,120}})));
+ Controls.OBC.CDL.Continuous.Hysteresis hys2(uLow=TDeaRel - 0.1,
+ uHigh=TDeaRel)
+ "Tests if absolute value of error is greater than relaxed error threshhold (signal used during unocc hours)"
+ annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul1(width=w, period=86400)
+ "True if occupied (and setpoint should be met within a smaller tolerance), false if unoccupied (and setpoint should be met within a larger tolerance)"
+ annotation (Placement(transformation(extent={{-120,-100},{-100,-80}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con(k=offWitDea)
+ "If user has specified that heating & cooling should both be off if slab is within deadband, offWitDea is true. Otherwise, it is false"
+ annotation (Placement(transformation(extent={{40,80},{60,100}})));
+ Controls.OBC.CDL.Logical.Sources.Constant con1(k=true)
+ "Constant true value- allows heating or cooling call if \"off within deadband\" is false"
+ annotation (Placement(transformation(extent={{40,40},{60,60}})));
+ Controls.OBC.CDL.Logical.And and3
+ "Heating call is true if slab is hot AND error is not within deadband, if user has indicated that no calls should be issued when slab is in deadband"
+ annotation (Placement(transformation(extent={{120,0},{140,20}})));
+ Controls.OBC.CDL.Logical.And and4
+ "Cooling call is true if slab is cold AND error is not within deadband, if user has indicated that no calls should be issued when slab is in deadband"
+ annotation (Placement(transformation(extent={{120,-100},{140,-80}})));
+ Controls.OBC.CDL.Logical.LogicalSwitch logSwi1
+ "Switches between occupied and unoccupied deadband based on time of day"
+ annotation (Placement(transformation(extent={{-40,-120},{-20,-100}})));
+ Controls.OBC.CDL.Logical.LogicalSwitch logSwi2
+ "Switches between occupied and unoccupied absolute error threshhold based on occupancy signal"
+ annotation (Placement(transformation(extent={{20,120},{40,140}})));
+ Controls.OBC.CDL.Logical.LogicalSwitch logSwi3
+ "Passes signal if flow is allowed to stop if slab temp is within deadband; if flow is NOT allowed to stop, always passes true"
+ annotation (Placement(transformation(extent={{82,120},{102,140}})));
+protected
+ parameter Real w=k/24 "Width of day";
+equation
+ connect(slaTemErr, hys.u) annotation (Line(points={{-176,-138},{-141,-138},{-141,
+ -52},{-122,-52}}, color={0,0,127}));
+ connect(slaTemErr, hysRel.u) annotation (Line(points={{-176,-138},{-140,-138},
+ {-140,-130},{-122,-130}}, color={0,0,127}));
+ connect(slaTemErr, abs.u) annotation (Line(points={{-176,-138},{-140,-138},{
+ -140,50},{-122,50}},
+ color={0,0,127}));
+ connect(abs.y, hys3.u) annotation (Line(points={{-98,50},{-80,50},{-80,110},{
+ -42,110}}, color={0,0,127}));
+ connect(abs.y, hys2.u) annotation (Line(points={{-98,50},{-80,50},{-80,30},{
+ -42,30}}, color={0,0,127}));
+ connect(not1.y, and3.u2) annotation (Line(points={{62,-10},{64,-10},{64,2},{
+ 118,2}}, color={255,0,255}));
+ connect(and3.y, uHea)
+ annotation (Line(points={{142,10},{170,10}}, color={255,0,255}));
+ connect(and4.y, uCoo)
+ annotation (Line(points={{142,-90},{170,-90}}, color={255,0,255}));
+ connect(hys.y, logSwi1.u1) annotation (Line(points={{-98,-52},{-72,-52},{-72,
+ -102},{-42,-102}}, color={255,0,255}));
+ connect(hysRel.y, logSwi1.u3) annotation (Line(points={{-98,-130},{-72,-130},
+ {-72,-118},{-42,-118}}, color={255,0,255}));
+ connect(booPul1.y, logSwi1.u2) annotation (Line(points={{-98,-90},{-80,-90},{
+ -80,-110},{-42,-110}}, color={255,0,255}));
+ connect(logSwi1.y, and4.u2) annotation (Line(points={{-18,-110},{112,-110},{
+ 112,-98},{118,-98}}, color={255,0,255}));
+ connect(logSwi1.y, not1.u) annotation (Line(points={{-18,-110},{20,-110},{20,
+ -10},{38,-10}}, color={255,0,255}));
+ connect(booPul1.y, logSwi2.u2) annotation (Line(points={{-98,-90},{0,-90},{0,
+ 130},{18,130}}, color={255,0,255}));
+ connect(hys3.y, logSwi2.u1) annotation (Line(points={{-18,110},{-8,110},{-8,
+ 138},{18,138}}, color={255,0,255}));
+ connect(hys2.y, logSwi2.u3) annotation (Line(points={{-18,30},{10,30},{10,122},
+ {18,122}}, color={255,0,255}));
+ connect(con.y, logSwi3.u2) annotation (Line(points={{62,90},{68,90},{68,130},
+ {80,130}}, color={255,0,255}));
+ connect(con1.y, logSwi3.u3) annotation (Line(points={{62,50},{72,50},{72,122},
+ {80,122}}, color={255,0,255}));
+ connect(logSwi2.y, logSwi3.u1) annotation (Line(points={{42,130},{66,130},{66,
+ 138},{80,138}}, color={255,0,255}));
+ connect(logSwi3.y, and4.u1) annotation (Line(points={{104,130},{104,-90},{118,
+ -90}}, color={255,0,255}));
+ connect(logSwi3.y, and3.u1)
+ annotation (Line(points={{104,130},{104,10},{118,10}}, color={255,0,255}));
+ annotation (defaultComponentName = "deaCon", Documentation(info="
+
+This determines calls for heating or cooling based on the slab error, ie the difference between the slab temperature and the slab temperature setpoint.
+The user specifies two error thresholds- one value for occupied hours (TDeaNor, typically 0.5F),
+and one larger value for unoccupied hours (TDeaRel,typically 4F), when slab temperature can fluctuate within a wider range.
+These variables indicate the absolute value of the allowable slab error.
+
+
+If this value is exceeded and slab temperature is below setpoint, heating is turned on.
+If this value is exceeded and slab temperature is above setpoint, cooling is turned on.
+
+The user also specifies the final occupied hour (k).
+
+Finally, the user specifies whether or not heating and cooling should both be off when the slab error is within deadband (offWitDea).
+If this variable is true, neither heating nor cooling is requested when the slab error is smaller than the user-specified difference from slab setpoint
+(TDeaNor if the room is occupied, or TDeaRel if the room is unoccupied).
+If this variable is false, either heating or cooling will be on at all times.
+It is recommended that this variable be set to true, as setting this to false requires either heating or cooling to be on at all times,
+which is more energy intensive and may be impractical with many building designs.
+
+ The slab setpoint is selected at midnight each day based on that day's forecasted outdoor air high temperature.
+From this point until the building's last occupied hour, the building system attempts to meet the slab setpoint within the specified occupied deadband.
+After the last occupied hour, the building system attempts to meet the slab setpoint within the specified unoccupied deadband.
+
+If the slab temperature is above the setpoint + deadband, a call for cooling is produced.
+If the slab temperature is below the slab setpoint minus deadband, a call for heating is produced.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-150,-150},{150,150}}), graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-150,110},{150,150}},
+ textString="%name"), Rectangle(
+ extent={{-150,-150},{150,150}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(
+ points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,-70},{82,-70}}, color={192,192,192}),
+ Polygon(
+ points={{90,-70},{68,-62},{68,-78},{90,-70}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,-70},{-40,-70},{31,38}}),
+ Line(points={{31,38},{86,38}}),
+ Text(
+ extent={{-72,78},{72,6}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="D"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3))),
+ Text(
+ lineColor={0,0,255},
+ extent={{-156,152},{144,192}},
+ textString="%name")}), Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-150,
+ -150},{150,260}}), graphics={
+ Rectangle(
+ extent={{-150,158},{40,12}},
+ lineColor={0,140,72},
+ lineThickness=1),
+ Rectangle(
+ extent={{-150,10},{40,-150}},
+ lineColor={244,125,35},
+ lineThickness=1),
+ Rectangle(
+ extent={{40,160},{150,30}},
+ lineColor={102,44,145},
+ lineThickness=1),
+ Text(
+ extent={{-144,156},{-100,94}},
+ lineColor={0,140,72},
+ lineThickness=1,
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="Test absolute slab temperature error
+against occupied
+or unoccupied
+error thresholds"),
+ Text(
+ extent={{-132,16},{-88,-46}},
+ lineColor={244,125,35},
+ lineThickness=1,
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="Test slab temperature error
+ against occupied or
+ unoccupied error thresholds"),
+ Rectangle(
+ extent={{42,28},{150,-150}},
+ lineColor={217,67,180},
+ lineThickness=1),
+ Text(
+ extent={{50,-58},{104,-170}},
+ lineColor={28,108,200},
+ lineThickness=1,
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="Final cooling signal-
+true
+if slab calls for cooling
+AND
+slab temperature
+is not within deadband
+"), Text(
+ extent={{48,4},{102,-108}},
+ lineColor={238,46,47},
+ lineThickness=1,
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="Final heating signal-
+true
+if slab calls for heating
+AND
+slab temperature
+is not within deadband
+"), Text(
+ extent={{-118,228},{-22,182}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ fontName="Arial Narrow",
+ textStyle={TextStyle.Bold},
+ textString="Deadband Control:
+Calls for heating or cooling
+based on slab temperature error,
+whether or not slab temperature is within deadband,
+and user specification for
+slab behavior within deadband"),
+ Text(
+ extent={{108,128},{150,64}},
+ lineColor={102,44,145},
+ lineThickness=1,
+ fontName="Arial Narrow",
+ horizontalAlignment=TextAlignment.Left,
+ textString="If user specifies
+that
+heating &
+cooling
+should
+stop within
+deadband,
+signal is false
+if error is
+within deadband,
+locking out
+heating
+& cooling.
+Otherwise,
+signal is true. ")}));
+end DeadbandControl;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Error.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Error.mo
new file mode 100644
index 00000000000..650b94369de
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Error.mo
@@ -0,0 +1,79 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal;
+block Error "Determines difference between slab temperature and slab setpoint"
+ Controls.OBC.CDL.Interfaces.RealInput TSla "Slab temperature"
+ annotation (Placement(transformation(extent={{-140,-10},{-100,30}})));
+ Controls.OBC.CDL.Interfaces.RealInput TSlaSet "Slab temperature setpoint"
+ annotation (Placement(transformation(extent={{-140,-50},{-100,-10}})));
+ Controls.OBC.CDL.Interfaces.RealOutput slaTemErr
+ "Difference between slab temp and setpoint"
+ annotation (Placement(transformation(extent={{100,-10},{140,30}})));
+ Controls.OBC.CDL.Continuous.Add add(k2=-1)
+ "Slab temperature minus slab setpoint"
+ annotation (Placement(transformation(extent={{0,0},{20,20}})));
+equation
+ connect(TSla, add.u1) annotation (Line(points={{-120,10},{-61,10},{-61,16},{
+ -2,16}}, color={0,0,127}));
+ connect(TSlaSet, add.u2) annotation (Line(points={{-120,-30},{-60,-30},{-60,4},
+ {-2,4}}, color={0,0,127}));
+ connect(add.y, slaTemErr)
+ annotation (Line(points={{22,10},{120,10}}, color={0,0,127}));
+ annotation (defaultComponentName = "err",Documentation(info="
+
+This calculates the slab error, ie the difference between the slab temperature and its setpoint.
+This term is what drives calls for heating or for cooling.
+
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-150,110},{150,150}},
+ textString="%name"), Rectangle(
+ extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(
+ points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,-70},{82,-70}}, color={192,192,192}),
+ Polygon(
+ points={{90,-70},{68,-62},{68,-78},{90,-70}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,-70},{-40,-70},{31,38}}),
+ Line(points={{31,38},{86,38}}),
+ Text(
+ extent={{-56,90},{48,-88}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="E"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-48,86},{48,40}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ fontName="Arial Narrow",
+ textStyle={TextStyle.Bold},
+ textString="Slab Error:
+Calculates slab error
+from slab temperature
+and slab setpoint")}));
+end Error;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/SlabSetpointPerimeter.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/SlabSetpointPerimeter.mo
new file mode 100644
index 00000000000..6010e11f977
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/SlabSetpointPerimeter.mo
@@ -0,0 +1,92 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal;
+block SlabSetpointPerimeter
+ "Determines slab temperature setpoint for perimeter zones from forecast outdoor air high temperature"
+ Controls.SetPoints.Table tabSlab(table=[274.8166667,302.5944444;
+ 274.8167222,300.9277778; 280.3722222,300.9277778; 280.3727778,
+ 300.9277778; 285.9277778,300.9277778; 285.9283333,298.7055556;
+ 291.4833333,298.7055556; 291.4838889,296.4833333; 292.5944444,
+ 296.4833333; 292.5945,296.4833333; 293.15,296.4833333; 293.1500556,
+ 295.9277778; 295.3722222,295.9277778; 295.3722778,295.3722222;
+ 295.9277778,295.3722222; 295.9278333,292.5944444; 299.8166667,
+ 292.5944444; 299.8172222,291.4833333; 302.5944444,291.4833333])
+ "Slab setpoint lookup table"
+ annotation (Placement(transformation(extent={{-20,-62},{-62,-20}})));
+ Controls.OBC.CDL.Interfaces.RealInput TFor
+ "High temperature for the day, as forecasted one day prior"
+ annotation (Placement(transformation(extent={{-140,-20},{-100,20}})));
+ Controls.OBC.CDL.Interfaces.RealOutput TSlaSetPer
+ "Slab temperature setpoint, determined based on forecast outdoor air high temperature"
+ annotation (Placement(transformation(extent={{100,-20},{140,20}})));
+ Controls.OBC.CDL.Discrete.Sampler sam(samplePeriod=86400)
+ "Samples forecast high each day"
+ annotation (Placement(transformation(extent={{-40,0},{-20,20}})));
+equation
+ connect(sam.y, tabSlab.u) annotation (Line(points={{-18,10},{0,10},{0,-41},{
+ -15.8,-41}},
+ color={0,0,127}));
+ connect(TFor, sam.u) annotation (Line(points={{-120,0},{-92,0},{-92,10},{-42,
+ 10}},
+ color={0,0,127}));
+ connect(tabSlab.y, TSlaSetPer) annotation (Line(points={{-64.1,-41},{-84,-41},
+ {-84,-80},{78,-80},{78,0},{120,0}}, color={0,0,127}));
+ annotation (defaultComponentName = "slaSetPer",Documentation(info="
+
+This determines the slab temperature setpoint for a perimeter zone from the forecast high OAT.
+Temperature setpoint is selected from a lookup table.
+Note that this setpoint is determined differently than the setpoint for core zones, which is set to a constant value throughout the year (typically 70F).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-150,110},{150,150}},
+ textString="%name"), Rectangle(
+ extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(
+ points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,-70},{82,-70}}, color={192,192,192}),
+ Polygon(
+ points={{90,-70},{68,-62},{68,-78},{90,-70}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,-70},{-40,-70},{31,38}}),
+ Line(points={{31,38},{86,38}}),
+ Text(
+ extent={{-90,60},{90,-60}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="Sp"),
+ Text(
+ extent={{-56,90},{48,-60}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(coordinateSystem(
+ preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ extent={{-62,90},{34,44}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ fontName="Arial Narrow",
+ textString="Slab Perimeter Setpoint:
+Selects slab temperature setpoint
+for a perimeter zone
+from lookup table based on forecast high",
+ textStyle={TextStyle.Bold})}));
+end SlabSetpointPerimeter;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/ForecastHighChicago.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/ForecastHighChicago.mo
new file mode 100644
index 00000000000..981571cd5b9
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/ForecastHighChicago.mo
@@ -0,0 +1,162 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses;
+block ForecastHighChicago
+ "Outputs next-day forecast high temperature for Chicago"
+ Buildings.Utilities.Time.ModelTime modTim1 "Model timer for forecast high"
+ annotation (Placement(transformation(extent={{32,26},{52,46}})));
+ Controls.SetPoints.Table forHi(table=[0,272.05; 86400,275.35; 172800,273.75;
+ 259200,272.55; 345600,269.85; 432000,262.05; 518400,260.35; 604800,
+ 264.85; 691200,274.85; 777600,275.35; 864000,277.55; 950400,277.05;
+ 1036800,268.15; 1123200,270.35; 1209600,275.95; 1296000,283.15; 1382400,
+ 284.85; 1468800,280.35; 1555200,275.35; 1641600,274.85; 1728000,285.35;
+ 1814400,276.45; 1900800,277.05; 1987200,275.95; 2073600,275.95; 2160000,
+ 266.45; 2246400,258.15; 2332800,265.35; 2419200,266.45; 2505600,267.55;
+ 2592000,272.05; 2678400,268.15; 2764800,272.55; 2851200,272.55; 2937600,
+ 272.55; 3024000,261.45; 3110400,263.75; 3196800,264.25; 3283200,269.25;
+ 3369600,278.15; 3456000,281.45; 3542400,287.05; 3628800,279.85; 3715200,
+ 275.35; 3801600,272.05; 3888000,268.75; 3974400,269.85; 4060800,276.45;
+ 4147200,279.85; 4233600,273.15; 4320000,272.55; 4406400,275.35; 4492800,
+ 284.85; 4579200,287.55; 4665600,283.75; 4752000,277.55; 4838400,274.85;
+ 4924800,273.15; 5011200,275.95; 5097600,279.25; 5184000,278.15; 5270400,
+ 274.85; 5356800,283.15; 5443200,270.95; 5529600,274.85; 5616000,279.85;
+ 5702400,284.25; 5788800,284.85; 5875200,289.85; 5961600,283.75; 6048000,
+ 282.55; 6134400,276.45; 6220800,282.05; 6307200,282.05; 6393600,283.15;
+ 6480000,275.35; 6566400,280.35; 6652800,290.35; 6739200,278.75; 6825600,
+ 281.45; 6912000,280.95; 6998400,279.85; 7084800,278.15; 7171200,279.85;
+ 7257600,290.95; 7344000,294.25; 7430400,288.15; 7516800,286.45; 7603200,
+ 276.45; 7689600,280.95; 7776000,277.55; 7862400,279.85; 7948800,277.55;
+ 8035200,275.35; 8121600,278.15; 8208000,279.25; 8294400,282.55; 8380800,
+ 284.25; 8467200,283.15; 8553600,290.95; 8640000,297.05; 8726400,292.05;
+ 8812800,289.85; 8899200,297.55; 8985600,304.25; 9072000,303.75; 9158400,
+ 302.05; 9244800,304.25; 9331200,292.55; 9417600,281.45; 9504000,278.75;
+ 9590400,279.25; 9676800,288.75; 9763200,295.95; 9849600,285.35; 9936000,
+ 283.75; 10022400,284.85; 10108800,288.15; 10195200,289.25; 10281600,
+ 288.15; 10368000,289.85; 10454400,297.05; 10540800,297.55; 10627200,
+ 303.15; 10713600,303.75; 10800000,295.95; 10886400,286.45; 10972800,
+ 285.35; 11059200,290.95; 11145600,295.35; 11232000,291.45; 11318400,
+ 290.35; 11404800,293.15; 11491200,288.15; 11577600,289.25; 11664000,
+ 289.85; 11750400,286.45; 11836800,289.25; 11923200,292.05; 12009600,
+ 296.45; 12096000,300.35; 12182400,300.95; 12268800,297.05; 12355200,
+ 298.15; 12441600,300.35; 12528000,295.95; 12614400,302.55; 12700800,
+ 302.55; 12787200,300.35; 12873600,302.55; 12960000,298.15; 13046400,
+ 298.15; 13132800,298.15; 13219200,302.05; 13305600,303.75; 13392000,
+ 294.25; 13478400,305.35; 13564800,299.85; 13651200,306.45; 13737600,
+ 299.85; 13824000,296.45; 13910400,298.75; 13996800,295.35; 14083200,
+ 295.95; 14169600,303.15; 14256000,304.85; 14342400,304.25; 14428800,
+ 298.15; 14515200,292.05; 14601600,302.05; 14688000,305.35; 14774400,
+ 303.75; 14860800,297.55; 14947200,288.15; 15033600,293.75; 15120000,
+ 299.85; 15206400,303.75; 15292800,303.75; 15379200,303.15; 15465600,
+ 299.85; 15552000,300.35; 15638400,292.05; 15724800,297.05; 15811200,
+ 297.55; 15897600,303.75; 15984000,305.95; 16070400,305.95; 16156800,
+ 302.05; 16243200,301.45; 16329600,296.45; 16416000,297.55; 16502400,
+ 298.75; 16588800,300.95; 16675200,302.05; 16761600,298.15; 16848000,
+ 305.35; 16934400,306.45; 17020800,307.05; 17107200,307.05; 17193600,
+ 308.15; 17280000,302.55; 17366400,300.95; 17452800,302.55; 17539200,
+ 304.25; 17625600,305.35; 17712000,303.15; 17798400,300.95; 17884800,
+ 304.85; 17971200,303.15; 18057600,300.95; 18144000,302.55; 18230400,
+ 304.85; 18316800,300.95; 18403200,302.55; 18489600,304.85; 18576000,
+ 304.25; 18662400,303.15; 18748800,294.85; 18835200,294.85; 18921600,
+ 298.15; 19008000,300.35; 19094400,301.45; 19180800,299.85; 19267200,
+ 301.45; 19353600,301.45; 19440000,298.75; 19526400,297.55; 19612800,
+ 296.45; 19699200,298.75; 19785600,298.15; 19872000,299.25; 19958400,
+ 302.05; 20044800,303.75; 20131200,302.05; 20217600,295.95; 20304000,
+ 295.95; 20390400,298.15; 20476800,299.85; 20563200,301.45; 20649600,
+ 301.45; 20736000,302.55; 20822400,300.95; 20908800,301.45; 20995200,
+ 298.75; 21081600,293.75; 21168000,295.35; 21254400,302.05; 21340800,
+ 304.25; 21427200,303.15; 21513600,297.05; 21600000,299.85; 21686400,
+ 299.25; 21772800,299.85; 21859200,300.35; 21945600,299.25; 22032000,
+ 293.75; 22118400,297.05; 22204800,299.25; 22291200,295.35; 22377600,
+ 294.85; 22464000,293.15; 22550400,294.85; 22636800,289.85; 22723200,
+ 289.25; 22809600,294.25; 22896000,297.55; 22982400,293.75; 23068800,
+ 293.75; 23155200,302.05; 23241600,304.85; 23328000,300.35; 23414400,
+ 292.05; 23500800,292.05; 23587200,292.55; 23673600,295.95; 23760000,
+ 292.55; 23846400,289.85; 23932800,288.75; 24019200,286.45; 24105600,
+ 285.35; 24192000,287.55; 24278400,295.95; 24364800,289.85; 24451200,
+ 289.85; 24537600,289.85; 24624000,289.85; 24710400,283.15; 24796800,
+ 283.75; 24883200,285.35; 24969600,287.05; 25056000,288.15; 25142400,
+ 288.75; 25228800,295.95; 25315200,299.25; 25401600,295.95; 25488000,
+ 284.25; 25574400,286.45; 25660800,289.25; 25747200,285.35; 25833600,
+ 290.35; 25920000,286.45; 26006400,287.55; 26092800,293.75; 26179200,
+ 286.45; 26265600,288.75; 26352000,294.85; 26438400,294.25; 26524800,
+ 288.15; 26611200,286.45; 26697600,288.15; 26784000,287.55; 26870400,
+ 290.35; 26956800,291.45; 27043200,276.45; 27129600,277.05; 27216000,
+ 275.95; 27302400,277.55; 27388800,284.85; 27475200,288.75; 27561600,
+ 284.85; 27648000,280.35; 27734400,279.25; 27820800,280.95; 27907200,
+ 288.15; 27993600,275.35; 28080000,277.05; 28166400,276.45; 28252800,
+ 277.05; 28339200,273.15; 28425600,265.95; 28512000,270.95; 28598400,
+ 268.15; 28684800,273.75; 28771200,276.25; 28857600,281.45; 28944000,
+ 274.85; 29030400,277.55; 29116800,277.05; 29203200,276.45; 29289600,
+ 280.35; 29376000,284.25; 29462400,276.45; 29548800,271.45; 29635200,
+ 272.55; 29721600,273.15; 29808000,275.35; 29894400,275.35; 29980800,
+ 273.75; 30067200,267.55; 30153600,267.55; 30240000,268.15; 30326400,
+ 267.55; 30412800,265.35; 30499200,267.55; 30585600,273.75; 30672000,
+ 273.75; 30758400,272.55; 30844800,271.45; 30931200,274.25; 31017600,
+ 274.25; 31104000,272.55; 31190400,270.95; 31276800,265.35; 31363200,
+ 271.45; 31449600,275.95])
+ "Forecast high lookup table: x axis time in seconds, y axis forecast high temperature"
+ annotation (Placement(transformation(extent={{-6,-30},{-48,12}})));
+ Controls.OBC.CDL.Interfaces.RealOutput TForHigChi
+ "Forecasted high temperature"
+ annotation (Placement(transformation(extent={{100,-18},{140,22}})));
+ Controls.OBC.CDL.Discrete.Sampler sam(samplePeriod=86400)
+ "Samples forecast temperature each day"
+ annotation (Placement(transformation(extent={{20,-80},{40,-60}})));
+equation
+ connect(modTim1.y, forHi.u) annotation (Line(points={{53,36},{70,36},{70,-9},
+ {-1.8,-9}}, color={0,0,127}));
+ connect(sam.y, TForHigChi) annotation (Line(points={{42,-70},{80,-70},{80,2},{
+ 120,2}}, color={0,0,127}));
+ connect(forHi.y, sam.u) annotation (Line(points={{-50.1,-9},{-60,-9},{-60,-70},
+ {18,-70}}, color={0,0,127}));
+ annotation (defaultComponentName = "forHiChi",Documentation(info="
+
+This outputs the next-day high temperature for Chicago, so that an appropriate radiant slab setpoint can be chosen from the lookup table.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(coordinateSystem(
+ preserveAspectRatio=true,
+ extent={{-100,-100},{100,100}}), graphics={
+ Text(
+ lineColor={0,0,255},
+ extent={{-150,110},{150,150}},
+ textString="%name"), Rectangle(
+ extent={{-100,-100},{100,100}},
+ lineColor={0,0,127},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-80,68},{-80,-80}}, color={192,192,192}),
+ Polygon(
+ points={{-80,90},{-88,68},{-72,68},{-80,90}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Line(points={{-90,-70},{82,-70}}, color={192,192,192}),
+ Polygon(
+ points={{90,-70},{68,-62},{68,-78},{90,-70}},
+ lineColor={192,192,192},
+ fillColor={192,192,192},
+ fillPattern=FillPattern.Solid),
+ Text(
+ extent={{-72,78},{102,6}},
+ lineColor={0,0,0},
+ fillColor={0,0,0},
+ fillPattern=FillPattern.Solid,
+ textString="F"),
+ Text(
+ extent={{226,60},{106,10}},
+ lineColor={0,0,0},
+ textString=DynamicSelect("", String(y, leftjustified=false, significantDigits=3)))}), Diagram(
+ coordinateSystem(preserveAspectRatio=false), graphics={Text(
+ extent={{-94,110},{24,66}},
+ lineColor={0,0,0},
+ lineThickness=1,
+ horizontalAlignment=TextAlignment.Left,
+ fontName="Arial Narrow",
+ textStyle={TextStyle.Bold},
+ textString="Chicago Forecast High Outdoor Temperature")}));
+end ForecastHighChicago;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mo
new file mode 100644
index 00000000000..16541e168cf
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mo
@@ -0,0 +1,50 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.Validation;
+model ChicagoForecastHigh
+ "Validation model for forecast high temperature for Chicago"
+ Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.ForecastHighChicago forHiChi
+ "Forecast high for Chicago location"
+ annotation (Placement(transformation(extent={{-40,40},{-20,60}})));
+ BoundaryConditions.WeatherData.ReaderTMY3 weaDat2(filNam=
+ ModelicaServices.ExternalReferences.loadResource(
+ "modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"))
+ "Weather data reader"
+ annotation (Placement(transformation(extent={{26,24},{46,44}})));
+ BoundaryConditions.WeatherData.Bus weaBus1 "Weather bus"
+ annotation (Placement(
+ transformation(extent={{8,54},{48,94}}), iconTransformation(extent={
+ {-168,106},{-148,126}})));
+equation
+ connect(weaDat2.weaBus,weaBus1. TDryBul) annotation (Line(
+ points={{46,34},{40,34},{40,74},{28,74}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%second",
+ index=1,
+ extent={{-6,3},{-6,3}},
+ horizontalAlignment=TextAlignment.Right));
+ annotation (experiment(Tolerance=1E-06, StopTime=31536000),
+__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mos"
+ "Simulate and plot"), Documentation(info="
+
+This validates the Chicago forecast high.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end ChicagoForecastHigh;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.mo
new file mode 100644
index 00000000000..4f0e0f6824f
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.mo
@@ -0,0 +1,16 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses;
+package Validation "Validation models for output-only blocks"
+
+annotation (Documentation(info="
+
+This package contains a validation model for the base class for the validation models for the slab temperature signal module.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Validation;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.order
new file mode 100644
index 00000000000..328041910fd
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/package.order
@@ -0,0 +1 @@
+ChicagoForecastHigh
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.mo
new file mode 100644
index 00000000000..074d75cc04e
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.mo
@@ -0,0 +1,17 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation;
+package BaseClasses "Base classes for validation models"
+
+
+annotation (Documentation(info="
+
+This package contains base classes for the validation models for the slab temperature signal module.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end BaseClasses;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.order
new file mode 100644
index 00000000000..b258bdc72f2
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/package.order
@@ -0,0 +1,2 @@
+ForecastHighChicago
+Validation
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mo
new file mode 100644
index 00000000000..eb703b1acfc
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mo
@@ -0,0 +1,123 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation;
+model DeadbandControl "Validation model for deadband control"
+ final parameter Real TemDeaRel(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=2.22 "Difference from slab temp setpoint required to trigger heating or cooling during occupied hours";
+ final parameter Real TemDeaNor(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=0.28
+ "Difference from slab temp setpoint required to trigger heating or cooling during unoccpied hours";
+ final parameter Real LastOcc(min=0,max=24)=16 "Last occupied hour";
+ final parameter Boolean OffTru=true "True: both heating and cooling signals turn off when slab setpoint is within deadband";
+ final parameter Boolean OffFal=false "False: signals may be on when slab setpoint is within deadband";
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=TemDeaNor,
+ freqHz=1/14400,
+ phase(displayUnit="rad"),
+ offset=0) "Varying slab temperature error"
+ annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
+ Controls.OBC.CDL.Continuous.Sources.Sine sin1(
+ amplitude=TemDeaRel,
+ freqHz=1/14400,
+ phase(displayUnit="rad"),
+ offset=0) "Varying slab temperature error"
+ annotation (Placement(transformation(extent={{-60,-60},{-40,-40}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaCon(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffTru) "Deadband control"
+ annotation (Placement(transformation(extent={{-20,40},{0,60}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaCon1(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffFal) "Deadband control"
+ annotation (Placement(transformation(extent={{-20,0},{0,20}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaCon2(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffTru) "Deadband control"
+ annotation (Placement(transformation(extent={{-20,-40},{0,-20}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaCon3(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffFal) "Deadband control"
+ annotation (Placement(transformation(extent={{-20,-80},{0,-60}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaConTes(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffTru) "Deadband control"
+ annotation (Placement(transformation(extent={{50,60},{80,92}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaConTesFal(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffFal) "Deadband control"
+ annotation (Placement(transformation(extent={{50,8},{80,40}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaConTes1(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffTru) "Deadband control"
+ annotation (Placement(transformation(extent={{50,-40},{80,-8}})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.DeadbandControl deaConTesFal1(
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LastOcc,
+ offWitDea=OffFal) "Deadband control"
+ annotation (Placement(transformation(extent={{50,-92},{80,-60}})));
+equation
+ connect(sin.y, deaCon.slaTemErr) annotation (Line(points={{-38,30},{-24,30},{
+ -24,40.8},{-21.7333,40.8}},
+ color={0,0,127}));
+ connect(sin1.y, deaCon2.slaTemErr) annotation (Line(points={{-38,-50},{-24,
+ -50},{-24,-39.2},{-21.7333,-39.2}},
+ color={0,0,127}));
+ connect(sin1.y, deaCon3.slaTemErr) annotation (Line(points={{-38,-50},{-24,
+ -50},{-24,-79.2},{-21.7333,-79.2}},
+ color={0,0,127}));
+ connect(sin.y, deaCon1.slaTemErr) annotation (Line(points={{-38,30},{-24,30},
+ {-24,0.8},{-21.7333,0.8}},color={0,0,127}));
+ connect(sin.y, deaConTes.slaTemErr) annotation (Line(points={{-38,30},{20,30},
+ {20,61.28},{47.4,61.28}}, color={0,0,127}));
+ connect(sin.y, deaConTesFal.slaTemErr) annotation (Line(points={{-38,30},{20,30},
+ {20,9.28},{47.4,9.28}}, color={0,0,127}));
+ connect(sin1.y, deaConTes1.slaTemErr) annotation (Line(points={{-38,-50},{22,-50},
+ {22,-38.72},{47.4,-38.72}}, color={0,0,127}));
+ connect(sin1.y, deaConTesFal1.slaTemErr) annotation (Line(points={{-38,-50},{22,
+ -50},{22,-90.72},{47.4,-90.72}}, color={0,0,127}));
+ annotation (Documentation(info="
+
+This validates the deadband control, which determines whether the slab is in heating or in cooling.
+Two error sizes were tested, as well as two options-
+one in which the slab is allowed to receive no flow if it is within deadband,
+and the other in which the slab must receive either heating or cooling at all times.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StartTime=0,StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mos"
+ "Simulate and plot"),Icon(
+ coordinateSystem(extent={{-100,-120},{100,100}}), graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}})));
+end DeadbandControl;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mo
new file mode 100644
index 00000000000..0789e787204
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mo
@@ -0,0 +1,51 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation;
+model SlabError "Validation model for slab temperature error block"
+
+ final parameter Real TSlaSet(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=294.3
+ "Slab temperature setpoint";
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=TSlaSet/5,
+ freqHz=1/86400,
+ phase(displayUnit="rad"),
+ offset=TSlaSet) "Varying slab temperature"
+ annotation (Placement(transformation(extent={{-40,20},{-20,40}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TSlaStp(
+ final k=TSlaSet)
+ "Slab temperature setpoint (constant)"
+ annotation (Placement(transformation(extent={{-40,-20},{-20,0}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Error err
+ "Error calculation"
+ annotation (Placement(transformation(extent={{6,4},{26,24}})));
+equation
+ connect(sin.y, err.TSla) annotation (Line(points={{-18,30},{-10,30},{-10,15},{
+ 4,15}}, color={0,0,127}));
+ connect(TSlaStp.y, err.TSlaSet) annotation (Line(points={{-18,-10},{-12,-10},{
+ -12,11},{4,11}}, color={0,0,127}));
+ annotation (Documentation(info="
+
+This validates the slab error model, ie the difference between the slab temperature and its setpoint.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StartTime=0.0, StopTime=172000.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end SlabError;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mo
new file mode 100644
index 00000000000..f078d65769d
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mo
@@ -0,0 +1,48 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation;
+model SlabSetpointPerimeterZone
+ "Validation model for slab setpoint for a perimeter zone"
+ final parameter Real TOut(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=294.3
+ "Outdoor air temperature";
+ Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.SlabSetpointPerimeter slaSetPer
+ "Slab temperature setpoint for the perimeter zone"
+ annotation (Placement(transformation(extent={{-4,20},{16,40}})));
+ Controls.OBC.CDL.Continuous.Sources.TimeTable timTab(table=[0,274.8166667;
+ 86400,274.8167222; 172800,280.3722222; 259200,280.3727778; 345600,
+ 285.9277778; 432000,285.9283333; 518400,291.4833333; 604800,291.4838889;
+ 691200,292.5944444; 777600,292.5945; 864000,293.15; 950400,293.1500556;
+ 1036800,295.3722222; 1123200,295.3722778; 1209600,295.9277778; 1296000,
+ 295.9278333; 1382400,299.8166667; 1468800,299.8172222; 1555200,
+ 302.5944444], extrapolation=Buildings.Controls.OBC.CDL.Types.Extrapolation.HoldLastPoint)
+ "Table"
+ annotation (Placement(transformation(extent={{-60,18},{-40,38}})));
+equation
+ connect(timTab.y[1], slaSetPer.TFor) annotation (Line(points={{-38,28},{-22,28},{
+ -22,30},{-6,30}}, color={0,0,127}));
+ annotation (Documentation(info="
+
+This validates the slab setpoint for a perimeter zone based on forecast outdoor air temperature TOut
.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),experiment(StartTime=0, StopTime=1641600.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end SlabSetpointPerimeterZone;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.mo
new file mode 100644
index 00000000000..0cb48ae2919
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.mo
@@ -0,0 +1,19 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal;
+package Validation "Validation models for slab temperature blocks"
+
+
+
+
+ annotation (preferredView="info", Documentation(info="
+
+This package contains validation models for models that determine the slab setpoint as well as calls for radiant slab heating or cooling.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Validation;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.order
new file mode 100644
index 00000000000..61148d0f6d7
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/package.order
@@ -0,0 +1,4 @@
+DeadbandControl
+SlabError
+SlabSetpointPerimeterZone
+BaseClasses
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.mo
new file mode 100644
index 00000000000..f1693e23868
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.mo
@@ -0,0 +1,30 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating;
+package SlabTemperatureSignal "Blocks that determine slab temperature setpoint and heating/cooling signal"
+
+
+
+
+ annotation (preferredView="info", Documentation(info="
+
+This package contains the blocks that determine the slab setpoint as well as calls for radiant slab heating or cooling. This package includes three blocks:
+
+
+These blocks are used together in the
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts block to determine the slab setpoint and calls for heating and cooling.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end SlabTemperatureSignal;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.order
new file mode 100644
index 00000000000..5f67bb76b68
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/package.order
@@ -0,0 +1,4 @@
+DeadbandControl
+Error
+SlabSetpointPerimeter
+Validation
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mo
new file mode 100644
index 00000000000..8f58be60313
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mo
@@ -0,0 +1,86 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation;
+model ControlPlusLockout "Validation model for radiant control"
+ final parameter Real TSlaSetCor(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=294.3
+ "Slab setpoint temperature offset";
+
+ final parameter Real TZonHigLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=297.6
+ "Air room temperature offset";
+
+ final parameter Real WatTemLowSet(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=285.9
+ "Water return temperature offset";
+
+ Controls.OBC.CDL.Continuous.Sources.Sine sin(
+ amplitude=20,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=TZonHigLim) "Varying room air temperature"
+ annotation (Placement(transformation(extent={{-60,-20},{-40,0}})));
+ Controls.OBC.CDL.Continuous.Sources.Sine sin1(
+ amplitude=20,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=WatTemLowSet) "Varying water return temperature"
+ annotation (Placement(transformation(extent={{-60,-60},{-40,-40}})));
+ Controls.OBC.CDL.Continuous.Sources.Sine sin2(
+ amplitude=TSlaSetCor/15,
+ freqHz=0.0001,
+ phase(displayUnit="rad"),
+ offset=TSlaSetCor) "Varying slab temperature"
+ annotation (Placement(transformation(extent={{-60,60},{-40,80}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TIntSet(k=294)
+ "Flat temperature setpoint"
+ annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
+ Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts conPluLoc "Control plus lockouts"
+ annotation (Placement(transformation(extent={{0,0},{22,20}})));
+ Controls.OBC.CDL.Logical.Sources.Pulse booPul(period=43000)
+ "Varying night flush signal"
+ annotation (Placement(transformation(extent={{-60,-100},{-40,-80}})));
+equation
+ connect(sin2.y, conPluLoc.TSla) annotation (Line(points={{-38,70},{-20,70},{
+ -20,18},{-2.2,18}},
+ color={0,0,127}));
+ connect(TIntSet.y, conPluLoc.TSlaSet) annotation (Line(points={{-38,30},{-30,
+ 30},{-30,14},{-2.2,14}},
+ color={0,0,127}));
+ connect(sin.y, conPluLoc.TRooAir) annotation (Line(points={{-38,-10},{-20,-10},
+ {-20,6},{-2.2,6}},
+ color={0,0,127}));
+ connect(sin1.y, conPluLoc.TSlaWatRet) annotation (Line(points={{-38,-50},{-8,
+ -50},{-8,2},{-2.2,2}},
+ color={0,0,127}));
+ connect(booPul.y, conPluLoc.uNigFlu) annotation (Line(points={{-38,-90},{-26,
+ -90},{-26,10},{-2.2,10}}, color={255,0,255}));
+ annotation (Documentation(info="
+
+This models the radiant slab control scheme with inputs not tied to a physical room.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation
+
+
+"),experiment(StartTime=0.0, StopTime=172800.0, Tolerance=1e-06),__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mos"
+ "Simulate and plot"),Icon(graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}), Diagram(
+ coordinateSystem(preserveAspectRatio=false)));
+end ControlPlusLockout;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mo
new file mode 100644
index 00000000000..52ac2d6f816
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mo
@@ -0,0 +1,517 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation;
+model ControlPlusLockoutCore
+ "Radiant slab serving core zone with heating and cooling sources, pumps, and valves"
+ extends Modelica.Icons.Example;
+ //-------------------------Media-------------------------//
+ replaceable package MediumA =
+ Buildings.Media.Air
+ "Air medium";
+
+ replaceable package MediumW =
+ Buildings.Media.Water "Medium model";
+ //-------------------------Radiant Control Parameters-------------------------//
+ final parameter Real TZonHigLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ final parameter Real TZonLowLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+ final parameter Real TemWaLoSet(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ final parameter Real cooLocDurWatTem(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=1800 "Time for which cooling is locked out if CHW return is too cold";
+ final parameter Real heaLocDurAftCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ final parameter Real cooLocDurAftHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ final parameter Real TemDeaRel(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=2.22 "Difference from slab temp setpoint required to trigger heating or cooling during occupied hours";
+ final parameter Real TemDeaNor(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=0.28
+ "Difference from slab temp setpoint required to trigger heating or cooling during unoccpied hours";
+ final parameter Real LasOcc(
+ final min=0,
+ final max=24)=16 "Last occupied hour";
+ final parameter Boolean OffTru=true "True: both heating and cooling signals turn off when slab setpoint is within deadband";
+//-------------------------Slab and Fluid Parameters-------------------------//
+ parameter Buildings.Fluid.Data.Pipes.PEX_RADTEST pipe "Pipe";
+ parameter HeatTransfer.Data.OpaqueConstructions.Generic layers(nLay=3, material={
+ Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.1,
+ k=2.31,
+ c=832,
+ d=2322,
+ nSta=5),Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.05,
+ k=0.04,
+ c=1400,
+ d=10),Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.1,
+ k=2.31,
+ c=832,
+ d=2322)})
+ "Material layers from surface a to b (10cm concrete, 5 cm insulation, 10 cm reinforced concrete)";
+ parameter Real Q_flow_nominal(
+ final min=0,
+ final unit="J/s",
+ final quantity="HeatFlowRate") = 4000
+ "Nominal heat flow rate of water in slab";
+ parameter Real TRadSup_nominal(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+40
+ "Slab nominal heating supply water temperature, 105 F";
+ parameter Real TRadRet_nominal(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+35
+ "Slab nominal heating return water temperature,heating 95 F";
+ parameter Real mRad_flow_nominal(
+ final min=0,
+ final unit="kg/s",
+ final quantity="MassFlowRate")=
+ Q_flow_nominal/4200/(TRadSup_nominal-TRadRet_nominal)
+ "Radiator nominal mass flow rate";
+ parameter Real TRadCol_nominal(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+10
+ "Radiator nominal temperature";
+ parameter Real A(
+ final min=0,
+ final unit="m2",
+ final quantity="Area")=45 "Area";
+ //---------------------------------Room Parameters---------------------------------------//
+ parameter Real V(
+ final min=0,
+ final unit="m3",
+ final quantity="Volume")= 5*9*3 "Room volume";
+
+ parameter Real mA_flow_nominal(
+ final min=0,
+ final unit="kg/s",
+ final quantity="MassFlowRate") = V*1.2*6/3600
+ "Nominal mass flow rate";
+ parameter Real QRooInt_flow(
+ final min=0,
+ final unit="J/s",
+ final quantity="HeatFlowRate") = 100
+ "Internal heat gains of the room";
+
+ Fluid.HeatExchangers.RadiantSlabs.SingleCircuitSlab sla1(
+ steadyStateInitial=true,
+ T_a_start=288.15,
+ T_b_start=288.15,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ massDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ T_start(fixed=true, start=293.15),
+ m_flow_nominal=mRad_flow_nominal,
+ redeclare package Medium = MediumW,
+ layers=layers,
+ iLayPip=1,
+ pipe=pipe,
+ sysTyp=Buildings.Fluid.HeatExchangers.RadiantSlabs.Types.SystemType.Floor,
+ disPip=0.2,
+ linearizeFlowResistance=false,
+ A=A,
+ from_dp=true) "Slabe with embedded pipes"
+ annotation (Placement(transformation(extent={{-4,2},{16,22}})));
+ Modelica.Thermal.HeatTransfer.Sources.FixedTemperature TBel(T=293.15)
+ "Radiant temperature below the slab"
+ annotation (Placement(transformation(extent={{62,-118},{82,-98}})));
+ Modelica.Thermal.HeatTransfer.Components.ThermalConductor conBel1(G=20*A)
+ "Combined convection and radiation resistance below the slab"
+ annotation (Placement(transformation(extent={{20,-60},{40,-40}})));
+ Fluid.Sources.Boundary_pT souCol(
+ redeclare package Medium = MediumW,
+ T=TRadCol_nominal,
+ nPorts=1) "Chilled water source" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-16,-290})));
+Fluid.Movers.FlowControlled_m_flow pumCol(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ T_start=TRadCol_nominal,
+ allowFlowReversal=false,
+ m_flow_nominal=mRad_flow_nominal,
+ addPowerToMedium=false,
+ nominalValuesDefineDefaultPressureCurve=true)
+ "Chilled water pump" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-12,-58})));
+ Fluid.Actuators.Valves.TwoWayPressureIndependent valCol(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ dpValve_nominal=100,
+ show_T=true) "Chilled water valve"
+ annotation (Placement(transformation(extent={{-22,-174},{-2,-154}})));
+Fluid.Movers.FlowControlled_m_flow pumHot(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ m_flow_nominal=mRad_flow_nominal,
+ addPowerToMedium=false,
+ nominalValuesDefineDefaultPressureCurve=true,
+ m_flow_start=0.1) "Heating hot water pump"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-174,-80})));
+ Fluid.Actuators.Valves.TwoWayPressureIndependent valHot(
+ redeclare package Medium = MediumW,
+ allowFlowReversal=false,
+ m_flow_nominal=mRad_flow_nominal,
+ dpValve_nominal=100) "Hot water valve"
+ annotation (Placement(transformation(extent={{-188,-178},{-168,-158}})));
+ Fluid.Sources.Boundary_pT souHea(
+ redeclare package Medium = MediumW,
+ T=TRadSup_nominal,
+ nPorts=1) "Heating hot water source" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-172,-292})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaHtgVal
+ "Heating hot water valve controller"
+ annotation (Placement(transformation(extent={{-260,-122},{-240,-102}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaHtgPum(realTrue=
+ mRad_flow_nominal, realFalse=0.001*mRad_flow_nominal)
+ "Heating hot water pump controller"
+ annotation (Placement(transformation(extent={{-260,-80},{-240,-60}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaClgPum(realTrue=
+ mRad_flow_nominal, realFalse=0.001*mRad_flow_nominal)
+ "Chilled water pump controller"
+ annotation (Placement(transformation(extent={{-62,-100},{-42,-80}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaClgVal
+ "Chilled water valve controller"
+ annotation (Placement(transformation(extent={{-62,-140},{-42,-120}})));
+ Fluid.Sensors.TemperatureTwoPort temSup(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal) "Supply water temperature"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-32,-8})));
+ Fluid.Sensors.TemperatureTwoPort temRet(redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal) "Return Water Temperature" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={52,-2})));
+ Fluid.Sensors.TemperatureTwoPort temHea(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ transferHeat=false) "Heating hot water temperature" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-188,-8})));
+ Fluid.Sensors.TemperatureTwoPort temCoo(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ T_start=TRadCol_nominal,
+ transferHeat=true,
+ TAmb=TRadCol_nominal) "Chilled water temperature" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-90,-40})));
+ Fluid.Sensors.TemperatureTwoPort temHeaSou(redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal)
+ "Heating hot water temperature between source and valve" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-178,-198})));
+ Fluid.Sensors.TemperatureTwoPort temHeatingValSla(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal)
+ "Heating hot water temperature between valve and slab" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-174,-124})));
+ Fluid.Sensors.TemperatureTwoPort temCooSouVal(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal)
+ "Chilled water temperature between source and valve" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-28,-194})));
+ Fluid.Sensors.TemperatureTwoPort temCoolingValtoPump(redeclare package
+ Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal) "CoolingTemperature"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-10,-112})));
+ Fluid.FixedResistances.Junction mix2(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ portFlowDirection_1=Modelica.Fluid.Types.PortFlowDirection.Entering,
+ portFlowDirection_2=Modelica.Fluid.Types.PortFlowDirection.Leaving,
+ portFlowDirection_3=Modelica.Fluid.Types.PortFlowDirection.Entering,
+ verifyFlowReversal=true,
+ dp_nominal={1,-200,1},
+ m_flow_nominal={mRad_flow_nominal,-mRad_flow_nominal,mRad_flow_nominal})
+ "Mixer" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=270,
+ origin={-90,10})));
+ Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSlaTop
+ "Temperature at top of slab" annotation (Placement(transformation(extent={{10,
+ -10},{-10,10}}, origin={-72,44})));
+
+ Fluid.Sources.Boundary_pT sin(nPorts=1, redeclare package Medium =
+ MediumW)
+ "Sink for mass flow rate" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={156,4})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts conPluLoc(
+ TZonHigSet=TZonHigLim,
+ TZonLowSet=TZonLowLim,
+ TWatSetLow=TemWaLoSet,
+ cooLocDurWatTem=cooLocDurWatTem,
+ heaLocDurAftCoo=heaLocDurAftCoo,
+ cooLocDurAftHea=cooLocDurAftHea,
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LasOcc,
+ offWitDea=OffTru) "Control plus lockouts"
+ annotation (Placement(transformation(extent={{-400,-100},{-380,-80}})));
+ Fluid.Sources.Boundary_pT
+ airOut2(redeclare package Medium = MediumA, nPorts=1)
+ "Air outlet for X3A"
+ annotation (Placement(transformation(extent={{-64,182},{-44,202}})));
+ Modelica.Blocks.Sources.CombiTimeTable shaPos1(table=[0,1; 86400,1],
+ tableOnFile=false) "Position of the shade"
+ annotation (Placement(transformation(extent={{-312,222},{-292,242}})));
+ Fluid.Sensors.TemperatureTwoPort temRoo(
+ redeclare package Medium = MediumA,
+ m_flow_nominal=mRad_flow_nominal,
+ transferHeat=false) "Room air temperature" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-152,204})));
+ Modelica.Blocks.Sources.CombiTimeTable airCon1(
+ table=[0,0.001,293.15; 28800,0.05,293.15; 64800,0.001,293.15; 86400,0.001,293.15],
+ tableOnFile=false,
+ tableName="airCon",
+ fileName=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/ThermalZones/Detailed/FLEXLAB/Rooms/Examples/X3AWithRadiantFloor.txt"),
+ columns=2:3,
+ smoothness=Modelica.Blocks.Types.Smoothness.ConstantSegments,
+ extrapolation=Modelica.Blocks.Types.Extrapolation.Periodic,
+ timeScale=1) "Inlet air conditions (y[1] = m_flow, y[4] = T)"
+ annotation (Placement(transformation(extent={{-380,274},{-360,294}})));
+
+ Fluid.Sources.MassFlowSource_T airIn1(
+ use_m_flow_in=true,
+ use_T_in=true,
+ redeclare package Medium = MediumA,
+ nPorts=1) "Inlet air conditions (from AHU) for X3A"
+ annotation (Placement(transformation(extent={{-322,294},{-302,314}})));
+ Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut1
+ "Outside temperature"
+ annotation (Placement(transformation(extent={{-178,240},{-158,260}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TIntSet2(k=294)
+ "Interior temperature (models adjacent conditioned spaces)"
+ annotation (Placement(transformation(extent={{-140,298},{-96,342}})));
+ Modelica.Blocks.Sources.CombiTimeTable intGai1(
+ table=[0,1.05729426,1.25089426,0; 3600,1.05729426,1.25089426,0; 7200,1.05729426,
+ 1.25089426,0; 10800,1.05729426,1.25089426,0; 14400,1.05729426,1.25089426,
+ 0; 18000,1.05729426,1.25089426,0; 21600,1.121827593,1.509027593,0; 25200,
+ 1.548281766,1.882174238,0.330986667; 28800,1.977743414,2.979420831,0.661973333;
+ 32400,5.734675369,8.73970762,3.144373333; 36000,5.734675369,8.73970762,3.144373333;
+ 39600,5.734675369,8.73970762,3.144373333; 43200,5.734675369,8.73970762,3.144373333;
+ 46800,4.496245967,7.501278218,1.654933333; 50400,5.734675369,8.73970762,
+ 3.144373333; 54000,5.734675369,8.73970762,3.144373333; 57600,5.734675369,
+ 8.73970762,3.144373333; 61200,5.734675369,8.73970762,3.144373333; 64800,
+ 2.714734464,4.384196826,0.99296; 68400,1.770876747,2.772554164,0.330986667;
+ 72000,1.770876747,2.772554164,0.330986667; 75600,1.659579257,2.327364201,
+ 0.330986667; 79200,1.659579257,2.327364201,0.330986667; 82800,1.444848433,
+ 1.778740905,0.165493333; 86400,1.389199687,1.556145923,0.165493333],
+ tableOnFile=false,
+ columns=2:4,
+ smoothness=Modelica.Blocks.Types.Smoothness.ConstantSegments,
+ extrapolation=Modelica.Blocks.Types.Extrapolation.Periodic,
+ timeScale=1,
+ startTime=0)
+ "Internal gain heat flow (Radiant = 1, Convective = 2, Latent = 3)"
+ annotation (Placement(transformation(extent={{-308,338},{-288,358}})));
+ Modelica.Blocks.Sources.CombiTimeTable shaPos3(table=[0,1; 86400,1],
+ tableOnFile=false) "Position of the shade"
+ annotation (Placement(transformation(extent={{-314,364},{-294,384}})));
+ Modelica.Thermal.HeatTransfer.Components.ThermalConductor conBel3(G=0.2)
+ "Combined convection and radiation resistance below the slab"
+ annotation (Placement(transformation(extent={{-182,280},{-162,300}})));
+ Buildings.ThermalZones.Detailed.FLEXLAB.Rooms.X3A.TestCellRadiantInterior radInt(
+ nConExtWin=0,
+ nConBou=5,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial,
+ massDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial,
+ nPorts=2,
+ redeclare package Medium = MediumA) "Radiant interior test cell"
+ annotation (Placement(transformation(extent={{-224,332},{-184,372}})));
+ Controls.OBC.CDL.Continuous.Sources.Constant TIntSet1(k=294.3)
+ "Interior setpoint"
+ annotation (Placement(transformation(extent={{-546,-92},{-502,-48}})));
+ Controls.OBC.CDL.Logical.Sources.Constant uNigFlu(k=false)
+ "Night flush signal- constantly false"
+ annotation (Placement(transformation(extent={{-480,-138},{-460,-118}})));
+equation
+ connect(TBel.port, conBel1.port_a) annotation (Line(points={{82,-108},{104,
+ -108},{104,-86},{12,-86},{12,-50},{20,-50}},
+ color={191,0,0}));
+ connect(conBel1.port_b, sla1.surf_b)
+ annotation (Line(points={{40,-50},{50,-50},{50,-48},{58,-48},{58,-24},{10,
+ -24},{10,2}}, color={191,0,0}));
+
+ connect(booToReaHtgPum.y, pumHot.m_flow_in) annotation (Line(points={{-238,-70},
+ {-238,-80},{-186,-80}}, color={0,0,127}));
+ connect(booToReaClgPum.y, pumCol.m_flow_in) annotation (Line(points={{-40,-90},
+ {-38,-90},{-38,-58},{-24,-58}}, color={0,0,127}));
+ connect(booToReaClgVal.y, valCol.y) annotation (Line(points={{-40,-130},{-30,-130},
+ {-30,-152},{-12,-152}}, color={0,0,127}));
+ connect(temSup.port_b, sla1.port_a) annotation (Line(points={{-32,2},{-18,2},{
+ -18,12},{-4,12}}, color={0,127,255}));
+ connect(sla1.port_b, temRet.port_a) annotation (Line(points={{16,12},{28,12},
+ {28,-12},{52,-12}},color={0,127,255}));
+ connect(pumHot.port_b, temHea.port_a) annotation (Line(points={{-174,-70},{-174,
+ -52},{-188,-52},{-188,-18}}, color={0,127,255}));
+ connect(pumCol.port_b, temCoo.port_a) annotation (Line(points={{-12,-48},{-90,
+ -48},{-90,-50}}, color={0,127,255}));
+ connect(souHea.ports[1], temHeaSou.port_a) annotation (Line(points={{-172,-282},
+ {-176,-282},{-176,-208},{-178,-208}}, color={0,127,255}));
+ connect(temHeaSou.port_b, valHot.port_a) annotation (Line(points={{-178,-188},
+ {-194,-188},{-194,-168},{-188,-168}}, color={0,127,255}));
+ connect(valHot.port_b, temHeatingValSla.port_a) annotation (Line(points={{-168,
+ -168},{-172,-168},{-172,-134},{-174,-134}}, color={0,127,255}));
+ connect(temHeatingValSla.port_b, pumHot.port_a)
+ annotation (Line(points={{-174,-114},{-174,-90}}, color={0,127,255}));
+ connect(souCol.ports[1], temCooSouVal.port_a) annotation (Line(points={{-16,-280},
+ {-24,-280},{-24,-204},{-28,-204}}, color={0,127,255}));
+ connect(temCooSouVal.port_b, valCol.port_a) annotation (Line(points={{-28,-184},
+ {-28,-164},{-22,-164}}, color={0,127,255}));
+ connect(valCol.port_b, temCoolingValtoPump.port_a) annotation (Line(points={{-2,
+ -164},{-6,-164},{-6,-122},{-10,-122}}, color={0,127,255}));
+ connect(temCoolingValtoPump.port_b, pumCol.port_a) annotation (Line(points={{-10,
+ -102},{-12,-102},{-12,-68}}, color={0,127,255}));
+ connect(sla1.surf_a, temSlaTop.port) annotation (Line(points={{10,22},{-22,22},
+ {-22,44},{-62,44}}, color={191,0,0}));
+ connect(temCoo.port_b, mix2.port_3) annotation (Line(points={{-90,-30},{-108,-30},
+ {-108,10},{-100,10}}, color={0,127,255}));
+ connect(temHea.port_b, mix2.port_1)
+ annotation (Line(points={{-188,2},{-188,20},{-90,20}}, color={0,127,255}));
+ connect(booToReaHtgVal.y, valHot.y) annotation (Line(points={{-238,-112},{-208,
+ -112},{-208,-156},{-178,-156}}, color={0,0,127}));
+ connect(mix2.port_2, temSup.port_a) annotation (Line(points={{-90,
+ -3.55271e-15},{-62,-3.55271e-15},{-62,-18},{-32,-18}}, color={0,127,
+ 255}));
+ connect(temRet.port_b, sin.ports[1]) annotation (Line(points={{52,8},{104,8},{
+ 104,14},{156,14}}, color={0,127,255}));
+ connect(conPluLoc.yHea, booToReaHtgPum.u) annotation (Line(points={{-378,-85.6},
+ {-316,-85.6},{-316,-70},{-262,-70}}, color={255,0,255}));
+ connect(conPluLoc.yHea, booToReaHtgVal.u) annotation (Line(points={{-378,-85.6},
+ {-316,-85.6},{-316,-112},{-262,-112}}, color={255,0,255}));
+ connect(conPluLoc.yCoo, booToReaClgPum.u) annotation (Line(points={{-378,-93},
+ {-366,-93},{-366,-320},{-100,-320},{-100,-90},{-64,-90}}, color={255,0,
+ 255}));
+ connect(conPluLoc.yCoo, booToReaClgVal.u) annotation (Line(points={{-378,-93},
+ {-366,-93},{-366,-320},{-100,-320},{-100,-130},{-64,-130}}, color={255,
+ 0,255}));
+ connect(temRet.T, conPluLoc.TSlaWatRet) annotation (Line(points={{41,-2},{41,230},
+ {-478,230},{-478,-98},{-402,-98}}, color={0,0,127}));
+ connect(temSlaTop.T, conPluLoc.TSla) annotation (Line(points={{-82,44},{-476,44},
+ {-476,-82},{-402,-82}}, color={0,0,127}));
+ connect(airCon1.y[1], airIn1.m_flow_in) annotation (Line(points={{-359,284},{-336,
+ 284},{-336,312},{-324,312}}, color={0,0,127}));
+ connect(airCon1.y[2], airIn1.T_in) annotation (Line(points={{-359,284},{-336,284},
+ {-336,308},{-324,308}}, color={0,0,127}));
+ connect(TIntSet2.y, TOut1.T) annotation (Line(points={{-91.6,320},{-52,320},{
+ -52,272},{-196,272},{-196,250},{-180,250}},
+ color={0,0,127}));
+ connect(temRoo.port_b, airOut2.ports[1]) annotation (Line(points={{-152,214},{
+ -152,224},{-18,224},{-18,192},{-44,192}}, color={0,127,255}));
+ connect(conBel3.port_b, radInt.surf_conBou[1]) annotation (Line(points={{-162,
+ 290},{-148,290},{-148,335.2},{-198,335.2}},
+ color={191,0,0}));
+ connect(sla1.surf_a, radInt.surf_surBou[1]) annotation (Line(points={{10,22},{
+ -260,22},{-260,338},{-207.8,338}}, color={191,0,0}));
+ connect(airIn1.ports[1], radInt.ports[1]) annotation (Line(points={{-302,304},
+ {-260,304},{-260,340},{-219,340}}, color={0,127,255}));
+ connect(radInt.ports[2], temRoo.port_a) annotation (Line(points={{-219,344},{-230,
+ 344},{-230,168},{-152,168},{-152,194}}, color={0,127,255}));
+ connect(intGai1.y, radInt.qGai_flow) annotation (Line(points={{-287,348},{-258,
+ 348},{-258,360},{-225.6,360}}, color={0,0,127}));
+ connect(temRoo.T, conPluLoc.TRooAir) annotation (Line(points={{-163,204},{-270,
+ 204},{-270,228},{-480,228},{-480,-94},{-402,-94}}, color={0,0,127}));
+ connect(TIntSet1.y, conPluLoc.TSlaSet) annotation (Line(points={{-497.6,-70},{
+ -449.8,-70},{-449.8,-86},{-402,-86}}, color={0,0,127}));
+ connect(uNigFlu.y, conPluLoc.uNigFlu) annotation (Line(points={{-458,-128},
+ {-431,-128},{-431,-90},{-402,-90}}, color={255,0,255}));
+ connect(TOut1.port, conBel3.port_a) annotation (Line(points={{-158,250},{-136,
+ 250},{-136,234},{-216,234},{-216,290},{-182,290}}, color={191,0,0}));
+ annotation (Documentation(info="
+
+This models a radiant slab serving a core zone.
+The slab is controlled to 70F year round, following the control scheme specified in the
+(Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts) block.
+
+
+The zone is 5 meters by 9 meters in floor area and is 3 meters in height.
+All walls are exposed to a constant-temperature boundary condition that is set to ~70defF
to approximate interior conditions. The corresponding heat gains are:
+
+- Standard office internal gains - 0.6 W/SF lighting (20% radiative, 80% convective), 0.6 W/SF plug loads (50% radiative, 50% convective)
+- 2 occupants (93 W/person sensible (50% radiative and 50% convective) and 74 W/person latent)
+
+
+
+Gains are modeled with ASHRAE standard schedules for lighting, plug loads, and occupancy, respectively.
+During occupied hours, the room receives ventilation air at approximately code minimum rate (~90 cfm).
+During unoccupied hours, the room receives a negligible amount of air.
+
+
+Chilled water and hot water are provided to the slab by constant temperature flow sources, at 10degC
(cooling) and 40degC
(heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),
+ experiment(Tolerance=1e-6, StartTime=0, StopTime=31536000),
+ __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mos" "Simulate and plot"),
+ Icon(coordinateSystem(extent={{-100,-100},{100,100}}),
+ graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}),
+ Diagram(coordinateSystem(extent={{-560,-380},{180,420}})));
+end ControlPlusLockoutCore;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mo
new file mode 100644
index 00000000000..b5dfb8c2f92
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mo
@@ -0,0 +1,534 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation;
+model ControlPlusLockoutPerimeter
+ "Radiant slab serving perimeter zone with heating and cooling sources, pumps, and valves"
+ extends Modelica.Icons.Example;
+ replaceable package MediumA =
+ Buildings.Media.Air "Air medium";
+
+//-------------------------Step 2: Water as medium-------------------------//
+ replaceable package MediumW =
+ Buildings.Media.Water "Medium model";
+ //--------------------------------------Radiant Control Parameters-----------------------------------//
+ final parameter Real TZonHigLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=297.6
+ "Air temperature high limit above which heating is locked out";
+ final parameter Real TZonLowLim(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=293.15
+ "Air temperature low limit below which heating is locked out";
+ final parameter Real TemWaLoSet(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="Temperature")=285.9
+ "Lower limit for chilled water return temperature, below which cooling is locked out";
+ final parameter Real TimCHW(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time")=1800 "Time for which cooling is locked out if CHW return is too cold";
+ final parameter Real TimHea(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which heating is locked out after cooling concludes";
+ final parameter Real TimCoo(min=0,
+ final unit="s",
+ final displayUnit="s",
+ final quantity="Time") = 3600 "Time for which cooling is locked out after heating concludes";
+ final parameter Real TemDeaRel(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=2.22 "Difference from slab temp setpoint required to trigger heating or cooling during occupied hours";
+ final parameter Real TemDeaNor(min=0,
+ final unit="K",
+ final displayUnit="K",
+ final quantity="TemperatureDifference")=0.28
+ "Difference from slab temp setpoint required to trigger heating or cooling during unoccpied hours";
+ final parameter Real LasOcc(min=0,max=24)=16 "Last occupied hour";
+ final parameter Boolean OffTru=true "True: both heating and cooling signals turn off when slab setpoint is within deadband";
+//------------------------Step 4: Design conditions------------------------//
+ parameter Buildings.Fluid.Data.Pipes.PEX_RADTEST pipe
+ "Pipe";
+ parameter HeatTransfer.Data.OpaqueConstructions.Generic layers(nLay=3, material={
+ Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.1,
+ k=2.31,
+ c=832,
+ d=2322,
+ nSta=5),Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.05,
+ k=0.04,
+ c=1400,
+ d=10),Buildings.HeatTransfer.Data.Solids.Generic(
+ x=0.1,
+ k=2.31,
+ c=832,
+ d=2322)})
+ "Material layers from surface a to b (8cm concrete, 5 cm insulation, 20 cm reinforced concrete)";
+ parameter Real Q_flow_nominal(
+ final min=0,
+ final unit="J/s",
+ final quantity="HeatFlowRate") = 4000
+ "Nominal heat flow rate of water in slab";
+ parameter Real TRadSup_nominal(
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+40
+ "Slab nominal heating supply water temperature, 105 F";
+ parameter Real TRadRet_nominal(
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+35
+ "Slab nominal heating return water temperature,heating 95 F";
+ parameter Real mRad_flow_nominal(
+ final min=0,
+ final unit="kg/s",
+ final quantity="MassFlowRate")=
+ Q_flow_nominal/4200/(TRadSup_nominal-TRadRet_nominal)
+ "Radiator nominal mass flow rate";
+ parameter Real TRadCol_nominal(
+ final unit="K",
+ final displayUnit="K",
+ final quantity="ThermodynamicTemperature") = 273.15+10
+ "Radiator nominal temperature";
+ parameter Real A(
+ final min=0,
+ final unit="m2",
+ final quantity="Area")= 45 "Area";
+//------------------------------------------------------------------------//
+ parameter Real V(
+ final min=0,
+ final unit="m3",
+ final quantity="Volume")=5*9*3 "Room volume";
+
+ parameter Real mA_flow_nominal(
+ final min=0,
+ final unit="kg/s",
+ final quantity="MassFlowRate") = V*1.2*6/3600
+ "Nominal mass flow rate";
+ parameter Real QRooInt_flow(
+ final min=0,
+ final unit="J/s",
+ final quantity="HeatFlowRate") = 100
+ "Internal heat gains of the room";
+
+ Fluid.HeatExchangers.RadiantSlabs.SingleCircuitSlab sla1(
+ steadyStateInitial=true,
+ T_a_start=288.15,
+ T_b_start=288.15,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ m_flow_nominal=mRad_flow_nominal,
+ redeclare package Medium = MediumW,
+ layers=layers,
+ iLayPip=1,
+ pipe=pipe,
+ sysTyp=Buildings.Fluid.HeatExchangers.RadiantSlabs.Types.SystemType.Floor,
+ disPip=0.2,
+ A=A) "Slabe with embedded pipes"
+ annotation (Placement(transformation(extent={{-4,2},{16,22}})));
+ Modelica.Thermal.HeatTransfer.Sources.FixedTemperature TBel(T=293.15)
+ "Radiant temperature below the slab"
+ annotation (Placement(transformation(extent={{82,-98},{102,-78}})));
+ Modelica.Thermal.HeatTransfer.Components.ThermalConductor conBel1(G=20*A)
+ "Combined convection and radiation resistance below the slab"
+ annotation (Placement(transformation(extent={{20,-60},{40,-40}})));
+ Fluid.Sources.Boundary_pT souCol(
+ redeclare package Medium = MediumW,
+ T=TRadCol_nominal,
+ nPorts=1) "Chilled water source" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-16,-290})));
+Fluid.Movers.FlowControlled_m_flow pumCol(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ T_start=TRadCol_nominal,
+ allowFlowReversal=false,
+ m_flow_nominal=mRad_flow_nominal,
+ addPowerToMedium=false,
+ nominalValuesDefineDefaultPressureCurve=true)
+ "Chilled water pump" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-12,-58})));
+ Fluid.Actuators.Valves.TwoWayPressureIndependent valCol(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ dpValve_nominal=100,
+ show_T=true) "Chilled water valve"
+ annotation (Placement(transformation(extent={{-22,-174},{-2,-154}})));
+Fluid.Movers.FlowControlled_m_flow pumHot(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ m_flow_nominal=mRad_flow_nominal,
+ addPowerToMedium=false,
+ nominalValuesDefineDefaultPressureCurve=true,
+ m_flow_start=0.01) "Hot water pump"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-174,-80})));
+ Fluid.Actuators.Valves.TwoWayPressureIndependent valHot(
+ redeclare package Medium = MediumW,
+ allowFlowReversal=false,
+ m_flow_nominal=mRad_flow_nominal,
+ dpValve_nominal=100) "Hot water valve"
+ annotation (Placement(transformation(extent={{-188,-178},{-168,-158}})));
+ Fluid.Sources.Boundary_pT souHot(
+ redeclare package Medium = MediumW,
+ T=TRadSup_nominal,
+ nPorts=1) "Heating hot water source" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-172,-292})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaHtgVal
+ "Heating valve controller"
+ annotation (Placement(transformation(extent={{-260,-122},{-240,-102}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaHtgPum(realTrue=
+ mRad_flow_nominal, realFalse=0.001*mRad_flow_nominal)
+ "Heating pump controller"
+ annotation (Placement(transformation(extent={{-260,-80},{-240,-60}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaClgPum(realTrue=
+ mRad_flow_nominal, realFalse=0.001*mRad_flow_nominal)
+ "Cooling pump controller"
+ annotation (Placement(transformation(extent={{-62,-100},{-42,-80}})));
+ Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToReaClgVal
+ "Cooling valve controller"
+ annotation (Placement(transformation(extent={{-62,-140},{-42,-120}})));
+ Fluid.Sensors.TemperatureTwoPort temSup(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal) "Supply water temperature"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-32,-8})));
+ Fluid.Sensors.TemperatureTwoPort temRet(redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal) "Return Water Temperature" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={52,-2})));
+ Fluid.Sensors.TemperatureTwoPort temHea(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ transferHeat=false) "HeatingTemperature" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-188,-8})));
+ Fluid.Sensors.TemperatureTwoPort temCoo(
+ redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal,
+ T_start=TRadCol_nominal,
+ transferHeat=true,
+ TAmb=TRadCol_nominal) "CoolingTemperature" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-90,-40})));
+ Fluid.Sensors.TemperatureTwoPort temHeaSou(redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal) "HeatingTemperature" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-178,-198})));
+ Fluid.Sensors.TemperatureTwoPort temHeaValSla(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal) "HeatingTemperature"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-174,-124})));
+ Fluid.Sensors.TemperatureTwoPort temCooSou(redeclare package Medium = MediumW,
+ m_flow_nominal=mRad_flow_nominal) "CoolingTemperature" annotation (
+ Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-28,-194})));
+ Fluid.Sensors.TemperatureTwoPort temCooValSla(redeclare package Medium =
+ MediumW, m_flow_nominal=mRad_flow_nominal) "CoolingTemperature"
+ annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={-10,-112})));
+ Fluid.FixedResistances.Junction mix2(
+ redeclare package Medium = MediumW,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
+ portFlowDirection_1=Modelica.Fluid.Types.PortFlowDirection.Entering,
+ portFlowDirection_2=Modelica.Fluid.Types.PortFlowDirection.Leaving,
+ portFlowDirection_3=Modelica.Fluid.Types.PortFlowDirection.Entering,
+ verifyFlowReversal=true,
+ dp_nominal={1,-200,1},
+ m_flow_nominal={mRad_flow_nominal,-mRad_flow_nominal,mRad_flow_nominal})
+ "Mixer" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=270,
+ origin={-90,10})));
+ BoundaryConditions.WeatherData.ReaderTMY3 weaDat1(filNam=
+ Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"))
+ "Weather data reader"
+ annotation (Placement(transformation(extent={{184,340},{204,360}})));
+ BoundaryConditions.WeatherData.Bus weaBus1 "Weather bus"
+ annotation (Placement(transformation(extent={{270,298},{290,318}})));
+ Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSlaTop
+ "Temperature at the top of the slab" annotation (Placement(transformation(
+ extent={{10,-10},{-10,10}}, origin={-72,44})));
+ Fluid.Sources.Boundary_pT
+ airOut1( redeclare package Medium = MediumA, nPorts=1)
+ "Air outlet for X3A"
+ annotation (Placement(transformation(extent={{0,244},{20,264}})));
+
+ Fluid.Sensors.TemperatureTwoPort temRoo(
+ redeclare package Medium = MediumA,
+ m_flow_nominal=mRad_flow_nominal,
+ transferHeat=false) "HeatingTemperature" annotation (Placement(
+ transformation(
+ extent={{-9,-20},{9,20}},
+ rotation=90,
+ origin={84,241})));
+ Modelica.Blocks.Sources.CombiTimeTable airCon(
+ table=[0,0.001,293.15; 28800,0.05,293.15; 64800,0.001,293.15; 86400,0.001,293.15],
+ tableOnFile=false,
+ tableName="airCon",
+ fileName=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/Data/ThermalZones/Detailed/FLEXLAB/Rooms/Examples/X3AWithRadiantFloor.txt"),
+ columns=2:3,
+ smoothness=Modelica.Blocks.Types.Smoothness.ConstantSegments,
+ extrapolation=Modelica.Blocks.Types.Extrapolation.Periodic,
+ timeScale=1) "Inlet air conditions (y[1] = m_flow, y[4] = T)"
+ annotation (Placement(transformation(extent={{-62,280},{-42,300}})));
+
+ Fluid.Sources.MassFlowSource_T airIn(
+ use_m_flow_in=true,
+ use_T_in=true,
+ redeclare package Medium = MediumA,
+ nPorts=1) "Inlet air conditions (from AHU) for X3A"
+ annotation (Placement(transformation(extent={{0,280},{20,300}})));
+ Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut2
+ "Outside temperature"
+ annotation (Placement(transformation(extent={{210,166},{230,186}})));
+ Buildings.Controls.OBC.CDL.Continuous.Sources.Constant TIntSet(k=294)
+ "Indoor temperature of adjacent conditioned spaces"
+ annotation (Placement(transformation(extent={{198,232},{242,276}})));
+ Buildings.ThermalZones.Detailed.FLEXLAB.Rooms.X3A.TestCellRadiantExterior radExt(
+ nSurBou=1,
+ hRoo=3,
+ steadyStateWindow=false,
+ energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial,
+ massDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial,
+ nPorts=2,
+ redeclare package Medium = MediumA) "Radiant exterior test cell"
+ annotation (Placement(transformation(extent={{82,300},{122,340}})));
+ Modelica.Blocks.Sources.CombiTimeTable intGai2(
+ table=[0,1.05729426,1.25089426,0; 3600,1.05729426,1.25089426,0; 7200,1.05729426,
+ 1.25089426,0; 10800,1.05729426,1.25089426,0; 14400,1.05729426,1.25089426,
+ 0; 18000,1.05729426,1.25089426,0; 21600,1.121827593,1.509027593,0; 25200,
+ 1.548281766,1.882174238,0.330986667; 28800,1.977743414,2.979420831,0.661973333;
+ 32400,5.734675369,8.73970762,3.144373333; 36000,5.734675369,8.73970762,3.144373333;
+ 39600,5.734675369,8.73970762,3.144373333; 43200,5.734675369,8.73970762,3.144373333;
+ 46800,4.496245967,7.501278218,1.654933333; 50400,5.734675369,8.73970762,
+ 3.144373333; 54000,5.734675369,8.73970762,3.144373333; 57600,5.734675369,
+ 8.73970762,3.144373333; 61200,5.734675369,8.73970762,3.144373333; 64800,
+ 2.714734464,4.384196826,0.99296; 68400,1.770876747,2.772554164,0.330986667;
+ 72000,1.770876747,2.772554164,0.330986667; 75600,1.659579257,2.327364201,
+ 0.330986667; 79200,1.659579257,2.327364201,0.330986667; 82800,1.444848433,
+ 1.778740905,0.165493333; 86400,1.389199687,1.556145923,0.165493333],
+ tableOnFile=false,
+ columns=2:4,
+ smoothness=Modelica.Blocks.Types.Smoothness.ConstantSegments,
+ extrapolation=Modelica.Blocks.Types.Extrapolation.Periodic,
+ timeScale=1,
+ startTime=0)
+ "Internal gain heat flow (Radiant = 1, Convective = 2, Latent = 3)"
+ annotation (Placement(transformation(extent={{0,320},{20,340}})));
+ Modelica.Blocks.Sources.CombiTimeTable shaPos2(table=[0,1; 86400,1],
+ tableOnFile=false) "Position of the shade"
+ annotation (Placement(transformation(extent={{38,340},{58,360}})));
+ Modelica.Thermal.HeatTransfer.Components.ThermalConductor conBel2(G=0.2)
+ "Combined convection and radiation resistance below the slab"
+ annotation (Placement(transformation(extent={{122,252},{142,272}})));
+ Fluid.Sources.Boundary_pT sin(nPorts=1, redeclare package Medium =
+ MediumW)
+ "Sink for mass flow rate" annotation (Placement(transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=90,
+ origin={156,4})));
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts conPluLoc(
+ TZonHigSet=TZonHigLim,
+ TZonLowSet=TZonLowLim,
+ TWatSetLow=TemWaLoSet,
+ cooLocDurWatTem=TimCHW,
+ heaLocDurAftCoo=TimHea,
+ cooLocDurAftHea=TimCoo,
+ TDeaRel=TemDeaRel,
+ TDeaNor=TemDeaNor,
+ k=LasOcc,
+ offWitDea=OffTru) "Control plus lockouts"
+ annotation (Placement(transformation(extent={{-400,-100},{-380,-80}})));
+ SlabTemperatureSignal.SlabSetpointPerimeter slaSetPer "Slab setpoint "
+ annotation (Placement(transformation(extent={{-520,-60},{-500,-40}})));
+ SlabTemperatureSignal.Validation.BaseClasses.ForecastHighChicago forHiChi
+ "Forecast high temperature"
+ annotation (Placement(transformation(extent={{-586,-64},{-566,-44}})));
+ Controls.OBC.CDL.Logical.Sources.Constant uNigFlu(k=false)
+ "Night flush signal- constantly false"
+ annotation (Placement(transformation(extent={{-482,-140},{-462,-120}})));
+equation
+ connect(TBel.port, conBel1.port_a) annotation (Line(points={{102,-88},{128,
+ -88},{128,-118},{12,-118},{12,-48},{20,-48},{20,-50}},
+ color={191,0,0}));
+ connect(conBel1.port_b, sla1.surf_b)
+ annotation (Line(points={{40,-50},{54,-50},{54,-24},{10,-24},{10,2}},
+ color={191,0,0}));
+
+ connect(booToReaHtgPum.y, pumHot.m_flow_in) annotation (Line(points={{-238,-70},
+ {-238,-80},{-186,-80}}, color={0,0,127}));
+ connect(booToReaClgPum.y, pumCol.m_flow_in) annotation (Line(points={{-40,-90},
+ {-38,-90},{-38,-58},{-24,-58}}, color={0,0,127}));
+ connect(booToReaClgVal.y, valCol.y) annotation (Line(points={{-40,-130},{-30,
+ -130},{-30,-152},{-12,-152}}, color={0,0,127}));
+ connect(temSup.port_b, sla1.port_a) annotation (Line(points={{-32,2},{-18,2},{
+ -18,12},{-4,12}}, color={0,127,255}));
+ connect(sla1.port_b, temRet.port_a) annotation (Line(points={{16,12},{28,12},
+ {28,-12},{52,-12}},color={0,127,255}));
+ connect(pumHot.port_b, temHea.port_a) annotation (Line(points={{-174,-70},{-174,
+ -52},{-188,-52},{-188,-18}}, color={0,127,255}));
+ connect(pumCol.port_b, temCoo.port_a) annotation (Line(points={{-12,-48},{-90,
+ -48},{-90,-50}}, color={0,127,255}));
+ connect(souHot.ports[1], temHeaSou.port_a) annotation (Line(points={{-172,-282},
+ {-176,-282},{-176,-208},{-178,-208}}, color={0,127,255}));
+ connect(temHeaSou.port_b, valHot.port_a) annotation (Line(points={{-178,-188},
+ {-194,-188},{-194,-168},{-188,-168}}, color={0,127,255}));
+ connect(valHot.port_b, temHeaValSla.port_a) annotation (Line(points={{-168,-168},
+ {-172,-168},{-172,-134},{-174,-134}}, color={0,127,255}));
+ connect(temHeaValSla.port_b, pumHot.port_a)
+ annotation (Line(points={{-174,-114},{-174,-90}}, color={0,127,255}));
+ connect(souCol.ports[1], temCooSou.port_a) annotation (Line(points={{-16,-280},
+ {-24,-280},{-24,-204},{-28,-204}}, color={0,127,255}));
+ connect(temCooSou.port_b, valCol.port_a) annotation (Line(points={{-28,-184},
+ {-28,-164},{-22,-164}}, color={0,127,255}));
+ connect(valCol.port_b, temCooValSla.port_a) annotation (Line(points={{-2,-164},
+ {-6,-164},{-6,-122},{-10,-122}}, color={0,127,255}));
+ connect(temCooValSla.port_b, pumCol.port_a) annotation (Line(points={{-10,-102},
+ {-12,-102},{-12,-68}}, color={0,127,255}));
+ connect(weaDat1.weaBus, weaBus1.TDryBul) annotation (Line(
+ points={{204,350},{248,350},{248,308},{280,308}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(airCon.y[1], airIn.m_flow_in) annotation (Line(points={{-41,290},{-14,
+ 290},{-14,298},{-2,298}}, color={0,0,127}));
+ connect(airCon.y[2], airIn.T_in) annotation (Line(points={{-41,290},{-14,290},
+ {-14,294},{-2,294}}, color={0,0,127}));
+ connect(airIn.ports[1], radExt.ports[1]) annotation (Line(points={{20,290},{
+ 60,290},{60,308},{87,308}}, color={0,127,255}));
+ connect(temRoo.port_b, airOut1.ports[1]) annotation (Line(points={{84,250},{
+ 60,250},{60,254},{20,254}}, color={0,127,255}));
+ connect(intGai2.y, radExt.qGai_flow) annotation (Line(points={{21,330},{58,
+ 330},{58,328},{80.4,328}}, color={0,0,127}));
+ connect(shaPos2.y[1], radExt.uSha[1]) annotation (Line(points={{59,350},{62,
+ 350},{62,338},{80.4,338}}, color={0,0,127}));
+ connect(sla1.surf_a, radExt.surf_surBou[1]) annotation (Line(points={{10,22},
+ {54,22},{54,306},{98.2,306}}, color={191,0,0}));
+ connect(sla1.surf_a, temSlaTop.port) annotation (Line(points={{10,22},{-22,22},
+ {-22,44},{-62,44}}, color={191,0,0}));
+ connect(temCoo.port_b, mix2.port_3) annotation (Line(points={{-90,-30},{-108,
+ -30},{-108,10},{-100,10}}, color={0,127,255}));
+ connect(temHea.port_b, mix2.port_1)
+ annotation (Line(points={{-188,2},{-188,20},{-90,20}}, color={0,127,255}));
+ connect(conBel2.port_b, radExt.surf_conBou[1])
+ annotation (Line(points={{142,262},{156,262},{156,294},{106,294},{106,302},
+ {108,302},{108,304}}, color={191,0,0}));
+ connect(booToReaHtgVal.y, valHot.y) annotation (Line(points={{-238,-112},{-208,
+ -112},{-208,-156},{-178,-156}}, color={0,0,127}));
+ connect(mix2.port_2, temSup.port_a) annotation (Line(points={{-90,
+ -3.55271e-15},{-62,-3.55271e-15},{-62,-18},{-32,-18}}, color={0,127,
+ 255}));
+ connect(temRet.port_b, sin.ports[1]) annotation (Line(points={{52,8},{104,8},{
+ 104,14},{156,14}}, color={0,127,255}));
+ connect(conPluLoc.yHea, booToReaHtgPum.u) annotation (Line(points={{-378,-85.6},
+ {-316,-85.6},{-316,-70},{-262,-70}}, color={255,0,255}));
+ connect(conPluLoc.yHea, booToReaHtgVal.u) annotation (Line(points={{-378,-85.6},
+ {-316,-85.6},{-316,-112},{-262,-112}}, color={255,0,255}));
+ connect(conPluLoc.yCoo, booToReaClgPum.u) annotation (Line(points={{-378,-93},
+ {-366,-93},{-366,-320},{-100,-320},{-100,-90},{-64,-90}}, color={255,
+ 0,255}));
+ connect(conPluLoc.yCoo, booToReaClgVal.u) annotation (Line(points={{-378,-93},
+ {-366,-93},{-366,-320},{-100,-320},{-100,-130},{-64,-130}}, color={
+ 255,0,255}));
+ connect(temRet.T, conPluLoc.TSlaWatRet) annotation (Line(points={{41,-2},{41,230},
+ {-462,230},{-462,-98},{-402,-98}}, color={0,0,127}));
+ connect(temRoo.T, conPluLoc.TRooAir) annotation (Line(points={{62,241},{-464,
+ 241},{-464,-94},{-402,-94}}, color={0,0,127}));
+ connect(temSlaTop.T, conPluLoc.TSla) annotation (Line(points={{-82,44},{-464,44},
+ {-464,-82},{-402,-82}}, color={0,0,127}));
+ connect(forHiChi.TForHigChi, slaSetPer.TFor) annotation (Line(points={{-564,-53.8},
+ {-556,-53.8},{-556,-56},{-540,-56},{-540,-50},{-522,-50}}, color={0,0,
+ 127}));
+ connect(slaSetPer.TSlaSetPer, conPluLoc.TSlaSet) annotation (Line(points={{-498,
+ -50},{-468,-50},{-468,-86},{-402,-86}}, color={0,0,127}));
+ connect(radExt.ports[2], temRoo.port_a) annotation (Line(points={{87,312},{80,
+ 312},{80,260},{100,260},{100,232},{84,232}}, color={0,127,255}));
+ connect(uNigFlu.y, conPluLoc.uNigFlu) annotation (Line(points={{-460,-130},
+ {-432,-130},{-432,-90},{-402,-90}}, color={255,0,255}));
+ connect(TIntSet.y, TOut2.T) annotation (Line(points={{246.4,254},{270,254},{
+ 270,138},{198,138},{198,176},{208,176}}, color={0,0,127}));
+ connect(TOut2.port, conBel2.port_a) annotation (Line(points={{230,176},{248,
+ 176},{248,202},{112,202},{112,262},{122,262}}, color={191,0,0}));
+ connect(weaDat1.weaBus, weaBus1.lat) annotation (Line(
+ points={{204,350},{248,350},{248,308},{280,308}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(weaDat1.weaBus, radExt.weaBus) annotation (Line(
+ points={{204,350},{214,350},{214,322},{119.9,322},{119.9,337.9}},
+ color={255,204,51},
+ thickness=0.5));
+ annotation (Documentation(info="
+
+This models a radiant slab serving a perimeter zone as per current control scheme.
+The slab is controlled to a daily setpoint based on forecast high outdoor air temperature,
+as specified in the Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTempSignal block.
+Slab control follows the control scheme specified in the (
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts) block.
+
+
+The zone is 5 meters by 9 meters in floor area and is 3 meters in height. The zone has two exposed walls, each with windows: one oriented south, and the other oriented west.
+The remaining walls are exposed to a constant-temperature boundary condition that is set to ~70degF
to approximate interior conditions.
+The room is modeled with standard office internal gains - 0.6 W/SF lighting (20% radiative, 80% convective), 0.6 W/SF plug loads (50% radiative, 50% convective) , and 2 occupants, with the corresponding heat gains of:
+93 W/person sensible (50% radiative and 50% convective) and 74 W/person latent. Gains are modeled with ASHRAE standard schedules for lighting, plug loads, and occupancy, respectively.
+
+
+During occupied hours, the room receives ventilation air at approximately code minimum rate (~90 cfm). During unoccupied hours, the room receives a negligible amount of air.
+
+
+Chilled water and hot water are provided to the slab by constant temperature flow sources, at 10C (cooling) and 40 C (heating).
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"), experiment(Tolerance=1e-6, StartTime=0, StopTime=31536000),
+ __Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mos" "Simulate and plot"),
+ Icon(coordinateSystem(extent={{-100,-100},{100,100}}),
+ graphics={
+ Ellipse(
+ lineColor={75,138,73},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,-100},{100,100}}),
+ Polygon(lineColor = {0,0,255},
+ fillColor = {75,138,73},
+ pattern = LinePattern.None,
+ fillPattern = FillPattern.Solid,
+ points={{-36,58},{64,-2},{-36,-62},{-36,58}})}),
+ Diagram(coordinateSystem(extent={{-600,-380},{300,380}})));
+end ControlPlusLockoutPerimeter;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.mo
new file mode 100644
index 00000000000..abcc2be6f75
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.mo
@@ -0,0 +1,25 @@
+within Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating;
+package Validation "Validation for radiant control"
+annotation (Documentation(info="
+
+ This package contains three validation models for the radiant control module.
+ The module, Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts, determines heating and cooling control for a radiant slab.
+
+ The three validation models included in this package are as follows:
+
+ - 1. ControlPlusLockout demonstrates radiant control based on example inputs
+ - 2. ControlPlusLockoutPerimeter demonstrates radiant control for a simple perimeter room model served by a radiant slab,
+ with a simple hot water source, cold water source, and associated valves and pumps.
+ - 3. ControlPlusLockoutPerimeter demonstrates radiant control for a simple core room model
+ (i.e., no surfaces exposed to the outdoors) served by a radiant slab,
+ with a simple hot water source, cold water source, and associated valves and pumps.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"));
+end Validation;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.order
new file mode 100644
index 00000000000..3e60456e0f1
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/package.order
@@ -0,0 +1,3 @@
+ControlPlusLockout
+ControlPlusLockoutCore
+ControlPlusLockoutPerimeter
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.mo b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.mo
new file mode 100644
index 00000000000..3a3a8dd9cc6
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.mo
@@ -0,0 +1,44 @@
+within Buildings.Controls.OBC.RadiantSystems;
+package CoolingAndHeating "Radiant Control Sequence"
+annotation (Documentation(info="
+
+This package contains a radiant control module and its constitutive blocks.
+
+
+The main controller module,
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts, determines heating and cooling control for a radiant slab.
+
+
+Blocks in the
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts and
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal packages are the composite pieces of the above control block.
+
+", revisions="
+
+-
+October 6, 2020, by Fiona Woods:
+First implementation.
+
+
+"),Icon(graphics={
+ Rectangle(
+ extent={{-100,100},{100,-100}},
+ lineColor={217,67,180},
+ lineThickness=1,
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-78,0},{42,-18}},
+ lineColor={217,67,180},
+ lineThickness=1,
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Line(
+ points={{-78,0},{-22,48},{78,48},{42,0}},
+ color={217,67,180},
+ thickness=1),
+ Line(
+ points={{78,48},{78,30},{42,-18}},
+ color={217,67,180},
+ thickness=1)}));
+end CoolingAndHeating;
diff --git a/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.order b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.order
new file mode 100644
index 00000000000..cebb2f524ad
--- /dev/null
+++ b/Buildings/Controls/OBC/RadiantSystems/CoolingAndHeating/package.order
@@ -0,0 +1,4 @@
+ControlPlusLockouts
+Lockouts
+SlabTemperatureSignal
+Validation
diff --git a/Buildings/Controls/OBC/RadiantSystems/package.order b/Buildings/Controls/OBC/RadiantSystems/package.order
index 12863110ed1..456277f58a4 100644
--- a/Buildings/Controls/OBC/RadiantSystems/package.order
+++ b/Buildings/Controls/OBC/RadiantSystems/package.order
@@ -1,2 +1,3 @@
Cooling
+CoolingAndHeating
Heating
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_AirTemperatureLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_AirTemperatureLockout.txt
new file mode 100644
index 00000000000..7be726f1aa7
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_AirTemperatureLockout.txt
@@ -0,0 +1,28 @@
+last-generated=2020-10-05
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+airTemLim.TRoo=[2.996000061035156e+02, 2.996000061035156e+02]
+airTemLim.TZonHigSet=[2.976000061035156e+02, 2.976000061035156e+02]
+airTemLim.TZonLowSet=[2.931499938964844e+02, 2.931499938964844e+02]
+airTemLim.yHeaTZon=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+airTemLim.yCooTZon=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+airTemLim1.TRoo=[2.951499938964844e+02, 2.951499938964844e+02]
+airTemLim1.TZonHigSet=[2.976000061035156e+02, 2.976000061035156e+02]
+airTemLim1.TZonLowSet=[2.931499938964844e+02, 2.931499938964844e+02]
+airTemLim1.yHeaTZon=[1e+00, 1e+00]
+airTemLim1.yCooTZon=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+airTemLim2.TRoo=[2.911499938964844e+02, 2.911499938964844e+02]
+airTemLim2.TZonHigSet=[2.976000061035156e+02, 2.976000061035156e+02]
+airTemLim2.TZonLowSet=[2.931499938964844e+02, 2.931499938964844e+02]
+airTemLim2.yHeaTZon=[1e+00, 1e+00]
+airTemLim2.yCooTZon=[0e+00, 0e+00]
+airTemLim3.TRoo=[2.976000061035156e+02, 3.17560546875e+02, 3.001066589355469e+02, 2.779542541503906e+02, 2.926261901855469e+02, 3.166211242675781e+02, 3.049624938964844e+02, 2.795034484863281e+02, 2.879649353027344e+02, 3.14486572265625e+02, 3.09355712890625e+02, 2.821897277832031e+02, 2.839090576171875e+02, 3.112909545898438e+02, 3.130102539062499e+02, 2.858442993164062e+02, 2.807134399414062e+02, 3.072350769042969e+02, 3.15696533203125e+02, 2.902375183105469e+02, 2.78578857421875e+02, 3.025737915039062e+02, 3.172457580566406e+02, 2.950933227539062e+02, 2.776394653320312e+02, 2.976000061035156e+02, 3.17560546875e+02, 3.001066589355469e+02, 2.779542541503906e+02, 2.926261901855469e+02, 3.166211242675781e+02, 3.049624938964844e+02, 2.795034484863281e+02, 2.879649353027344e+02, 3.144865722656251e+02, 3.093557128906251e+02, 2.821897277832031e+02, 2.839090576171875e+02, 3.112909545898438e+02, 3.1301025390625e+02, 2.858442993164062e+02, 2.807134399414062e+02, 3.072350769042969e+02, 3.15696533203125e+02, 2.902375183105469e+02, 2.78578857421875e+02, 3.025737915039062e+02, 3.172457580566406e+02, 2.950933227539062e+02, 2.776394653320312e+02, 2.976000061035156e+02, 3.17560546875e+02, 3.001066589355469e+02, 2.779542541503906e+02, 2.926261901855469e+02, 3.166211242675782e+02, 3.049624938964841e+02, 2.795034484863282e+02, 2.879649353027344e+02, 3.14486572265625e+02, 3.09355712890625e+02, 2.821897277832031e+02, 2.839090576171875e+02, 3.112909545898438e+02, 3.1301025390625e+02, 2.858442993164062e+02, 2.807134399414062e+02, 3.072350769042969e+02, 3.156965332031249e+02, 2.902375183105471e+02, 2.785788574218749e+02, 3.025737915039062e+02, 3.172457580566406e+02, 2.950933227539062e+02, 2.776394653320312e+02, 2.976000061035156e+02, 3.17560546875e+02, 3.001066589355469e+02, 2.779542541503906e+02, 2.926261901855469e+02, 3.166211242675781e+02, 3.049624938964844e+02, 2.795034484863281e+02, 2.879649353027344e+02, 3.14486572265625e+02, 3.09355712890625e+02, 2.821897277832031e+02, 2.839090576171875e+02, 3.112909545898438e+02, 3.1301025390625e+02, 2.858442993164062e+02, 2.807134399414062e+02, 3.072350769042969e+02, 3.15696533203125e+02, 2.902375183105469e+02, 2.78578857421875e+02, 3.025737915039062e+02, 3.172457580566406e+02, 2.950933227539062e+02, 2.776394653320312e+02, 2.976000061035156e+02]
+airTemLim3.TZonHigSet=[2.976000061035156e+02, 2.976000061035156e+02]
+airTemLim3.TZonLowSet=[2.931499938964844e+02, 2.931499938964844e+02]
+airTemLim3.yHeaTZon=[1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00]
+airTemLim3.yCooTZon=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 8.326672684688674e-14, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_ChilledWaterReturnLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_ChilledWaterReturnLockout.txt
new file mode 100644
index 00000000000..ee1ef8d7016
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_ChilledWaterReturnLockout.txt
@@ -0,0 +1,10 @@
+last-generated=2021-09-27
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+chwRetLim.TSlaRet=[2.858999938964844e+02, 3.035929260253906e+02, 3.023991088867188e+02, 2.835929260253906e+02, 2.672494812011719e+02, 2.708149719238281e+02, 2.904833374023438e+02, 3.052590942382812e+02, 2.993695373535156e+02, 2.791015930175781e+02, 2.660907592773438e+02, 2.742257690429688e+02, 2.948226928710938e+02, 3.058948974609375e+02, 2.956230468749999e+02, 2.749721069335938e+02, 2.659864196777344e+02, 2.782579345703126e+02, 2.986871643066406e+02, 3.054664306640625e+02, 2.913590393066406e+02, 2.714242553710938e+02, 2.669419555664062e+02, 2.826968688964844e+02, 3.018710327148438e+02, 3.039965515136719e+02, 2.868044738769531e+02, 2.686469116210938e+02, 2.689065551757813e+02, 2.873062744140625e+02, 3.04204833984375e+02, 3.015634460449219e+02, 2.822017517089844e+02, 2.66787841796875e+02, 2.717756347656251e+02, 2.918408203124999e+02, 3.055643310546875e+02, 2.982966613769531e+02, 2.777958984375e+02, 2.65946044921875e+02, 2.753965148925781e+02, 2.960591735839844e+02, 3.05877197265625e+02, 2.943700866699219e+02, 2.738213806152344e+02, 2.661662902832031e+02, 2.79576416015625e+02, 2.9973681640625e+02, 3.051267700195312e+02, 2.899926452636719e+02, 2.7048974609375e+02, 2.674368591308594e+02, 2.840928955078125e+02, 3.02677978515625e+02, 3.033529968261719e+02, 2.853973999023436e+02, 2.679783325195312e+02, 2.696901550292968e+02, 2.887055969238281e+02, 3.047261047363281e+02, 3.006502685546875e+02, 2.808288879394531e+02, 2.664208068847656e+02, 2.728062438964844e+02, 2.931689147949219e+02, 3.05772216796875e+02, 2.971624450683594e+02, 2.765303039550781e+02, 2.659000549316406e+02, 2.766192321777342e+02, 2.97245391845703e+02, 3.057606201171875e+02, 2.930751647949219e+02, 2.727304077148438e+02, 2.6644384765625e+02, 2.809262084960938e+02, 3.007179565429688e+02, 3.046919555664062e+02, 2.886060180664062e+02, 2.696314697265625e+02, 2.680231628417969e+02, 2.854978942871094e+02, 3.0340185546875e+02, 3.02623046875e+02, 2.839928283691406e+02, 2.673984680175781e+02, 2.705540161132812e+02, 2.900910034179688e+02, 3.051542053222656e+02, 2.996640625e+02, 2.794811401367188e+02, 2.661501770019531e+02, 2.739016418457031e+02, 2.944610290527344e+02, 3.058817443847656e+02, 2.959724731445312e+02, 2.753110961914062e+02, 2.659530944824219e+02, 2.778879089355469e+02, 2.983753967285156e+02, 3.055457458496094e+02]
+chwRetLim.yCooTChiWatRetLim=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_HysteresisLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_HysteresisLockout.txt
new file mode 100644
index 00000000000..d2d7f48c70a
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_HysteresisLockout.txt
@@ -0,0 +1,32 @@
+last-generated=2021-09-28
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+hysLim.uHea=[1e+00, 1e+00]
+hysLim.uCoo=[1e+00, 1e+00]
+hysLim.yHeaNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim.yCooNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim1.uHea=[0e+00, 0e+00]
+hysLim1.uCoo=[0e+00, 0e+00]
+hysLim1.yHeaNotLoc=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+hysLim1.yCooNotLoc=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+hysLim2.uHea=[0e+00, 0e+00]
+hysLim2.uCoo=[1e+00, 1e+00]
+hysLim2.yHeaNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim2.yCooNotLoc=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+hysLim3.uHea=[1e+00, 1e+00]
+hysLim3.uCoo=[0e+00, 0e+00]
+hysLim3.yHeaNotLoc=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+hysLim3.yCooNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim4.uHea=[1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 4.04121180963557e-14, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00]
+hysLim4.uCoo=[1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 4.04121180963557e-14, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00]
+hysLim4.yHeaNotLoc=[0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim4.yCooNotLoc=[0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+hysLim5.uHea=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00]
+hysLim5.uCoo=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00]
+hysLim5.yHeaNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00]
+hysLim5.yCooNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_NightFlushLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_NightFlushLockout.txt
new file mode 100644
index 00000000000..36b0f439382
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_SubLockouts_Validation_NightFlushLockout.txt
@@ -0,0 +1,10 @@
+last-generated=2020-10-05
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+nigFluLoc.uNigFlu=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00]
+nigFluLoc.yNigFluHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_Validation_AllLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_Validation_AllLockout.txt
new file mode 100644
index 00000000000..1ca5e400b3c
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Lockouts_Validation_AllLockout.txt
@@ -0,0 +1,16 @@
+last-generated=2021-09-28
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.72e+05]
+allLoc.yCoo=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+allLoc.hysLim.yCooNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+allLoc.airTemLim.yCooTZon=[1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00]
+allLoc.chwRetLim.yCooTChiWatRetLim=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+allLoc.yHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00]
+allLoc.hysLim.yHeaNotLoc=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+allLoc.airTemLim.yHeaTZon=[1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00]
+allLoc.nitFluLoc.yNigFluHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_BaseClasses_Validation_ChicagoForecastHigh.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_BaseClasses_Validation_ChicagoForecastHigh.txt
new file mode 100644
index 00000000000..28e47c899a0
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_BaseClasses_Validation_ChicagoForecastHigh.txt
@@ -0,0 +1,10 @@
+last-generated=2020-10-07
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": "1",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 3.1536e+07]
+forHiChi.TForHigChi=[2.720499877929688e+02, 2.725499877929688e+02, 2.648500061035156e+02, 2.775499877929688e+02, 2.759500122070312e+02, 2.753500061035156e+02, 2.764500122070312e+02, 2.664500122070312e+02, 2.675499877929688e+02, 2.725499877929688e+02, 2.6375e+02, 2.814500122070312e+02, 2.753500061035156e+02, 2.764500122070312e+02, 2.753500061035156e+02, 2.8375e+02, 2.759500122070312e+02, 2.831499938964844e+02, 2.798500061035156e+02, 2.8375e+02, 2.820499877929688e+02, 2.803500061035156e+02, 2.809500122070312e+02, 2.798500061035156e+02, 2.864500122070312e+02, 2.798500061035156e+02, 2.781499938964844e+02, 2.831499938964844e+02, 2.898500061035156e+02, 3.0375e+02, 2.814500122070312e+02, 2.959500122070312e+02, 2.848500061035156e+02, 2.898500061035156e+02, 3.0375e+02, 2.853500061035156e+02, 2.903500061035156e+02, 2.898500061035156e+02, 2.920499877929688e+02, 2.970499877929688e+02, 2.959500122070312e+02, 3.025499877929688e+02, 3.020499877929688e+02, 3.053500061035156e+02, 2.964500122070312e+02, 3.031499938964844e+02, 2.981499938964844e+02, 3.0375e+02, 2.998500061035156e+02, 3.031499938964844e+02, 2.970499877929688e+02, 3.059500122070312e+02, 2.964500122070312e+02, 3.020499877929688e+02, 3.070499877929688e+02, 3.025499877929688e+02, 3.053500061035156e+02, 3.031499938964844e+02, 3.048500061035156e+02, 3.0425e+02, 2.948500061035156e+02, 2.998500061035156e+02, 2.975499877929688e+02, 2.981499938964844e+02, 3.020499877929688e+02, 2.998500061035156e+02, 3.025499877929688e+02, 2.9375e+02, 3.031499938964844e+02, 2.9925e+02, 2.9375e+02, 2.948500061035156e+02, 2.898500061035156e+02, 2.9375e+02, 3.003500061035156e+02, 2.925499877929688e+02, 2.8875e+02, 2.959500122070312e+02, 2.898500061035156e+02, 2.853500061035156e+02, 2.8875e+02, 2.8425e+02, 2.903500061035156e+02, 2.9375e+02, 2.9425e+02, 2.875499877929688e+02, 2.764500122070312e+02, 2.848500061035156e+02, 2.7925e+02, 2.753500061035156e+02, 2.731499938964844e+02, 2.7375e+02, 2.748500061035156e+02, 2.803500061035156e+02, 2.725499877929688e+02, 2.753500061035156e+02, 2.681499938964844e+02, 2.7375e+02, 2.714500122070312e+02, 2.709500122070312e+02, 2.759500122070312e+02]
+weaDat2.weaBus.TDryBul=[2.609500122070312e+02, 2.721241760253906e+02, 2.514559326171875e+02, 2.749552612304688e+02, 2.752900085449219e+02, 2.748500061035156e+02, 2.6801806640625e+02, 2.625499877929688e+02, 2.559499969482422e+02, 2.705828857421875e+02, 2.609500122070312e+02, 2.712843933105469e+02, 2.722561645507812e+02, 2.720389404296875e+02, 2.639713134765625e+02, 2.7425e+02, 2.713699951171875e+02, 2.732699890136719e+02, 2.7875e+02, 2.804643859863281e+02, 2.725499877929688e+02, 2.804530639648438e+02, 2.735158996582031e+02, 2.737742919921875e+02, 2.856371154785156e+02, 2.764500122070312e+02, 2.732782287597656e+02, 2.810541381835938e+02, 2.796654968261719e+02, 2.987295837402344e+02, 2.809500122070312e+02, 2.825499877929688e+02, 2.8153857421875e+02, 2.886300048828125e+02, 2.888379821777344e+02, 2.8425e+02, 2.879100036621094e+02, 2.791740112304688e+02, 2.911358032226562e+02, 2.938409118652344e+02, 2.825499877929688e+02, 3.0212158203125e+02, 2.913900146484375e+02, 3.000140075683594e+02, 2.889259948730469e+02, 2.914500122070312e+02, 2.8875e+02, 3.0375e+02, 2.79756103515625e+02, 2.962140502929688e+02, 2.959500122070312e+02, 2.957225341796875e+02, 2.929080505371094e+02, 3.001300048828125e+02, 2.979100036621094e+02, 2.998500061035156e+02, 3.010237731933594e+02, 2.920499877929688e+02, 3.001717224121094e+02, 2.98227783203125e+02, 2.859500122070312e+02, 2.96918212890625e+02, 2.927784729003906e+02, 2.895780944824219e+02, 3.005049743652344e+02, 2.920499877929688e+02, 2.935899963378906e+02, 2.937058410644531e+02, 2.910376281738281e+02, 2.925608520507812e+02, 2.8925e+02, 2.925499877929688e+02, 2.856871643066406e+02, 2.925940246582031e+02, 2.873388061523438e+02, 2.881499938964844e+02, 2.888507995605469e+02, 2.794700012207031e+02, 2.850619201660156e+02, 2.799443969726562e+02, 2.7925e+02, 2.823743286132812e+02, 2.778880310058594e+02, 2.807859802246094e+02, 2.935283203125e+02, 2.864500122070312e+02, 2.748500061035156e+02, 2.840026550292969e+02, 2.754036865234375e+02, 2.703080749511719e+02, 2.659500122070312e+02, 2.6183251953125e+02, 2.719844055175781e+02, 2.773255615234375e+02, 2.656995239257812e+02, 2.725499877929688e+02, 2.66414794921875e+02, 2.67631591796875e+02, 2.699956970214844e+02, 2.683118286132812e+02, 2.675e+02]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_DeadbandControl.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_DeadbandControl.txt
new file mode 100644
index 00000000000..fc2b1c615ad
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_DeadbandControl.txt
@@ -0,0 +1,48 @@
+last-generated=2021-09-28
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+deaCon.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaCon.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaCon.slaTemErr=[0e+00, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224257e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757204e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.96331709623341e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -1.214285850283147e-14, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303018e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726082e-01, 2.662958204746243e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -4.114813265867486e-16, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166518e-01, -2.750404179096224e-01, -2.364118248224267e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224267e-01, 2.750404179096224e-01, 1.645798683166518e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, 1.088063626285447e-13, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -8.229626531734973e-16]
+deaCon.uHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaCon.uCoo=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaCon1.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaCon1.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaCon1.slaTemErr=[0e+00, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224257e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757204e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.96331709623341e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -1.214285850283147e-14, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303018e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726082e-01, 2.662958204746243e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -4.114813265867486e-16, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166518e-01, -2.750404179096224e-01, -2.364118248224267e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224267e-01, 2.750404179096224e-01, 1.645798683166518e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, 1.088063626285447e-13, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -8.229626531734973e-16]
+deaCon1.uHea=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+deaCon1.uCoo=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaCon2.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaCon2.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaCon2.slaTemErr=[0e+00, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.87440800666809e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414796e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389061007e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -9.627551983719049e-14, 1.519694566726685e+00, 2.215619325637817e+00, 1.710539340972896e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552923e+00, 2.111345529556272e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -3.262458992940739e-15, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653453e+00, -2.180677652359011e+00, -1.874408006668097e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668097e+00, 2.180677652359011e+00, 1.304883241653453e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, 8.6267901459533e-13, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -6.524917985881477e-15]
+deaCon2.uHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaCon2.uCoo=[0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaCon3.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaCon3.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaCon3.slaTemErr=[0e+00, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.87440800666809e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414796e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389061007e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -9.627551983719049e-14, 1.519694566726685e+00, 2.215619325637817e+00, 1.710539340972896e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552923e+00, 2.111345529556272e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -3.262458992940739e-15, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653453e+00, -2.180677652359011e+00, -1.874408006668097e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668097e+00, 2.180677652359011e+00, 1.304883241653453e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, 8.6267901459533e-13, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -6.524917985881477e-15]
+deaCon3.uHea=[1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+deaCon3.uCoo=[0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTes.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaConTes.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaConTes.slaTemErr=[0e+00, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224257e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757204e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.96331709623341e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -1.214285850283147e-14, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303018e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726082e-01, 2.662958204746243e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -4.114813265867486e-16, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166518e-01, -2.750404179096224e-01, -2.364118248224267e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224267e-01, 2.750404179096224e-01, 1.645798683166518e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, 1.088063626285447e-13, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -8.229626531734973e-16]
+deaConTes.uHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTes.uCoo=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTes1.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaConTes1.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaConTes1.slaTemErr=[0e+00, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.87440800666809e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414796e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389061007e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -9.627551983719049e-14, 1.519694566726685e+00, 2.215619325637817e+00, 1.710539340972896e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552923e+00, 2.111345529556272e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -3.262458992940739e-15, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653453e+00, -2.180677652359011e+00, -1.874408006668097e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668097e+00, 2.180677652359011e+00, 1.304883241653453e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, 8.6267901459533e-13, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -6.524917985881477e-15]
+deaConTes1.uHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTes1.uCoo=[0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTesFal.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaConTesFal.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaConTesFal.slaTemErr=[0e+00, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224257e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757204e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.96331709623341e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -1.214285850283147e-14, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303018e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726082e-01, 2.662958204746243e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -4.114813265867486e-16, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166518e-01, -2.750404179096224e-01, -2.364118248224267e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224267e-01, 2.750404179096224e-01, 1.645798683166518e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, 1.088063626285447e-13, 1.916731894016266e-01, 2.794474959373474e-01, 2.157437056303024e-01, 3.509330376982689e-02, -1.645798683166504e-01, -2.750404179096222e-01, -2.364118248224258e-01, -6.963317096233368e-02, 1.348910331726074e-01, 2.662958204746246e-01, 2.533515691757202e-01, 1.030748784542084e-01, -1.030748784542084e-01, -2.533515691757202e-01, -2.662958204746246e-01, -1.348910331726074e-01, 6.963317096233368e-02, 2.364118248224258e-01, 2.750404179096222e-01, 1.645798683166504e-01, -3.509330376982689e-02, -2.157437056303024e-01, -2.794474959373474e-01, -1.916731894016266e-01, -8.229626531734973e-16]
+deaConTesFal.uHea=[1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+deaConTesFal.uCoo=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+deaConTesFal1.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+deaConTesFal1.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
+deaConTesFal1.slaTemErr=[0e+00, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.87440800666809e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414796e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389061007e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -9.627551983719049e-14, 1.519694566726685e+00, 2.215619325637817e+00, 1.710539340972896e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552923e+00, 2.111345529556272e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -3.262458992940739e-15, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653453e+00, -2.180677652359011e+00, -1.874408006668097e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668097e+00, 2.180677652359011e+00, 1.304883241653453e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, 8.6267901459533e-13, 1.519694566726685e+00, 2.215619325637817e+00, 1.7105393409729e+00, 2.782397866249084e-01, -1.304883241653442e+00, -2.180677652359009e+00, -1.874408006668091e+00, -5.520915389060974e-01, 1.069493174552917e+00, 2.111345529556274e+00, 2.008716106414795e+00, 8.172364830970764e-01, -8.172364830970764e-01, -2.008716106414795e+00, -2.111345529556274e+00, -1.069493174552917e+00, 5.520915389060974e-01, 1.874408006668091e+00, 2.180677652359009e+00, 1.304883241653442e+00, -2.782397866249084e-01, -1.7105393409729e+00, -2.215619325637817e+00, -1.519694566726685e+00, -6.524917985881477e-15]
+deaConTesFal1.uHea=[1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00]
+deaConTesFal1.uCoo=[0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabError.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabError.txt
new file mode 100644
index 00000000000..d1ea6f51f3e
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabError.txt
@@ -0,0 +1,11 @@
+last-generated=2020-10-07
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.72e+05]
+err.TSlaSet=[2.942999877929688e+02, 2.942999877929688e+02]
+err.TSla=[2.942999877929688e+02, 3.016431274414062e+02, 3.088715515136719e+02, 3.158722534179688e+02, 3.225359191894531e+02, 3.287583618164062e+02, 3.344424133300781e+02, 3.394992370605469e+02, 3.438498229980469e+02, 3.474261779785156e+02, 3.501724243164062e+02, 3.52045654296875e+02, 3.530166320800781e+02, 3.530701293945312e+02, 3.522053527832031e+02, 3.50435791015625e+02, 3.477890930175781e+02, 3.44306640625e+02, 3.400428161621094e+02, 3.350642700195312e+02, 3.294487609863281e+02, 3.232840576171875e+02, 3.166664733886719e+02, 3.096994018554688e+02, 3.024917297363281e+02, 2.951560668945312e+02, 2.878070068359375e+02, 2.805594177246094e+02, 2.735265197753906e+02, 2.668182067871094e+02, 2.605392761230469e+02, 2.547879028320312e+02, 2.496538848876953e+02, 2.452174835205078e+02, 2.415479888916016e+02, 2.387027587890625e+02, 2.367262268066406e+02, 2.356493072509766e+02, 2.354888000488281e+02, 2.362472229003906e+02, 2.379127349853516e+02, 2.404593048095703e+02, 2.438471374511719e+02, 2.480233001708984e+02, 2.529225311279297e+02, 2.584682922363281e+02, 2.645739440917969e+02, 2.7114404296875e+02, 2.780759887695312e+02, 2.852614135742188e+02, 2.925880737304688e+02, 2.999414672851562e+02, 3.072067260742188e+02, 3.142703247070312e+02, 3.210218811035156e+02, 3.273558959960938e+02, 3.331734313964844e+02, 3.383835449218749e+02, 3.429048461914062e+02, 3.466666870117188e+02, 3.496103210449219e+02, 3.51689697265625e+02, 3.528723754882812e+02, 3.531398315429688e+02, 3.524879150390625e+02, 3.509268188476562e+02, 3.484809265136719e+02, 3.451884460449219e+02, 3.411007995605468e+02, 3.362819213867188e+02, 3.308070678710938e+02, 3.247617797851562e+02, 3.182405090332031e+02, 3.113451843261719e+02, 3.041835327148438e+02, 2.96867431640625e+02, 2.8951123046875e+02, 2.822298583984375e+02, 2.751370544433594e+02, 2.683436889648438e+02, 2.619559020996094e+02, 2.56073486328125e+02, 2.507883605957031e+02, 2.461831207275391e+02, 2.423297119140625e+02, 2.39288330078125e+02, 2.371065216064453e+02, 2.35818359375e+02, 2.354439849853516e+02, 2.359892425537109e+02, 2.374456024169922e+02, 2.397903289794922e+02, 2.429867706298828e+02, 2.469849853515625e+02, 2.517225036621094e+02, 2.571253051757812e+02, 2.631089477539062e+02, 2.695799560546875e+02, 2.764372253417969e+02, 2.835736083984375e+02, 2.908775939941406e+02]
+err.slaTemErr=[0e+00, 7.3431396484375e+00, 1.457154178619385e+01, 2.157226181030273e+01, 2.823591423034668e+01, 3.445837783813477e+01, 4.014242172241211e+01, 4.51992416381836e+01, 4.95498161315918e+01, 5.312617111206055e+01, 5.587242126464844e+01, 5.774566268920898e+01, 5.871662139892578e+01, 5.877012634277344e+01, 5.790534210205078e+01, 5.613578033447266e+01, 5.348908996582031e+01, 5.000662994384765e+01, 4.574281311035156e+01, 4.076425552368164e+01, 3.514875411987305e+01, 2.898405075073242e+01, 2.236646842956543e+01, 1.539940738677979e+01, 8.191728591918945e+00, 8.560538291931152e-01, -6.492997169494629e+00, -1.374059391021729e+01, -2.077349281311038e+01, -2.748180389404297e+01, -3.376070785522461e+01, -3.951210021972656e+01, -4.464611053466797e+01, -4.908251953125e+01, -5.2752010345459e+01, -5.55972442626953e+01, -5.757376861572266e+01, -5.865069580078125e+01, -5.881119918823242e+01, -5.805276870727539e+01, -5.638726425170898e+01, -5.38406982421875e+01, -5.045286560058594e+01, -4.627670669555664e+01, -4.137746429443359e+01, -3.583169937133789e+01, -2.97260570526123e+01, -2.315594291687012e+01, -1.622401428222656e+01, -9.03858470916748e+00, -1.711926579475403e+00, 5.641480922698975e+00, 1.290674018859863e+01, 1.997032928466797e+01, 2.672187995910645e+01, 3.305590057373052e+01, 3.887341690063482e+01, 4.408353424072261e+01, 4.860483932495117e+01, 5.236669158935547e+01, 5.531030654907227e+01, 5.738969421386719e+01, 5.857236099243164e+01, 5.883982849121094e+01, 5.818791961669922e+01, 5.66268196105957e+01, 5.418091583251953e+01, 5.088843154907227e+01, 4.680081176757809e+01, 4.198192214965825e+01, 3.650706100463872e+01, 3.04617748260498e+01, 2.394051933288574e+01, 1.704519081115723e+01, 9.883529663085938e+00, 2.567437171936035e+00, -4.788771629333496e+00, -1.207015514373779e+01, -1.916294097900391e+01, -2.59563045501709e+01, -3.234409713745117e+01, -3.822651290893555e+01, -4.351163101196289e+01, -4.811687850952148e+01, -5.197029495239258e+01, -5.501166915893555e+01, -5.71934814453125e+01, -5.848163986206055e+01, -5.885601425170898e+01, -5.831076049804688e+01, -5.685439300537109e+01, -5.450967025756836e+01, -5.1313232421875e+01, -4.731501388549805e+01, -4.257749557495117e+01, -3.717470169067383e+01, -3.119104766845703e+01, -2.472002983093262e+01, -1.786276054382324e+01, -1.072638320922852e+01, -3.422404527664185e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabSetpointPerimeterZone.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabSetpointPerimeterZone.txt
new file mode 100644
index 00000000000..60da3160002
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_SlabTemperatureSignal_Validation_SlabSetpointPerimeterZone.txt
@@ -0,0 +1,10 @@
+last-generated=2020-10-07
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.6416e+06]
+slaSetPer.TFor=[2.748166809082031e+02, 2.748166809082031e+02, 2.748166809082031e+02, 2.748167114257812e+02, 2.748167114257812e+02, 2.748167114257812e+02, 2.75594482421875e+02, 2.766500244140625e+02, 2.777055969238281e+02, 2.787611389160156e+02, 2.798166809082031e+02, 2.803722839355469e+02, 2.803723754882812e+02, 2.803724975585938e+02, 2.803725891113281e+02, 2.803726806640625e+02, 2.80594970703125e+02, 2.816504211425781e+02, 2.827058715820312e+02, 2.837613220214844e+02, 2.848167724609375e+02, 2.858722229003906e+02, 2.859278869628906e+02, 2.85927978515625e+02, 2.859281005859375e+02, 2.859281921386719e+02, 2.859283142089844e+02, 2.866504821777344e+02, 2.877059326171875e+02, 2.887613830566406e+02, 2.898168334960938e+02, 2.908722839355469e+02, 2.914833679199219e+02, 2.914834899902344e+02, 2.914835815429688e+02, 2.914837036132812e+02, 2.914837951660156e+02, 2.915172119140625e+02, 2.917282104492188e+02, 2.91939208984375e+02, 2.921502075195312e+02, 2.923612365722656e+02, 2.925722351074219e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.92594482421875e+02, 2.92594482421875e+02, 2.92594482421875e+02, 2.926611633300781e+02, 2.927666931152344e+02, 2.928722534179688e+02, 2.92977783203125e+02, 2.930833435058594e+02, 2.931499938964844e+02, 2.931500244140625e+02, 2.931500244140625e+02, 2.931500244140625e+02, 2.931500549316406e+02, 2.931944885253906e+02, 2.9361669921875e+02, 2.940389099121094e+02, 2.944611206054688e+02, 2.948833312988281e+02, 2.953055419921875e+02, 2.953722229003906e+02, 2.953722534179688e+02, 2.953722534179688e+02, 2.953722534179688e+02, 2.953722839355469e+02, 2.954333801269531e+02, 2.955389404296875e+02, 2.956444702148438e+02, 2.957500305175781e+02, 2.958555603027344e+02, 2.959277954101562e+02, 2.959277954101562e+02, 2.959277954101562e+02, 2.959278259277344e+02, 2.959278259277344e+02, 2.959667358398438e+02, 2.967055969238281e+02, 2.974444885253906e+02, 2.98183349609375e+02, 2.989222412109375e+02, 2.996611022949219e+02, 2.998167419433594e+02, 2.998168640136719e+02, 2.998169555664062e+02, 2.998170776367188e+02, 2.998171691894531e+02, 3.000949401855469e+02, 3.006226196289062e+02, 3.011502990722656e+02, 3.016779479980469e+02, 3.022056274414062e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02]
+slaSetPer.TSlaSetPer=[3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.025944519042969e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 3.009277648925781e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.9870556640625e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.964833374023438e+02, 2.959277648925782e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.959277648925781e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.953722229003906e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.925944519042969e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02, 2.914833374023438e+02]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockout.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockout.txt
new file mode 100644
index 00000000000..184f128716c
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockout.txt
@@ -0,0 +1,17 @@
+last-generated=2021-09-28
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.728e+05]
+conPluLoc.yHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00]
+conPluLoc.yCoo=[0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 9.999999999999091e-01, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+conPluLoc.allLoc.yHea=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00]
+conPluLoc.allLoc.yCoo=[0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 9.999999999999091e-01, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00]
+conPluLoc.deaCon.uCoo=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00]
+conPluLoc.deaCon.uHea=[0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00]
+conPluLoc.err.slaTemErr=[3.00000011920929e-01, 1.76567554473877e+01, 1.648563003540039e+01, -1.963230609893799e+00, -1.799615287780762e+01, -1.449841213226318e+01, 4.796245098114014e+00, 1.929127883911133e+01, 1.351362037658691e+01, -6.369230270385742e+00, -1.913285255432129e+01, -1.115241527557373e+01, 9.05317497253418e+00, 1.991498184204102e+01, 9.838309288024861e+00, -1.042025661468506e+01, -1.923523139953613e+01, -7.196858406066852e+00, 1.284421348571777e+01, 1.949466705322266e+01, 5.655316829681396e+00, -1.39006929397583e+01, -1.829783630371094e+01, -2.84227728843689e+00, 1.596757984161377e+01, 1.805270767211914e+01, 1.187285184860229e+00, -1.662528991699219e+01, -1.637056159973139e+01, 1.679553031921387e+00, 1.825703239440918e+01, 1.566585063934326e+01, -3.327972888946533e+00, -1.844902992248535e+01, -1.355599021911614e+01, 6.127955913543615e+00, 1.959071159362793e+01, 1.246113967895508e+01, -7.650130271911621e+00, -1.927484512329102e+01, -1.000392627716064e+01, 1.026616287231445e+01, 1.989763450622559e+01, 8.609146118164062e+00, -1.154913806915283e+01, -1.905877876281738e+01, -5.903430938720703e+00, 1.387391662597656e+01, 1.916146469116211e+01, 4.314894199371338e+00, -1.481746959686279e+01, -1.781233215332031e+01, -1.472754716873169e+00, 1.675919151306152e+01, 1.742138290405273e+01, -1.930524706842309e-01, -1.728116607666023e+01, -1.560184764862069e+01, 3.052277088165283e+00, 1.876841735839844e+01, 1.477000713348389e+01, -4.674756050109863e+00, -1.880909729003906e+01, -1.254497909545898e+01, 7.430817604064941e+00, 1.979465484619141e+01, 1.134845924377441e+01, -8.89167594909668e+00, -1.931993865966795e+01, -8.804430961609036e+00, 1.142981719970687e+01, 1.978327751159668e+01, 7.338850975036621e+00, -1.261936473846436e+01, -1.878649711608887e+01, -4.579295635223389e+00, 1.483642578125e+01, 1.873489379882812e+01, 2.954596996307373e+00, -1.565941333770752e+01, -1.723716926574707e+01, -9.445692598819733e-02, 1.746932792663574e+01, 1.67053050994873e+01, -1.57094943523407e+00, -1.785001564025879e+01, -1.475441551208496e+01, 4.411376953125e+00, 1.918838310241699e+01, 1.380253601074219e+01, -5.996913433074951e+00, -1.90745735168457e+01, -1.147038459777832e+01, 8.698380470275879e+00, 1.99020938873291e+01, 1.018108749389648e+01, -1.0087721824646e+01, -1.926791000366211e+01, -7.559868335723877e+00, 1.25383768081665e+01, 1.957247543334961e+01]
+conPluLoc.deaCon.TDeaRel=[2.220000028610229e+00, 2.220000028610229e+00]
+conPluLoc.deaCon.TDeaNor=[2.800000011920929e-01, 2.800000011920929e-01]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutCore.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutCore.txt
new file mode 100644
index 00000000000..2257a3bed21
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutCore.txt
@@ -0,0 +1,17 @@
+last-generated=2021-09-29
+statistics-initialization=
+{
+ "linear": "0",
+ "nonlinear": "26, 1, 1",
+ "numerical Jacobians": "0"
+}
+statistics-simulation=
+{
+ "linear": "0, 6, 0, 0, 0, 0, 0",
+ "nonlinear": "2, 0, 1, 0, 0, 1, 0",
+ "number of continuous time states": "47",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 3.1536e+07]
+temRoo.T=[2.931499938964844e+02, 2.967834777832031e+02, 2.958287353515625e+02, 2.969026489257812e+02, 2.965056457519531e+02, 2.955142822265625e+02, 2.968980102539062e+02, 2.967070922851562e+02, 2.955486755371094e+02, 2.969658203125e+02, 2.96411376953125e+02, 2.960313415527344e+02, 2.970990600585938e+02, 2.9647705078125e+02, 2.956007080078125e+02, 2.971886901855469e+02, 2.964459838867188e+02, 2.962087707519531e+02, 2.970293579101562e+02, 2.951354675292969e+02, 2.967900390625e+02, 2.967536926269531e+02, 2.958290100097656e+02, 2.969025268554688e+02, 2.965057067871094e+02, 2.955142211914062e+02, 2.968981628417969e+02, 2.9670703125e+02, 2.955486450195312e+02, 2.969657287597656e+02, 2.964113159179688e+02, 2.960313415527344e+02, 2.970990905761719e+02, 2.964771118164062e+02, 2.956012573242188e+02, 2.971887512207031e+02, 2.964459838867188e+02, 2.962088012695312e+02, 2.970293884277344e+02, 2.95135498046875e+02, 2.967898864746094e+02, 2.967537841796875e+02, 2.958287658691406e+02, 2.969025573730469e+02, 2.965055847167969e+02, 2.955142517089844e+02, 2.968982238769531e+02, 2.967072143554688e+02, 2.95548828125e+02, 2.969657592773438e+02, 2.964113159179688e+02, 2.960313415527344e+02, 2.970990600585938e+02, 2.9647705078125e+02, 2.956007690429688e+02, 2.971886901855469e+02, 2.964461059570312e+02, 2.962088012695312e+02, 2.970294494628906e+02, 2.951354675292969e+02, 2.967898864746094e+02, 2.967537536621094e+02, 2.958287658691406e+02, 2.969026794433594e+02, 2.965056457519531e+02, 2.955142517089844e+02, 2.968989868164062e+02, 2.967070922851562e+02, 2.955486755371094e+02, 2.969657897949219e+02, 2.964113159179688e+02, 2.960315856933594e+02, 2.970993041992188e+02, 2.964771728515625e+02, 2.956007385253906e+02, 2.971887817382812e+02, 2.964460144042969e+02, 2.962097778320312e+02, 2.970293884277344e+02, 2.951354370117188e+02, 2.967900085449219e+02, 2.967536926269531e+02, 2.958287658691406e+02, 2.969025268554688e+02, 2.96505615234375e+02, 2.955142517089844e+02, 2.968981018066406e+02, 2.967071533203125e+02, 2.955487060546875e+02, 2.969658203125e+02, 2.964113464355469e+02, 2.960313110351562e+02, 2.970991516113281e+02, 2.964771423339844e+02, 2.956007385253906e+02, 2.971887817382812e+02, 2.964460144042969e+02, 2.962088928222656e+02, 2.970294494628906e+02, 2.951355285644531e+02, 2.967900085449219e+02]
+conPluLoc.err.slaTemErr=[1.755537223815918e+01, 9.295845627784729e-01, 4.058699905872345e-01, 1.497451663017273e+00, -5.144079923629761e-01, 7.816773056983948e-01, 1.453242659568787e+00, 1.012065410614014e+00, -5.580535531044006e-01, 1.40313196182251e+00, 6.349849700927734e-02, 1.042451858520508e+00, 1.34908664226532e+00, -2.711388468742371e-01, -8.684520423412323e-02, 1.28193986415863e+00, 1.082977294921875e+00, -2.417664974927902e-01, 1.173708915710449e+00, -5.989688634872437e-01, 1.53133761882782e+00, 8.454468250274658e-01, 4.063338041305542e-01, 1.497297883033752e+00, -5.143632888793945e-01, 7.812905311584473e-01, 1.453413367271423e+00, 1.011811017990112e+00, -5.579788088798523e-01, 1.402995109558105e+00, 6.31755068898201e-02, 1.042362332344055e+00, 1.349113464355469e+00, -2.710330188274384e-01, -8.806069940328598e-02, 1.282040357589722e+00, 1.082963943481445e+00, -2.417549192905426e-01, 1.173752307891846e+00, -5.989752411842346e-01, 1.531195759773254e+00, 8.455950617790222e-01, 4.059745073318481e-01, 1.49731719493866e+00, -5.144258737564087e-01, 7.815444469451904e-01, 1.453501343727112e+00, 1.012638688087463e+00, -5.579422116279602e-01, 1.403053045272827e+00, 6.32123276591301e-02, 1.042425513267517e+00, 1.349074125289917e+00, -2.712140083312988e-01, -8.703448623418808e-02, 1.281927704811096e+00, 1.083021879196167e+00, -2.417514026165009e-01, 1.173947215080261e+00, -5.989276170730591e-01, 1.531187534332275e+00, 8.455938100814819e-01, 4.059410989284515e-01, 1.497478246688843e+00, -5.143990516662598e-01, 7.814865708351135e-01, 1.454474925994873e+00, 1.011969804763794e+00, -5.579713582992554e-01, 1.403086304664612e+00, 6.336884200572968e-02, 1.042255163192749e+00, 1.349479079246521e+00, -2.709043622016907e-01, -8.696615695953369e-02, 1.282132744789124e+00, 1.083011150360107e+00, -2.410746365785599e-01, 1.173794031143188e+00, -5.989142060279846e-01, 1.531310558319092e+00, 8.45399796962738e-01, 4.059370756149292e-01, 1.497290968894958e+00, -5.144168138504028e-01, 7.817845344543457e-01, 1.453338623046875e+00, 1.01226282119751e+00, -5.579673051834106e-01, 1.40313708782196e+00, 6.314811855554581e-02, 1.042360544204712e+00, 1.349197030067444e+00, -2.709565460681915e-01, -8.696587383747101e-02, 1.282163143157959e+00, 1.083011627197266e+00, -2.41695910692215e-01, 1.173922896385193e+00, -5.990045070648193e-01, 1.531326293945312e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutPerimeter.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutPerimeter.txt
new file mode 100644
index 00000000000..5303cc43433
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Controls_OBC_RadiantSystems_CoolingAndHeating_Validation_ControlPlusLockoutPerimeter.txt
@@ -0,0 +1,17 @@
+last-generated=2021-09-29
+statistics-initialization=
+{
+ "linear": "0",
+ "nonlinear": "33, 1, 1",
+ "numerical Jacobians": "0"
+}
+statistics-simulation=
+{
+ "linear": "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0",
+ "nonlinear": "1, 16, 2, 1, 0, 0, 1, 0",
+ "number of continuous time states": "51",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 3.1536e+07]
+temRoo.T=[2.931499938964844e+02, 2.991380310058594e+02, 2.9792724609375e+02, 2.981222229003906e+02, 3.002405395507812e+02, 2.974573974609375e+02, 2.984290466308594e+02, 2.980887145996094e+02, 2.978960876464844e+02, 2.977198791503906e+02, 2.9971923828125e+02, 2.97709228515625e+02, 2.986314392089844e+02, 2.991258239746094e+02, 2.978619995117188e+02, 2.98617919921875e+02, 2.987038879394531e+02, 2.977402648925781e+02, 2.995280151367188e+02, 2.973616638183594e+02, 2.983988952636719e+02, 3.016913757324219e+02, 2.9786328125e+02, 2.976716003417969e+02, 2.991410217285156e+02, 2.979093322753906e+02, 2.980051574707031e+02, 2.999259338378906e+02, 2.968992919921875e+02, 2.949406433105469e+02, 3.000841064453125e+02, 2.939081115722656e+02, 2.9917822265625e+02, 2.990643920898438e+02, 2.928970336914062e+02, 2.998323974609375e+02, 2.988940124511719e+02, 2.97428955078125e+02, 2.995812072753906e+02, 2.938805236816406e+02, 2.940868225097656e+02, 2.960816040039062e+02, 2.933052062988281e+02, 2.955489807128906e+02, 2.957475891113281e+02, 2.931882629394531e+02, 2.948423156738281e+02, 2.960416870117188e+02, 2.925382995605469e+02, 2.954888610839844e+02, 2.962865295410156e+02, 2.936523132324219e+02, 2.963792419433594e+02, 2.953589477539062e+02, 2.935868225097656e+02, 2.966022338867188e+02, 2.950634460449219e+02, 2.944002380371094e+02, 2.962874755859375e+02, 2.936629943847656e+02, 2.969270324707031e+02, 2.962579650878906e+02, 2.937930603027344e+02, 2.955827026367188e+02, 2.960780944824219e+02, 2.932419738769531e+02, 2.945039367675781e+02, 2.983350219726562e+02, 2.931078186035156e+02, 2.956939697265625e+02, 2.977564697265625e+02, 2.967014465332031e+02, 2.990668640136719e+02, 2.980747375488281e+02, 2.924892272949219e+02, 2.984802551269531e+02, 2.992041625976562e+02, 2.963311462402344e+02, 2.987955627441406e+02, 2.973537902832031e+02, 2.971219482421875e+02, 3.00548583984375e+02, 2.973403625488281e+02, 2.9605419921875e+02, 2.979306640625e+02, 2.979486999511719e+02, 2.977791748046875e+02, 3.011610107421875e+02, 2.977419738769531e+02, 2.985646362304688e+02, 2.996318664550781e+02, 2.981434020996094e+02, 2.977160339355469e+02, 2.994490356445312e+02, 2.981911010742188e+02, 2.983753356933594e+02, 2.98715087890625e+02, 2.974428405761719e+02, 2.998899841308594e+02, 2.976011657714844e+02, 2.970408325195312e+02]
+conPluLoc.err.slaTemErr=[-1.117940998077393e+01, -2.460771322250366e+00, -1.295955300331116e+00, -1.75690495967865e+00, -6.386943459510803e-01, -1.669893741607666e+00, -1.192263007164001e+00, -2.956996202468872e+00, -9.14178729057312e-01, -3.607425928115845e+00, -1.956180572509766e+00, -7.34416663646698e-01, -1.726309061050415e+00, -6.493368744850159e-01, -1.706343740224838e-01, -1.422205448150635e+00, -1.262929677963257e+00, -3.140994310379028e-01, -8.368476033210754e-01, -2.227312326431274e+00, -1.310235857963562e+00, -5.138552188873291e-01, -1.461961507797241e+00, -2.287137031555176e+00, -6.697673797607422e-01, -1.460105538368225e+00, -1.902758598327637e+00, -9.631554484367371e-01, 2.895825803279877e-01, 1.044701933860779e+00, -1.287631273269653e+00, -4.640185832977295e-01, -1.562738060951233e+00, -8.26257050037384e-01, -3.677635788917542e-01, -1.575633883476257e+00, 2.400926053524017e-01, -3.210480809211731e-01, 1.461589783430099e-01, -2.389632612466812e-01, 1.256667137145996e+00, 1.194122135639191e-01, 1.176136612892151e+00, 1.764332175254822e+00, -2.03187108039856e-01, 1.935549229383469e-01, 1.01181435585022e+00, -3.242594003677368e-02, 8.987666964530945e-01, 1.676144480705261e+00, -2.16558426618576e-01, 8.384628891944885e-01, 1.135668158531189e+00, -3.661463037133217e-02, -2.538636326789856e-01, 8.987968564033508e-01, 8.775004744529724e-02, 7.076625823974609e-01, 4.099160432815552e-01, -2.744165062904358e-01, 7.436357736587524e-01, 8.082691580057144e-03, -5.281891673803329e-02, 1.805238246917725e+00, 2.201799899339676e-01, 1.105659008026123e+00, 1.318194627761841e+00, -4.511698782444e-01, 1.080740809440613e+00, 1.179087519645691e+00, 5.261560678482056e-01, 2.441460452973843e-02, -4.265106618404388e-01, -2.390419691801071e-01, -2.442401200532913e-01, -1.505461484193802e-01, -7.347220182418823e-01, 2.979852676391602e+00, -6.08220636844635e-01, -2.049362182617188e+00, -1.055885553359985e+00, -1.101763248443604e+00, -8.795883655548096e-01, -1.516335010528564e-01, -1.649630963802338e-01, -5.889893174171448e-01, -2.085504531860352e+00, -7.56988525390625e-01, -1.616423010826111e+00, -1.167066812515259e+00, -1.59670102596283e+00, -1.336653470993042e+00, -2.425960302352905e+00, -7.89857804775238e-01, -1.559522986412048e+00, -1.986232757568359e+00, -1.449246168136597e+00, -2.56641960144043e+00, -1.709798216819763e+00, -2.339995622634888e+00, -2.046144962310791e+00]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_Lighting_Validation_DaylightControl.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_Lighting_Validation_DaylightControl.txt
new file mode 100644
index 00000000000..b19cc778884
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_Lighting_Validation_DaylightControl.txt
@@ -0,0 +1,12 @@
+last-generated=2020-10-05
+statistics-simulation=
+{
+ "linear": " ",
+ "nonlinear": " ",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 1.44e+04]
+dayConCon.yLigLev=[1e+02, 9.9e+01, 9.8e+01, 9.7e+01, 9.6e+01, 9.5e+01, 9.4e+01, 9.3e+01, 9.2e+01, 9.1e+01, 9e+01, 8.9e+01, 8.8e+01, 8.7e+01, 8.6e+01, 8.5e+01, 8.4e+01, 8.3e+01, 8.2e+01, 8.1e+01, 8e+01, 7.9e+01, 7.8e+01, 7.7e+01, 7.6e+01, 7.5e+01, 7.4e+01, 7.3e+01, 7.2e+01, 7.1e+01, 7e+01, 6.9e+01, 6.8e+01, 6.7e+01, 6.6e+01, 6.5e+01, 6.4e+01, 6.3e+01, 6.2e+01, 6.1e+01, 6e+01, 5.9e+01, 5.8e+01, 5.7e+01, 5.6e+01, 5.5e+01, 5.4e+01, 5.3e+01, 5.2e+01, 5.1e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01]
+dayConCon.uDayLev=[0e+00, 1e+00, 2e+00, 3e+00, 4e+00, 5e+00, 6e+00, 7.000000000000001e+00, 8e+00, 9e+00, 1e+01, 1.1e+01, 1.2e+01, 1.3e+01, 1.4e+01, 1.5e+01, 1.6e+01, 1.7e+01, 1.8e+01, 1.9e+01, 2e+01, 2.1e+01, 2.2e+01, 2.3e+01, 2.4e+01, 2.5e+01, 2.6e+01, 2.7e+01, 2.8e+01, 2.9e+01, 3e+01, 3.1e+01, 3.2e+01, 3.3e+01, 3.4e+01, 3.5e+01, 3.6e+01, 3.7e+01, 3.8e+01, 3.9e+01, 4e+01, 4.1e+01, 4.2e+01, 4.3e+01, 4.4e+01, 4.5e+01, 4.6e+01, 4.7e+01, 4.8e+01, 4.9e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01, 5e+01]
+dayConCon.uLigSet=[1e+02, 1e+02]
+dayConCon.yLigSig=[1e+00, 9.900000095367432e-01, 9.800000190734863e-01, 9.700000286102295e-01, 9.599999785423279e-01, 9.49999988079071e-01, 9.399999976158142e-01, 9.300000071525574e-01, 9.200000166893005e-01, 9.100000262260437e-01, 8.999999761581421e-01, 8.899999856948853e-01, 8.799999952316284e-01, 8.700000047683716e-01, 8.600000143051147e-01, 8.500000238418579e-01, 8.399999737739563e-01, 8.299999833106995e-01, 8.199999928474426e-01, 8.100000023841858e-01, 8.00000011920929e-01, 7.900000214576721e-01, 7.799999713897705e-01, 7.699999809265137e-01, 7.599999904632568e-01, 7.5e-01, 7.400000095367432e-01, 7.300000190734863e-01, 7.200000286102295e-01, 7.099999785423279e-01, 6.99999988079071e-01, 6.899999976158142e-01, 6.800000071525574e-01, 6.700000166893005e-01, 6.600000262260437e-01, 6.499999761581421e-01, 6.399999856948853e-01, 6.299999952316284e-01, 6.200000047683716e-01, 6.100000143051147e-01, 6.000000238418579e-01, 5.899999737739563e-01, 5.799999833106995e-01, 5.699999928474426e-01, 5.600000023841858e-01, 5.50000011920929e-01, 5.400000214576721e-01, 5.299999713897705e-01, 5.199999809265137e-01, 5.099999904632568e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01, 5e-01]
diff --git a/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_RadiantControl_Validation_ControlPlusLockoutPerim.txt b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_RadiantControl_Validation_ControlPlusLockoutPerim.txt
new file mode 100644
index 00000000000..dbf0af42171
--- /dev/null
+++ b/Buildings/Resources/ReferenceResults/Dymola/Buildings_Experimental_RadiantControl_Validation_ControlPlusLockoutPerim.txt
@@ -0,0 +1,16 @@
+last-generated=2020-10-07
+statistics-initialization=
+{
+ "nonlinear": "33, 1, 1",
+ "numerical Jacobians": "0"
+}
+statistics-simulation=
+{
+ "linear": "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0",
+ "nonlinear": "1, 16, 1, 1, 0, 1, 0, 1",
+ "number of continuous time states": "51",
+ "numerical Jacobians": "0"
+}
+time=[0e+00, 3.1536e+07]
+temRoo.T=[2.931499938964844e+02, 2.985999755859375e+02, 2.981135559082031e+02, 2.980956726074219e+02, 3.003302917480469e+02, 2.975601806640625e+02, 2.982218627929688e+02, 2.982024536132812e+02, 2.975310363769531e+02, 2.983330078125e+02, 2.997538452148438e+02, 2.981420288085938e+02, 2.993185729980469e+02, 2.98927001953125e+02, 2.976475524902344e+02, 2.986128845214844e+02, 2.988428039550781e+02, 2.977586975097656e+02, 2.996137390136719e+02, 2.975403137207031e+02, 2.985108337402344e+02, 3.017957153320312e+02, 2.980899047851562e+02, 2.976682434082031e+02, 2.990729675292969e+02, 2.980985107421875e+02, 2.980596313476562e+02, 2.994658203125e+02, 2.967253723144531e+02, 2.951704406738281e+02, 2.997709350585938e+02, 2.938026733398438e+02, 2.992688293457031e+02, 2.99000732421875e+02, 2.927331237792969e+02, 2.998629760742188e+02, 2.986976318359375e+02, 2.976665344238281e+02, 2.994018249511719e+02, 2.938548889160156e+02, 2.936964721679688e+02, 2.960244445800781e+02, 2.933770751953125e+02, 2.953165893554688e+02, 2.9581982421875e+02, 2.92890625e+02, 2.950178527832031e+02, 2.961273498535156e+02, 2.925163269042969e+02, 2.950986022949219e+02, 2.965729675292969e+02, 2.936395874023438e+02, 2.964200744628906e+02, 2.957411499023438e+02, 2.936789855957031e+02, 2.964666137695312e+02, 2.951060791015625e+02, 2.941731262207031e+02, 2.961506042480469e+02, 2.938124694824219e+02, 2.969645080566406e+02, 2.962959899902344e+02, 2.940001220703125e+02, 2.952363891601562e+02, 2.960873107910156e+02, 2.93234375e+02, 2.942110900878906e+02, 2.983921508789062e+02, 2.932344665527344e+02, 2.954605712890625e+02, 2.977778930664062e+02, 2.966698913574219e+02, 2.98906982421875e+02, 2.98015380859375e+02, 2.9254931640625e+02, 2.984728698730469e+02, 2.994780578613281e+02, 2.966322021484375e+02, 2.988002624511719e+02, 2.976415100097656e+02, 2.975435791015625e+02, 3.003123474121094e+02, 2.974136657714844e+02, 2.963961181640625e+02, 2.977920532226562e+02, 2.979901123046875e+02, 2.979013977050781e+02, 3.012445373535156e+02, 2.980732116699219e+02, 2.984628601074219e+02, 2.996015625e+02, 2.981805725097656e+02, 2.978874206542969e+02, 2.995936279296875e+02, 2.982340698242188e+02, 2.989595336914062e+02, 2.984843444824219e+02, 2.974682312011719e+02, 2.997114562988281e+02, 2.972613220214844e+02, 2.969582824707031e+02]
+conPluLoc.err.slaTemErr=[-9.44444465637207e+00, -3.254599332809448e+00, -9.610209465026855e-01, -1.770264625549316e+00, -2.099079042673111e-01, -1.80298638343811e+00, -1.412735223770142e+00, -2.747767448425293e+00, -1.536918520927429e+00, -2.903625965118408e+00, -1.813125014305115e+00, -2.661003768444061e-01, -8.765889406204224e-01, -6.96109414100647e-01, -1.183022737503052e+00, -1.429072499275208e+00, -9.889350533485413e-01, -3.562946617603302e-01, -7.038648724555969e-01, -1.991320252418518e+00, -1.178019762039185e+00, 2.951222062110901e-01, -1.130928158760071e+00, -2.283062219619751e+00, -7.910836935043335e-01, -1.182130336761475e+00, -1.829773783683777e+00, -1.884833216667175e+00, 3.05984728038311e-03, 1.346441864967346e+00, -1.755329847335815e+00, -5.393377542495728e-01, -1.438284873962402e+00, -9.940604567527771e-01, -4.305253922939301e-01, -1.453484654426575e+00, -1.068817257881165e+00, 5.640711188316345e-01, -1.711190044879913e-01, -3.573130369186401e-01, 7.642588019371033e-01, 4.863162711262703e-02, 7.533624768257141e-01, 1.914724588394165e+00, -3.385692238807678e-01, -3.065623044967651e-01, 1.225092768669128e+00, 2.95019268989563e-01, 1.128877758979797e+00, 1.203967332839966e+00, 4.922853708267212e-01, 1.012038707733154e+00, 1.25042200088501e+00, 9.830104112625122e-01, -3.500626087188721e-01, 7.716364860534668e-01, 2.336587309837341e-01, 2.283394187688828e-01, 1.157089099287987e-01, -1.47438108921051e-01, 8.022585511207581e-01, 3.167463541030884e-01, 7.141023874282837e-01, 1.379348039627075e+00, 2.753676474094391e-02, 6.359493136405945e-01, 9.3999844789505e-01, -5.814405679702759e-01, 1.299269199371338e+00, 9.006192684173584e-01, 1.225329875946045e+00, -1.466724276542664e-01, -5.922291874885559e-01, -4.735961854457855e-01, -4.233273863792419e-01, -2.995286136865616e-02, 9.25442099571228e-01, 3.298053026199341e+00, -5.713021755218506e-01, -1.631682395935059e+00, -5.535641312599182e-01, -1.326518893241882e+00, -8.786152005195618e-01, 2.861620187759399e-01, -6.455041766166687e-01, -5.724753141403198e-01, -1.943540334701538e+00, -5.867165923118591e-01, -1.146427392959595e+00, -1.258886218070984e+00, -1.510849833488464e+00, -1.230102062225342e+00, -2.23022985458374e+00, -6.154328584671021e-01, -1.464189410209656e+00, -1.130401372909546e+00, -2.012283563613892e+00, -2.863342046737671e+00, -1.842516422271729e+00, -3.114948749542236e+00, -2.153491020202637e+00]
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mos
new file mode 100644
index 00000000000..aef54650297
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/AirTemperatureLockout.mos
@@ -0,0 +1,70 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.AirTemperatureLockout", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="AirTemperatureLockout");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"airTemLim.TRoo","airTemLim.TZonHigSet","airTemLim.TZonLowSet"},
+ range={0.0, 172000.0, 280, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 10, 924, 294},
+ y={"airTemLim.yHeaTZon","airTemLim.yCooTZon"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+ createPlot(id=2, position={15, 10, 924, 583},
+ y={"airTemLim1.TRoo","airTemLim1.TZonHigSet","airTemLim1.TZonLowSet"},
+ range={0.0, 172000.0, 280, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=2, position={15, 10, 924, 294},
+ y={"airTemLim1.yHeaTZon","airTemLim1.yCooTZon"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+ createPlot(id=3, position={15, 10, 924, 583},
+ y={"airTemLim2.TRoo","airTemLim2.TZonHigSet","airTemLim2.TZonLowSet"},
+ range={0.0, 172000.0, 280, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=3, position={15, 10, 924, 294},
+ y={"airTemLim2.yHeaTZon","airTemLim2.yCooTZon"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+ createPlot(id=4, position={15, 10, 924, 583},
+ y={"airTemLim3.TRoo","airTemLim3.TZonHigSet","airTemLim3.TZonLowSet"},
+ range={0.0, 172000.0, 280, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=4, position={15, 10, 924, 294},
+ y={"airTemLim3.yHeaTZon","airTemLim3.yCooTZon"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+
\ No newline at end of file
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mos
new file mode 100644
index 00000000000..cdb97657a09
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/ChilledWaterReturnLockout.mos
@@ -0,0 +1,18 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.ChilledWaterReturnLockout", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="ChilledWaterReturnLockout");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"chwRetLim.TSlaRet","chwRetLim.TSlaRet"},
+ range={0.0, 172000.0, 250, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 10, 924, 294},
+ y={"chwRetLim.yCooTChiWatRetLim"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mos
new file mode 100644
index 00000000000..f49af7293bd
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/HysteresisLockout.mos
@@ -0,0 +1,49 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.HysteresisLockout", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="HysteresisLockout");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"hysLim.uHea","hysLim.uCoo","hysLim.yHeaNotLoc","hysLim.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=2, position={15, 10, 924, 583},
+ y={"hysLim1.uHea","hysLim1.uCoo","hysLim1.yHeaNotLoc","hysLim1.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=3, position={15, 10, 924, 583},
+ y={"hysLim2.uHea","hysLim2.uCoo","hysLim2.yHeaNotLoc","hysLim2.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=4, position={15, 10, 924, 583},
+ y={"hysLim3.uHea","hysLim3.uCoo","hysLim3.yHeaNotLoc","hysLim3.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=5, position={15, 10, 924, 583},
+ y={"hysLim4.uHea","hysLim4.uCoo","hysLim4.yHeaNotLoc","hysLim4.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=6, position={15, 10, 924, 583},
+ y={"hysLim5.uHea","hysLim5.uCoo","hysLim5.yHeaNotLoc","hysLim5.yCooNotLoc"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mos
new file mode 100644
index 00000000000..8052ab9e8c0
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/SubLockouts/Validation/NightFlushLockout.mos
@@ -0,0 +1,9 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.NightFlushLockout", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="NightFlushLockout");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"nigFluLoc.uNigFlu","nigFluLoc.yNigFluHea"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mos
new file mode 100644
index 00000000000..e5f76132ee0
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Lockouts/Validation/AllLockout.mos
@@ -0,0 +1,17 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.Validation.AllLockout", startTime=0.0, stopTime=172000.0, method="cvode", tolerance=1E-06, resultFile="AllLockout");
+createPlot(id=1, position={15, 10, 924, 294},
+ y={"allLoc.yCoo","allLoc.hysLim.yCooNotLoc","allLoc.airTemLim.yCooTZon","allLoc.chwRetLim.yCooTChiWatRetLim"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=2, position={15, 10, 924, 294},
+ y={"allLoc.yHea","allLoc.hysLim.yHeaNotLoc","allLoc.airTemLim.yHeaTZon","allLoc.nitFluLoc.yNigFluHea"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mos
new file mode 100644
index 00000000000..4302aca601a
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/BaseClasses/Validation/ChicagoForecastHigh.mos
@@ -0,0 +1,10 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.Validation.ChicagoForecastHigh", stopTime=31536000, method="cvode", tolerance=1E-06, resultFile="ChicagoForecastHigh");
+createPlot(id=1, position={55, 50, 1186, 817},
+ y={"forHiChi.TForHigChi", "weaDat2.weaBus.TDryBul"},
+ range={0.0, 31536000, 250, 320},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true)
+
\ No newline at end of file
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mos
new file mode 100644
index 00000000000..4bc5d294519
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/DeadbandControl.mos
@@ -0,0 +1,65 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.DeadbandControl", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="DeadbandControl");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"deaCon.TDeaRel","deaCon.TDeaNor","deaCon.slaTemErr","deaCon.uHea","deaCon.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=2, position={15, 10, 924, 583},
+ y={"deaCon1.TDeaRel","deaCon1.TDeaNor","deaCon1.slaTemErr","deaCon1.uHea","deaCon1.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=3, position={15, 10, 924, 583},
+ y={"deaCon2.TDeaRel","deaCon2.TDeaNor","deaCon2.slaTemErr","deaCon2.uHea","deaCon2.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=4, position={15, 10, 924, 583},
+ y={"deaCon3.TDeaRel","deaCon3.TDeaNor","deaCon3.slaTemErr","deaCon3.uHea","deaCon3.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=5, position={15, 10, 924, 583},
+ y={"deaConTes.TDeaRel","deaConTes.TDeaNor","deaConTes.slaTemErr","deaConTes.uHea","deaConTes.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=6, position={15, 10, 924, 583},
+ y={"deaConTes1.TDeaRel","deaConTes1.TDeaNor","deaConTes1.slaTemErr","deaConTes1.uHea","deaConTes1.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+ createPlot(id=7, position={15, 10, 924, 583},
+ y={"deaConTesFal.TDeaRel","deaConTesFal.TDeaNor","deaConTesFal.slaTemErr","deaConTesFal.uHea","deaConTesFal.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=8, position={15, 10, 924, 583},
+ y={"deaConTesFal1.TDeaRel","deaConTesFal1.TDeaNor","deaConTesFal1.slaTemErr","deaConTesFal1.uHea","deaConTesFal1.uCoo"},
+ range={0.0, 172000.0, (-3), 3},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mos
new file mode 100644
index 00000000000..1b745a3e5c4
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabError.mos
@@ -0,0 +1,18 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabError", startTime=0.0, stopTime=172000.0, method="cvode", tolerance=1E-06, resultFile="SlabError");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"err.TSlaSet","err.TSla"},
+ range={0.0, 172000.0, 220, 380},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 10, 924, 289},
+ y={"err.slaTemErr"},
+ range={0.0, 172000.0, (-100), 100},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot = 2);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mos
new file mode 100644
index 00000000000..e9ce276cd36
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/SlabTemperatureSignal/Validation/SlabSetpointPerimeterZone.mos
@@ -0,0 +1,9 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabSetpointPerimeterZone", startTime=0.0, stopTime=1641600.0, method="cvode", tolerance=1E-06, resultFile="SlabSetpointPerimeterZone");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"slaSetPer.TFor","slaSetPer.TSlaSetPer"},
+ range={0.0, 1641600.0, 220, 380},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mos
new file mode 100644
index 00000000000..e23104caae6
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockout.mos
@@ -0,0 +1,36 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockout", startTime=0.0, stopTime=172800.0, method="cvode", tolerance=1E-06, resultFile="ControlPlusLockout");
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"conPluLoc.yHea","conPluLoc.yCoo"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 10, 924, 583},
+ y={"conPluLoc.allLoc.yHea", "conPluLoc.allLoc.yCoo"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+ createPlot(id=1, position={15, 10, 924, 583},
+ y={"conPluLoc.deaCon.uCoo", "conPluLoc.deaCon.uHea"},
+ range={0.0, 172000.0, 0, 1},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=3);
+ createPlot(id=2, position={15, 10, 924, 583},
+ y={"conPluLoc.err.slaTemErr","conPluLoc.deaCon.TDeaRel","conPluLoc.deaCon.TDeaNor"},
+ range={0.0, 172000.0, (-20), 20},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+
\ No newline at end of file
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mos
new file mode 100644
index 00000000000..12b5fb9136c
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutCore.mos
@@ -0,0 +1,19 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutCore", startTime=0.0, stopTime=31536000, method="cvode", tolerance=1E-06, resultFile="ControlPlusLockoutCore");
+createPlot(id=1, position={15, 20, 924, 583},
+ y={"temRoo.T"},
+ range={0.0, 31536000, 16, 30},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 20, 924, 583},
+ y={"conPluLoc.err.slaTemErr"},
+ range={0.0, 31536000, (-10), 10},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2)
+
diff --git a/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mos b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mos
new file mode 100644
index 00000000000..96dcee81eb8
--- /dev/null
+++ b/Buildings/Resources/Scripts/Dymola/Controls/OBC/RadiantSystems/CoolingAndHeating/Validation/ControlPlusLockoutPerimeter.mos
@@ -0,0 +1,19 @@
+simulateModel("Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutPerimeter", startTime=0.0, stopTime=31536000, method="cvode", tolerance=1E-06, resultFile="ControlPlusLockoutPerimeter");
+createPlot(id=1, position={15, 20, 924, 583},
+ y={"temRoo.T"},
+ range={0.0, 31536000, 16, 30},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true);
+createPlot(id=1, position={15, 20, 924, 583},
+ y={"conPluLoc.err.slaTemErr"},
+ range={0.0, 31536000, (-10), 10},
+ autoscale = true,
+ autoerase = true,
+ autoreplot = true,
+ grid=true,
+ color=true,
+ subPlot=2);
+
\ No newline at end of file
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.AirTemperatureLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.AirTemperatureLockout.mos
new file mode 100644
index 00000000000..ead34057fcf
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.AirTemperatureLockout.mos
@@ -0,0 +1,23 @@
+compareVars :=
+ {
+ "airTemLim.TRoo",
+ "airTemLim.TZonHigSet",
+ "airTemLim.TZonLowSet",
+ "airTemLim.yHeaTZon",
+ "airTemLim.yCooTZon",
+ "airTemLim1.TRoo",
+ "airTemLim1.TZonHigSet",
+ "airTemLim1.TZonLowSet",
+ "airTemLim1.yHeaTZon",
+ "airTemLim1.yCooTZon",
+ "airTemLim2.TRoo",
+ "airTemLim2.TZonHigSet",
+ "airTemLim2.TZonLowSet",
+ "airTemLim2.yHeaTZon",
+ "airTemLim2.yCooTZon",
+ "airTemLim3.TRoo",
+ "airTemLim3.TZonHigSet",
+ "airTemLim3.TZonLowSet",
+ "airTemLim3.yHeaTZon",
+ "airTemLim3.yCooTZon"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.ChilledWaterReturnLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.ChilledWaterReturnLockout.mos
new file mode 100644
index 00000000000..39c795cc209
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.ChilledWaterReturnLockout.mos
@@ -0,0 +1,6 @@
+compareVars :=
+ {
+ "chwRetLim.TSlaRet",
+ "chwRetLim.TSlaRet",
+ "chwRetLim.yCooTChiWatRetLim"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.HysteresisLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.HysteresisLockout.mos
new file mode 100644
index 00000000000..f9347554808
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.HysteresisLockout.mos
@@ -0,0 +1,27 @@
+compareVars :=
+ {
+ "hysLim.uHea",
+ "hysLim.uCoo",
+ "hysLim.yHeaNotLoc",
+ "hysLim.yCooNotLoc",
+ "hysLim1.uHea",
+ "hysLim1.uCoo",
+ "hysLim1.yHeaNotLoc",
+ "hysLim1.yCooNotLoc",
+ "hysLim2.uHea",
+ "hysLim2.uCoo",
+ "hysLim2.yHeaNotLoc",
+ "hysLim2.yCooNotLoc",
+ "hysLim3.uHea",
+ "hysLim3.uCoo",
+ "hysLim3.yHeaNotLoc",
+ "hysLim3.yCooNotLoc",
+ "hysLim4.uHea",
+ "hysLim4.uCoo",
+ "hysLim4.yHeaNotLoc",
+ "hysLim4.yCooNotLoc",
+ "hysLim5.uHea",
+ "hysLim5.uCoo",
+ "hysLim5.yHeaNotLoc",
+ "hysLim5.yCooNotLoc"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.NightFlushLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.NightFlushLockout.mos
new file mode 100644
index 00000000000..e9329eba17e
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.SubLockouts.Validation.NightFlushLockout.mos
@@ -0,0 +1,5 @@
+compareVars :=
+ {
+ "nigFluLoc.uNigFlu",
+ "nigFluLoc.yNigFluHea"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.Validation.AllLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.Validation.AllLockout.mos
new file mode 100644
index 00000000000..3a02a542ce4
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Lockouts.Validation.AllLockout.mos
@@ -0,0 +1,11 @@
+compareVars :=
+ {
+ "allLoc.yCoo",
+ "allLoc.hysLim.yCooNotLoc",
+ "allLoc.airTemLim.yCooTZon",
+ "allLoc.chwRetLim.yCooTChiWatRetLim",
+ "allLoc.yHea",
+ "allLoc.hysLim.yHeaNotLoc",
+ "allLoc.airTemLim.yHeaTZon",
+ "allLoc.nitFluLoc.yNigFluHea"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.Validation.ChicagoForecastHigh.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.Validation.ChicagoForecastHigh.mos
new file mode 100644
index 00000000000..8890f73c289
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.BaseClasses.Validation.ChicagoForecastHigh.mos
@@ -0,0 +1,5 @@
+compareVars :=
+ {
+ "forHiChi.TForHigChi",
+ "weaDat2.weaBus.TDryBul"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.DeadbandControl.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.DeadbandControl.mos
new file mode 100644
index 00000000000..da688182e0c
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.DeadbandControl.mos
@@ -0,0 +1,43 @@
+compareVars :=
+ {
+ "deaCon.TDeaRel",
+ "deaCon.TDeaNor",
+ "deaCon.slaTemErr",
+ "deaCon.uHea",
+ "deaCon.uCoo",
+ "deaCon1.TDeaRel",
+ "deaCon1.TDeaNor",
+ "deaCon1.slaTemErr",
+ "deaCon1.uHea",
+ "deaCon1.uCoo",
+ "deaCon2.TDeaRel",
+ "deaCon2.TDeaNor",
+ "deaCon2.slaTemErr",
+ "deaCon2.uHea",
+ "deaCon2.uCoo",
+ "deaCon3.TDeaRel",
+ "deaCon3.TDeaNor",
+ "deaCon3.slaTemErr",
+ "deaCon3.uHea",
+ "deaCon3.uCoo",
+ "deaConTes.TDeaRel",
+ "deaConTes.TDeaNor",
+ "deaConTes.slaTemErr",
+ "deaConTes.uHea",
+ "deaConTes.uCoo",
+ "deaConTes1.TDeaRel",
+ "deaConTes1.TDeaNor",
+ "deaConTes1.slaTemErr",
+ "deaConTes1.uHea",
+ "deaConTes1.uCoo",
+ "deaConTesFal.TDeaRel",
+ "deaConTesFal.TDeaNor",
+ "deaConTesFal.slaTemErr",
+ "deaConTesFal.uHea",
+ "deaConTesFal.uCoo",
+ "deaConTesFal1.TDeaRel",
+ "deaConTesFal1.TDeaNor",
+ "deaConTesFal1.slaTemErr",
+ "deaConTesFal1.uHea",
+ "deaConTesFal1.uCoo"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabError.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabError.mos
new file mode 100644
index 00000000000..23cbb020811
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabError.mos
@@ -0,0 +1,6 @@
+compareVars :=
+ {
+ "err.TSlaSet",
+ "err.TSla",
+ "err.slaTemErr"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabSetpointPerimeterZone.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabSetpointPerimeterZone.mos
new file mode 100644
index 00000000000..5a71a5d0dd0
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.SlabTemperatureSignal.Validation.SlabSetpointPerimeterZone.mos
@@ -0,0 +1,5 @@
+compareVars :=
+ {
+ "slaSetPer.TFor",
+ "slaSetPer.TSlaSetPer"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockout.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockout.mos
new file mode 100644
index 00000000000..a0b6e75e22c
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockout.mos
@@ -0,0 +1,12 @@
+compareVars :=
+ {
+ "conPluLoc.yHea",
+ "conPluLoc.yCoo",
+ "conPluLoc.allLoc.yHea",
+ "conPluLoc.allLoc.yCoo",
+ "conPluLoc.deaCon.uCoo",
+ "conPluLoc.deaCon.uHea",
+ "conPluLoc.err.slaTemErr",
+ "conPluLoc.deaCon.TDeaRel",
+ "conPluLoc.deaCon.TDeaNor"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutCore.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutCore.mos
new file mode 100644
index 00000000000..4670061f96a
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutCore.mos
@@ -0,0 +1,5 @@
+compareVars :=
+ {
+ "temRoo.T",
+ "conPluLoc.err.slaTemErr"
+ };
diff --git a/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutPerimeter.mos b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutPerimeter.mos
new file mode 100644
index 00000000000..4670061f96a
--- /dev/null
+++ b/Buildings/Resources/Scripts/OpenModelica/compareVars/Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.Validation.ControlPlusLockoutPerimeter.mos
@@ -0,0 +1,5 @@
+compareVars :=
+ {
+ "temRoo.T",
+ "conPluLoc.err.slaTemErr"
+ };
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/RadiantGlaSB70XL.mo b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/RadiantGlaSB70XL.mo
new file mode 100644
index 00000000000..4053a36db18
--- /dev/null
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/RadiantGlaSB70XL.mo
@@ -0,0 +1,29 @@
+within Buildings.ThermalZones.Detailed.FLEXLAB.Data.Constructions.GlazingSystems;
+record RadiantGlaSB70XL =
+ Buildings.HeatTransfer.Data.GlazingSystems.Generic (
+ final glass={Buildings.HeatTransfer.Data.Glasses.ID101(),
+ Buildings.HeatTransfer.Data.Glasses.ID101()},
+ final gas = {Buildings.HeatTransfer.Data.Gases.Air(x=0.0127)},
+ UFra=1.4)
+ "Radiant Glass"
+ annotation (
+defaultComponentPrefixes="parameter",
+defaultComponentName="datGlaSys",
+Documentation(info="
+
+ This is a model of a window construction used in FLEXLAB test cells. It is minimally
+ compliant per the ASHRAE 90.1 specification.
+
+
+ Note: This model is not yet completed, and is currently a placeholder. See
+
+ Buildings.ThermalZones.Detailed.FLEXLAB.UsersGuide for more information.
+
+ ", revisions="
+
+-
+September 17, 2013, by Peter Grant:
+First implementation.
+
+
+"));
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/package.order b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/package.order
index 085fa650ea1..a702c42a93b 100644
--- a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/package.order
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/GlazingSystems/package.order
@@ -1 +1,2 @@
ASHRAE901Gla
+RadiantGlaSB70XL
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/ConstructionRadiantR25Wall.mo b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/ConstructionRadiantR25Wall.mo
new file mode 100644
index 00000000000..4da521077be
--- /dev/null
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/ConstructionRadiantR25Wall.mo
@@ -0,0 +1,25 @@
+within Buildings.ThermalZones.Detailed.FLEXLAB.Data.Constructions.OpaqueConstructions.ExteriorConstructions;
+record ConstructionRadiantR25Wall =
+ Buildings.HeatTransfer.Data.OpaqueConstructions.Generic(final material={
+ Buildings.HeatTransfer.Data.Solids.InsulationBoard(x=0.05),
+ Buildings.HeatTransfer.Data.Solids.Plywood(x=0.0127),
+ Buildings.HeatTransfer.Data.Solids.InsulationBoard(x=0.08255),
+ Buildings.HeatTransfer.Data.Solids.GypsumBoard(x=0.01588)},
+ final nLay = 4) "South and north exterior wall in test bed X3"
+ annotation (
+defaultComponentPrefixes="parameter",
+defaultComponentName="datOpaCon",
+Documentation(info="
+
+ This is a model of exterior walls in test bed X3. It is used to
+ represent both the north and south exterior wall of the test cells
+ themselves.
+
+ ", revisions="
+
+-
+September 17, 2013, by Peter Grant:
+First implementation.
+
+
+"));
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/package.order b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/package.order
index 873c3e5c656..25d1e9039e4 100644
--- a/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/package.order
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Data/Constructions/OpaqueConstructions/ExteriorConstructions/package.order
@@ -5,5 +5,6 @@ Construction2
Construction3
Construction5and8
Construction9
+ConstructionRadiantR25Wall
ExteriorDoorInsulated
ExteriorDoorUninsulated
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantExterior.mo b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantExterior.mo
new file mode 100644
index 00000000000..f759feac08d
--- /dev/null
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantExterior.mo
@@ -0,0 +1,158 @@
+within Buildings.ThermalZones.Detailed.FLEXLAB.Rooms.X3A;
+model TestCellRadiantExterior
+ "Model of a room with two exposed walls, built from model of LBNL User Test Facility Cell X3A"
+ extends Buildings.ThermalZones.Detailed.MixedAir(
+ massDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial,
+ AFlo=45,
+ nSurBou=1,
+ nConPar=0,
+ nConBou=3,
+ nConExt=0,
+ nConExtWin=2,
+ hRoo=3,
+ surBou(
+ A={5*9},
+ each absIR=0.9,
+ each absSol=0.9,
+ each til=Buildings.Types.Tilt.Floor),
+ datConBou(
+ layers={parCon,parCon,R20Wal},
+ each steadyStateInitial=false,
+ each T_a_start=288.15,
+ each T_b_start=288.15,
+ each stateAtSurface_b=false,
+ each boundaryCondition=Buildings.ThermalZones.Detailed.Types.CFDBoundaryConditions.Temperature,
+ A = {3 * 9, 5 * 3, 5*9},
+ til = {Buildings.Types.Tilt.Wall, Buildings.Types.Tilt.Wall, Buildings.Types.Tilt.Ceiling},
+ azi = {Buildings.Types.Azimuth.N, Buildings.Types.Azimuth.E, Buildings.Types.Azimuth.N},
+ each stateAtSurface_a=false),
+ datConExtWin(
+ layers={R25Wal, R25Wal},
+ each steadyStateInitial=false,
+ each T_a_start=288.15,
+ each T_b_start=288.15,
+ each stateAtSurface_a=true,
+ each stateAtSurface_b=true,
+ A={5*3,9*3},
+ glaSys={glaSys,glaSys},
+ hWin={2,2},
+ wWin={2,2},
+ til={Buildings.Types.Tilt.Wall,Buildings.Types.Tilt.Wall},
+ azi={Buildings.Types.Azimuth.W,Buildings.Types.Azimuth.S}),
+ intConMod=Buildings.HeatTransfer.Types.InteriorConvection.Temperature,
+ extConMod=Buildings.HeatTransfer.Types.ExteriorConvection.TemperatureWind,
+ conBou(
+ each steadyStateInitial=false,
+ each T_a_start=288.15,
+ each T_b_start=288.15),
+ datConPar(
+ each steadyStateInitial=true,
+ each stateAtSurface_a=true,
+ each stateAtSurface_b=true));
+
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.ExteriorConstructions.ConstructionRadiantR25Wall
+ R25Wal
+ annotation (Placement(transformation(extent={{410,-166},{430,-146}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.CellAndElectricalDividingWall
+ R52Wal
+ annotation (Placement(transformation(extent={{410,-192},{430,-172}})));
+ replaceable parameter Data.Constructions.OpaqueConstructions.Roofs.ASHRAE_901_2010Roof
+ R20Wal
+ annotation (Placement(transformation(extent={{410,-216},{430,-196}})));
+ replaceable parameter Data.Constructions.GlazingSystems.RadiantGlaSB70XL glaSys
+ annotation (Placement(transformation(extent={{436,-192},{456,-172}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.PartitionConstructions.PartitionWall
+ parCon
+ annotation (Placement(transformation(extent={{436,-216},{456,-196}})));
+
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.TestCellDividngWall
+ celDiv
+ "Construction of wall connecting to cell UF90X3B- NOT USED"
+ annotation (Placement(transformation(extent={{410,-144},{430,-124}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.TestBedDividingWall
+ bedDiv
+ "Construction of wall connecting to cell UF90X2B- NOT USED"
+ annotation (Placement(transformation(extent={{410,-120},{430,-100}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.PartitionConstructions.PartitionDoor
+ parDoo
+ "Door used in partition walls in FLEXLAB test cells- NOT USED"
+ annotation (Placement(transformation(extent={{410,-94},{430,-74}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.ExteriorConstructions.ExteriorDoorInsulated
+ extDoo "Construction of an exterior door- NOT USED"
+ annotation (Placement(transformation(extent={{410,-72},{430,-52}})));
+ annotation(Documentation(info="
+
+ This is a model for an exterior zone, with many base characteristics drawn from test cell 3A in the LBNL User Facility.
+ This model is intended to represent a sample exterior zone for radiant and natural ventilation control, and is used in validation models for
+ (
+ Buildings.Experimental.NaturalVentilation.NightFlush.NaturalVentilationNightFlushFixedDuration), (
+ Buildings.Experimental.NaturalVentilation.NightFlush.NaturalVentilationNightFlushDynamicDuration), and (
+ Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts). The zone is 5 meters by 9 meters in floor area and is 3 meters in height. The zone has two exposed walls, each with windows: one oriented south, and the other oriented west.
+ The roof is a standard ASHRAE 90.1 2010 code-minimum construction.
+ The floor should be exposed to a radiant slab (in the case of radiant models) or to another boundary condition (if no radiant is present).
+ The remaining two walls are exposed to a constant-temperature boundary condition that should be set to ~70F to approximate interior conditions.
+ Exterior wall constructions are R-25; windows are 2 meters by 2 meters each and are the equivalent of Solarban 70. Partition walls are standard partition constructions.
+
+ ",
+ revisions = "
+
+ - Jun 10, 2013 by Peter Grant:
+ First implementation.
+
+
+ "), defaultComponentName = "radExt", Icon(coordinateSystem(preserveAspectRatio=false, extent={{-200,-200},
+ {200,200}}), graphics={
+ Bitmap(extent={{-160,164},{162,-166}}, fileName=
+ "modelica://Buildings/Resources/Images/ThermalZones/Detailed/FLEXLAB/Rooms/icon.png"),
+ Rectangle(
+ extent={{-58,12},{-26,-8}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-74,-26},{-22,-42}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-108,-132},{-56,-148}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-136,-82},{-84,-98}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Text(
+ extent={{-60,12},{-22,-10}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="air"),
+ Text(
+ extent={{-72,-22},{-22,-50}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="radiation"),
+ Text(
+ extent={{-104,-124},{-54,-152}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="surface"),
+ Text(
+ extent={{-138,-82},{-96,-100}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="fluid")}));
+end TestCellRadiantExterior;
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantInterior.mo b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantInterior.mo
new file mode 100644
index 00000000000..7bde2354130
--- /dev/null
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/TestCellRadiantInterior.mo
@@ -0,0 +1,145 @@
+within Buildings.ThermalZones.Detailed.FLEXLAB.Rooms.X3A;
+model TestCellRadiantInterior
+ "Model of a room with all interior walls, built from model of LBNL User Test Facility Cell X3A"
+ extends Buildings.ThermalZones.Detailed.MixedAir(AFlo=45,
+ nSurBou=1,
+ nConPar=0,
+ nConBou=3,
+ nConExt=0,
+ nConExtWin=2,
+ hRoo=3,
+ surBou(
+ A={5*9},
+ each absIR=0.9,
+ each absSol=0.9,
+ each til=Buildings.Types.Tilt.Floor),
+ datConBou(
+ layers={parCon,parCon,parCon,parCon,parCon},
+ each steadyStateInitial=false,
+ each T_a_start=288.15,
+ each T_b_start=288.15,
+ each stateAtSurface_a=true,
+ each stateAtSurface_b=true,
+ each boundaryCondition=Buildings.ThermalZones.Detailed.Types.CFDBoundaryConditions.Temperature,
+ A={5*3,9*3,3*9,5*3,5*9},
+ til={Buildings.Types.Tilt.Wall,Buildings.Types.Tilt.Wall,Buildings.Types.Tilt.Wall,
+ Buildings.Types.Tilt.Wall,Buildings.Types.Tilt.Ceiling},
+ azi={Buildings.Types.Azimuth.W,Buildings.Types.Azimuth.S,Buildings.Types.Azimuth.N,
+ Buildings.Types.Azimuth.E,Buildings.Types.Azimuth.N}),
+ datConExtWin(
+ each steadyStateInitial=false,
+ each T_a_start=288.15,
+ each T_b_start=288.15,
+ each boundaryCondition=Buildings.ThermalZones.Detailed.Types.CFDBoundaryConditions.HeatFlowRate),
+ each intConMod=Buildings.HeatTransfer.Types.InteriorConvection.Temperature,
+ each extConMod=Buildings.HeatTransfer.Types.ExteriorConvection.TemperatureWind,
+ conBou(each steadyStateInitial=true),
+ datConExt(each steadyStateInitial=true, each boundaryCondition=Buildings.ThermalZones.Detailed.Types.CFDBoundaryConditions.Temperature),
+ datConPar(each steadyStateInitial=true));
+
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.ExteriorConstructions.ConstructionRadiantR25Wall
+ R25Wal
+ annotation (Placement(transformation(extent={{410,-166},{430,-146}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.CellAndElectricalDividingWall
+ R52Wal
+ annotation (Placement(transformation(extent={{410,-192},{430,-172}})));
+ replaceable parameter Data.Constructions.OpaqueConstructions.Roofs.ASHRAE_901_2010Roof
+ R20Wal "R20Wall"
+ annotation (Placement(transformation(extent={{410,-216},{430,-196}})));
+ replaceable parameter Data.Constructions.GlazingSystems.RadiantGlaSB70XL glaSys
+ annotation (Placement(transformation(extent={{436,-192},{456,-172}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.PartitionConstructions.PartitionWall
+ parCon "ParCon"
+ annotation (Placement(transformation(extent={{436,-216},{456,-196}})));
+
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.TestCellDividngWall
+ celDiv
+ "Construction of wall connecting to cell UF90X3B- NOT USED"
+ annotation (Placement(transformation(extent={{410,-144},{430,-124}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.DividingWalls.TestBedDividingWall
+ bedDiv
+ "Construction of wall connecting to cell UF90X2B- NOT USED"
+ annotation (Placement(transformation(extent={{410,-120},{430,-100}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.PartitionConstructions.PartitionDoor
+ parDoo
+ "Door used in partition walls in FLEXLAB test cells- NOT USED"
+ annotation (Placement(transformation(extent={{410,-94},{430,-74}})));
+ replaceable parameter
+ Data.Constructions.OpaqueConstructions.ExteriorConstructions.ExteriorDoorInsulated
+ extDoo "Construction of an exterior door- NOT USED"
+ annotation (Placement(transformation(extent={{410,-74},{430,-54}})));
+ annotation(Documentation(info="
+
+ This is a model for an exterior zone, with many base characteristics drawn from test cell 3A in the LBNL User Facility.
+ This model is intended to represent a sample interior zone for radiant and natural ventilation control,
+ and is used in validation models for (
+ Buildings.Experimental.NaturalVentilation.NightFlush.NaturalVentilationNightFlushFixedDuration), (
+ Buildings.Experimental.NaturalVentilation.NightFlush.NaturalVentilationNightFlushDynamicDuration),
+ and (
+Buildings.Controls.OBC.RadiantSystems.CoolingAndHeating.ControlPlusLockouts) .
+
The zone is 5 meters by 9 meters in floor area and is 3 meters in height. The roof is a standard ASHRAE 90.1 2010 code-minimum construction.
+The floor should be exposed to a radiant slab (in the case of radiant models) or to another boundary condition (if no radiant is present).
+All four walls are exposed to a constant-temperature boundary condition that should be set to ~70F to approximate interior conditions.
+Walls are standard partition wall constructions.
+ ",
+ revisions = "
+
+ - Jun 10, 2013 by Peter Grant:
+ First implementation.
+
+
+ "), defaultComponentName = "radInt", Icon(coordinateSystem(preserveAspectRatio=false, extent={{-200,-200},
+ {200,200}}), graphics={
+ Bitmap(extent={{-160,164},{162,-166}}, fileName=
+ "modelica://Buildings/Resources/Images/ThermalZones/Detailed/FLEXLAB/Rooms/icon.png"),
+ Rectangle(
+ extent={{-58,12},{-26,-8}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-74,-26},{-22,-42}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-108,-132},{-56,-148}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Rectangle(
+ extent={{-136,-82},{-84,-98}},
+ pattern=LinePattern.None,
+ fillColor={215,215,215},
+ fillPattern=FillPattern.Solid),
+ Text(
+ extent={{-60,12},{-22,-10}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="air"),
+ Text(
+ extent={{-72,-22},{-22,-50}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="radiation"),
+ Text(
+ extent={{-104,-124},{-54,-152}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="surface"),
+ Text(
+ extent={{-138,-82},{-96,-100}},
+ lineColor={0,0,0},
+ fillColor={61,61,61},
+ fillPattern=FillPattern.Solid,
+ textString="fluid")}));
+end TestCellRadiantInterior;
diff --git a/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/package.order b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/package.order
index 5040c30da4a..aa38ee52acd 100644
--- a/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/package.order
+++ b/Buildings/ThermalZones/Detailed/FLEXLAB/Rooms/X3A/package.order
@@ -3,3 +3,5 @@ ClosetFullBed
Electrical
TestCell
TestCellFullBed
+TestCellRadiantExterior
+TestCellRadiantInterior
diff --git a/Buildings/failed-simulator-dymola.log b/Buildings/failed-simulator-dymola.log
new file mode 100644
index 00000000000..3d43ef277d1
--- /dev/null
+++ b/Buildings/failed-simulator-dymola.log
@@ -0,0 +1,2 @@
+Automatically generated BuildingsPy dump file for failed translations.
+
diff --git a/modelica-buildings b/modelica-buildings
new file mode 100644
index 00000000000..4d6a3b44f49
--- /dev/null
+++ b/modelica-buildings
@@ -0,0 +1 @@
+ECHO is on.
diff --git a/var_rename.sh b/var_rename.sh
new file mode 100755
index 00000000000..7015f3f59f7
--- /dev/null
+++ b/var_rename.sh
@@ -0,0 +1,284 @@
+for ff in `find . \( -name '*ControlPlusLockouts.mo' -or -name '*ControlPlusLockouts.mos' -or -name '*ControlPlusLockouts.txt' -or -name '*ControlPlusLockouts.svg' \)`; do
+ list=(\
+ nitFluSig uNigFlu \
+ TWaRet TSlaWatRet \
+ htgSig yHea \
+ clgSig yCoo \
+ htgSigL yHea \
+ clgSigL yCoo \
+ TAirHiSet TZonHigSet \
+ TAirLoSet TZonLowSet \
+ TWaLoSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ off_within_deadband offWitDea \
+ TChwRet TSlaWatRet \
+
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*AllLockouts.mo' -or -name '*AllLockouts.mos' -or -name '*AllLockouts.txt' -or -name '*AllLockouts.svg' \)`; do
+ list=(\
+ nitFluSig uNigFlu \
+ TWaRet TSlaWatRet \
+ htgSig uHea \
+ clgSig uCoo \
+ htgSigL yHea \
+ clgSigL yCoo \
+ heaSig uHea \
+ cooSig uCoo \
+ TChwRet TSlaWatRet \
+ TAirHiSet TZonHigSet \
+ TAirLoSet TZonLowSet \
+ TWaLoSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ off_within_deadband offWitDea \
+ hysLim.uHeaHys hysLim.uHea \
+ hysLim.uCooHys hysLim.uCoo \
+ airTemLim.uHeaAirTem airTemLim.yHeaTZon \
+ airTemLim.uCooAirTem airTemLim.yCooTZon \
+ nitFluLoc.uHeaNitFlu nitFluLoc.uNigFlu \
+ chwRetLim.cooSigChwRet chwRetLim.yCooTChiWatRetLim \
+ chwRetLim.TWa chwRetLim.TSlaRet \
+
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*AirTemperatureLimit.mo' -or -name '*AirTemperatureLimit.mos' -or -name '*AirTemperatureLimit.txt' -or -name '*AirTemperatureLimit.svg' \)`; do
+ list=(\
+ TAirHiSet TZonHigSet \
+ TAirLoSet TZonLowSet \
+ htgSigAirTem yHeaTZon \
+ clgSigAirTem yCooTZon \
+ TRoo TZon \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ChilledWaterReturnLimit.mo' -or -name '*ChilledWaterReturnLimit.mos' -or -name '*ChilledWaterReturnLimit.txt' -or -name '*ChilledWaterReturnLimit.svg' \)`; do
+ list=(\
+ TWaLoSet TWatSetLow \
+ TWaLowSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ TWa TSlaRet \
+ cooSigChwRet yCooTChiWatRetLim \
+ TSlaRettSetLow TWatSetLow \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*HysteresisLimit.mo' -or -name '*HysteresisLimit.mos' -or -name '*HysteresisLimit.txt' -or -name '*HysteresisLimit.svg' \)`; do
+ list=(\
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ heaSig uHea \
+ cooSig uCoo \
+ htgSigHys yHeaNotLoc \
+ clgSigHys yCooNotLoc \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*NightFlush.mo' -or -name '*NightFlush.mos' -or -name '*NightFlush.txt' -or -name '*NightFlush.svg' \)`; do
+ list=(\
+ nitFluSig uNigFlu \
+ htgSigNitFlu yNigFluHea \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*AirTemperatureLockout.mo' -or -name '*AirTemperatureLockout.mos' -or -name '*AirTemperatureLockout.txt' -or -name '*AirTemperatureLockout.svg' \)`; do
+ list=(\
+ TAirHiLim TZonHigLim \
+ TAirLoLim TZonLowLim \
+ THiRoo THigRoo \
+ TLoRoo TLowRoo \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*ChilledWaterReturnLockout.mo' -or -name '*ChilledWaterReturnLockout.mos' -or -name '*ChilledWaterReturnLockout.txt' -or -name '*ChilledWaterReturnLockout.svg' \)`; do
+ list=(\
+ TWaLoSet TWatSetLow \
+ TWaLowSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ cooSigChwRet yCooTChiWatRetLim \
+ TWa TSlaRet \
+ TSlaRettSetLow TWatSetLow \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*HysteresisLockout.mo' -or -name '*HysteresisLockout.mos' -or -name '*HysteresisLockout.txt' -or -name '*HysteresisLockout.svg' \)`; do
+ list=(\
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ heaSig uHea \
+ cooSig uCoo \
+ htgSigHys yHeaNotLoc \
+ clgSigHys yCooNotLoc \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*NightFlushLockout.mo' -or -name '*NightFlushLockout.mos' -or -name '*NightFlushLockout.txt' -or -name '*NightFlushLockout.svg' \)`; do
+ list=(\
+ nitFluLoc nigFluLoc \
+ TiHea heaLocDurAftCoo \
+ nigFluLoc.nitFluSig nigFluLoc.uNigFlu \
+ nigFluLoc.htgSigNitFlu nigFluLoc.yNigFluHea
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*AllLockout.mo' -or -name '*AllLockout.mos' -or -name '*AllLockout.txt' -or -name '*AllLockout.svg' \)`; do
+ list=(\
+ TAirHiLim TZonHigLim \
+ TAirLoLim TZonLowLim \
+ TAirHiSet TZonHigSet \
+ TAirLoSet TZonLowSet \
+ TimeCHW LocDurCHW \
+ TimHea LocDurHea \
+ TimCoo LocDurCoo \
+ TWaLoSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ allLoc.clgSig hysLim.uCoo \
+ allLoc.clgSig hysLim.uCoo \
+ allLoc.TChwRet allLoc.TSlaWatRet
+ allLoc.clgSig allLoc.uCoo \
+ allLoc.htgSig allLoc.uHea \
+ allLoc.nitFluSig allLoc.uNigFlu
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+
+for ff in `find . \( -name '*DeadbandControl.mo' -or -name '*DeadbandControl.mos' -or -name '*DeadbandControl.txt' -or -name '*DeadbandControl.svg' \)`; do
+ list=(\
+ htgCal uHea \
+ clgCal uCoo \
+ off_within_deadband offWitDea \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ForecastHighChicago.mo' -or -name '*ForecastHighChicago.mos' -or -name '*ForecastHighChicago.txt' -or -name '*ForecastHighChicago.svg' \)`; do
+ list=(\
+ TForHiChi TForHigChi \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ChicagoForecastHigh.mo' -or -name '*ChicagoForecastHigh.mos' -or -name '*ChicagoForecastHigh.txt' -or -name '*ChicagoForecastHigh.svg' \)`; do
+ list=(\
+ TForHiChi TForHigChi \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ControlPlusLockout.mo' -or -name '*ControlPlusLockout.mos' -or -name '*ControlPlusLockout.txt' -or -name '*ControlPlusLockout.svg' \)`; do
+ list=(\
+ TAirHiLim TZonHigLim \
+ TempWaLoSet WatTemLowSet \
+ nitFluSig uNigFlu \
+ TWaRet TSlaWatRet \
+ htgSig yHea \
+ clgSig yCoo \
+ htgSigL yHea \
+ clgSigL yCoo \
+ TAirHiSet TZonHigSet \
+ TAirLoSet TZonLowSet \
+ TWaLoSet TWatSetLow \
+ TiCHW cooLocDurWatTem \
+ TiCoo cooLocDurAftHea \
+ TiHea heaLocDurAftCoo \
+ off_within_deadband offWitDea \
+ TChwRet TSlaWatRet \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ControlPlusLockoutPerimeter.mo' -or -name '*ControlPlusLockoutPerimeter.mos' -or -name '*ControlPlusLockoutPerimeter.txt' -or -name '*ControlPlusLockoutPerimeter.svg' \)`; do
+ list=(\
+ TAirHiLim TZonHigLim \
+ TAirLoLim TZonLowLim \
+ TempWaLoSet WatTemLowSet \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+
+for ff in `find . \( -name '*ControlPlusLockoutCore.mo' -or -name '*ControlPlusLockoutCore.mos' -or -name '*ControlPlusLockoutCore.txt' -or -name '*ControlPlusLockoutCore.svg' \)`; do
+ list=(\
+ TAirHiLim TZonHigLim \
+ TAirLoLim TZonLowLim \
+ TempWaLoSet WatTemLowSet \
+ TimCHW cooLocDurWatTem \
+ TimCoo cooLocDurAftHea \
+ TimHea heaLocDurAftCoo \
+ )
+
+ for ((i=0; i<${#list[@]}; i+=2)); do
+ sed -e s/${list[i]}/${list[i+1]}/g -i $ff
+ done
+done
+