Modular PID Control что внутри? Часть 2.
Дата: 2009-03-23
Добавлено: komatic
Тема: 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 работает как надо, проверено.
Добавить комментарий