Версия для печати

Modular PID Control что внутри? Часть 2.

Дата: 2009-03-23

Добавлено: komatic

Тема: ModPID



MODPID

Содержание
1.ERR_MON Контроль сигнала рассогласования.
2.OVERRIDE Контроль переполнения.
3.LIMALARM Контроль граничных условий.
4.LIMITER Ограничитель.
5.SPLT_RAN Переключатель диапазонов.
6.NORM Нормализатор.
7.DEADBAND Зона нечувствительности.

Продолжаем расматривать функции из набора MODPID. В этой части собрано несколько простых функций. Чтобы не повторять подробное описание этих функций в разделе download вы можете загурзить официальную документацию на русском и английском языке, перейти.


ERR_MON Контроль сигнала рассогласования.

FUNCTION_BLOCK FB107
TITLE =" error_signal monitoring"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : ERR_MON
VERSION : " 1.0"
// reverse by komatic
(*
Контроль сигнала рассогласования.
Вычисляет сигнал рассогласования и контролирует его граничные значения.
*)
VAR_INPUT
  ER_LM             : REAL  := 1.000000e+001;   //error variable limit
  ER_LMTD           : REAL  := 1.000000e+002;   //error-signal limit during time delay
  SP                : REAL ;                    //задание
  PV                : REAL ;                    //входная переменная
  SP_DIFF           : REAL  := 1.000000e+001;   //setpoint differenz
  TM_DELAY          : TIME  := T#1M;            //delay time of the monitoring signal
  TM_RAMP           : TIME  := T#1M;            //time constant of ramp
  COM_RST           : BOOL ;                    //полный рестарт
  CYCLE             : TIME  := T#1S;            //время выполнения блока
END_VAR
VAR_OUTPUT
  QER_LM            : BOOL ;                    //error-signal limit reached
  QER_LMTD          : BOOL ;                    //error-signal limit during time delay reached
  ER                : REAL ;                    //error signal
END_VAR
VAR
  stTmDelay         : TIME ;   
  srRampV           : REAL ;   
  srSpOld           : REAL ;   
END_VAR
VAR_TEMP
  drEr              : REAL ;                    //Zwischenspeicher ER
  drErBtrg          : REAL ;                    //Betrag von ER
  drSpDfBg          : REAL ;                    //Betrag der Sollwertдnderung
  drDek             : REAL ;                    //Dekrement der Rampe
  drTF              : REAL ;                    //Zeitfaktor
  drCycle           : REAL ;                    //Abtastzeit in real
  drTmRamp          : REAL ;                    //Rampenzeitkonstante in real
END_VAR
BEGIN
QER_LM:=0;
QER_LMTD:=0;
IF COM_RST
THEN
    drEr:=0.0;
    stTmDelay:=T#0MS;
    srRampV:=0.0;
    srSpOld:=0.0;
ELSE
    drEr:=SP - PV;
    drErBtrg:=ABS(drEr);
    drSpDfBg:=SP - srSpOld;
    drSpDfBg:=ABS(drSpDfBg);
    srSpOld:=SP;
    IF drSpDfBg > SP_DIFF
    THEN
        stTmDelay:=TM_DELAY;
        drCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
        drTmRamp:=DINT_TO_REAL(TIME_TO_DINT(TM_RAMP));
        drTF:=drTmRamp / drCycle;
        drDek:=(ER_LMTD - ER_LM) / drTF;
        srRampV:=ER_LMTD;
        IF drErBtrg >= srRampV THEN QER_LMTD:=1; END_IF;
    ELSE
        IF stTmDelay > CYCLE
        THEN
            stTmDelay:=stTmDelay - CYCLE;
            IF drErBtrg >= ER_LMTD THEN QER_LMTD:=1; END_IF;
        ELSE
            IF srRampV > ER_LM
            THEN
                srRampV:=srRampV - drDek;
                IF drErBtrg >= srRampV THEN QER_LMTD:=1; END_IF;
            ELSE
                IF drErBtrg>=ER_LM THEN QER_LM:=1; END_IF;
            END_IF;
        END_IF;
    END_IF;
