Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Не работает функциональный блок PID из стандартной библиотеки Util.lib - Контроллеры

  1. #1

    По умолчанию Не работает функциональный блок PID из стандартной библиотеки Util.lib - Контроллеры

    Использую среду программирования Codesys v.2.3 для программирования ПЛК ОВЕН 110.60(М02).
    Использую функциональный блок ПИД-регулирования из стандартной библиотеки Util.lib.
    Во время работы программы переменная ПИД-регулятора ctu_PID.Y всегда равна 0, хотя согласно пред-настройкам входных переменных должна принимать другое значение. Кто-нибудь может проверить код выложенный ниже и объяснить мне как правильно подключать функциональные блоки из библиотек Codesys?

    PHP код:
    PROGRAM PLC_PRG
    VAR CONSTANT
        Curr_SetPoint
    : REAL := 12.5;
        
    Low_Pressure_Set: REAL := 10.0;
        
    High_Pressure_Set: REAL := 15.0;
    END_VAR
     
    VAR
        
    ctu_PID: PID;
        
    Curr_Dif_Pressure: REAL;
        
    Tmp: REAL;
        
    Is_Door_Open: BOOL;
    END_VAR
     
    Moving1 
    := Moving2 := 1;
    Moving3 := Moving4 := Moving5 := 2;
    Is_Door_Open := FALSE;
    Curr_Dif_Pressure := 8.6;
    ctu_PID.ACTUAL := Curr_Dif_Pressure;
    ctu_PID.SET_POINT := Curr_SetPoint;
    ctu_PID.Y_MIN := 0.0;
    ctu_PID.Y_MAX := 1000;
    Tmp := ctu_PID.Y;
    IF(
    ctu_PID.OVERFLOW )
    THEN
        ctu_PID
    .RESET := TRUE;
    END_IF;
    IF 
    NOT( Is_Door_Open)
    THEN
        
    IF(Curr_Dif_Pressure < Low_Pressure_Set)
        
    THEN
                Frequency1 
    := REAL_TO_WORD(Tmp);
                
    Frequency2 := REAL_TO_WORD(Tmp);
                
    Frequency3 := 0;
                
    Frequency4 := 0;
                
    Frequency5 := 0;
        
    ELSIF(Curr_Dif_Pressure > High_Pressure_Set)
        
    THEN
                Frequency1 
    := 0;
                
    Frequency2 := 0;
                
    Frequency3 := REAL_TO_WORD(Tmp);
                
    Frequency4 := REAL_TO_WORD(Tmp);
                
    Frequency5 := REAL_TO_WORD(Tmp);
        ELSE
                
    Frequency1 := 300;
                
    Frequency2 := 0;
                
    Frequency3 := 300;
                
    Frequency4 := 300;
                
    Frequency5 := 0;
        
    END_IF;
    ELSE
        
    Frequency1 := 300;
        
    Frequency2 := 0;
        
    Frequency3 := 300;
        
    Frequency4 := 300;
        
    Frequency5 := 0;
    END_IF; 
    В ручном режиме ПИД-регулятор также не работает(скриншот ниже)
    Изображения Изображения

  2. #2

    По умолчанию

    Вы нигде не вызываете ФБ ПИД. Вы не даете ему работать.

  3. #3

    По умолчанию

    1. Крайне желательно обрабатывать PID в отдельной программе с отдельной от всего остального кода выделенной задачей с высшим приоритетом (100мс например)
    2. ASo верно сказал. Вы нигде не вызываете экземпляр. Математика блока может работать только если блок циклически вызывается. Пример вызова ниже.
    PHP код:
    IF MODE_GVS=1 THEN SP_TE3:=TE3_M; GVS_MAN:=TRUE; ELSE GVS_MAN:=FALSE; END_IF;(*&#208;ó÷íîé*)
    IF MODE_GVS=2 THEN Y1_MANUAL:=Y1_M;  END_IF;(*&#192;âòî*)
    IF Y1_MANUAL<0 THEN Y1_MANUAL:=0; END_IF;IF Y1_MANUAL>100 THEN Y1_MANUAL:=100; END_IF;
    PID_Y1(
        
    ACTUAL:= TE3_M, (* actual value, process variable *)
        
    SET_POINT:= SP_TE3,(* desired value, set point *)
        
    KP:= Y1_P,(* proportionality const. (P)*)
        
    TN:= Y1_I, (* reset time (I) in sec *)
        
    TV:= Y1_D, (* rate time, derivative time (D) in sec*)
        
    Y_MANUAL:=Y1_MANUAL , (* Y is set to this value as long as MANUAL=TRUE *)
        
    Y_OFFSET:= 0.1, (* offset for manipulated variable *)
        
    Y_MIN:= 0.0, (* minimum value for manipulated variable *)
        
    Y_MAX:= 100.0, (* maximum value for manipulated variable *)
        
    MANUAL:= GVS_MAN, (*     TRUE: manual: Y is not influenced by controller,FALSE: controller determines Y *)
        
    RESET:= GVS_RESET, (* reset: set Y output to Y_OFFSET and reset integral part *)
        
    Y=> Y1_M, (* manipulated variable, set value*)
        
    LIMITS_ACTIVE=> Y1_LA,(* true set value would exceed limits Y_MIN, Y_MAX *)
        
    OVERFLOW=> Y1_OW);(* overflow in integral part *) 
    +79104444236
    С уважением,
    Лапшин Вячеслав

  4. #4
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,232

    По умолчанию

    а разве так можно?
    Moving1 := Moving2 := 1;

  5. #5

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    а разве так можно?
    Moving1 := Moving2 := 1;
    пока ещё не знаю, но код компилируется

  6. #6

    По умолчанию

    Цитата Сообщение от krollcbas Посмотреть сообщение
    1. Крайне желательно обрабатывать PID в отдельной программе с отдельной от всего остального кода выделенной задачей с высшим приоритетом (100мс например)
    2. ASo верно сказал. Вы нигде не вызываете экземпляр. Математика блока может работать только если блок циклически вызывается. Пример вызова ниже.
    PHP код:
    IF MODE_GVS=1 THEN SP_TE3:=TE3_M; GVS_MAN:=TRUE; ELSE GVS_MAN:=FALSE; END_IF;(*&#208;ó÷íîé*)
    IF MODE_GVS=2 THEN Y1_MANUAL:=Y1_M;  END_IF;(*&#192;âòî*)
    IF Y1_MANUAL<0 THEN Y1_MANUAL:=0; END_IF;IF Y1_MANUAL>100 THEN Y1_MANUAL:=100; END_IF;
    PID_Y1(
        
    ACTUAL:= TE3_M, (* actual value, process variable *)
        
    SET_POINT:= SP_TE3,(* desired value, set point *)
        
    KP:= Y1_P,(* proportionality const. (P)*)
        
    TN:= Y1_I, (* reset time (I) in sec *)
        
    TV:= Y1_D, (* rate time, derivative time (D) in sec*)
        
    Y_MANUAL:=Y1_MANUAL , (* Y is set to this value as long as MANUAL=TRUE *)
        
    Y_OFFSET:= 0.1, (* offset for manipulated variable *)
        
    Y_MIN:= 0.0, (* minimum value for manipulated variable *)
        
    Y_MAX:= 100.0, (* maximum value for manipulated variable *)
        
    MANUAL:= GVS_MAN, (*     TRUE: manual: Y is not influenced by controller,FALSE: controller determines Y *)
        
    RESET:= GVS_RESET, (* reset: set Y output to Y_OFFSET and reset integral part *)
        
    Y=> Y1_M, (* manipulated variable, set value*)
        
    LIMITS_ACTIVE=> Y1_LA,(* true set value would exceed limits Y_MIN, Y_MAX *)
        
    OVERFLOW=> Y1_OW);(* overflow in integral part *) 

    По первому пункту, могли бы вы объяснить подробнее как это делается или дать ссылочку на путный гайд?
    По второму пункту тоже пока ничего не получается. Могли бы вы подробнее указать на мои ошибки? Ниже привожу код и скриншот экрана при выполнении программы. Не пойму, что я делаю не так?

    PHP код:
    PROGRAM PLC_PRG
    VAR CONSTANT
        Curr_SetPoint
    : REAL := 12.5;
        
    Low_Pressure_Set: REAL := 10.0;
        
    High_Pressure_Set: REAL := 15.0;
    END_VAR

    VAR
        
    ctu_PID: PID;
        
    Curr_Dif_Pressure: REAL;
        
    Tmp: REAL;
        
    Is_Door_Open: BOOL;
    END_VAR


    ctu_PID
    (ACTUAL := 10.0, SET_POINT := 12.0, Y_MIN := 4, Y_MAX := 20,  Y  => Tmp);
    ctu_PID; 
    screenshot2.png

  7. #7
    Пользователь Аватар для Василий Кашуба
    Регистрация
    20.11.2011
    Адрес
    Ставрополь
    Сообщений
    2,548

    По умолчанию

    Цитата Сообщение от Дмитрий_Кирсанов Посмотреть сообщение
    По первому пункту, могли бы вы объяснить подробнее как это делается или дать ссылочку на путный гайд?
    По второму пункту тоже пока ничего не получается. Могли бы вы подробнее указать на мои ошибки? Ниже привожу код и скриншот экрана при выполнении программы. Не пойму, что я делаю не так?

    PHP код:
    PROGRAM PLC_PRG
    VAR CONSTANT
        Curr_SetPoint
    : REAL := 12.5;
        
    Low_Pressure_Set: REAL := 10.0;
        
    High_Pressure_Set: REAL := 15.0;
    END_VAR

    VAR
        
    ctu_PID: PID;
        
    Curr_Dif_Pressure: REAL;
        
    Tmp: REAL;
        
    Is_Door_Open: BOOL;
    END_VAR


    ctu_PID
    (ACTUAL := 10.0, SET_POINT := 12.0, Y_MIN := 4, Y_MAX := 20,  Y  => Tmp);
    ctu_PID; 
    screenshot2.png
    Вот так делается. Снимок.PNG , а вот так вызывается Снимок_.PNG

  8. #8
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,232

    По умолчанию

    вызвать Фб можно по разному:
    сначала установить параметры
    ctu_PID.ACTUAL:=10.0;
    ctu_PID.SET_POINT:=12.0;
    ...
    а потом, где-нибудь вызываем
    ctu_PID();

    или сразу вызываем с параметрами
    ctu_PID(ACTUAL := 10.0, SET_POINT := 12.0, Y_MIN := 4, Y_MAX := 20);

    выходы так же можно читать по разному
    при вызове ctu_PID(Y=>Tmp);
    или после вызова Tmp:=ctu_PID.Y;

  9. #9
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,232

    По умолчанию

    и еще, небольшой совет - используйте CFC, а на СТ какие-нибудь дополнительные или громоздкие вычисления

  10. #10

    По умолчанию

    Цитата Сообщение от Василий Кашуба Посмотреть сообщение
    Вот так делается. Снимок.PNG , а вот так вызывается Снимок_.PNG
    Василий Кашуба, могли бы вы выложить код от PID_REGUL(PRG)? Мне все еще не понятно как должно выглядеть его описание в PRG на ST (первое, это просто указание входов и выходов; второе, нужно писать программу ПИД-регулирования целиком)? Если второе, то для чего тогда подключать библиотеку Util.lib? Почему компилятор ругается: "ошибка 3700: POU с именем PID уже включен в библиотеку 'Util.lib'", когда в менеджер библиотек добавлена данная библиотека и я добавляю программу PID в POU? Как можно избежать необходимости описывать PID и ограничиться лишь только библиотечным описанием этого ФБ? Можете дать ссылку на доступный guide?
    Последний раз редактировалось Дмитрий_Кирсанов; 07.04.2017 в 14:59.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 10
    Последнее сообщение: 12.09.2019, 11:54
  2. Функциональный блок PID
    от Hemann в разделе Программируемые реле
    Ответов: 78
    Последнее сообщение: 04.05.2017, 08:57
  3. Начинающий: Пид регулятор из библиотеки Util
    от Dimooon в разделе Эксплуатация
    Ответов: 65
    Последнее сообщение: 16.07.2014, 21:04
  4. LD + функциональный блок
    от дрю в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 26.04.2014, 08:47

Ваши права

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