用宏指令编写的温度pid算法简单易懂(四)
用宏指编写piD算法程序,只用了一条宏指编写为的是简单易懂,也是为了移稙到其它软件方便些。本章介绍MVP和MVi部分,下章介绍MVD和MV(输出占空比)=MVP+MVi+MVD部分,以及宏指令变量窗口。指令原码如下(本章宏指令必须和下一章宏指令连在一起才能编译成功)。 #include "macrotypedef.h" #include "math.h"
int MacroEntry() { //程序运行周期,1秒 PV=FXIS_D[0];//DO(D8030)把PLC温度读到触摸屏 PV=((200)*(PV-817)/3278)-50;// 温度模块-50~+150=4~20ma if (P==0)//开关量输出 { if (PV>=SV){ MV=0;} //AT8为记下当时时间SV是给定值 ,MV为占空比输出(PLC的D1)。 if (PV<=SV-DF){MV=OPH;}//AT8为记下当时时间DF回差 } else { //mvP的计算;///////////////////////////////////////////////////////////////// //MVP 输出 MVP = (SV - PV) * 1000/ (P+0.001); if (MVP<0){ MVP=0;} if (MVP>100){MVP=100;} //mvI的计算;//////////////////////////////////////////////////////////////////////////////// MVI2 = 0; MVI3 = 0; LW4054=LW4056; LW4056=LW9034;LW4058=LW9034-LW4054;LW4058=LW9034-LW4054;LW4058=LW4058/10; MVI1 =((SV - PV) * 1000/ (P+0.001) / (I + 0.001))*LW4058 ;
if (I1!=PV)//同升降 { if (I2!=SV) { if (I0==PV-SV){ I1=PV;I2=SV;I4=1;}//在PID窗口显示变化的位置 } } I0=PV-SV; if (I1!=PV)//PV有变化====================================== { if (PV>SV)//解决PV>SV情况 { MVI2= ((I1-PV) * 1000 / (P+0.001)); } if (I1<SV)//第2种情况。PV从负上穿或=SV { if (PV>SV){MVI2= -((PV-SV) * 1000/ (P+0.001)) ;}//只减穿过SV的部分 } if (I1>PV)//第3种情况。PV从正变为0或下穿SV { if (I1>SV) { if (PV<=SV){MVI2= ((I1-SV) * 1000 / (P+0.001));}//只加未穿过SV的部分 } }//************************************** if (PV-SV>(P+0.001)/20)//PV高于SV //解决人工设定SV的问题 { MVI1= 0;MVI2= 0;MVI3= 0;MVIT= 0; } }//================================================= I1= PV;
if (I2!=SV)//SV有变化,除了人工设定外,走曲线只能每次加0.1,如果每次加的数较大,在使用SV变化程序来控制没意义。 { if (I2<=PV)//第1种情况。在PV大于=SV的情况下SV往下降** { if (I2>SV){MVI3= ((SV-I2) * 1000 / (P+0.001));} //减SV-I2 }//*********************************** if (SV<PV)//第2种情况。前SV下穿PV或=PV **** { if (I2>PV) { if (SV<=PV){MVI3= ((SV-PV) * 1000 / (P+0.001));} // '只减穿过PV的部分SV-PV } }//************************************** if (I2<=PV)//第3种情况。在PV大于I2的情况下、SV上行 **** { if (SV>I2) { if (SV<=PV)//没有越过PV { MVI3=((SV-PV) * 1000 / (P+0.001));// '加// '加(纠结,减∶没有测试) } if (SV>PV) //SV越过了PV { MVI3= ((SV-I2) * 1000 / (P+0.001));// '加SV-I2 } } }//************************************** if (MVI3>(200 / (P+0.001))){MVI3= 0; } //如果曲线SV上升超0.2度的控制没意义。如果人工设定会出现很的MVI3 if (MVI3<-(200/ (P+0.001))) {MVI3= 0;} //如果曲线SV下降超0.2度的控制没意义。如果人工设定会出现很的-MVI3 if (SV-PV>(P+0.001)*0.1)//SV高于PV { MVI1= 0;MVI2= 0;MVI3= 0;MVIT= 0; } }//================================================= I2 = SV; if (I==0) {MVI1= 0;MVI2= 0;MVI3= 0;MVIT= 0; } if (MVP+MVI1>99){ MVI1=100-MVP;MVIT=0; } MVIT= MVIT+MVI1;// '累加公共部分 MVIT= MVIT+MVI2+MVI3;// ''累加PV变化的部分+SV变化的部分 MVI= MVIT;