请教PLC控制电机转速pid怎么编程

请教PLC控制电机转速pid怎么编程,第1张

根据你说的情况,有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指令如何使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9854816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存