下面是一个基本的串级PID模糊控制程序的SCL代码:
//定义变量
VAR
//输入变量
Input: REAL;
//中间变量
Intermediate: REAL;
//输出变量
Output: REAL;
//主控制器参数
Kp: REAL:= 10;
Ki: REAL:= 0.5;
Kd: REAL:= 1;
//辅助控制器参数
Kpf: REAL:= 2;
Kif: REAL:= 0.1;
Kdf: REAL:= 0.5;
//模糊控制器参数
FuzzyKp: ARRAY [0..2] OF REAL:= [1, 2, 3];
FuzzyKi: ARRAY [0..2] OF REAL:= [1, 2, 3];
FuzzyKd: ARRAY [0..2] OF REAL:= [1, 2, 3];
FuzzyScale: ARRAY [0..2] OF REAL:= [0.2, 0.5, 0.8];
//错误变量及误差积分、微分变量
Error, LastError, IntegralError, DerivativeError: REAL;
END_VAR
//主程序
BEGIN
//计算误差
Error:= Setpoint - Input;
//利用模糊控制器获取控制量Kp、Ki、Kd
IF Error < 0 THEN
FuzzyInput:= (-1) * Error;
ELSE
FuzzyInput:= Error;
END_IF
FuzzyResult:= FuzzyOutput(FuzzyInput, FuzzyKp, FuzzyKi, FuzzyKd, FuzzyScale);
//计算PID主控制器输出量
Intermediate:= Kp * Error;
IntegralError:= IntegralError + Error;
DerivativeError:= Error - LastError;
Intermediate:= Intermediate + Ki * IntegralError + Kd * DerivativeError;
//利用辅助控制器调整主控制器输出量
Intermediate:= Intermediate + Kpf * FuzzyResult[0] + Kif * FuzzyResult[1] + Kdf * FuzzyResult[2];
//输出控制量
Output:= Intermediate;
//保存上一次误差值
LastError:= Error;
END_FUNCT
其中,FuzzyOutput是一个自定义函数,用于计算模糊控制器的输出量。它的参数分别是:
- Input: 模糊控制器的输入量;
- FuzzyKp: 用于计算Kp的模糊控制器参数数组;
- FuzzyKi: 用于计算Ki的模糊控制器参数数组;
- FuzzyKd: 用于计算Kd的模糊控制器参数数组;
- FuzzyScale: 模糊控制器输出量的缩放因子。
该函数的返回值是一个包含三个元素的实数数组,分别对应于模糊控制器输出量的三个部分。 |