Matlab .m文件仿真程序如下

%BP based PID Control

clear All;

close All;

xite=0.20;  %学习速率

alfa=0.01;  %惯性因子

IN=4;H=5;Out=3; %NN Structure

wi=[-0.6394 -0.2696 -0.3756 -0.7023;

-0.8603 -0.2013 -0.5024 -0.2596;

-1.0749 0.5543 -1.6820 -0.5437;

-0.3625 -0.0724 -0.6463 -0.2859;

0.1425 0.0279 -0.5406 -0.7660];

%wi=0.50*rands(H,IN);  %隐含层加权系数wi初始化

wi_1=wi;wi_2=wi;wi_3=wi;

wo=[0.7576 0.2616 0.5820 -0.1416 -0.1325;

-0.1146 0.2949 0.8352 0.2205 0.4508;

0.7201 0.4566 0.7672 0.4962 0.3632];

%wo=0.50*rands(Out,H);  %输出层加权系数wo初始化

wo_1=wo;wo_2=wo;wo_3=wo;

ts=20; %采样周期取值

x=[0,0,0]; %比例,积分,微分赋初值

u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;

y_1=0;y_2=0;y_3=0;

Oh=zeros(H,1); %Output from NN middle layer 隐含层的输出

I=Oh; %Input to NN middle layer 隐含层输入

error_2=0;

error_1=0;

for k=1:1:500 %仿真开始,共500步

time(k)=k*ts;

rin(k)=5;

%Delay plant

sys=tf(1.2,[208 1],'inputdelay',10);  %建立被控对象传递函数?

dsys=c2d(sys,ts,'zoh');                  %把传递函数离散化?

[num,den]=tfdata(dsys,'v');           %离散化后提取分子、分母

yout(k)=-den(2)*y_1+num(2)*u_5;

error(k)=rin(k)-yout(k);

xi=[rin(k),yout(k),error(k),1];

%经典增量式数字PID的控制算式为:

x(1)=error(k)-error_1; %比例输出

x(2)=error(k); %积分输出

x(3)=error(k)-2*error_1+error_2; %微分输出

epid=[x(1);x(2);x(3)];

I=xi*wi';% 隐含层的输入,即:输入层输入*权值

for j=1:1:H

Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j))); %Middle Layer在激活函数作用下隐含层的输出

end

K=wo*Oh; %Output Layer 输出层的输入,即:隐含层的输出*权值

for l=1:1:Out

K(l)=exp(K(l))/(exp(K(l))+exp(-K(l))); %Getting kp,ki,kd 输出层的输出,即三个pid控制器的参数

end

kp(k)=K(1);ki(k)=K(2);kd(k)=K(3);

Kpid=[kp(k),ki(k),kd(k)];

du(k)=Kpid*epid;

u(k)=u_1+du(k);

if u(k)>=10 % Restricting the output of controller 控制器饱和环节

u(k)=10;

end

if u(k)<=-10

u(k)=-10;

end

%以下为权值wi、wo的在线调整,参考刘金琨的《先进PID控制》

dyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.0000001));

%Output layer 输出层

for j=1:1:Out

dK(j)=2/(exp(K(j))+exp(-K(j)))^2;

end

for l=1:1:Out

delta3(l)=error(k)*dyu(k)*epid(l)*dK(l);

end

for l=1:1:Out

for i=1:1:H

d_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);

end

end

wo=wo_1+d_wo+alfa*(wo_1-wo_2);

%Hidden layer

for i=1:1:H

dO(i)=4/(exp(I(i))+exp(-I(i)))^2;

end

segma=delta3*wo;

for i=1:1:H

delta2(i)=dO(i)*segma(i);

end

d_wi=xite*delta2'*xi;

wi=wi_1+d_wi+alfa*(wi_1-wi_2);

%Parameters Update 参数更新

u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);

y_2=y_1;y_1=yout(k);

wo_3=wo_2;

wo_2=wo_1;

wo_1=wo;

wi_3=wi_2;

wi_2=wi_1;

wi_1=wi;

error_2=error_1;

error_1=error(k);

end

%仿真结束,绘图

figure(1);

plot(time,rin,'r',time,yout,'b');

xlabel('time(s)');ylabel('rin,yout');

figure(2);

plot(time,error,'r');

xlabel('time(s)');ylabel('error');

figure(3);

plot(time,u,'r');

xlabel('time(s)');ylabel('u');

figure(4);

subplot(311);

plot(time,kp,'r');

xlabel('time(s)');ylabel('kp');

subplot(312);

plot(time,ki,'g');

xlabel('time(s)');ylabel('ki');

subplot(313);

plot(time,kd,'b');

xlabel('time(s)');ylabel('kd');

博图v14 sp1使用scl

SCL如下:plant

#yout := - #den * #y_1 + #num * #u_10;

//更新状态u

#u_10 := #u_9;

#u_9 := #u_8;

#u_8 := #u_7;

#u_7 := #u_6;

#u_6 := #u_5;

