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 | 
  LimPID
 | 
Test model for PID controller with optional reverse action | 
  LimPIDWithReset
 | 
Example that demonstrates the controller output reset | 
  NumberOfRequests
 | 
Example model for block that outputs the number of requests | 
  OffTimer
 | 
Example model for off timer | 
  PIDHysteresis
 | 
Example model for PID controller with hysteresis | 
  PIDHysteresisTimer
 | 
Example model for PID controller with hysteresis and timer | 
  SignalRanker
 | 
Example model for signal ranker | 
Test model for PID controller with optional reverse action
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 
  
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)
    ;
  
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;
 
Example that demonstrates the controller output reset
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
  
  
extends Modelica.Icons.Example;
  
Plant plaWitRes ;
  
Controller conWitRes(reset=Annex60.Types.Reset.Parameter)
    ;
  
Plant plaNoRes ;
  
Controller conNoRes(reset=Annex60.Types.Reset.Disabled)
    ;
  
Modelica.Blocks.Sources.Pulse TSet(
    amplitude=20,
    width=50,
    offset=293.15,
    y(unit="K"),
    period=180) ;
protected 
  model Plant
    
    
extends Modelica.Blocks.Icons.Block;
    
Modelica.Blocks.Interfaces.RealInput Q_flow(unit="W")
      ;
    
Modelica.Blocks.Interfaces.RealOutput T(unit="K")
      ;
    
Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap(
      C=10,
      T(fixed=true,
        start=293.15)) ;
    
Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap1(
      C=10,
      T(fixed=true,
          start=293.15)) ;
    
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen
      ;
    
Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHea
      ;
    
Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=5)
      ;
    
Modelica.Thermal.HeatTransfer.Sources.FixedTemperature TBou(T=293.15)
      ;
    
Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon1(G=1)
      ;
  
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 
    
extends Modelica.Blocks.Icons.Block;
    
parameter Annex60.Types.Reset reset=Annex60.Types.Reset.Disabled
      ;
    
Modelica.Blocks.Interfaces.RealInput TSet(unit="K") ;
    
Modelica.Blocks.Interfaces.RealInput u_m(unit="K")
      ;
    
Modelica.Blocks.Interfaces.RealOutput y
      ;
    
Annex60.Controls.Continuous.LimPID conPID(
      
final reset=reset,
      yMax=1,
      yMin=0,
      controllerType=Modelica.Blocks.Types.SimpleController.PI,
      Ti=1,
      k=10) ;
    
Modelica.Blocks.Math.Gain gain(k=5000)
                                          ;
    
Modelica.Blocks.Logical.GreaterThreshold trigger(threshold=303.15)
      ;
  
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;
 
Example model for block that outputs the number of requests
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.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
Example model for off timer
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.

Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
Example model for PID controller with hysteresis
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.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
model PIDHysteresis 
  
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")) ;
  
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;
 
Example model for PID controller with hysteresis and timer
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.

Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
model PIDHysteresisTimer
  
  
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")) ;
  
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;
 
Example model for signal ranker
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].

Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
Plant model
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
| Type | Name | Description | 
| input RealInput | Q_flow | Heat flow rate added to system [W] | 
| output RealOutput | T | Controlled temperature [K] | 
Modelica definition
model Plant
  
  
extends Modelica.Blocks.Icons.Block;
  
Modelica.Blocks.Interfaces.RealInput Q_flow(unit="W")
    ;
  
Modelica.Blocks.Interfaces.RealOutput T(unit="K")
    ;
  
Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap(
    C=10,
    T(fixed=true,
      start=293.15)) ;
  
Modelica.Thermal.HeatTransfer.Components.HeatCapacitor cap1(
    C=10,
    T(fixed=true,
        start=293.15)) ;
  
Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen
    ;
  
Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHea
    ;
  
Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon(G=5)
    ;
  
Modelica.Thermal.HeatTransfer.Sources.FixedTemperature TBou(T=293.15)
    ;
  
Modelica.Thermal.HeatTransfer.Components.ThermalConductor theCon1(G=1)
    ;
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;
 
PID controller with optional output reset
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
| Type | Name | Default | Description | 
| Reset | reset | Annex60.Types.Reset.Disabled | Type of controller output reset | 
Connectors
| Type | Name | Description | 
| input RealInput | TSet | Temperature set point [K] | 
| input RealInput | u_m | Measured temperature [K] | 
| output RealOutput | y | Control signal | 
Modelica definition
model Controller 
  
extends Modelica.Blocks.Icons.Block;
  
parameter Annex60.Types.Reset reset=Annex60.Types.Reset.Disabled
    ;
  
Modelica.Blocks.Interfaces.RealInput TSet(unit="K") ;
  
Modelica.Blocks.Interfaces.RealInput u_m(unit="K")
    ;
  
Modelica.Blocks.Interfaces.RealOutput y
    ;
  
Annex60.Controls.Continuous.LimPID conPID(
    
final reset=reset,
    yMax=1,
    yMin=0,
    controllerType=Modelica.Blocks.Types.SimpleController.PI,
    Ti=1,
    k=10) ;
  
Modelica.Blocks.Math.Gain gain(k=5000)
                                        ;
  
Modelica.Blocks.Logical.GreaterThreshold trigger(threshold=303.15)
    ;
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