PID控制器的参数整定是控制系统设计的核心内容。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。三种方法各有其特点,其共同点都是通过试验,然后按照工程经验公式对控制器参数进行整定。但无论采用哪一种方法所得到的控制器参数,都需要在实际运行中进行最后调整与完善。 一种增量式PID: △U(k)=Ae(k)-Be(k-1)+Ce(k-2) A=Kp(1+T/Ti+Td/T) B=Kp(1+2Td/T)C=KpTd/TT采样周期 Td微分时间 Ti积分时间
指点谈不上,大家交流一下。
我是这样做的,在实际应用中感觉还行(一个用控制风机频率来实现加温结果恒定的系统):
第一步:先用被控对象目标测量值与设定值都除以量程,(相当于换成百分比了,程序里过程为LAD2,15-16行,F8:27—F8:31/850---F8:35,设定F8:77-F8:33/850—F8:37);
第二步:用换成百分比的设定值减测量值,(LAD3中第1行,F8:11存储),用相减的结果乘以I值(F8:73存储I值,积分系数);
第三步:再计算一个换成百分比的设定值减测量值,乘以01后乘以I值后除以P值,然后将此数值和主程序值相加(F8:15,初始切换到自动PID调节时此值为0,见LAD2第18行,自动后每个周期加一次此数),同时把结果也存储到F8:15中(如果调节目标的测量值和实际值之差小于02,则将F8:15赋值0,相当于不再累加LAD2第59行);
第四步:将第二步和第四步的值相减存储于F8:17中,并判断其是否大于1,大于1则赋值1;(F8:15和值系数也需要这样一个判读和赋值,不过基本上不可能)
第五步:将计算结果在主程序中(LAD2第20行)乘以输出幅度(输出为风机频率,最大50赫兹),然后在在上一周期输出值基础上累加(LAD2第61行)。
第六步:将上述计算结果换算成模块的输出信号值(先除以输出幅度,变换为百分比,标度变换系数12483)
上述内容自己看着都别扭,简单点讲就是将调节目标的实际值和设定值转换为百分比后取差,然后将差值的1/10×I÷P后再求差,结果累加到输出上去。P值越大,差值越大,I值越大,差值越小,每个扫描周期累加一次,直到实际值和设定值接近。
我用的PLC是AB的MicroLogix1200系列,不知道你能打开不?
PID广泛应用于工业生产各个环节,然而对于不同PID结构会有一些差异,导致在调参时若按照常规的经验调试,结果将会有非常大的不同。
串联型PID的三个环节由比例,积分和微分项串级而成,结构简图如下:
其传递函数为:
若使用后向欧拉法将其离散化,即将:
带入式(1-1)中,可得到:
其中:
式(1-3)即为串联型PID的离散化增量式实现。利用递推的方法可得到绝对式实现如下:
并联型PID的三个环节由比例,积分和微分项并联而成,其结构简图如下:
其传递函数为:
串联型与并联型二者的系数有所不同,其关系如下:
使用后向欧拉离散化,可得到并联型PID的离散化增量式实现如下:
若使用Tustin方式离散化,即将:
带入式(2-1)中,并将 置为0,可得到:
此即为并联型PI的离散化增量式实现。同样利用递推的方法可以得到绝对式实现如下:
标准型PID与上述二者都不同,其结构简图如下:
其传递函数为:
此时有:
使用后向欧拉离散化方法,可得到标准型PID的离散化增量式实现:
若使用Tustin方式离散化,并将 置0,则得到标准型PI的离散化增量式实现:
式(3-4)即为TI的快速电流环(FCL)中速度优化型PI控制器实现原理。值得注意的是,FCL中的各变量均为标幺值,因此实际实现需要稍作转换,即:
其中:
最后,使用同样的递推法,可以得到绝对式实现:
<div id="refer-anchor-1"></div>
你好,在Excel编写坐标增量很简单!公式:ΔX=平距COS(
方位角
PI()/180))ΔY=平距SIN(方位角PI()/180))如果还有什么不明白的请咨询本团!谢谢!
typedef struct{
float limit; //输出限幅
float target; //设置量
float feedback; //实测量
float Kp; //比例系数
float Ki; //积分系数
float Kd; //微分系数
float eSum; //误差积分
float e0; //当前误差
float e1; //上一次误差
}PIDType;
#define max(a, b) (a>b a:b)
#define min(a, b) (a<b a:b)
#define range(x, a, b) (min(max(x, a), b))
float pid_pos_update(PIDType p)
{
float pe, ie, de;
float out=0;
//计算当前误差
p->e0 = p->target - p->feedback;
//误差积分
p->eSum += p->e0;
//误差微分
de = p->e0 - p->e1;
pe = p->e0;
ie = p->eSum;
p->e1 = p->e0;
//数据增量
out = pe(p->Kp) + ie(p->Ki) + de(p->Kd);
//输出限幅
out = range(out, -p->limit, p->limit);
return out;
}
C++中用宏来定义pi,可以这样:
#define PI 31415926
说明:
宏定义的格式是:
#define 宏名 字符串
对照上面的定义,宏名是PI,字符串是31415926。
编译器在编译程序时,先使用宏名代表的字符串把所有宏名替换,然后再进行编译。
注意点:
宏定义后面不需要分号;
宏名的命名和标准变量的命名规则相同,不允许数字开头。
作为编程习惯,一边用全大写字母作为宏名,比如:MAX_ITEM, MIN_NUM等等。
对于算术表达式的宏定义,最好用小括号括起来,比如:
#define MAX_NUM (2+4)
如果程序里有4MAX_NUM,预编译被替代后就是4(2+4),想想如果没有括号,就会替代成42+4,两者的结果截然不同,所以一定要注意这种定义。
C代码和运行结果如下:
可见在给定精度下,输出π的近似值为3141393,望采纳~
附源码:
#include <stdioh>
#define E 1e-4
int main() {
double pi = 0;
int i, sign = 1; // sign表示正负号
for (i = 1; 10 / i >= E; i += 2) {
pi += sign 10 / i;
sign = -sign;
}
pi = pi 4;
printf("%lf\n", pi);
return 0;
}
以上就是关于请问这个pI控制器的p参数是如何算出来的,求具体过程,谢谢全部的内容,包括:请问这个pI控制器的p参数是如何算出来的,求具体过程,谢谢、在PLC编程中如何实现PI算式、串联型PID,并联型PID与标准型PID简要说明等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)