PID程序
要求:1.西门子1200PLC
2.SCL语言编程
3.偏差控制
4.模拟量输入
5.模拟量输
6输出上线限制 下面是一个简单的PID控制程序,满足你的要求:
FUNCTION_BLOCK PID_Control
VAR_INPUT
Setpoint: REAL; // 设定值
ProcessValue: REAL; // 过程量值
END_VAR
VAR_OUTPUT
Output: REAL; // 控制器输出
END_VAR
VAR_IN_OUT
Kp: REAL := 1.0;// 比例常数
Ki: REAL := 0.5;// 积分常数
Kd: REAL := 0.2;// 微分常数
Integral: REAL := 0.0; // 积分部分
Derivative: REAL := 0.0; // 微分部分
LastError: REAL := 0.0; // 上次偏差
OutputMin: REAL := -10.0; // 控制器输出下限
OutputMax: REAL := 10.0; // 控制器输出上限
END_VAR
// 计算本次偏差和累计偏差
LastError := Setpoint - ProcessValue;
Integral := Integral + LastError;
Derivative := LastError - Derivative;
// 计算控制器输出
Output := Kp * LastError + Ki * Integral + Kd * Derivative;
// 控制器输出上下限限制
IF Output < OutputMin THEN
Output := OutputMin;
ELSIF Output > OutputMax THEN
Output := OutputMax;
END_IF;
END_FUNCTION_BLOCK
在程序中,我们定义了一个函数块`PID_Control`,以设定值`Setpoint`和过程量值`ProcessValue`为输入,以控制器输出`Output`为输出。在函数块内部,我们采用了PID控制的基本公式进行计算,其中包括比例、积分、微分三个部分。
需要注意的是,为了防止控制器输出超出上下限,我们在程序中加入了限幅处理。具体地,在计算结束后,我们检查输出是否超出了`OutputMin`和`OutputMax`的范围,并根据情况进行上下限限制。 用PI控制即可 如果只需要使用PI控制,那么可以在上面的程序中去掉微分部分,即将代码中的`Kd`设为0。如下所示:
FUNCTION_BLOCK PI_ControlVAR_INPUT
Setpoint: REAL; // 设定值
ProcessValue: REAL; // 过程量值END_VARVAR_OUTPUT
Output: REAL; // 控制器输出END_VARVAR_IN_OUT
Kp: REAL := 1.0; // 比例常数
Ki: REAL := 0.5; // 积分常数
Integral: REAL := 0.0; // 积分部分
OutputMin: REAL := -10.0; // 控制器输出下限
OutputMax: REAL := 10.0;// 控制器输出上限END_VAR
// 计算本次偏差和累计偏差
LastError := Setpoint - ProcessValue;
Integral := Integral + LastError;
// 计算控制器输出,并进行上下限限制
Output := Kp * LastError + Ki * Integral;
IF Output < OutputMin THEN
Output := OutputMin;
ELSIF Output > OutputMax THEN
Output := OutputMax;
END_IF;
END_FUNCTION_BLOCK
整个程序的主体结构和上一个程序大致相同,只是在计算部分去掉了微分项。需要注意的是,在使用PI控制时,由于没有加入微分项,控制器输出可能会出现一定的超调现象。因此,需要针对实际场景进行调试,以获得最好的控制效果。
页:
[1]