单神经元自适应PID控制SCL程序

单神经元自适应PID控制

  • 原理
  • 代码及注释
  • 调参方式

原理

参考此文章给出的原理性解释,出自《先进PID控制MATLAB仿真 第四版
建议先花二十分钟看懂增量型PID,再花十分钟看懂下面这个链接中的帖子,最后就可以用本文给出的程序进行调参。
https://blog.csdn.net/foxclever/article/details/84678393?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162480492816780271567085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162480492816780271567085&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-2-84678393.pc_v2_rank_blog_default&utm_term=%E5%8D%95%E7%A5%9E%E7%BB%8F%E5%85%83%E6%99%BA%E8%83%BDPID&spm=1018.2226.3001.4450

代码及注释

程序采用SCL语言编写,使用软件为TIA Portal V16.0。第一部分使用结构化文本定义变量(仅支持V16.0及以上版本),版本低于16可用传统定义变量方法代替。

变量定义:

FUNCTION_BLOCK "单神经元PID"

VAR_INPUT
  SV : Real;//设定值
  PV : Real;// 测量值
  siteP : Real := 0.5;//学习速率 P
  siteI : Real := 0.35;//学习速率 I 
  siteD : Real := 0.8;//学习速率 D
  wkp_1 : Real := 0.8;//比例系数(加权系数随机值)
  wki_1 : Real := 0.7;//积分系数
  wkd_1 : Real := 0.4;//微分系数
  K : Real := 0.15;//神经元的比例系数
  LimitHigh : Real := 100.0;//输出最大值
  LimitLow : Real := 0.0;//输出最小值
END_VAR

VAR_OUTPUT
  u : Real;//输出操作值
END_VAR

VAR_IN_OUT

END_VAR

VAR
  e_i : Real;
  u_i : Real;//e_k为基本偏差量
  e_1 : Real;//e(k-1)
  e_2 : Real;//e(k-2)
  x_1 : Real;//神经元输入信号,初值设为0
  x_2 : Real;//神经元输入信号
  x_3 : Real;//神经元输入信号
  u_1 : Real;//
  u_2 : Real;//
  u_3 : Real;//
  x : Real;
  i : Int := 0;//integer i实际为整形
  wkp_i : Real;
  wki_i : Real;
  wkd_i : Real;//加权系数(第i次)
  wadd_i : Real;//权值和
  w11_i : Real;
  w22_i : Real;
  w33_i : Real;//归一化各权值
END_VAR

VAR_TEMP

END_VAR

VAR CONSTANT

END_VAR

程序编写:

#u_1 := 48;// 在循环外部赋初值,此初值为手动模式PID的输出。
FOR #i := 0 TO 127 DO
    #e_1 := 0;//e(k-1) //增量式PID在K-1时刻的误差
    #e_2 := 0;//e(k-2) //增量式PID在K-2时刻的误差
    #x_1 := 0;//神经元输入信号,初值设为0
    #x_2 := 0;//神经元输入信号
    #x_3 := 0;//神经元输入信号
    
    #siteP := 0.5;//学习速率 P
    #siteI := 0.7;//学习速率 I 
    #siteD := 0.8;//学习速率 D
    #wkp_1 := 0.8;//比例系数(加权系数随机值)
    #wki_1 := 0.7;//积分系数
    #wkd_1 := 0.4;//微分系数
    #K := 0.8;//神经元的比例系数
    
    #e_i := #SV - #PV;//给定值减去反馈值,得到当前误差
    #wkp_i := #wkp_1 + #siteP * #e_i * #u_1 *  (#e_i - #e_1); //比例系数 
    #wki_i := #wki_1 + #siteI * #e_i * #u_1 * #e_i; //积分系数
    #wkd_i := #wkd_1 + #siteD * #e_i * #u_1 * (#e_i - 2 * #e_1 + #e_2); //微分系数
    #x_1 := #e_i - #e_1; //神经元输入信号 
    #x_2 := #e_i; //神经元输入信号 
    #x_3 := #e_i - 2 * #e_1 + #e_2; //神经元输入信号 
    
    #wadd_i := ABS(#wkp_i) + ABS(#wki_i) + ABS(#wkd_i);
    #w11_i := #wkp_i / #wadd_i;
    #w22_i := #wki_i / #wadd_i;
    #w33_i := #wkd_i / #wadd_i;
    #u_i := #u_1 + #K * (#w11_i * #x_1 + #w22_i * #x_2 + #w33_i * #x_3) ; //Control law 控制法则
    
    IF #u_i > 100 //限幅
    THEN
        #u_i := 100;
    ELSIF #u_i < 0
    THEN
        #u_i := 0;
    ELSE
        #u := #u_i;
    END_IF;

调参方式

图片来源网络,侵删
单神经元自适应PID控制SCL程序_第1张图片

你可能感兴趣的:(单神经元自适应PID控制SCL程序)