Files
AIDASimulation/SimulationModels/AIDAModelica/PID_2.mo

121 lines
5.2 KiB
Plaintext
Raw Normal View History

// 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;