Страница 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_SetREAL := 10.0;
        
    High_Pressure_SetREAL := 15.0;
    END_VAR
     
    VAR
        
    ctu_PIDPID;
        
    Curr_Dif_PressureREAL;
        
    TmpREAL;
        
    Is_Door_OpenBOOL;
    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 
    NOTIs_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_MGVS_MAN:=TRUE; ELSE GVS_MAN:=FALSEEND_IF;(*Ðó÷íîé*)
    IF MODE_GVS=2 THEN Y1_MANUAL:=Y1_M;  END_IF;(*Àâòî*)
    IF Y1_MANUAL<0 THEN Y1_MANUAL:=0END_IF;IF Y1_MANUAL>100 THEN Y1_MANUAL:=100END_IF;
    PID_Y1(
        
    ACTUAL:= TE3_M, (* actual valueprocess variable *)
        
    SET_POINT:= SP_TE3,(* desired valueset point *)
        
    KP:= Y1_P,(* proportionality const. (P)*)
        
    TN:= Y1_I, (* reset time (Iin sec *)
        
    TV:= Y1_D, (* rate timederivative time (Din 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, (*     TRUEmanualY is not influenced by controller,FALSEcontroller determines Y *)
        
    RESET:= GVS_RESET, (* resetset Y output to Y_OFFSET and reset integral part *)
        
    Y=> Y1_M, (* manipulated variableset value*)
        
    LIMITS_ACTIVE=> Y1_LA,(* true set value would exceed limits Y_MINY_MAX *)
        
    OVERFLOW=> Y1_OW);(* overflow in integral part *) 
    +79104444236
    С уважением,
    Лапшин Вячеслав

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

    По умолчанию

    а разве так можно?
    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_MGVS_MAN:=TRUE; ELSE GVS_MAN:=FALSEEND_IF;(*&#208;ó÷íîé*)
    IF MODE_GVS=2 THEN Y1_MANUAL:=Y1_M;  END_IF;(*&#192;âòî*)
    IF Y1_MANUAL<0 THEN Y1_MANUAL:=0END_IF;IF Y1_MANUAL>100 THEN Y1_MANUAL:=100END_IF;
    PID_Y1(
        
    ACTUAL:= TE3_M, (* actual valueprocess variable *)
        
    SET_POINT:= SP_TE3,(* desired valueset point *)
        
    KP:= Y1_P,(* proportionality const. (P)*)
        
    TN:= Y1_I, (* reset time (Iin sec *)
        
    TV:= Y1_D, (* rate timederivative time (Din 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, (*     TRUEmanualY is not influenced by controller,FALSEcontroller determines Y *)
        
    RESET:= GVS_RESET, (* resetset Y output to Y_OFFSET and reset integral part *)
        
    Y=> Y1_M, (* manipulated variableset value*)
        
    LIMITS_ACTIVE=> Y1_LA,(* true set value would exceed limits Y_MINY_MAX *)
        
    OVERFLOW=> Y1_OW);(* overflow in integral part *) 

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

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

    VAR
        
    ctu_PIDPID;
        
    Curr_Dif_PressureREAL;
        
    TmpREAL;
        
    Is_Door_OpenBOOL;
    END_VAR


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

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

    По умолчанию

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

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

    VAR
        
    ctu_PIDPID;
        
    Curr_Dif_PressureREAL;
        
    TmpREAL;
        
    Is_Door_OpenBOOL;
    END_VAR


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

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

    По умолчанию

    вызвать Фб можно по разному:
    сначала установить параметры
    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
    Адрес
    Ставрополь
    Сообщений
    1,089

    По умолчанию

    и еще, небольшой совет - используйте 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, 22:04
  4. LD + функциональный блок
    от дрю в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 26.04.2014, 09:47

Ваши права

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