根据你说的情况,有2种PID模式进行控制
一是PID控制做在PLC中,输出的4--20毫安信号直接给定变频器的频率输入,从而直接控制了变频器的输出而控制了电机的转速。
二是PLC的输出的4--20毫安信号作为变频器的AI输入,在变频器中做PID闭环控制,来控制电机转速。其实就简单一个恒压供水,根本用不着PLC,变频器本身就足够了,现在的变频器都带有单回路PID控制功能的
#include <stdlibh>
#include "global_varibleh"
/
模块名: PID
描述: PID调节子程序
采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。
当偏差绝对值小于△e时,用PID算法,提高稳定精度。
PIDout=kpe(t)+ki[e(t)+e(t-1)++e(1)]+kd[e(t)-e(t-1)]
============================================================================
入口: 无
出口: 无
改变: PID_T_Run=加热时间控制
/
void PID_Math(void)
{
signed long ee1; //偏差一阶
//signed long ee2; //偏差二阶
signed long d_out; //积分输出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700; //温度控制设定值3700度
PID_e0 = Temp_Set-Temp_Now; //本次偏差
ee1 = PID_e0-PID_e1; //计算一阶偏差
//ee2 = PID_e0-2PID_e1+PID_e2; //计算二阶偏差
if(ee1 > 500) //一阶偏差的限制范围
ee1 = 500;
if(ee1 < -500)
ee1 = -500;
PID_e_SUM += PID_e0; //偏差之和
if(PID_e_SUM > 200) //积分最多累计的温差
PID_e_SUM = 200;
if(PID_e_SUM < -200)
PID_e_SUM = -200;
PID_Out = PID_kpPID_e0+PID_kdee1; //计算PID比例和微分输出
if(abs(PID_e0) < 200) //如果温度相差小于15度则计入PID积分输出
{
if(abs(PID_e0) > 100) //如果温度相差大于1度时积分累计限制
{
if(PID_e_SUM > 100)
PID_e_SUM = 100;
if(PID_e_SUM < -100)
PID_e_SUM = -100;
}
d_out = PID_kiPID_e_SUM; //积分输出
if(PID_e0 < -5) //当前温度高于设定温度05度时积分累计限制
{
if(PID_e_SUM > 150)
PID_e_SUM = 150;
if(PID_e_SUM > 0) //当前温度高于设定温度05度时削弱积分正输出
d_out >>= 1;
}
PID_Out += d_out; //PID比例,积分和微分输出
}
else
PID_e_SUM=0;
PID_Out/=100; //恢复被PID_Out系数放大的倍数
if(PID_Out > 200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0 > 300) //当前温度比设定温度低3度则全速加热
PID_Out=200;
if(PID_e0 < -20) //当前温度高于设定温度02度则关闭加热
PID_Out=0;
Hot_T_Run=PID_Out; //加热时间控制输出
PID_e2 = PID_e1; //保存上次偏差
PID_e1 = PID_e0; //保存当前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end
首先你要建立PID控制的模型算法,才能写程序,同时要考虑到效率问题,具体的程序根据情况进行!
P,I ,D参数都可以设定,另外你的工艺参数有无特殊的要求,可以采用限值法等,根据工艺要求做,对扰动的措施,手动自动的切换你都要考虑。
PID是一种控制方法或理论,你把它理解成写程序的思路也可以,叫方法一定意义上也行,但它只给你提供了一个框架,根据具体控制对象和控制条件,如何实现归根到底还是得你自己考虑思路(流程)和方法(实现)。数学功底肯定要有,有时还必须应用高等数学理论,但别把这个看的太重,数学家不见得能当好程序员,编程需要特殊的思维方式,没这个能力看多美丽的数学公式也是抓瞎。强调一点。PID跟你学那种CPU哪种编程语言无关。
pid-比例加微分加积分矫正
传递函数为H(s)=Kp(Tas+1/(Tbs)+1)
这是频域的表达式,用汇编应该是在时域下来做吧?
相当于要计算Kp(f(x)+f'(x)Ta+f(x)的积分/Tb),是吧?
这个涉及到用汇编计算微分还有积分。。好难啊。。不会。。。
不过希望我写的东西可以帮助其他人回答楼主的问题
给你个Step 7写的PID控制的FC模块。带"_IN"与带"_OUT"的变量,如果前缀是一样的,要求连接同一个变量。
FUNCTION FC1 : VOID
VAR_INPUT
Run:BOOL; //True-运行,False-停止
Auto:BOOL; //True-自动,False-手动
ISW:BOOL; //True-积分有效,False-积分无效
DSW:BOOL; //True-微分有效,False-微分无效
SetMV:REAL; //手动时的开度设定值
SVSW:REAL; //当设定值低于SVSW时,开度为零
PV:REAL; //测量值
SV:REAL; //设定值
DeadBand:REAL; //死区大小
PBW:REAL; //比例带大小
IW:REAL; //积分带大小
DW:REAL; //微分带大小
dErr_IN:REAL; //误差累积
LastPV_IN:REAL; //上一控制周期的测量值
END_VAR
VAR_OUTPUT
MV:REAL; //输出开度
dErr_OUT:REAL; //误差累积
LastPV_OUT:REAL;//上一控制周期的测量值
END_VAR
VAR
Err:REAL; //误差
dErr:REAL; //误差累积
PBH:REAL; //比例带上限
PBL:REAL; //比例带下限
PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率
P:REAL; //比例项
I:REAL; //积分项
D:REAL; //微分项
END_VAR
IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //计算比例项
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为积分项的计算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上为积分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为微分项的计算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上为微分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;
END_FUNCTION
以上就是关于请教PLC控制电机转速pid怎么编程全部的内容,包括:请教PLC控制电机转速pid怎么编程、求一个单片机C语言编写的PID控制程序。谢谢!!、欧姆龙PLC的PID指令如何使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)