END_IF;
ER:=drEr;
END_FUNCTION_BLOCK

OVERRIDE Контроль переполнения.

FUNCTION_BLOCK FB117
TITLE =" override controlling"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : OVERRIDE
VERSION : " 1.0"
// reverse by komatic
(*
Контроль переполнения.
Необходим для предотвращения ошибок переполнения.
*)
VAR_INPUT
  PID1_ON           : BOOL ;    //ПИД регулятор 1 включить
  PID2_ON           : BOOL ;    //ПИД регулятор 2 включить
  OVR_MODE          : BOOL ;    //режим замещения FALSE/TRUE=MAX/MIN
  PID1_OVR          : STRUCT    
   PID_OUTV         : REAL ;    //PID выходная переменная
   PID_SCTR         : REAL ;    //PID выходная переменная для шагового регулятора
  END_STRUCT ;   
  PID2_OVR          : STRUCT    
   PID_OUTV         : REAL ;    //PID выходная переменная
   PID_SCTR         : REAL ;    //PID выходная переменная для шагового регулятора
  END_STRUCT ;   
END_VAR
VAR_OUTPUT
  QPID1             : BOOL ;    //ПИД регулятор 1 активен
  QPID2             : BOOL ;    //ПИД регулятор 1 активен
  OVR_LMNG          : STRUCT    
   PID_OUTV         : REAL ;    //PID выходная переменная
   PID_SCTR         : REAL ;    //PID выходная переменная для шагового регулятора
  END_STRUCT ;   
END_VAR
VAR_TEMP
  drOutv            : REAL ;    //Zwischenspeicher fьr PID output variable
END_VAR
BEGIN
IF PID1_ON XOR PID2_ON
THEN                        // если один из регуляторов принудительнов включен
    IF PID1_ON
    THEN
        QPID1:=1;
        QPID2:=0;
    ELSE
        QPID1:=0;
        QPID2:=1;
    END_IF;
ELSE                        // если ни один из регуляторов принудительно не включен
    IF OVR_MODE            
    THEN                    // если включен режим замещения по минимуму
        IF PID1_OVR.PID_OUTV <= PID2_OVR.PID_OUTV
        THEN
            QPID1:=1;
            QPID2:=0;
        ELSE
            QPID1:=0;
            QPID2:=1;
        END_IF;
    ELSE                    // если включен режим замещения по максимуму
        IF PID1_OVR.PID_OUTV >= PID2_OVR.PID_OUTV
        THEN
            QPID1:=1;
            QPID2:=0;
        ELSE
            QPID1:=0;
            QPID2:=1;
        END_IF;
    END_IF;
END_IF;
IF QPID1                    // записываем выход того регулятора чей признак установлен
THEN
    OVR_LMNG.PID_OUTV:=PID1_OVR.PID_OUTV;
    OVR_LMNG.PID_SCTR:=PID1_OVR.PID_SCTR;
ELSE
    OVR_LMNG.PID_OUTV:=PID2_OVR.PID_OUTV;
    OVR_LMNG.PID_SCTR:=PID2_OVR.PID_SCTR;
END_IF;
END_FUNCTION_BLOCK

LIMALARM Контроль граничных условий.

FUNCTION_BLOCK FB111
TITLE =" limit alarm"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : LIMALARM
VERSION : " 1.0"
// reverse by komatic
(*
Контроль граничных условий.
Проверяет заданные граничные значения входного сигнала.
*)
VAR_INPUT
  H_LM_ALM      : REAL  := 1.000000e+002;       //верхняя граница нарушения
  H_LM_WRN      : REAL  := 9.000000e+001;       //верхняя граница предупреждения
  L_LM_WRN      : REAL  := 1.000000e+001;       //нижняя граница предупреждения
  L_LM_ALM      : REAL ;                        //нижняя граница нарушения
  INV           : REAL ;                        //входная переменная
  HYS           : REAL  := 1.000000e+000;       //гистерезис
  COM_RST       : BOOL ;                        //полный рестарт
