Buildings.Controls.SetPoints

Package with models for control set points

Information


This package contains components models to compute set points of control systems.
For additional models, see also 

Modelica.Blocks.Continuous.

Package Content

NameDescription
Buildings.Controls.SetPoints.Examples Examples Collection of models that illustrate model use and test models
Buildings.Controls.SetPoints.HotWaterTemperatureReset HotWaterTemperatureReset Block to compute the supply and return set point of heating systems
Buildings.Controls.SetPoints.OccupancySchedule OccupancySchedule Occupancy schedule with look-ahead


Buildings.Controls.SetPoints.HotWaterTemperatureReset Buildings.Controls.SetPoints.HotWaterTemperatureReset

Block to compute the supply and return set point of heating systems

Buildings.Controls.SetPoints.HotWaterTemperatureReset

Information


This block computes the set point temperatures for the
supply and return temperature of a heating system.
The set point for the room air temperature can either be specified
by a parameter, or it can be an input to the model. The latter allows
to use this model with systems that have night set back.

The parameter dTOutHeaBal can be used to shift the heating curve to account for the fact that solar heat gains and heat gains from equipment and people make up for some of the transmission losses. For example, in energy efficient houses, the heating may not be switched on above 12 degree Celsius, even if a room temperature of 20 degree is required. In such a situation, set dTOutHeaBal=20-12=8 Kelvin to shift the heating curve.