#u_5 := #u_4;

#u_4 := #u_3;

#u_3 := #u_2;

#u_2 := #u_1;

#u_1 := #u;

//更新输出状态

#y_2 := #y_1;

#y_1 := #yout;

pidnn controller

#e := #rin - #yout;

//#u := #u_1 + #Kp * (#e - #e_1) + #Ki * #e + #Kd * (#e - 2 * #e_1 + #e_2);

#x[1] := #e - #e_1;

#x[2] := #e;

#x[3] := #e - 2 * #e_1 + #e_2;

#epid[1]:=#x[1];

#epid[2]:=#x[2];

#epid[3] := #x[3];

#xi[1] := #rin;

#xi[2] := #yout;

#xi[3] := #e;

#xi[4] := 1;

#temp := 0;

FOR #a := 1 TO 5 BY 1 DO

FOR #b := 1 TO 4 BY 1 DO

#temp := #temp + #xi[#b] * #wi[#a, #b];

END_FOR;

#I[#a]:=#temp;

#temp := 0;

END_FOR;

FOR #a :=1 TO 5 BY 1 DO

#Oh[#a]:=EXP(#I[#a])-EXP(-(#I[#a]))/EXP(#I[#a]+EXP(-(#I[#a])));

END_FOR;

#temp := 0;

FOR #a := 1 TO 3 BY 1 DO

FOR #b := 1 TO 5 BY 1 DO

#temp:=#wo[#a,#b]*#Oh[#b] ;

END_FOR;

#K[#a] := #temp;

#temp := 0;

END_FOR;

FOR #a := 1 TO 3 BY 1 DO

#K[#a]:=EXP(#K[#a])/(EXP(#K[#a])+EXP(-(#K[#a])));

END_FOR;

#Kp := #K[1];

#Ki := #K[2];

#Kd := #K[3];

#Kpid[1] := #Kp;

#Kpid[2] := #Ki;

#Kpid[3] := #Kd;

#du := #Kpid[1] * #epid[1] + #Kpid[2] * #epid[2] + #Kpid[3] * #epid[3];

#u := #u + #du;

IF #u > 10 THEN

#u := 10;

END_IF;

IF #u < -10 THEN

#u := -10;

END_IF;

#temp := (#yout - #y_1) / (#u - #u_1 + 0.0000001);

IF #temp > 0.0 THEN

#dyu := 1;

ELSIF

#temp < 0.0 THEN

#dyu := -1;

ELSE

#dyu := 0;

END_IF;

//输出层

FOR #a := 1 TO 3 BY 1 DO

#dK[#a] := 2 / SQR(EXP(#K[#a] + EXP(- (#K[#a]))));

END_FOR;

FOR #a := 1 TO 3 BY 1 DO

#delta3[#a] := #e * #dyu * #epid[#a] * #dK[#a];

END_FOR;

FOR #a := 1 TO 3 BY 1 DO

FOR #b := 1 TO 5 BY 1 DO

#d_wo[#a, #b] := #xite * #delta3[#a] * #Oh[#b] + #alfa * (#wo_1[#a,#b] - #wo_2[#a,#b]);

END_FOR;

END_FOR;

FOR #a := 1 TO 3 BY 1 DO

FOR #b := 1 TO 5 BY 1 DO

#wo[#a,#b] := #wo_1[#a,#b] + #d_wo[#a,#b] + #alfa * (#wo_1[#a,#b] - #wo_2[#a,#b]);

END_FOR;

END_FOR;

//隐含层

FOR #a := 1 TO 5 BY 1 DO

#dO[#a] := 4 / SQR(EXP(#I[#a]) + EXP(- (#I[#a])));

END_FOR;

#temp := 0;

FOR #a := 1 TO 5 BY 1 DO

FOR #b := 1 TO 3 BY 1 DO

#temp := #delta3[#b] * #wo[#b, #a]+#temp;

END_FOR;

#segma[#a] := #temp;

#temp := 0;

END_FOR;

FOR #a := 1 TO 5 BY 1 DO

#delta2[#a] := #dO[#a] * #segma[#a];

END_FOR;

FOR #a := 1 TO 5 BY 1 DO

FOR #b := 1 TO 4 BY 1 DO

#d_wi[#a, #b] := #xite * #delta2[#a] *#xi[#b];

END_FOR;

END_FOR;

FOR #a := 1 TO 5 BY 1 DO

FOR #b := 1 TO 4 BY 1 DO

#wi[#a, #b] := #wi_1[#a, #b] + #d_wi[#a, #b] + #alfa * (#wi_1[#a, #b] - #wi_2[#a, #b]);

END_FOR;

END_FOR;

//参数更新

#u_5 := #u_4;

#u_4 := #u_3;

#u_3 := #u_2;

#u_2 := #u_1;

#u_1 := #u;

#y_2 := #y_1;

#y_1 := #yout;

#wo_3 := #wo_2;

#wo_2 := #wo_1;

#wo_1 := #wo;