END_VAR
VAR_OUTPUT
  QH_LMALM : BOOL ;                             //верхняя граница нарушения достигнута
  QH_LMWRN : BOOL ;                             //верхняя граница предупреждения достигнута
  QL_LMWRN : BOOL ;                             //нижняя граница предупреждения достигнута
  QL_LMALM : BOOL ;                             //нижняя граница нарушения достигнута
END_VAR
BEGIN
IF COM_RST
THEN
    QH_LMALM:=0;
    QH_LMWRN:=0;
    QL_LMWRN:=0;
    QL_LMALM:=0;
ELSE
    IF INV >= H_LM_ALM THEN QH_LMALM:=1; END_IF;
    IF INV < (H_LM_ALM - HYS) THEN QH_LMALM:=0; END_IF;
    IF INV >= H_LM_WRN THEN QH_LMWRN:=1; END_IF;
    IF INV < (H_LM_WRN - HYS) THEN QH_LMWRN:=0; END_IF;
    IF INV <= L_LM_ALM THEN QL_LMALM:=1; END_IF;
    IF INV > (L_LM_ALM + HYS) THEN QL_LMALM:=0; END_IF;
    IF INV <= L_LM_WRN THEN QL_LMWRN:=1; END_IF;
    IF INV > (L_LM_WRN + HYS) THEN QL_LMWRN:=0; END_IF;
END_IF;
END_FUNCTION_BLOCK

LIMITER Ограничитель.

FUNCTION_BLOCK FB112
TITLE =" limiter"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : LIMITER
VERSION : " 1.0"
// reversed by komatic
(*
Ограничитель. Ограничивает входную величину заданными значениями.
*)
VAR_INPUT
  INV           : REAL ;                        //входная переменная
  H_LM          : REAL  := 1.000000e+002;       //верхний предел
  L_LM          : REAL ;                        //нижний предел
  COM_RST       : BOOL ;                        //полный рестарт
END_VAR
VAR_OUTPUT
  OUTV          : REAL ;                        //output variable
  QH_LM         : BOOL ;                        //high limit reached
  QL_LM         : BOOL ;                        //low limit reached
END_VAR
BEGIN
IF COM_RST                                      //если полный сброс
THEN
    QH_LM:=0;                                   //обнуляем выходные переменные
    QL_LM:=0;
    OUTV:=0.0;
ELSE
    IF INV >= H_LM                              //если вход больше верхнего предела
    THEN
        QL_LM:=0;                              
        QH_LM:=1;                               //признак выход за верхний предел
        OUTV:=H_LM;                             //выход равен верхнему пределу
    ELSE
        QH_LM:=0;
        IF INV <= L_LM                          //если выход меньше нижнего предела
        THEN
            QL_LM:=1;                           //признак выхода за верхней предел
            OUTV:=L_LM;                         //выход равен нижнему пределу
        ELSE
            QL_LM:=0;
            OUTV:=INV;                          //выход равен входу
        END_IF;
    END_IF;
END_IF;
END_FUNCTION_BLOCK

SPLT_RAN Переключатель диапазонов.

FUNCTION_BLOCK FB124
TITLE =" split ranging"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : SPLT_RAN
VERSION : " 1.0"
// reversed by komatic
(*
Переключатель диапазонов.
Выполняет автоматическое переключение пределов измерений.
*)
VAR_INPUT
  INV           : REAL ;                    //входная переменная
  STR_INV       : REAL ;                    //начало диапазона INV
  EDR_INV       : REAL  := 5.000000e+001;   //конец диапазона INV
  STR_OUTV      : REAL ;                    //начало диапазона OUTV
  EDR_OUTV      : REAL  := 1.000000e+002;   //конец диапазона OUTV
