// CP: 65001 // SimulationX Version: 3.8.2.45319 x64 //Licensed by 2000-2019 Modelica Association & al. under the Modelica License 2 //Copyright © 2000-2019, Modelica Association & al. within AIDAModelica; model PID_2 "PID_2" import Modelica.Blocks.Types.InitPID; import Modelica.Blocks.Types.Init; import Modelica.Blocks; Modelica.Blocks.Interfaces.RealInput u "'input Real' as connector" annotation(Placement( transformation( origin={-126,86}, extent={{-14,-14},{14,14}}), iconTransformation( origin={-50,-100}, extent={{-20,-20},{20,20}}, rotation=90))); Modelica.Blocks.Interfaces.RealInput du "'input Real' as connector" annotation(Placement( transformation( origin={-116,-82}, extent={{-14,-14},{14,14}}), iconTransformation( origin={50,-100}, extent={{-20,-20},{20,20}}, rotation=90))); Blocks.Interfaces.RealOutput y annotation(Placement( transformation( origin={110,0}, extent={{-10,-10},{10,10}}), iconTransformation( origin={110,0}, extent={{-10,-10},{10,10}}))); Modelica.Blocks.Interfaces.RealInput Consign "'input Real' as connector" annotation(Placement( transformation( origin={-126,30}, extent={{-12,-12},{12,12}}), iconTransformation( origin={-100,0}, extent={{-20,-20},{20,20}}))); parameter Real k(unit="1")=1 "Gain"; parameter Real Ti( min=Modelica.Constants.small, start=0.5) "Time Constant of Integrator"; parameter Real Td( min=0, start=0.1) "Time Constant of Derivative block"; parameter Blocks.Types.InitPID initType=Blocks.Types.InitPID.DoNotUse_InitialIntegratorState "Type of initialization (1: no init, 2: steady state, 3: initial state, 4: initial output)" annotation( Evaluate=true, Dialog(group="Initialization")); parameter Real xi_start=0 "Initial or guess value value for integrator output (= integrator state)" annotation(Dialog(group="Initialization")); parameter Real xd_start=0 "Initial or guess value for state of derivative block" annotation(Dialog(group="Initialization")); parameter Real y_start=0 "Initial value of output" annotation(Dialog( group="Initialization", enable=initType==InitPID.InitialOutput)); constant Real unitTime=1 annotation(HideResult=true); Modelica.Blocks.Math.Gain P(k=1) "Proportional part of PID controller" annotation(Placement(transformation( origin={-28,68}, extent={{-10,-10},{10,10}}))); Modelica.Blocks.Math.Gain D(k=Td) "Derivative part of PID controller, with derivate received at input du" annotation(Placement(transformation( origin={-27,-41}, extent={{-9,-9},{9,9}}))); Modelica.Blocks.Continuous.Integrator I( k=unitTime / Ti, initType=if initType == InitPID.SteadyState then Init.SteadyState else if initType == InitPID.InitialState or initType == InitPID.DoNotUse_InitialIntegratorState then Init.InitialState else Init.NoInit, y_start=xi_start) "Integral part of PID controller" annotation(Placement(transformation( origin={-28,30}, extent={{-10,-10},{10,10}}))); Blocks.Math.Gain Gain(k=k) "Gain of PID controller" annotation(Placement(transformation(extent={{60,-10},{80,10}}))); Blocks.Math.Add3 Add annotation(Placement(transformation(extent={{20,-10},{40,10}}))); Modelica.Blocks.Math.Feedback feedback1 annotation(Placement(transformation( origin={-68,30}, extent={{-14,14},{14,-14}}))); Modelica.Blocks.Math.Feedback feedback2 annotation(Placement(transformation( origin={-64,-42}, extent={{-10,-10},{10,10}}))); Modelica.Blocks.Continuous.Derivative derivative1 annotation(Placement(transformation( origin={-90,-42}, extent={{-10,-10},{10,10}}))); initial equation if initType == InitPID.InitialOutput then y = y_start; end if; equation connect(derivative1.y, feedback2.u1) annotation( Line(points = {{-79, -42}, {-79, -44}, {-72, -44}, {-72, -42}}, color = {0, 0, 127})); connect(Consign, derivative1.u) annotation( Line(points = {{-126, 30}, {-102, 30}, {-102, -42}}, color = {0, 0, 127})); connect(du, feedback2.u2) annotation( Line(points = {{-116, -82}, {-64, -82}, {-64, -50}}, color = {0, 0, 127})); connect(feedback2.y,D.u) annotation(Line( points={{-55,-42},{-50,-42},{-42.7,-42},{-42.7,-41},{-37.7,-41}}, color={0,0,127})); connect(D.y, Add.u3) annotation( Line(points = {{-17, -41}, {0, -41}, {0, -8}, {18, -8}}, color = {0, 0, 127})); connect(Consign,feedback1.u1) annotation(Line( points={{-126,30},{-121,30},{-84.3,30},{-79.3,30}}, color={0,0,127})); connect(u,feedback1.u2) annotation(Line( points={{-126,86},{-121,86},{-68,86},{-68,46.3},{-68,41.3}}, color={0,0,127})); connect(feedback1.y,P.u) annotation(Line( points={{-55.3,30},{-50.3,30},{-45,30},{-45,68},{-40,68}}, color={0,0,127})); connect(I.u,feedback1.y) annotation(Line( points={{-40,30},{-45,30},{-50.3,30},{-55.3,30}}, color={0,0,127})); connect(I.y, Add.u2) annotation( Line(points = {{-17, 30}, {-0.5, 30}, {-0.5, 0}, {18, 0}}, color = {0, 0, 127})); connect(P.y, Add.u1) annotation( Line(points = {{-17, 68}, {0, 68}, {0, 8}, {18, 8}}, color = {0, 0, 127})); connect(y,Gain.y) annotation(Line( points={{110,0},{105,0},{86,0},{81,0}}, color={0,0,127})); connect(Add.y, Gain.u) annotation( Line(points = {{41, 0}, {58, 0}}, color = {0, 0, 127})); annotation(experiment( StopTime=1, StartTime=0, Interval=0.001)); end PID_2;