Buildings.Controls.Continuous.Examples

Collection of models that illustrate model use and test models

Information

This package contains examples for the use of models that can be found in Buildings.Controls.Continuous.

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

Name Description
Buildings.Controls.Continuous.Examples.LimPID LimPID Test model for PID controller with optional reverse action
Buildings.Controls.Continuous.Examples.LimPIDWithReset LimPIDWithReset Example that demonstrates the controller output reset
Buildings.Controls.Continuous.Examples.NumberOfRequests NumberOfRequests Example model for block that outputs the number of requests
Buildings.Controls.Continuous.Examples.OffTimer OffTimer Example model for off timer
Buildings.Controls.Continuous.Examples.PIDHysteresis PIDHysteresis Example model for PID controller with hysteresis
Buildings.Controls.Continuous.Examples.PIDHysteresisTimer PIDHysteresisTimer Example model for PID controller with hysteresis and timer
Buildings.Controls.Continuous.Examples.SignalRanker SignalRanker Example model for signal ranker

Buildings.Controls.Continuous.Examples.LimPID Buildings.Controls.Continuous.Examples.LimPID

Test model for PID controller with optional reverse action

Buildings.Controls.Continuous.Examples.LimPID

Information

This model tests the implementation of the PID controller with optional reverse action. The model limPIDOri is the original implementation of the controller from the Modelica Standard Library. The models limPID and limPIDRev are the implementations from the Buildings library. The model limPIDRev is parameterized to have reverse action. The assertion blocks test whether the results of all three controllers are identical.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model LimPID "Test model for PID controller with optional reverse action" extends Modelica.Icons.Example; Modelica.Blocks.Sources.Pulse pulse(period=0.25); Buildings.Controls.Continuous.LimPID limPID( controllerType=Modelica.Blocks.Types.SimpleController.PID, Ti=1, Td=1, yMax=1, yMin=-1, initType=Modelica.Blocks.Types.InitPID.InitialState); Buildings.Controls.Continuous.LimPID limPIDRev( controllerType=Modelica.Blocks.Types.SimpleController.PID, reverseAction=true, Ti=1, Td=1, yMax=1, yMin=-1, initType=Modelica.Blocks.Types.InitPID.InitialState) "Controller with reverse action"; Modelica.Blocks.Sources.Constant const(k=0.5); Modelica.Blocks.Math.Gain gain(k=-1); Buildings.Utilities.Diagnostics.AssertEquality assertEquality( threShold=1e-3); Modelica.Blocks.Continuous.LimPID limPIDOri( controllerType=Modelica.Blocks.Types.SimpleController.PID, Ti=1, Td=1, yMax=1, yMin=-1, initType=Modelica.Blocks.Types.InitPID.InitialState); Buildings.Utilities.Diagnostics.AssertEquality assertEquality1( threShold=1e-3); equation connect(pulse.y, limPID.u_s); connect(pulse.y, limPIDRev.u_s); connect(const.y, limPID.u_m); connect(const.y, limPIDRev.u_m); connect(limPIDRev.y, gain.u); connect(gain.y, assertEquality.u2); connect(limPID.y, assertEquality.u1); connect(pulse.y, limPIDOri.u_s); connect(const.y, limPIDOri.u_m); connect(assertEquality1.u1, limPIDOri.y); connect(assertEquality1.u2, limPID.y); end LimPID;

Buildings.Controls.Continuous.Examples.LimPIDWithReset Buildings.Controls.Continuous.Examples.LimPIDWithReset

Example that demonstrates the controller output reset

Buildings.Controls.Continuous.Examples.LimPIDWithReset

Information

