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; (* и выдаем на выход*)