#wi_3 := #wi_2;

#wi_2 := #wi_1;

#wi_1 := #wi;

#e_2 := #e_1;

#e_1 := #e;

基于S7-1200 PLC实现PIDNN控制仿真相关推荐

  1. 基于s7—1200的电梯控制,wincc hmi动画仿真,带PLC源代码

    基于s7-1200的电梯控制,wincc hmi动画仿真,带PLC源代码,hmi源代码,图纸,IO地址分配id=639682504507&

  2. 【控制】《多无人机协同控制技术》周伟老师-第12章-基于 Multi-Agent 的多无人机协同控制仿真平台的设计与实现

    第11章 回到目录 无 第12章-基于 Multi-Agent 的多无人机协同控制仿真平台的设计与实现 12.1 多无人机协同控制视景仿真系统设计 12.1.1 多无人机协同控制视景仿真系统功能描述 ...

  3. 【飞行器】基于matlab四旋翼飞行器PID控制仿真【含Matlab源码 1277期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[飞行器]基于matlab四旋翼飞行器PID控制仿真[含Matlab源码 1277期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...

  4. 基于单片机的饮水机温度控制系统、基于单片机继电器及双向可控硅控制照明设备、基于单片机的液位自动检测控制仿真设计、基于单片机家用厨房天然气火灾报警器系统-设计全套资料

    1347基于单片机的饮水机温度控制系统-电设资料 随着社会的发展和科技的不断进步,人们的生活水平也在逐渐提高.与之而来的问题也很多,例如能源危机与环境污染,绿色环保理念因而开始深入人心.太阳能作为新兴 ...

  5. 基于 stm32f103 芯片的直流电机驱动控制仿真系统

    西电2022年A测(线上)题目 文章目录 前言 一.Keil5的安装 1.获取安装包 2.安装Keil5 3.运行注册机 4.安装器件库 二,运行工程文件,获取HEX可执行文件 1,获取工程文件 2. ...

  6. 西电A测|基于Arduino uno的温度检测控制仿真系统

    西电A测|基于Arduino uno的温度检测控制仿真系统 温度检测控制仿真系统 Proteus仿真电路图 Arduino IDE编写程序 结果验证 功能拓展 温度检测控制仿真系统 功能要求:Ardu ...

  7. matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究

    摘要: 基于Matlab/Simulink,本文设计了一个无刷直流电机的控制方案,详细阐述了无刷直流电机的运行原理,并用Matlab/Simulink对其进行了仿真.实验证明,用Matlab/Simu ...

  8. 基于simulink的无人机姿态飞行控制仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 无人机是无人驾驶飞机的简称(Unmanned Aerial Vehicle),是利用无线电遥控设备和 ...

  9. 路径跟踪—基于车辆运动学方程的离散时间LQR控制仿真

    文章目录 前言 一.运动学模型 二.建模仿真 总结 更新 前言 路径跟踪,轨迹跟踪的算法有基于运动学和基于动力学的,其中LQR算法基于车辆动力学网上有很多,毕竟百度开源了apollo,该算法通过简单改 ...

最新文章

  1. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
  2. linux线程引起jvm崩溃,JVM宕机分析
  3. Android -- WebView进度条
  4. BugkuCTF-MISC题Pokergame
  5. 用户注册与登陆(验证和数据库)
  6. 怎么给php下拉框默认选中
  7. matlab绘制等间距同心圆,CDR绘制等距离同心圆的多种方法
  8. 【视频技术】ffmpeg截取图片(Mac)
  9. 项目管理团队建设成功经验
  10. python如何截长图_python 截长图、H5页面截长图
  11. 利用jieba对已爬取好的中国地名信息进行分词
  12. Promise 是什么?
  13. 相关系数|皮尔逊和斯皮尔曼
  14. 【见闻录系列】我所理解的搜索业务二三事
  15. Kettle安装完报错:Driver class org.gjt.mm.mysql.Driver could not be found
  16. 点连线的思路与js的简单实现
  17. Android Studio 默认keystore 以及自定义keystore
  18. 家具行业APP定制开发需具备哪些功能
  19. OSPF虚链路(学习笔记+实验验证)
  20. 计算机冷门知识大全集,阴阳师冷门小知识汇总 冷门小知识合集一览

热门文章

  1. 5·29“爱脚日”,双驰“个性化量脚制鞋”以爱之名给你呵护
  2. 太阳光轨迹软件_轻松画太阳视运动轨迹
  3. matlab行星运动轨迹仿真动画,利用Matlab可视化功能实现微分方程求解行星运动轨迹...
  4. SAP的统驭科目 - 什么是SAP的统驭科目
  5. 微生物恒化器中的进化压力----进化模型推导与分析
  6. STM32L0系列的ADC用法
  7. 【BI学习心得10-时间序列实战】
  8. 隐藏控制台程序的dos窗口
  9. Arduino ESP32 WIFI 蓝牙模式触控按键切换
  10. 插入区间之非合并区间的思路 leetcode57