基于S7-1200 PLC实现PIDNN控制仿真
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控制仿真相关推荐
- 基于s7—1200的电梯控制,wincc hmi动画仿真,带PLC源代码
基于s7-1200的电梯控制,wincc hmi动画仿真,带PLC源代码,hmi源代码,图纸,IO地址分配id=639682504507&
- 【控制】《多无人机协同控制技术》周伟老师-第12章-基于 Multi-Agent 的多无人机协同控制仿真平台的设计与实现
第11章 回到目录 无 第12章-基于 Multi-Agent 的多无人机协同控制仿真平台的设计与实现 12.1 多无人机协同控制视景仿真系统设计 12.1.1 多无人机协同控制视景仿真系统功能描述 ...
- 【飞行器】基于matlab四旋翼飞行器PID控制仿真【含Matlab源码 1277期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[飞行器]基于matlab四旋翼飞行器PID控制仿真[含Matlab源码 1277期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式 ...
- 基于单片机的饮水机温度控制系统、基于单片机继电器及双向可控硅控制照明设备、基于单片机的液位自动检测控制仿真设计、基于单片机家用厨房天然气火灾报警器系统-设计全套资料
1347基于单片机的饮水机温度控制系统-电设资料 随着社会的发展和科技的不断进步,人们的生活水平也在逐渐提高.与之而来的问题也很多,例如能源危机与环境污染,绿色环保理念因而开始深入人心.太阳能作为新兴 ...
- 基于 stm32f103 芯片的直流电机驱动控制仿真系统
西电2022年A测(线上)题目 文章目录 前言 一.Keil5的安装 1.获取安装包 2.安装Keil5 3.运行注册机 4.安装器件库 二,运行工程文件,获取HEX可执行文件 1,获取工程文件 2. ...
- 西电A测|基于Arduino uno的温度检测控制仿真系统
西电A测|基于Arduino uno的温度检测控制仿真系统 温度检测控制仿真系统 Proteus仿真电路图 Arduino IDE编写程序 结果验证 功能拓展 温度检测控制仿真系统 功能要求:Ardu ...
- matlab仿真直流电机,[转载]基于Matlab/Simulink的无刷直流电机控制仿真研究
摘要: 基于Matlab/Simulink,本文设计了一个无刷直流电机的控制方案,详细阐述了无刷直流电机的运行原理,并用Matlab/Simulink对其进行了仿真.实验证明,用Matlab/Simu ...
- 基于simulink的无人机姿态飞行控制仿真
目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 无人机是无人驾驶飞机的简称(Unmanned Aerial Vehicle),是利用无线电遥控设备和 ...
- 路径跟踪—基于车辆运动学方程的离散时间LQR控制仿真
文章目录 前言 一.运动学模型 二.建模仿真 总结 更新 前言 路径跟踪,轨迹跟踪的算法有基于运动学和基于动力学的,其中LQR算法基于车辆动力学网上有很多,毕竟百度开源了apollo,该算法通过简单改 ...
最新文章
- c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
- linux线程引起jvm崩溃,JVM宕机分析
- Android -- WebView进度条
- BugkuCTF-MISC题Pokergame
- 用户注册与登陆(验证和数据库)
- 怎么给php下拉框默认选中
- matlab绘制等间距同心圆,CDR绘制等距离同心圆的多种方法
- 【视频技术】ffmpeg截取图片(Mac)
- 项目管理团队建设成功经验
- python如何截长图_python 截长图、H5页面截长图
- 利用jieba对已爬取好的中国地名信息进行分词
- Promise 是什么?
- 相关系数|皮尔逊和斯皮尔曼
- 【见闻录系列】我所理解的搜索业务二三事
- Kettle安装完报错:Driver class org.gjt.mm.mysql.Driver could not be found
- 点连线的思路与js的简单实现
- Android Studio 默认keystore 以及自定义keystore
- 家具行业APP定制开发需具备哪些功能
- OSPF虚链路(学习笔记+实验验证)
- 计算机冷门知识大全集,阴阳师冷门小知识汇总 冷门小知识合集一览
热门文章
- 5·29“爱脚日”,双驰“个性化量脚制鞋”以爱之名给你呵护
- 太阳光轨迹软件_轻松画太阳视运动轨迹
- matlab行星运动轨迹仿真动画,利用Matlab可视化功能实现微分方程求解行星运动轨迹...
- SAP的统驭科目 - 什么是SAP的统驭科目
- 微生物恒化器中的进化压力----进化模型推导与分析
- STM32L0系列的ADC用法
- 【BI学习心得10-时间序列实战】
- 隐藏控制台程序的dos窗口
- Arduino ESP32 WIFI 蓝牙模式触控按键切换
- 插入区间之非合并区间的思路 leetcode57