Name | Description |
---|---|
Examples | Collection of models that illustrate model use and test models |
HotWaterTemperatureReset | Block to compute the supply and return set point of heating systems |
OccupancySchedule | Occupancy schedule with look-ahead |
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).
Type | Name | Default | Description |
---|---|---|---|
Real | m | 1.3 | Exponent for heat transfer |
Boolean | use_TRoo_in | false | Get the room temperature set point from the input connector |
Temperature | TRoo | 293.15 | Fixed value of room air temperature set point [K] |
TemperatureDifference | dTOutHeaBal | 8 | Offset for heating curve [K] |
Nominal conditions | |||
Temperature | TSup_nominal | Supply temperature [K] | |
Temperature | TRet_nominal | Return temperature [K] | |
Temperature | TRoo_nominal | 293.15 | Room temperature [K] |
Temperature | TOut_nominal | Outside temperature [K] |
Type | Name | Description |
---|---|---|
input RealInput | TRoo_in | Room air temperature set point [K] |
input RealInput | TOut | Outside temperature [K] |
output RealOutput | TSup | Setpoint for supply temperature [K] |
output RealOutput | TRet | Setpoint for return temperature [K] |
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;
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).
Type | Name | Default | Description |
---|---|---|---|
Real | occupancy[:] | 3600*{7,19} | Occupancy table, each entry switching occupancy on or off |
Boolean | firstEntryOccupied | true | Set to true if first entry in occupancy denotes a changed from unoccupied to occupied |
Time | startTime | 0 | Start time of periodicity [s] |
Time | endTime | 86400 | End time of periodicity [s] |
Type | Name | Description |
---|---|---|
output RealOutput | tNexNonOcc | Time until next non-occupancy |
output RealOutput | tNexOcc | Time until next occupancy |
output BooleanOutput | occupied | Outputs true if occupied at current time |
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;