Extends from Modelica.Blocks.Interfaces.BlockIcon (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
Realm1.3Exponent for heat transfer
Booleanuse_TRoo_infalseGet the room temperature set point from the input connector
TemperatureTRoo293.15Fixed value of room air temperature set point [K]
TemperatureDifferencedTOutHeaBal8Offset for heating curve [K]
Nominal conditions
TemperatureTSup_nominal Supply temperature [K]
TemperatureTRet_nominal Return temperature [K]
TemperatureTRoo_nominal293.15Room temperature [K]
TemperatureTOut_nominal Outside temperature [K]

Connectors

TypeNameDescription
input RealInputTRoo_inRoom air temperature set point [K]
input RealInputTOutOutside temperature [K]
output RealOutputTSupSetpoint for supply temperature [K]
output RealOutputTRetSetpoint for return temperature [K]

Modelica definition

block HotWaterTemperatureReset 
  "Block to compute the supply and return set point of heating systems"
  extends Modelica.Blocks.Interfaces.BlockIcon;


  parameter Real m = 1.3 "Exponent for heat transfer";
  parameter Modelica.SIunits.Temperature TSup_nominal "Supply temperature";
  parameter Modelica.SIunits.Temperature TRet_nominal "Return temperature";
  parameter Modelica.SIunits.Temperature TRoo_nominal = 293.15 
    "Room temperature";
  parameter Modelica.SIunits.Temperature TOut_nominal "Outside temperature";

  parameter Boolean use_TRoo_in = false 
    "Get the room temperature set point from the input connector";
  parameter Modelica.SIunits.Temperature TRoo = 293.15 
    "Fixed value of room air temperature set point";
  parameter Modelica.SIunits.TemperatureDifference dTOutHeaBal = 8 
    "Offset for heating curve";
  Modelica.Blocks.Interfaces.RealInput TRoo_in(final quantity="ThermodynamicTemperature",
                                               final unit = "K", displayUnit = "degC", min=0) if 
          use_TRoo_in "Room air temperature set point";

  Modelica.Blocks.Interfaces.RealInput TOut(final quantity="ThermodynamicTemperature",
                                            final unit = "K", displayUnit = "degC", min=0) 
    "Outside temperature";
  Modelica.Blocks.Interfaces.RealOutput TSup(final quantity="ThermodynamicTemperature",
                                            final unit = "K", displayUnit = "degC", min=0) 
    "Setpoint for supply temperature";
  Modelica.Blocks.Interfaces.RealOutput TRet(final quantity="ThermodynamicTemperature",
                                            final unit = "K", displayUnit = "degC", min=0) 
    "Setpoint for return temperature";

protected 
  Modelica.Blocks.Interfaces.RealInput TRoo_in_internal(final quantity="ThermodynamicTemperature",
                                                        final unit = "K", displayUnit = "degC", min=0) 
    "Needed to connect to conditional connector";
  Real qRel "Relative heat load = Q_flow/Q_flow_nominal";
  Modelica.SIunits.Temperature TOutOffSet 
    "Effective outside temperature for heat transfer (takes into account room heat gains)";
  parameter Modelica.SIunits.Temperature TOutOffSet_nominal =  TOut_nominal + dTOutHeaBal 
    "Effective outside temperature for heat transfer at nominal conditions (takes into account room heat gains)";

equation 
  connect(TRoo_in, TRoo_in_internal);
  if not use_TRoo_in then
    TRoo_in_internal = TRoo;
  end if;
 TOutOffSet = TOut + dTOutHeaBal;
 // Relative heating load, compared to nominal conditions
 qRel = max(0, (TRoo_in_internal-TOutOffSet)/(TRoo_nominal-TOutOffSet_nominal));
 TSup = TRoo_in_internal
          + ((TSup_nominal+TRet_nominal)/2-TRoo_in_internal) * qRel^(1/m)
          + (TSup_nominal-TRet_nominal)/2 * qRel;
 TRet = TSup - qRel * (TSup_nominal-TRet_nominal);
end HotWaterTemperatureReset;

Buildings.Controls.SetPoints.OccupancySchedule Buildings.Controls.SetPoints.OccupancySchedule

Occupancy schedule with look-ahead

Buildings.Controls.SetPoints.OccupancySchedule

Information


This model outputs whether the building is currently occupied, and how long it will take until the next time when the building will be occupied or non-occupied. The latter may be used, for example, to start a ventilation system half an hour before occupancy starts in order to ventilate the room.

The occupancy is defined by a time schedule of the form

  occupancy = 3600*{7, 12, 14, 19}
This indicates that the occupancy is from 7:00 until 12:00 and from 14:00 to 19:00. This will be repeated periodically. The parameters startTime and endTime define the periodicity.


Extends from Modelica.Blocks.Interfaces.BlockIcon (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
Realoccupancy[:]3600*{7,19}Occupancy table, each entry switching occupancy on or off
BooleanfirstEntryOccupiedtrueSet to true if first entry in occupancy denotes a changed from unoccupied to occupied
TimestartTime0Start time of periodicity [s]
TimeendTime86400End time of periodicity [s]

Connectors

TypeNameDescription
output RealOutputtNexNonOccTime until next non-occupancy
output RealOutputtNexOccTime until next occupancy
output BooleanOutputoccupiedOutputs true if occupied at current time

Modelica definition

block OccupancySchedule "Occupancy schedule with look-ahead"
  extends Modelica.Blocks.Interfaces.BlockIcon;

  parameter Real occupancy[:]=3600*{7, 19} 
    "Occupancy table, each entry switching occupancy on or off";
  parameter Boolean firstEntryOccupied = true 
    "Set to true if first entry in occupancy denotes a changed from unoccupied to occupied";
  parameter Modelica.SIunits.Time startTime = 0 "Start time of periodicity";
  parameter Modelica.SIunits.Time endTime =   86400 "End time of periodicity";

  Modelica.Blocks.Interfaces.RealOutput tNexNonOcc 
    "Time until next non-occupancy";
  Modelica.Blocks.Interfaces.RealOutput tNexOcc "Time until next occupancy";
  Modelica.Blocks.Interfaces.BooleanOutput occupied 
    "Outputs true if occupied at current time";

protected 
  final parameter Modelica.SIunits.Time period = endTime-startTime;
  final parameter Integer nRow = size(occupancy,1);

  output Integer nexStaInd "Next index when occupancy starts";
  output Integer nexStoInd "Next index when occupancy stops";

  output Integer iPerSta 
    "Counter for the period in which the next occupancy starts";
  output Integer iPerSto 
    "Counter for the period in which the next occupancy stops";
  output Modelica.SIunits.Time schTim 
    "Time in schedule (not exceeding max. schedule time)";
  output Modelica.SIunits.Time tMax "Maximum time in schedule";
  output Modelica.SIunits.Time tOcc "Time when next occupancy starts";
  output Modelica.SIunits.Time tNonOcc "Time when next non-occupancy starts";
initial algorithm 
  // Check parameters for correctness
 assert(mod(nRow, 2) < 0.1,
   "The parameter \"occupancy\" must have an even number of elements.\n");
 assert(startTime < occupancy[1],
   "The parameter \"startTime\" must be smaller than the first element of \"occupancy\"."
   + "\n   Received startTime    = " + realString(startTime)
   + "\n            occupancy[1] = " + realString(occupancy[1]));
 assert(endTime > occupancy[nRow],
   "The parameter \"endTime\" must be greater than the last element of \"occupancy\"."
   + "\n   Received endTime      = " + realString(endTime)
   + "\n            occupancy[" + integerString(nRow) +
     "] = " + realString(occupancy[nRow]));
  for i in 1:nRow-1 loop
    assert(occupancy[i] < occupancy[i+1],
      "The elements of the parameter \"occupancy\" must be strictly increasing.");
  end for;
 // Initialize variables
 // if the firstEntryOccupied == false, then set the current time to the
 // the time when occupancy starts.
 tOcc    :=if firstEntryOccupied then occupancy[1] else time;
 tNonOcc :=if firstEntryOccupied then time else occupancy[1];

 iPerSta   := 0;
 iPerSto   := 0;
 nexStaInd := if firstEntryOccupied then 1 else 2;
 nexStoInd := if firstEntryOccupied then 2 else 1;
 occupied := not firstEntryOccupied;
 tOcc    := occupancy[nexStaInd];
 tNonOcc := occupancy[nexStoInd];
algorithm 
  assert(startTime < endTime, "Wrong parameter values.");
  tMax :=endTime;
  schTim :=startTime + mod(time-startTime, period);

  // Changed the index that computes the time until the next occupancy
  when time >= pre(occupancy[nexStaInd])+ iPerSta*period then
    nexStaInd :=nexStaInd + 2;
    occupied := not occupied;
    // Wrap index around
    if nexStaInd > nRow then
       nexStaInd := if firstEntryOccupied then 1 else 2;
       iPerSta := iPerSta + 1;
    end if;
    tOcc := occupancy[nexStaInd] + iPerSta*(period);
  end when;

  // Changed the index that computes the time until the next non-occupancy
  when time >= pre(occupancy[nexStoInd])+ iPerSto*period then
    nexStoInd :=nexStoInd + 2;
    occupied := not occupied;
    // Wrap index around
    if nexStoInd > nRow then
       nexStoInd := if firstEntryOccupied then 2 else 1;
       iPerSto := iPerSto + 1;
    end if;
    tNonOcc := occupancy[nexStoInd] + iPerSto*(period);
  end when;

 tNexOcc    := tOcc-time;
 tNexNonOcc := tNonOcc-time;
end OccupancySchedule;

HTML-documentation generated by Dymola Tue Sep 29 08:07:21 2009.