IEA EBC Annex 60 EBC logo

Annex60.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 Annex60.Controls.Continuous.

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

Package Content

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

Annex60.Controls.Continuous.Examples.LimPID Annex60.Controls.Continuous.Examples.LimPID

Test model for PID controller with optional reverse action

Annex60.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 Annex60 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); Annex60.Controls.Continuous.LimPID limPID( controllerType=Modelica.Blocks.Types.SimpleController.PID, Ti=1, Td=1, yMax=1, yMin=-1, initType=Modelica.Blocks.Types.InitPID.InitialState); Annex60.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); Annex60.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); Annex60.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;

Annex60.Controls.Continuous.Examples.LimPIDWithReset Annex60.Controls.Continuous.Examples.LimPIDWithReset

Example that demonstrates the controller output reset

Annex60.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=Annex60.Types.Reset.Parameter) "Controller with reset"; Plant plaNoRes "Plant connected to controller without reset"; Controller conNoRes(reset=Annex60.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"; Modelica.Thermal.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 Annex60.Types.Reset reset=Annex60.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"; Annex60.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;

Annex60.Controls.Continuous.Examples.NumberOfRequests Annex60.Controls.Continuous.Examples.NumberOfRequests

Example model for block that outputs the number of requests

Annex60.Controls.Continuous.Examples.NumberOfRequests

Information

Example that demonstrates the use of the block Annex60.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; Annex60.Controls.Continuous.NumberOfRequests numReq( nin=2, threShold=0, kind=0); Modelica.Blocks.Sources.Sine sine(freqHz=2); Modelica.Blocks.Sources.Pulse pulse(period=0.25); equation connect(sine.y, numReq.u[1]); connect(pulse.y, numReq.u[2]); end NumberOfRequests;

Annex60.Controls.Continuous.Examples.OffTimer Annex60.Controls.Continuous.Examples.OffTimer

Example model for off timer

Annex60.Controls.Continuous.Examples.OffTimer

Information

Example that demonstrates the use of the model Annex60.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); Annex60.Controls.Continuous.OffTimer offTim1; Annex60.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;

Annex60.Controls.Continuous.Examples.PIDHysteresis Annex60.Controls.Continuous.Examples.PIDHysteresis

Example model for PID controller with hysteresis

Annex60.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; Annex60.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)); Modelica.Thermal.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;

Annex60.Controls.Continuous.Examples.PIDHysteresisTimer Annex60.Controls.Continuous.Examples.PIDHysteresisTimer

Example model for PID controller with hysteresis and timer

Annex60.Controls.Continuous.Examples.PIDHysteresisTimer

Information

Example that demonstrates the use of the PID controller with hysteresis and off timer. The example is identical to Annex60.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; Annex60.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)); Modelica.Thermal.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;

Annex60.Controls.Continuous.Examples.SignalRanker Annex60.Controls.Continuous.Examples.SignalRanker

Example model for signal ranker

Annex60.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); Modelica.Blocks.Sources.Pulse pulse(period=0.25); Annex60.Controls.Continuous.SignalRanker sigRan(nin=3); Modelica.Blocks.Sources.ExpSine expSine(freqHz=10, damping=1); equation connect(sine.y, sigRan.u[1]); connect(pulse.y, sigRan.u[2]); connect(expSine.y, sigRan.u[3]); end SignalRanker;

Annex60.Controls.Continuous.Examples.LimPIDWithReset.Plant Annex60.Controls.Continuous.Examples.LimPIDWithReset.Plant

Plant model

Annex60.Controls.Continuous.Examples.LimPIDWithReset.Plant

Information

Plant model for Annex60.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"; Modelica.Thermal.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;

Annex60.Controls.Continuous.Examples.LimPIDWithReset.Controller Annex60.Controls.Continuous.Examples.LimPIDWithReset.Controller

PID controller with optional output reset

Annex60.Controls.Continuous.Examples.LimPIDWithReset.Controller

Information

Controller model for Annex60.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
ResetresetAnnex60.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 Annex60.Types.Reset reset=Annex60.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"; Annex60.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;

http://iea-annex60.org