END_VAR
VAR_OUTPUT
  SPL_LMNG      : STRUCT    
   PID_OUTV     : REAL ;                    //PID выходная переменная
   PID_SCTR     : REAL ;                    //PID выходная переменная для шагового регулятора
  END_STRUCT ;   
END_VAR
BEGIN
IF INV <= STR_INV
THEN
    SPL_LMNG.PID_OUTV:=STR_OUTV;
ELSIF INV >= EDR_INV
THEN
    SPL_LMNG.PID_OUTV:=EDR_OUTV;
ELSE
    SPL_LMNG.PID_OUTV:=(((EDR_OUTV - STR_OUTV) * INV) / (EDR_INV - STR_INV) + STR_OUTV) -
                        ((EDR_OUTV - STR_OUTV) * STR_INV) / (EDR_INV - STR_INV); 
END_IF;
END_FUNCTION_BLOCK

NORM Нормализатор.

FUNCTION_BLOCK FB116
TITLE =" physical norm"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : NORM
VERSION : " 1.0"
// reverse by komatic
(*
Нормализатор. Масштабирует входную величину. Масштаб задается указанием двух крайних значений.
*)
VAR_INPUT
  INV               : REAL ;                        //входная переменная
  IN_HVAL           : REAL  := 1.000000e+002;       //максимальное физическое значение входа
  OUT_HVAL          : REAL  := 1.000000e+002;       //максимальное физическое значение выхода
  IN_LVAL           : REAL ;                        //минимальное физическое значение входа
  OUT_LVAL          : REAL ;                        //минимальное физическое значение выхода
END_VAR
VAR_OUTPUT
  OUTV              : REAL ;                        //выходная переменная
END_VAR
BEGIN
    OUTV:=(((OUT_HVAL - OUT_LVAL) * INV / (IN_HVAL - IN_LVAL)) + OUT_LVAL) -
            (OUT_HVAL - OUT_LVAL) * IN_LVAL / (IN_HVAL - IN_LVAL);
END_FUNCTION_BLOCK

DEADBAND Зона нечувствительности.

FUNCTION_BLOCK FB105
TITLE =" dead band"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : DEADBAND
VERSION : " 1.0"
// reverse by komatic
(*
Зона нечувствительности.
*)
VAR_INPUT
  INV           : REAL ;                        //входная переменная
  DEADB_W       : REAL  := 1.000000e+000;       //dead band width
  DEADB_O       : REAL ;                        //dead band offset
END_VAR
VAR_OUTPUT
  OUTV          : REAL ;                        //выходная переменная
END_VAR
BEGIN
IF    INV < (DEADB_O - DEADB_W)
THEN
    OUTV:=INV + DEADB_W - DEADB_O;
ELSIF INV > (DEADB_O + DEADB_W)
THEN
    OUTV:=INV - DEADB_W - DEADB_O;
ELSE
    OUTV:=0.0;
END_IF;
END_FUNCTION_BLOCK

Продолжение следует, до встречи.





Просмотров: 7585

Комментарии к материалу

Добавлен: microteam    Дата: 2013-05-31

Спасибо за хороший сайт, часто сюда захожу. У мен есть небольшие замечания по FB116 NORM, сложная формула, можно ее и попроще написать: OUTV:=((INV - IN_LVAL) / (IN_HVAL - IN_LVAL)) * (OUT_HVAL - OUT_LVAL) + OUT_LVAL;

Добавлен: microteam    Дата: 2013-05-31

Суть функционального блока в чем, найти процент входного сигнала от диапазона входа и потом этот процент умножить на диапазон выхода (плюс нижняя граница выхода).

Добавлен: microteam    Дата: 2013-06-01

А вообщее код FB116 работает как надо, проверено.

Добавить комментарий

Ваше имя:

Текст комментария (4000 max):

Введите сумму с картинки: