scl编写的。功能块FB 临时变量已赋予初始值,改为静态变量也不行。请问高人是代码哪里有问题,一直找不到原因
FUNCTION_BLOCK FB666
// Block Parameters
VAR_INPUT
// Input Parameters
X1: BOOL;
p: REAL;
I: REAL;
PVfeedback: INT;
SP: REAL ; //
PID_upperlimit: REAL;
PID_downlimit: REAL;
deadzone: REAL;
END_VAR
VAR_IN_OUT
// I/O Parameters
END_VAR
VAR_OUTPUT
// Output Parameters
X2: BOOL;
feedbackprocess: REAL ; //反馈过程值
outputprocess: REAL; //输出控制值
pidoutput: INT;
END_VAR
VAR_TEMP
// Temporary Variables
END_VAR
VAR
// Static Variables
feedbacktemp: REAL:= 0.0;
current_offset: REAL:= 0.0;
current_value: REAL:= 0.0;
last_value: REAL:= 0.0;
outputtemp: REAL:= 0.0;
last_offset: REAL:= 0.0;
END_VAR
// Statement Section
#feedbacktemp := INT_TO_REAL(#PVfeedback);//反馈值转成浮点数存入到临时存储区。
#feedbackprocess := (#feedbacktemp - 0.0) / 27648.0 * (#PID_upperlimit - #PID_downlimit) + #PID_downlimit;//反馈过程值处理公式。
#current_offset := #SP - #feedbackprocess;//算出当前误差值。
IF ABS(#offset)<#deadzone THEN//PID死区大于当前误差的绝对值时。(使用绝对值表示无论是整数还是负数都不允许超出比较范围)。
#current_value := last_value; //如果上述条件成立,当前输出值为0.
ELSIF ABS(#current_offset)>=#deadzone THEN//PID死区小于等于当前误差,执行下面公式。
#current_value := #p * (#current_offset - #last_offset) + #I * #current_offset;//此公式在S7-200PID课程有讲,PID输出=p值*(当前误差-上次误差)+积分*当前误差。
END_IF;
#outputprocess := #current_value;//将当前值输出值传送到输出控制值,再进行下一步处理。
IF #outputprocess > #PID_upperlimit THEN//如果输出控制值大于PID上限值。
#outputprocess := #PID_upperlimit;//将上限值写入输出控制值。
ELSIF #outputprocess < #PID_downlimit THEN//如果输出控制值小于PID下限值。
#outputprocess := #PID_downlimit;//将下限值写入输出控制值。
END_IF;
#last_offset := #current_offset;//处理完成将当前误差写入上次误差。
#last_value := #outputprocess;//处理完成将输出控制值写入上次输出值。
#outputtemp := (#outputprocess - #PID_downlimit) / (#PID_upperlimit - #PID_downlimit) * 27648.0 + 0.0;//PID输出处理成0.0--27648.0范围。
#pidoutput := REAL_TO_INT(#outputtemp);//再小数0.0--27648.0转换成16位整数0-27648范围
END_FUNCTION_BLOCK