Показано с 1 по 8 из 8

Тема: ПИД на ПЛК160 [М02]

  1. #1

    По умолчанию ПИД на ПЛК160 [М02]

    Всем привет!
    Есть задача управлять 3х ходовым клапаном 0-10 В по ПИД закону с ПЛК160 [М02] в режиме охлаждения.
    Подскажите, пожалуйста, какой ФБ и с какой библиотеки лучше использовать ?

  2. #2

    По умолчанию

    https://content.helpme-codesys.com/e...oller/PID.html
    Util -> PID

    В составе CoDeSys есть справки на английском и русском.
    Также, можно вместо проекта открыть библиотеку и посмотреть устройство на ST.
    Есть ограничения - для работы нужно ненулевые K и Tи, иначе код не выполняется - такое входное условие на ST.

  3. #3

    По умолчанию

    FUNCTION_BLOCK PID1
    VAR_INPUT

    input:INT; (* входная величина*)
    setPoint: INT; (* уставка *)

    minOut: WORD; (* минимальное значение выходного сигнала*)
    maxOut: WORD; (* максимальное*)

    Kp: WORD; (* пропорциональный коэффициент*)
    Ki:WORD; (* интегральный коэффициент*)
    Kd: WORD; (* дифференциальный коэффициент*)
    dts: REAL; (* время дискретизации*)

    direction:BOOL; (* направление 0: нормальное - увеличение выходного сигнала, приводит к увеличению входного*)
    (* 1: обратное - увеличение выходного сигнала приводит к уменьшению входного *)
    reset:BOOL; (* сброс значений выхода, интегральной суммы, дифференциальной суммы*)

    END_VAR
    VAR_OUTPUT
    output:REAL; (* выходное значение*)
    outInt:WORD;
    out:WORD;
    END_VAR
    VAR
    init: BOOL:=TRUE;

    error : INT; (* ошибка регулирования*)
    prevInput: INT; (* предыдушее значение*)

    prevErr: INT;
    pid_integral: REAL;
    pid_diferens:REAL;

    minOutReal:REAL;
    maxOutReal:REAL;



    pidKp: REAL; (* пропорциональный коэффициент*)
    pidKi:REAL; (* интегральный коэффициент*)
    pidKd: REAL; (* дифференциальный коэффициент*)


    END_VAR

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

    (* максимальную температуру на выходе приточной системы ----------------------------------------------------------------------------------*)

    IF p1_pid5_tdiscr>p1_pid5_tdiscr_set THEN (* если наступило время расчет пид*)
    p1_pid5_tdiscr:=0; (* обнуляем текушее время, выполняем расчет*)

    p1_pid5_zima_max (input:=p1_Tvihod, (* температура канала*)
    setPoint:=Tvihod_max_calc, (* максимальная температура канала*)
    kp:=pid_zima_max_Kp, ki:=pid_zima_max_Ki, kd:=pid_zima_max_Kd, dts:=p1_pid5_tdiscr_set,
    direction:=0, minOut:=0, maxOut:=Umax);

    P1_zima_umax_calc:=p1_pid5_zima_max.out; (* выгружаем на выход*)
    END_IF

  6. #6

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    https://content.helpme-codesys.com/e...oller/PID.html
    Util -> PID

    В составе CoDeSys есть справки на английском и русском.
    Также, можно вместо проекта открыть библиотеку и посмотреть устройство на ST.
    Есть ограничения - для работы нужно ненулевые K и Tи, иначе код не выполняется - такое входное условие на ST.
    Подскажите, работает ли он в эмуляции?

  7. #7

    По умолчанию

    Цитата Сообщение от oleg123 Посмотреть сообщение
    Подскажите, работает ли он в эмуляции?
    Работа в эмуляции на скрине 1 Работа ПИД из Util.jpg
    Работа PID из Util

  8. #8

    По умолчанию

    Спасибо!!!

Похожие темы

  1. Ответов: 3
    Последнее сообщение: 29.01.2025, 08:33
  2. ПЛК160 или ПЛК160(М02) - как определить?
    от In_Da_Cher_A в разделе ПЛК1хх [М02]
    Ответов: 3
    Последнее сообщение: 30.03.2022, 14:40
  3. Ответов: 2
    Последнее сообщение: 20.03.2020, 17:32
  4. ПЛК160(Master)+МВВ+ПЛК160(slave), по Modbus RTU
    от NikolaevV в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 16.05.2019, 18:07
  5. Ответов: 6
    Последнее сообщение: 22.05.2017, 12:31

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •