编写PI和PD控制器
软件:MWORKS.Sysplorer 24
目的:设计简单的例子比较P、PI和PD的区别
实验条件:仿真30s,求解器为Euler。
今天从《Modelica多领域物理系统建模入门与提高》这本书里看到一个例子,介绍的是使用Dymola设计一个简单的控制器例子,但是Dymola收费,我感觉免费且好用的就是苏州同源软控的软件。
这里面主要有protected、extends、constrainedby、replaceable以及redeclare的用法。
protected:是定义局部变量的关键字。
extends Amodel:表示当前模型继承了A的组件和接口,然后就不用再定义了。
constrainedby:目前学到的和extends没啥区别,用法是replaceable B b constrainedby A,表示b可被A中的任意一个组件替换。
redeclare:重新声明模型定义,用于替换不同组件后对比,例如:
model CompareControllers
ControllerAndMotor pic;
ControllerAndMotor pc(redeclare PController con(Kp = 1.1));
ControllerAndMotor pdc(redeclare PDController con(Kp = 1.1, Kd = 0.2));
end CompareControllers;
通过redeclare可将ControllerAndMotor 中replaceable的对象重新声明而替换为redeclare的块或者其他的东西。
- 首先定义一个通用的控制器接口Controller:
partial block Controller "设置通用的控制器接口"
import Modelica.Blocks;
Blocks.Interfaces.RealInput command;
Blocks.Interfaces.RealInput sensor;
Blocks.Interfaces.RealOutput driver;
end Controller;
- 定义一个简单的比例控制器PController:
block PController "A proporational gain controller"
extends Controller;
parameter Real Kp = 1;
protected
Real e "reference error";
equation
e = command - sensor;
driver = Kp * e;
end PController;
- 定义一个简单的比例差分控制器PDController:
block PDController "A ideal PD controller"
extends Controller;
parameter Real Kp = 1.0;
parameter Real Kd = 1.0;
import Modelica.Blocks;
protected
Real e;
Real timeinterval = 1.0;
equation
e = command - sensor;
driver = Kp * e + Kd * (e)/timeinterval;
end PDController;
- 定义一个简单的比例积分控制器PIController:
block PIController "2个输入和1个输出的PI控制器"
parameter Real Kp = 1;
parameter Real Ti = 1;
import Modelica.Blocks;
Blocks.Interfaces.RealInput command;
Blocks.Interfaces.RealInput sensor;
Blocks.Interfaces.RealOutput driver;
Blocks.Math.Feedback Difference;
Blocks.Math.Gain K1(k = Kp);
Blocks.Math.Gain K2(k = 1 / Ti);
Blocks.Math.Add Summation;
Blocks.Continuous.Integrator IntegratorBlock;
equation
connect(command, Difference.u1);
connect(sensor, Difference.u2);
connect(Difference.y, K1.u);
connect(K1.y, Summation.u1);
connect(K1.y, K2.u);
connect(K2.y, IntegratorBlock.u);
connect(IntegratorBlock.y, Summation.u2);
connect(Summation.y, driver);
end PIController;
- PI控制器的简单应用(跟随正弦输入):
model ControllerAndMotor
extends Controller;
import Modelica.Blocks;
Blocks.Sources.Sine sinsig(amplitude = 0.2, f = 0.3, offset = 1.0);
// constrainedby 这个词意思是前者受限于后者,前者的组件类型和后者一致,
replaceable PIController con(Kp = 0.4) constrainedby Controller;
Blocks.Continuous.TransferFunction motor(a = {0.8, 0.1});
equation
connect(sinsig.y, con.command);
connect(con.driver, motor.u);
connect(motor.y, con.sensor);
end ControllerAndMotor;
- 通过redeclare进行并列比较P、PI、PD控制器的差别(参数是随机设置的,没有调优):
model CompareControllers
ControllerAndMotor pic;
ControllerAndMotor pc(redeclare PController con(Kp = 1.1));
ControllerAndMotor pdc(redeclare PDController con(Kp = 1.1, Kd = 0.2));
end CompareControllers;
仿真结果
PS:之前学的优化算法也可以做成块,然后供设计的控制器调用,然后进行控制器的参数优化,避免试错调优,岂不美哉!以后再学一些再整!