Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation

Collection of models that validate the blocks for autotuning PID controllers

Information

This package contains models that validate the blocks in Buildings.Controls.OBC.Utilities.PIDWIthAutotuning.

Package Content

Name Description
Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIDWithFirstOrderAMIGO DirectActingPIDWithFirstOrderAMIGO Test model for an autotuning direct-acting PID controller
Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIWithFirstOrderAMIGO DirectActingPIWithFirstOrderAMIGO Test model for an autotuning direct-acting PI controller
Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO ReverseActingPIDWithFirstOrderAMIGO Test model for an autotuning reverse-acting PID controller
Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIWithFirstOrderAMIGO ReverseActingPIWithFirstOrderAMIGO Test model for an autotuning reverse-acting PI controller

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIDWithFirstOrderAMIGO Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIDWithFirstOrderAMIGO

Test model for an autotuning direct-acting PID controller

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIDWithFirstOrderAMIGO

Information

Validation test for the block Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO.

This example is similar as Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO. However, direct-acting PID controllers are considered.

Modelica definition

model DirectActingPIDWithFirstOrderAMIGO "Test model for an autotuning direct-acting PID controller" Buildings.Controls.OBC.CDL.Reals.Sources.Constant SetPoint(k=0.8) "Setpoint value"; Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO PIDWitTun( controllerType=Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Types.SimpleController.PID, yHig=1, yLow=0, deaBan=0.1, yRef=0.8, reverseActing=false) "PID controller with an autotuning feature"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset PID( controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PID, k=1, Ti=0.5, Td=0.1, reverseActing=false) "PID controller with constant gains"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant resSig(k=false) "Reset signal"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel2(samplePeriod=240) "A delay process for control process 2"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel1(samplePeriod=240) "A delay process for control process 1"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant k(k=10) "Gain of the first order process"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant T(k=10) "Time constant of the first order process"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "A subtract block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "A subtract block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative1 "A derivative block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative2 "A derivative block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Logical.Sources.Pulse autTunSig( width=0.9, period=6000, shift=500) "Signal for enabling the autotuning"; Buildings.Controls.OBC.CDL.Reals.Subtract sub3 "A subtract block that is used to mimic the direct-acting in the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant const(k=1) "constant value 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub4 "A subtract block that is used to mimic the direct-acting in the first order process 2"; equation connect(resSig.y, PID.trigger); connect(SetPoint.y, PID.u_s); connect(uniDel1.y, sub1.u1); connect(k.y, derivative1.k); connect(derivative1.T, T.y); connect(derivative1.y, sub1.u2); connect(sub1.y, PID.u_m); connect(sub2.u1, uniDel2.y); connect(derivative2.y,sub2. u2); connect(sub2.y, PIDWitTun.u_m); connect(derivative2.T, T.y); connect(derivative1.u, sub1.u1); connect(derivative2.u, uniDel2.y); connect(autTunSig.y, PIDWitTun.triTun); connect(k.y, derivative2.k); connect(const.y, sub3.u1); connect(PID.y, sub3.u2); connect(sub3.y, uniDel1.u); connect(PIDWitTun.y, sub4.u2); connect(uniDel2.u, sub4.y); connect(sub4.u1, const.y); connect(resSig.y, PIDWitTun.triRes); connect(SetPoint.y, PIDWitTun.u_s); end DirectActingPIDWithFirstOrderAMIGO;

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIWithFirstOrderAMIGO Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIWithFirstOrderAMIGO

Test model for an autotuning direct-acting PI controller

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.DirectActingPIWithFirstOrderAMIGO

Information

Validation test for the block Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO.

This example is similar as Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIWithFirstOrderAMIGO. However, direct-acting PI controllers are considered.

Modelica definition

model DirectActingPIWithFirstOrderAMIGO "Test model for an autotuning direct-acting PI controller" Buildings.Controls.OBC.CDL.Reals.Sources.Constant SetPoint(k=0.8) "Setpoint value"; Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO PIWitTun( controllerType=Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Types.SimpleController.PI, yHig=1, yLow=0, deaBan=0.1, yRef=0.8, reverseActing=false) "PI controller with an autotuning feature"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset PI( controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PID, k=1, Ti=0.5, Td=0.1, reverseActing=false) "PI controller with constant gains"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant resSig(k=false) "Reset signal"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel2(samplePeriod=240) "A delay process for control process 2"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel1(samplePeriod=240) "A delay process for control process 1"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant k(k=10) "Gain of the first order process"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant T(k=10) "Time constant of the first order process"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "A subtract block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "A subtract block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative1 "A derivative block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative2 "A derivative block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Logical.Sources.Pulse autTunSig( width=0.9, period=6000, shift=500) "Signal for enabling the autotuning"; Buildings.Controls.OBC.CDL.Reals.Subtract sub3 "A subtract block that is used to mimic the direct acting in the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant const(k=1) "constant value 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub4 "A subtract block that is used to mimic the direct acting in the first order process 2"; equation connect(resSig.y, PI.trigger); connect(SetPoint.y, PI.u_s); connect(uniDel1.y, sub1.u1); connect(k.y, derivative1.k); connect(derivative1.T, T.y); connect(derivative1.y, sub1.u2); connect(sub1.y, PI.u_m); connect(sub2.u1, uniDel2.y); connect(derivative2.y,sub2. u2); connect(sub2.y, PIWitTun.u_m); connect(derivative2.T, T.y); connect(derivative1.u, sub1.u1); connect(derivative2.u, uniDel2.y); connect(autTunSig.y, PIWitTun.triTun); connect(k.y, derivative2.k); connect(const.y, sub3.u1); connect(PI.y, sub3.u2); connect(sub3.y, uniDel1.u); connect(PIWitTun.y, sub4.u2); connect(uniDel2.u, sub4.y); connect(sub4.u1, const.y); connect(resSig.y, PIWitTun.triRes); connect(SetPoint.y, PIWitTun.u_s); end DirectActingPIWithFirstOrderAMIGO;

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO

