FUNCTION_BLOCK "块_1"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
p值 : Real;
积分 : Real;
反馈值 : Int;
设定值 : Real;
PID死区 : Real;
PID上限 : Real;
PID下限 : Real;
END_VAR
VAR_OUTPUT
输出控制值 : Real;
反馈过程值 : Real;
PID输出 : Int;
END_VAR
VAR_TEMP
当前误差 : Real;
上次误差 : Real;
计算当前输出值 : Real;
计算上次输出值 : Real;
反馈过程值临时存储 : Real;
输出过程值临时存储 : Real;
END_VAR
BEGIN
#反馈过程值临时存储 := INT_TO_REAL(#反馈值);//反馈值转成浮点数存入到临时存储区。
#反馈过程值 := (#反馈过程值临时存储 - 0.0) / 27648.0 * (#PID上限 - #PID下限) + #PID下限;//反馈过程值处理公式。
#当前误差 := #设定值 - #反馈过程值;//算出当前误差值。
IF ABS(#当前误差)<#PID死区 THEN//PID死区大于当前误差的绝对值时。(使用绝对值表示无论是整数还是负数都不允许超出比较范围)。
#计算当前输出值 := 0; //如果上述条件成立,当前输出值为0.
ELSIF ABS(#当前误差)>=#PID死区 THEN//PID死区小于等于当前误差,执行下面公式。
#计算当前输出值 := #p值 * (#当前误差 - #上次误差) + #积分 * #当前误差;//此公式在S7-200PID课程有讲,PID输出=p值*(当前误差-上次误差)+积分*当前误差。
END_IF;
#输出控制值 := #计算当前输出值;//将当前值输出值传送到输出控制值,再进行下一步处理。
IF #输出控制值 > #PID上限 THEN//如果输出控制值大于PID上限值。
#输出控制值 := #PID上限;//将上限值写入输出控制值。
ELSIF #输出控制值 < #PID下限 THEN//如果输出控制值小于PID下限值。
#输出控制值 := #PID下限;//将下限值写入输出控制值。
END_IF;
#上次误差 := #当前误差;//处理完成将当前误差写入上次误差。
#计算上次输出值 := #输出控制值;//处理完成将输出控制值写入上次输出值。
#输出过程值临时存储 := (#输出控制值 - #PID下限) / (#PID上限 - #PID下限) * 27648.0 + 0.0;//PID输出处理成0.0--27648.0范围。
#PID输出 := REAL_TO_INT(#输出过程值临时存储);//再小数0.0--27648.0转换成16位整数0-27648范围。
END_FUNCTION_BLOCK