Example that demonstrates the effect of the integrator reset. The top model has the reset of the controller output enabled. By plotting the controller error, one sees that the integrator reset improves the closed loop performance slightly. Note, however, that both controllers have an integrator anti-windup and hence the integrator reset has limited benefits.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model LimPIDWithReset "Example that demonstrates the controller output reset" extends Modelica.Icons.Example; Plant plaWitRes "Plant connected to controller with reset"; Controller conWitRes(reset=Buildings.Types.Reset.Parameter) "Controller with reset"; Plant plaNoRes "Plant connected to controller without reset"; Controller conNoRes(reset=Buildings.Types.Reset.Disabled) "Controller without reset"; Modelica.Blocks.Sources.Pulse TSet( amplitude=20, width=50, offset=293.15, y(unit="K"), period=180) "Temperature set point"; protected model Plant "Plant model" extends Modelica.Blocks.Icons.Block; Modelica.Blocks.Interfaces.RealInput Q_flow(unit="W") "Heat flow rate added to system"; Modelica.Blocks.Interfaces.RealOutput T(unit="K") "Controlled temperature"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap( C=10, T(fixed=true, start=293.15)) "Heat capacitor"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap1( C=10, T(fixed=true, start=293.15)) "Heat capacitor"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen "Temperature sensor"; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHea "Prescribed heat flow rate"; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=5) "Thermal conductor"; Buildings.HeatTransfer.Sources.FixedTemperature TBou(T=293.15) "Boundary condition"; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon1(G=1) "Thermal conductor"; equation connect(Q_flow, preHea.Q_flow); connect(T, temSen.T); connect(TBou.port, theCon.port_a); connect(cap.port, theCon1.port_a); connect(theCon1.port_b, cap1.port); connect(cap1.port, temSen.port); connect(theCon.port_b, cap.port); connect(preHea.port, cap.port); end Plant; model Controller "PID controller with optional output reset" extends Modelica.Blocks.Icons.Block; parameter Buildings.Types.Reset reset=Buildings.Types.Reset.Disabled "Type of controller output reset"; Modelica.Blocks.Interfaces.RealInput TSet(unit="K") "Temperature set point"; Modelica.Blocks.Interfaces.RealInput u_m(unit="K") "Measured temperature"; Modelica.Blocks.Interfaces.RealOutput y "Control signal"; Buildings.Controls.Continuous.LimPID conPID( final reset=reset, yMax=1, yMin=0, controllerType=Modelica.Blocks.Types.SimpleController.PI, Ti=1, k=10) "PI controller"; Modelica.Blocks.Math.Gain gain(k=5000) "Gain for heat flow rate"; Modelica.Blocks.Logical.GreaterThreshold trigger(threshold=303.15) "Trigger input for controller reset"; equation connect(conPID.y,gain. u); connect(trigger.y,conPID. trigger); connect(u_m, conPID.u_m); connect(conPID.u_s, TSet); connect(trigger.u, TSet); connect(gain.y, y); end Controller; equation connect(plaWitRes.T, conWitRes.u_m); connect(conWitRes.y, plaWitRes.Q_flow); connect(plaNoRes.T, conNoRes.u_m); connect(conNoRes.y, plaNoRes.Q_flow); connect(TSet.y, conWitRes.TSet); connect(TSet.y, conNoRes.TSet); end LimPIDWithReset;

Buildings.Controls.Continuous.Examples.NumberOfRequests Buildings.Controls.Continuous.Examples.NumberOfRequests

Example model for block that outputs the number of requests

Buildings.Controls.Continuous.Examples.NumberOfRequests

Information

Example that demonstrates the use of the block Buildings.Controls.Continuous.NumberOfRequests. The parameters of the block are such that the output is incremented for each input signal that is strictly larger than 0. The figure below shows the inputs and the output of the block.

Simulation results

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model NumberOfRequests "Example model for block that outputs the number of requests" extends Modelica.Icons.Example; Buildings.Controls.Continuous.NumberOfRequests numReq( nin=2, threShold=0, kind=0); Modelica.Blocks.Sources.Sine sine(freqHz=2); Modelica.Blocks.Sources.Pulse pulse(period=0.35); equation connect(sine.y, numReq.u[1]); connect(pulse.y, numReq.u[2]); end NumberOfRequests;

Buildings.Controls.Continuous.Examples.OffTimer Buildings.Controls.Continuous.Examples.OffTimer

Example model for off timer

Buildings.Controls.Continuous.Examples.OffTimer

Information

Example that demonstrates the use of the model Buildings.Controls.Continuous.OffTimer. The input to the two timers are alternating boolean values. Whenever the input becomes false(=0), the timer is reset. The figures below show the input and output of the blocks.

Input and output of the OffTimer offTim1.
Input and output of the OffTimer offTim1.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model OffTimer "Example model for off timer" extends Modelica.Icons.Example; Modelica.Blocks.Sources.BooleanPulse booleanPulse(period=0.2); Buildings.Controls.Continuous.OffTimer offTim1; Buildings.Controls.Continuous.OffTimer offTim2; Modelica.Blocks.Logical.Not not1; equation connect(booleanPulse.y, offTim1.u); connect(booleanPulse.y, not1.u); connect(offTim2.u, not1.y); end OffTimer;