Test model for an autotuning reverse-acting PID controller

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO

Information

Validation test for the block Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO.

This example compares the output of an autotuning PID controller (PIDWitTun) to that of a normal PID controller (PID) with prescribed gains.

Both PID controllers are connected with a first-order control process. At the beginning (0s-500s), the outputs from those two PID controllers are identical as their prescribed gains are the same.

Once the autotuning starts at 500s, the outputs of the two PID controllers become different. After the tuning completes, under the control of PIDWitTun, the value of the controlled variable is close to the setpoint after the tuning period ends (PIDWitTun.resPro.triEnd = true). On the contrary, PID has a poor control performance, i.e., the value of the controlled variable oscillates.

The example also shows that the autotunning process can be re-triggered when the input triTun becomes true.

Modelica definition

model ReverseActingPIDWithFirstOrderAMIGO "Test model for an autotuning reverse-acting PID controller" Buildings.Controls.OBC.CDL.Reals.Sources.Constant SetPoint(k=0.8) "Setpoint value"; Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO PIDWitTun( controllerType=Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Types.SimpleController.PID, yHig=1, yLow=0, deaBan=0.1, yRef=0.8) "PID controller with an autotuning feature"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset PID( controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PID, k=1, Ti=0.5, Td=0.1) "PID controller with constant gains"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant resSig(k=false) "Reset signal"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel2(samplePeriod=240) "A delay process for control process 2"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel1(samplePeriod=240) "A delay process for control process 1"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant k(k=10) "Gain of the first order process"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant T(k=10) "Time constant of the first order process"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "A subtract block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "A subtract block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative1 "A derivative block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative2 "A derivative block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Logical.Sources.Pulse autTunSig( width=0.9, period=6000, shift=500) "Signal for enabling the autotuning"; equation connect(resSig.y, PID.trigger); connect(PIDWitTun.triRes, PID.trigger); connect(PIDWitTun.u_s, PID.u_s); connect(SetPoint.y, PID.u_s); connect(PIDWitTun.y, uniDel2.u); connect(uniDel1.u, PID.y); connect(uniDel1.y, sub1.u1); connect(k.y, derivative1.k); connect(derivative1.T, T.y); connect(derivative1.y, sub1.u2); connect(sub1.y, PID.u_m); connect(sub2.u1, uniDel2.y); connect(derivative2.y,sub2. u2); connect(sub2.y, PIDWitTun.u_m); connect(derivative2.T, T.y); connect(derivative2.u, uniDel2.y); connect(autTunSig.y, PIDWitTun.triTun); connect(k.y, derivative2.k); connect(uniDel1.y, derivative1.u); end ReverseActingPIDWithFirstOrderAMIGO;

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIWithFirstOrderAMIGO Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIWithFirstOrderAMIGO

Test model for an autotuning reverse-acting PI controller

Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIWithFirstOrderAMIGO

Information

Validation test for the block Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO.

This example is similar as Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Validation.ReverseActingPIDWithFirstOrderAMIGO. However, an autotuning PI controller rather than an autotuning PID controller is considered in this example.

Modelica definition

model ReverseActingPIWithFirstOrderAMIGO "Test model for an autotuning reverse-acting PI controller" Buildings.Controls.OBC.CDL.Reals.Sources.Constant SetPoint(k=0.8) "Setpoint value"; Buildings.Controls.OBC.Utilities.PIDWithAutotuning.FirstOrderAMIGO PIWitTun( controllerType=Buildings.Controls.OBC.Utilities.PIDWithAutotuning.Types.SimpleController.PI, yHig=1, yLow=0, deaBan=0.1, yRef=0.8) "PI controller with an autotuning feature"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset PI( controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, k=1, Ti=0.5, Td=0.1) "PI controller with constant gains"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant resSig(k=false) "Reset signal"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel1(samplePeriod=240) "A delay process for control process 1"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel2(samplePeriod=240) "A delay process for control process 2"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant k(k=10) "Gain of the first order process"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant T(k=10) "Time constant of the first order process"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "A subtract block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "A subtract block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative1 "A derivative block that is used to mimic the first order process 1"; Buildings.Controls.OBC.CDL.Reals.Derivative derivative2 "A derivative block that is used to mimic the first order process 2"; Buildings.Controls.OBC.CDL.Logical.Sources.Pulse autTunSig( width=0.9, period=6000, shift=500) "Signal for enabling the autotuning"; equation connect(resSig.y, PI.trigger); connect(PIWitTun.triRes, PI.trigger); connect(PIWitTun.u_s, PI.u_s); connect(SetPoint.y, PI.u_s); connect(PIWitTun.y, uniDel2.u); connect(uniDel1.u, PI.y); connect(uniDel1.y, sub1.u1); connect(k.y, derivative1.k); connect(derivative1.T, T.y); connect(derivative1.y, sub1.u2); connect(sub1.y, PI.u_m); connect(sub2.u1, uniDel2.y); connect(derivative2.y,sub2. u2); connect(sub2.y, PIWitTun.u_m); connect(derivative2.k, derivative1.k); connect(derivative2.T, T.y); connect(derivative1.u, sub1.u1); connect(derivative2.u, uniDel2.y); connect(autTunSig.y, PIWitTun.triTun); end ReverseActingPIWithFirstOrderAMIGO;