pidKp:=WORD_TO_REAL(Kp)/1000;
pidKi:=WORD_TO_REAL(Ki)/1000;
pidKd:=WORD_TO_REAL(Kd)/1000;
IF init = TRUE OR reset=TRUE THEN
init:=FALSE;
pid_integral:=0; (* начальные значения*)
prevErr:=0; (* ошибка для последующих вычислений*)
END_IF
error:=setPoint - input; (* вычисляем текущую ошибку*)
IF direction =1 THEN error:=0-error; END_IF (* если обратная характеристика*)
IF pidKi=0 THEN (* если интеграл коэф равен нулю*)
pid_Integral:=0; (* обнуляем интегральную составляющую*)
ELSE
pid_Integral:=pid_integral + error * dts *pidKi; (* вычисляем интегральную составляющую*)
IF pid_integral < minOut THEN (* ограничиваем интегральную составляющую снизу *)
minOutReal:=WORD_TO_REAL(minOut); (* преобразуем *)
pid_integral:=minOutReal; (* и ограничиваем*)
END_IF
IF pid_integral > maxOut THEN (* ограниваем интегральную сверху*)
maxOutReal:=WORD_TO_REAL(maxout); (* преобразуем*)
pid_integral:=maxOutReal; (* и ограниваем*)
END_IF
END_IF
pid_diferens:=(error-prevErr)/dts; (* диференциальная составляющая*)
prevErr:=error; (* сохраняем текущую ошибку, для будуших вызовов*)
output:= error*pidKp +pid_integral+ pid_diferens*pidKd; (* вычисляем значение выхода*)
IF output < minOut THEN minOutReal:=WORD_TO_REAL(minOut); output:=minOutReal; END_IF (* ограничиваем выход снизу *)
IF output > maxOut THEN maxOutReal:=WORD_TO_REAL(maxout); output:=maxOutReal; END_IF (* ограничиваем выход сверху*)
outint:=REAL_TO_WORD(output); (* преобразуем*)
out:=outint; (* и выдаем на выход*)




Ответить с цитированием