Buildings.Controls.Continuous.Examples.PIDHysteresis Buildings.Controls.Continuous.Examples.PIDHysteresis

Example model for PID controller with hysteresis

Buildings.Controls.Continuous.Examples.PIDHysteresis

Information

Example that demonstrates the use of the PID controller with hysteresis. The control objective is to keep the temperature of the energy storage cap at 40°C. The controller con is parameterized to switch on if the control error is bigger than eon=1. The output of the controller remains above ymin=0.3 until the control error is smaller than eoff=-1, at which time the controller outputs y=0 until the control error is again bigger than 1. The figure below shows the control error con.feeBac.y and the control signal con.y.

Control error.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model PIDHysteresis "Example model for PID controller with hysteresis" extends Modelica.Icons.Example; Buildings.Controls.Continuous.PIDHysteresis con( pre_y_start=false, controllerType=Modelica.Blocks.Types.SimpleController.PI, yMin=0.3, Ti=600, Td=60); Modelica.Blocks.Sources.Constant TSet(k=273.15 + 40, y(unit="K")) "Set point"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap(C=1000000, T(start= 313.15, fixed=true)); Buildings.HeatTransfer.Sources.PrescribedTemperature TBC; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=20); Modelica.Blocks.Math.Gain gain(k=2000); Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow Q_flow; Modelica.Blocks.Sources.Sine sine( freqHz=1/86400, offset=273.15, amplitude=20, phase=-1.5707963267949, y(unit="K")); equation connect(TSet.y, con.u_s); connect(TBC.port, theCon.port_a); connect(theCon.port_b, cap.port); connect(con.y, gain.u); connect(cap.port, temSen.port); connect(temSen.T, con.u_m); connect(gain.y, Q_flow.Q_flow); connect(Q_flow.port, cap.port); connect(sine.y, TBC.T); end PIDHysteresis;

Buildings.Controls.Continuous.Examples.PIDHysteresisTimer Buildings.Controls.Continuous.Examples.PIDHysteresisTimer

Example model for PID controller with hysteresis and timer

Buildings.Controls.Continuous.Examples.PIDHysteresisTimer

Information

Example that demonstrates the use of the PID controller with hysteresis and off timer. The example is identical to Buildings.Controls.Continuous.Examples.PIDHysteresis, except that the controller also has an off timer. This timer keeps the control signal at y=0 for a period of minOffTime=1000 seconds. This may be used to avoid short-cycling if the load is small and the system has little heat capacity.

The figure below shows the control error con.feeBac.y and the control signal con.y.

Control error.
Control signal.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model PIDHysteresisTimer "Example model for PID controller with hysteresis and timer" extends Modelica.Icons.Example; Buildings.Controls.Continuous.PIDHysteresisTimer con( yMin=0.3, minOffTime=10000, controllerType=Modelica.Blocks.Types.SimpleController.PI, Ti=60, Td=10); Modelica.Blocks.Sources.Constant TSet(k=273.15 + 40, y(unit="K")) "Set point"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap(C=100000, T(start= 293.15, fixed=true)); Buildings.HeatTransfer.Sources.PrescribedTemperature TBC; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=10); Modelica.Blocks.Math.Gain gain(k=800); Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow Q_flow; Modelica.Blocks.Sources.Sine sine( freqHz=1/86400, offset=273.15, amplitude=20, phase=-1.5707963267949); equation connect(TSet.y, con.u_s); connect(TBC.port, theCon.port_a); connect(theCon.port_b, cap.port); connect(con.y, gain.u); connect(cap.port, temSen.port); connect(temSen.T, con.u_m); connect(gain.y, Q_flow.Q_flow); connect(Q_flow.port, cap.port); connect(sine.y, TBC.T); end PIDHysteresisTimer;

Buildings.Controls.Continuous.Examples.SignalRanker Buildings.Controls.Continuous.Examples.SignalRanker

Example model for signal ranker

Buildings.Controls.Continuous.Examples.SignalRanker

Information

Example that demonstrates the use of the signal ranker model. The figure below shows the input and output signals of the block. Note that sigRan.y[1] ≥ sigRan.y[2] ≥ sigRan.y[3].

Input to signal ranker.
Output of signal ranker.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model SignalRanker "Example model for signal ranker" extends Modelica.Icons.Example; Modelica.Blocks.Sources.Sine sine( freqHz = 2, startTime=0.025) "Sine source"; Modelica.Blocks.Sources.Pulse pulse(period=0.25) "Pulse source"; Buildings.Controls.Continuous.SignalRanker sigRan(nin=3) "Signal ranker"; Modelica.Blocks.Sources.ExpSine expSine(freqHz=10, damping=1) "Exponential sine source"; equation connect(sine.y, sigRan.u[1]); connect(pulse.y, sigRan.u[2]); connect(expSine.y, sigRan.u[3]); end SignalRanker;

Buildings.Controls.Continuous.Examples.LimPIDWithReset.Plant Buildings.Controls.Continuous.Examples.LimPIDWithReset.Plant

Plant model

Buildings.Controls.Continuous.Examples.LimPIDWithReset.Plant

Information

Plant model for Buildings.Controls.Continuous.Examples.LimPIDWithReset. consisting of a simple heat transfer model.

Implementation

To compare the effect of the controller output reset, the plant and control models have been implemented in separate blocks so they can be instantiated twice in the system model with the appropriate control settings.

Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).

Connectors

TypeNameDescription
input RealInputQ_flowHeat flow rate added to system [W]
output RealOutputTControlled temperature [K]

Modelica definition

model Plant "Plant model" extends Modelica.Blocks.Icons.Block; Modelica.Blocks.Interfaces.RealInput Q_flow(unit="W") "Heat flow rate added to system"; Modelica.Blocks.Interfaces.RealOutput T(unit="K") "Controlled temperature"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap( C=10, T(fixed=true, start=293.15)) "Heat capacitor"; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap1( C=10, T(fixed=true, start=293.15)) "Heat capacitor"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen "Temperature sensor"; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHea "Prescribed heat flow rate"; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=5) "Thermal conductor"; Buildings.HeatTransfer.Sources.FixedTemperature TBou(T=293.15) "Boundary condition"; Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon1(G=1) "Thermal conductor"; equation connect(Q_flow, preHea.Q_flow); connect(T, temSen.T); connect(TBou.port, theCon.port_a); connect(cap.port, theCon1.port_a); connect(theCon1.port_b, cap1.port); connect(cap1.port, temSen.port); connect(theCon.port_b, cap.port); connect(preHea.port, cap.port); end Plant;

Buildings.Controls.Continuous.Examples.LimPIDWithReset.Controller Buildings.Controls.Continuous.Examples.LimPIDWithReset.Controller

PID controller with optional output reset

Buildings.Controls.Continuous.Examples.LimPIDWithReset.Controller

Information

Controller model for Buildings.Controls.Continuous.Examples.LimPIDWithReset.

The controller is reset whenever the input signal becomes bigger than 30°C.

Implementation

To compare the effect of the controller output reset, the plant and control models have been implemented in separate blocks so they can be instantiated twice in the system model with the appropriate control settings.

Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
ResetresetBuildings.Types.Reset.DisabledType of controller output reset

Connectors

TypeNameDescription
input RealInputTSetTemperature set point [K]
input RealInputu_mMeasured temperature [K]
output RealOutputyControl signal

Modelica definition

model Controller "PID controller with optional output reset" extends Modelica.Blocks.Icons.Block; parameter Buildings.Types.Reset reset=Buildings.Types.Reset.Disabled "Type of controller output reset"; Modelica.Blocks.Interfaces.RealInput TSet(unit="K") "Temperature set point"; Modelica.Blocks.Interfaces.RealInput u_m(unit="K") "Measured temperature"; Modelica.Blocks.Interfaces.RealOutput y "Control signal"; Buildings.Controls.Continuous.LimPID conPID( final reset=reset, yMax=1, yMin=0, controllerType=Modelica.Blocks.Types.SimpleController.PI, Ti=1, k=10) "PI controller"; Modelica.Blocks.Math.Gain gain(k=5000) "Gain for heat flow rate"; Modelica.Blocks.Logical.GreaterThreshold trigger(threshold=303.15) "Trigger input for controller reset"; equation connect(conPID.y,gain. u); connect(trigger.y,conPID. trigger); connect(u_m, conPID.u_m); connect(conPID.u_s, TSet); connect(trigger.u, TSet); connect(gain.y, y); end Controller;