Modular PID Control ÷òî âíóòðè? ×àñòü 3.
Äàòà: 2009-03-23
Äîáàâëåíî: komatic
Òåìà: ModPID
Ñîäåðæàíèå
1.SP_GEN Óìíûå êíîïêè áîëüøå-ìåíüøå.
2.A_DEAD_BÀäàïòèâíàÿ çîíà íå÷óâñòâèòåëüíîñòè.
3.INTEG Èíòåãðàòîð.
4.DIF Äèôôåðåíöèàòîð.
5.LAG2ND Çàäåðæêà 2 ïîðÿäêà.
6.LAG1ST Çàäåðæêà 1 ïîðÿäêà.
×òîáû íå ïîâòîðÿòü ïîäðîáíîå îïèñàíèå ýòèõ ôóíêöèé â ðàçäåëå download âû ìîæåòå çàãóðçèòü îôèöèàëüíóþ äîêóìåíòàöèþ íà ðóññêîì è àíãëèéñêîì ÿçûêå, ïåðåéòè.
Óìíûå êíîïêè áîëüøå-ìåíüøå.
FUNCTION_BLOCK FB125
TITLE =" setpoint generator"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : SP_GEN
VERSION : " 1.0"
// reverse by komatic
(*
Ôóíêöèÿ SP_GEN ïîçâîëÿåò ñ ïîìîùüþ êëþ÷åé OUTVUP è
OUTVDN óâåëè÷èâàòü èëè óìåíüøàòü çíà÷åíèå âûõîäíîé
ïåðåìåííîé OUTV â ïðåäåëàõ H_LM è L_LM.
Ñêîðîñòü èçìåíåíèÿ ïåðåìåííîé OUTV ïîä÷èíÿåòñÿ ïðàâèëó:
 òå÷åíèå ïåðâûõ 3 ñ ïîñëå àêòèâàöèè OUTVUP èëè OUTVDN:
d OUTV / d t = (H_LM – L_LM) / (100 ñ)
Çàòåì, ïî èñòå÷åíèè 3 ñ:
d OUTV / d t = (H_LM – L_LM) / (10 ñ).
Âåðõíèå è íèæíèå ãðàíèöû äëÿ âûõîäíîé ïåðåìåííîé çàäàþòñÿ ñ
ïîìîùüþ âõîäíûõ ïàðàìåòðîâ: H_LM . OUTV . L_LM.
Åñëè ïðîèñõîäèò îãðàíè÷åíèå óïðàâëÿþùåé ïåðåìåííîé ñ
ïîìîùüþ ãðàíè÷íûõ çíà÷åíèé H_LM è L_LM, òî óñòàíàâëèâàþòñÿ
ñèãíàëüíûå áèòû QH_LM è QL_LM.
Åñëè DFOUT_ON = TRUE (ÈÑÒÈÍÀ), òî OUTV = DF_OUTV.
*)
VAR_INPUT
DF_OUTV : REAL ; //çíà÷åíèå âûõîäà ïî óìîë÷àíèþ
H_LM : REAL := 1.000000e+002; //âåðõíèé ïðåäåë ïåðåìåííîé
L_LM : REAL ; //íèæíèé ïðåäåë ïåðåìåííîé
OUTVUP : BOOL ; //âûõîäíóþ ïåðåìåííóþ âûøå
OUTVDN : BOOL ; //âûõîäíóþ ïåðåìåííóþ íèæå
DFOUT_ON : BOOL ; //çàäàíèå ïî óìîë÷àíèþ âêëþ÷èòü
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#100MS; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
QH_LM : BOOL ; //äîñòèãíóòà âåðõíÿÿ ãðàíèöà
QL_LM : BOOL ; //äîñòèãíóòà íèæíÿÿ ãðàíèöà
END_VAR
VAR
stUpSp : TIME ;
stDownSp : TIME ;
rCycle : REAL ;
Sollwert : REAL ;
END_VAR
BEGIN
IF COM_RST
THEN
Sollwert:=0.0;
stUpSp:=T#0MS;
stDownSp:=T#0MS;
ELSE
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE))/1000.0;
IF (NOT (OUTVUP OR QL_LM)) AND OUTVDN
THEN
stUpSp:=T#0MS;
stDownSp:=stDownSp+CYCLE;
IF stDownSp > T#3S
THEN
Sollwert:=Sollwert-((H_LM-L_LM)*rCycle/10.0);
ELSE
Sollwert:=Sollwert-((H_LM-L_LM)*rCycle/100.0);
END_IF;
ELSIF (NOT (OUTVDN OR QH_LM)) AND OUTVUP
THEN
stDownSp:=T#0MS;
stUpSp:=stUpSp+CYCLE;
IF stUpSp > T#3S
THEN
Sollwert:=Sollwert+((H_LM-L_LM)*rCycle/10.0);
ELSE
Sollwert:=Sollwert+((H_LM-L_LM)*rCycle/100.0);
END_IF;
ELSE
stUpSp:=T#0MS;
stDownSp:=T#0MS;
END_IF;
END_IF;
IF DFOUT_ON
THEN
Sollwert:=DF_OUTV;
stUpSp:=T#0MS;
stDownSp:=T#0MS;
END_IF;
IF Sollwert >= H_LM
THEN
QH_LM:=1;
QL_LM:=0;
Sollwert:=H_LM;
ELSE
QH_LM:=0;
IF Sollwert <= L_LM
THEN
QL_LM:=1;
Sollwert:=L_LM;
ELSE
QL_LM:=0;
END_IF;
END_IF;
OUTV:=Sollwert;
END_FUNCTION_BLOCK
Àäàïòèâíàÿ çîíà íå÷óâñòâèòåëüíîñòè.
FUNCTION_BLOCK FB101
TITLE =" adaptive dead band"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : A_DEAD_B
VERSION : " 1.0"
// reverse by komatic
(*
Àäàïòèâíàÿ çîíà íå÷óâñòâèòåëüíîñòè.
Îáåñïå÷èâàåò ôèëüòðàöèþ ñèãíàëîâ.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
DB_WH_LM : REAL := 5.000000e+000; //âåðõíÿÿ ãðàíèöà çîíû íå÷óñòâèòåëüíîñòè
DB_WL_LM : REAL := 1.000000e+000; //íèæíÿÿ ãðàíèöà çîíû íå÷óñòâèòåëüíîñòè
CRIT_FRQ : REAL := 1.000000e-001; //êðèòè÷åñêàÿ ÷àñòîòà
RET_FAC : INT := 1; //ôàêòîð âîçâðàòà
ADAPT_ON : BOOL ; //âêëþ÷èòü àäàïòèâíûé àëãîðèòì
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
DB_WIDTH : REAL ; //ýôåêòèâíàÿ øèðèíà çîàíû íå÷óñòâèòåëüíîñòè
END_VAR
VAR
sbPos : BOOL ;
sbNeg : BOOL ;
stP1 : TIME ;
stP2 : TIME ;
siZaehl : INT ;
END_VAR
VAR_TEMP
drOutv : REAL ; //Zwischenspeicher OUTV
drDbWidth : REAL ; //Zwischenspeicher DB_WIDTH
dbUp : BOOL ; //Kennung "Totzonenbreite vergrößern"
dbDown : BOOL ; //Kennung "Totzonenbreite verkleinern"
END_VAR
BEGIN
IF COM_RST
THEN
sbPos:=0;
sbNeg:=0;
dbUp:=0;
dbDown:=0;
stP1:=T#0MS;
stP2:=T#0MS;
siZaehl:=0;
OUTV:=0.0;
DB_WIDTH:=DB_WL_LM;
ELSE
IF ADAPT_ON
THEN // àäàïòèâíûé àëãîðèòì âêëþ÷åí
//----------
dbDown:=0;
IF stP1 >= CYCLE
THEN
stP1:=stP1 - CYCLE;
IF siZaehl >=1
THEN
dbUp:=1;
ELSE
dbUp:=0;
END_IF;
ELSE
siZaehl:=0;
dbUp:=0;
END_IF;
//----------
IF INV < -DB_WIDTH
THEN
sbNeg:=1;
IF sbPos
THEN
stP1:=DINT_TO_TIME(REAL_TO_DINT(1000.0 / CRIT_FRQ));
siZaehl:=siZaehl+1;
sbPos:=0;
ELSE
dbUp:=0;
END_IF;
drOutv:=INV + DB_WIDTH;
stP2:=T#0MS;
ELSE
//----------
IF INV > DB_WIDTH
THEN
sbPos:=1;
IF sbNeg
THEN
stP1:=DINT_TO_TIME(REAL_TO_DINT(1000.0 / CRIT_FRQ));
siZaehl:=siZaehl+1;
sbNeg:=0;
ELSE
dbUp:=0;
END_IF;
drOutv:=INV - DB_WIDTH;
stP2:=T#0MS;
ELSE
dbUp:=0;
IF stP2 >= CYCLE
THEN
stP2:=stP2 - CYCLE;
IF stP2 < CYCLE
THEN
dbDown:=1;
END_IF;
ELSE
stP2:=DINT_TO_TIME(REAL_TO_DINT(RET_FAC*1000.0/CRIT_FRQ));
END_IF;
drOutv:=0.0;
END_IF;
//----------
IF dbUp
THEN
drDbWidth:=DB_WIDTH+0.1;
IF drDbWidth > DB_WH_LM THEN drDbWidth:=DB_WH_LM; END_IF;
ELSE
IF dbDown
THEN
drDbWidth:=DB_WIDTH-0.1;
IF drDbWidth < DB_WL_LM THEN drDbWidth:=DB_WL_LM; END_IF;
ELSE
drDbWidth:=DB_WIDTH;
END_IF;
OUTV:=drOutv;
DB_WIDTH:=drDbWidth;
END_IF;
END_IF;
ELSE // åñëè àäàïòèðîâàíèå âûêëþ÷åíî
IF INV < -DB_WIDTH
THEN
OUTV:=INV+DB_WIDTH;
ELSE
IF INV > DB_WIDTH
THEN
OUTV:=INV-DB_WIDTH;
ELSE
OUTV:=0.0;
END_IF;
END_IF;
END_IF;
END_IF;
END_FUNCTION_BLOCK
Èíòåãðàòîð.
FUNCTION_BLOCK FB108
TITLE =" integrator"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : INTEG
VERSION : " 1.0"
// reverse by komatic
(*
Èíòåãðàòîð. Èíòåãðèðóåò âõîäíîé ñèãíàë ïî âðåìåíè è
êîíòðîëèðóåò ãðàíè÷íûå çíà÷åíèÿ âûõîäíîãî ñèãíàëà.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
H_LM : REAL := 1.000000e+002; //âåðõíÿÿ ãðàíèöà
L_LM : REAL ; //íèæíÿÿ ãðàíèöà
TI : TIME := T#25S; //âðåìÿ èíòåãðèðîâàíèÿ
DF_OUTV : REAL ; //âûõîäíîå çíà÷åíèå ïî óìîë÷àíèþ
HOLD : BOOL ; //óäåðæàíèå èíòåãðàòîðà
DFOUT_ON : BOOL ; //âûäàòü âûõîäíîå çíà÷åíèå ïî óìîë÷àíèþ
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
QH_LM : BOOL ; //âåðõíèé ïðåäåë äîñòèãíóò
QL_LM : BOOL ; //íèæíèé ïðåäåë äîñòèãíóò
END_VAR
VAR
sRest : REAL ;
END_VAR
VAR_TEMP
rTi : REAL ; //âðåìÿ èíòåãðèðîâàíèÿ â real
rCycle : REAL ; //âðåìÿ âûïîëíåíèÿ áëîêà â real
OutvNew : REAL ; //Neue Ausgangsgröße
OutvDiff : REAL ; //Änderungswert
END_VAR
BEGIN
IF COM_RST
THEN // åñëè åñòü ïîëíûé ñáðîñ
sRest:=0.0;
IF DFOUT_ON
THEN
OutvNew:=DF_OUTV;
ELSE
OutvNew:=0.0;
END_IF;
ELSE
IF DFOUT_ON
THEN
OutvNew:=DF_OUTV;
ELSE
IF HOLD
THEN
OutvNew:=OUTV;
sRest:=0.0;
ELSE // ðàñ÷åò
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
rTi:=DINT_TO_REAL(TIME_TO_DINT(TI));
IF rTi < rCycle THEN rTi:=rCycle; END_IF;
OutvDiff:=rCycle / rTi * INV + sRest;
OutvNew:=OutvDiff + OUTV;
sRest:=OUTV - OutvNew + OutvDiff;
END_IF;
END_IF;
END_IF;
IF OutvNew >= H_LM
THEN
QL_LM:=0;
QH_LM:=1;
OutvNew:=H_LM;
ELSE
QH_LM:=0;
IF OutvNew <= L_LM
THEN
QL_LM:=1;
OutvNew:=L_LM;
ELSE
QL_LM:=0;
END_IF;
END_IF;
OUTV:=OutvNew;
END_FUNCTION_BLOCK
Äèôôåðåíöèàòîð.
FUNCTION_BLOCK FB106
TITLE =" differentiator"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : DIF
VERSION : " 1.0"
// reverse by komatic
(*
Äèôôåðåíöèàòîð.
Âû÷èñëÿåò ñèãíàë ðàññîãëàñîâàíèÿ è êîíòðîëèðóåò åãî ãðàíè÷íûå çíà÷åíèÿ.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
TD : TIME := T#25S; //âðåìÿ äèôåðåíöèðîâàíèÿ
TM_LAG : TIME := T#5S; //âðåìÿ äåéñòâèÿ äèô.ñîñò.
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //ïåðèîäè÷íîñòü âûïîëíåíèÿ áëîêà
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
END_VAR
VAR
sRueck : REAL ;
sRest : REAL ;
END_VAR
VAR_TEMP
rTd : REAL ; //âðåìÿ äèôåðåíöèðîâàíèÿ â real
rTmLag : REAL ; //âðåìÿ äåéñòâèÿ äèô.ñîñò. â real
rCycle : REAL ; //âðåìÿ öèêëà â real
OutvNew : REAL ; //Neue Ausgangsgröße
Verstaerk : REAL ; //Verstärkung
RueckDiff : REAL ; //Differenz des Rückkopplungswertes
RueckAlt : REAL ; //Alter Rückkopplungswert
END_VAR
BEGIN
IF COM_RST
THEN
sRest:=0.0;
OUTV:=0;
sRueck:=INV;
ELSE
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
rTd:=DINT_TO_REAL(TIME_TO_DINT(TD));
rTmLag:=DINT_TO_REAL(TIME_TO_DINT(TM_LAG));
IF rTd < rCycle THEN rTd:=rCycle; END_IF;
IF rTmLag < rCycle * 0.5 THEN rTmLag:=rCycle * 0.5; END_IF;
Verstaerk:= rTd / (rCycle * 0.5 + rTmLag);
OutvNew:= (INV - sRueck) * Verstaerk;
RueckAlt:=sRueck;
RueckDiff:= rCycle / rTd * OutvNew + sRest;
sRueck:=RueckDiff + RueckAlt;
sRest:=RueckAlt - sRueck + RueckDiff;
OUTV:=OutvNew;
END_IF;
END_FUNCTION_BLOCK
Çàäåðæêà 2 ïîðÿäêà.
FUNCTION_BLOCK FB110
TITLE =" second-order lag element"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : LAG2ND
VERSION : " 1.0"
// reverse by komatic
(*
Çàäåðæêà 2 ïîðÿäêà. Ðåàëèçóåò çàäåðæêó âòîðîãî ïîðÿäêà.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
TM_CONST : TIME := T#10S; //êîíñòàíòà âðåìåíè
DAM_COEF : REAL := 1.000000e+000; //damping coefficient
TRANCOEF : REAL := 1.000000e+000; //transfer coefficient
DF_OUTV : REAL ; //âûõîä ïî óìîë÷àíèþ
DFOUT_ON : BOOL ; //âûõîä ïî óìîë÷àíèþ âêëþ÷èòü
TRACK : BOOL ; //ðåæèì OUTV=INV
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
END_VAR
VAR
sRest1 : REAL ;
sRest2 : REAL ;
sRueck : REAL ;
sInt : REAL ;
END_VAR
VAR_TEMP
drTmCon : REAL ; //Verzögerungszeit in real
drCycle : REAL ; //Abtastzeit in real
Hvar : REAL ; //Hilfsvariable
RueckDiff : REAL ; //Rückkopplungsdifferenz
IntDiff : REAL ; //Inkrement beim Integrieren
RueckAlt : REAL ; //alter Rückkopplungswert
IntAlt : REAL ; //alter Integrierwert
END_VAR
BEGIN
IF COM_RST
THEN
OUTV:=0.0;
sRest1:=0.0;
sRest2:=0.0;
sRueck:=0.0;
sInt:=0.0;
ELSE
IF TRACK
THEN
OUTV:=INV;
sRest1:=0.0;
sRest2:=0.0;
sRueck:=INV * TRANCOEF;
sInt:=INV*2.0*DAM_COEF;
ELSE
drCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
drTmCon:=DINT_TO_REAL(TIME_TO_DINT(TM_CONST));
IF drTmCon < drCycle / 2.0 THEN drTmCon:=drCycle / 2.0; END_IF;
IntAlt:=sInt;
IntDiff:=(INV - (sRueck / TRANCOEF)) * drCycle / drTmCon + sRest1;
sInt:=IntDiff + sInt;
sRest1:=IntAlt - sInt + IntDiff;
RueckAlt:=sRueck;
Hvar:= drCycle / (drTmCon / DAM_COEF);
Hvar:=((sInt * TRANCOEF / (2*DAM_COEF) - RueckAlt) * Hvar) / (1 + Hvar);
OUTV:=Hvar+RueckAlt;
RueckDiff:=2.0 * Hvar + sRest2;
sRueck:=RueckDiff + RueckAlt;
sRest2:=RueckAlt-sRueck+RueckDiff;
END_IF;
END_IF;
IF DFOUT_ON
THEN
OUTV:=DF_OUTV;
sRest1:=0.0;
sRest2:=0.0;
sRueck:=INV*TRANCOEF;
sInt:=INV*2.0*DAM_COEF;
END_IF;
END_FUNCTION_BLOCK
Çàäåðæêà 1 ïîðÿäêà.
FUNCTION_BLOCK FB109
TITLE =" first-order lag element"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : LAG1ST
VERSION : " 1.0"
// reverse by komatic
(*
Çàäåðæêà 1 ïîðÿäêà. Ðåàëèçóåò çàäåðæêó ïåðâîãî ïîðÿäêà.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
TM_LAG : TIME := T#25S; //âðåìÿ çàäåðæêè
DF_OUTV : REAL ; //âûõîä ïî óìîë÷àíèþ
TRACK : BOOL ; //òðåê âêëþ÷èòü OUTV = INV
DFOUT_ON : BOOL ; //âêëþ÷èòü âûõîä ïî óìîë÷àíèþ
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
END_VAR
VAR
sRueck : REAL ;
sRest : REAL ;
END_VAR
VAR_TEMP
rTmLag : REAL ; //âðåìÿ çàäåðæêè â real
rCycle : REAL ; //âðåìÿ âûïîëíåíèÿ â real
OutvNew : REAL ; //íîâîå çíà÷åíèå âûõîäà
RueckAlt : REAL ; //Alter Rückkopplungswert
Hvar : REAL ; //âñïîìîãàòåëüíàÿ ïåðåìåííàÿ
RueckDiff : REAL ; //Rückkopplungsdifferenz
END_VAR
BEGIN
IF COM_RST
THEN // åñëè ïîëíûé ðåñòàðò
sRest:=0.0;
IF DFOUT_ON
THEN // åñëè âêëþ÷åí âûõîä ïî óìîë÷àíèþ
OutvNew:=DF_OUTV;
sRueck:=DF_OUTV;
ELSE // èíà÷å â ïîëíîì ðåñòàðòå âûõîä ðàâåí íóëþ
OutvNew:=0.0;
sRueck:=0.0;
END_IF;
ELSE
IF DFOUT_ON
THEN // åñëè âêëþ÷åí âûõîä ïî óìîë÷àíèþ
OutvNew:=DF_OUTV;
sRueck:=DF_OUTV;
ELSE
IF TRACK
THEN // åñëè âêëþ÷åí ðåæèì òðåêèíãà
OutvNew:=INV;
sRueck:=INV;
sRest:=0.0;
ELSE // íîðìàëüíûé ðåæèì ðàáîòû áëîêà
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
// ïåðåâîä âðåìåíè âûïîëíåíèÿ áëîêà â real
rTmLag:=DINT_TO_REAL(TIME_TO_DINT(TM_LAG));
// ïåðåâîä âðåìåíè çàäåðæêè â real
// âðåìÿ çàäåðæêè íå ìîæåò áûòü ìåíüøå ïîëîâèíû âðåìåíè âûïîëíåíèÿ
IF rTmLag < rCycle * 0.5 THEN rTmLag:=rCycle * 0.5; END_IF;
RueckAlt:=sRueck;
Hvar:=rCycle /( 2.0 * rTmLag);
Hvar:= (INV - RueckAlt) * Hvar / (1.0 + Hvar);
OutvNew:=Hvar+RueckAlt;
RueckDiff:=2.0 * Hvar + sRest;
sRueck:=RueckDiff + RueckAlt;
sRest:=RueckAlt - sRueck + RueckDiff;
END_IF;
END_IF;
END_IF;
OUTV:=OutvNew;
END_FUNCTION_BLOCK
Åùå îñòàëîñü íåñêîëüêî ôóíêöèé, äî âñòðå÷è â ñëåäóþùåé ÷àñòè
Ïðîñìîòðîâ: 7891
Êîììåíòàðèè ê ìàòåðèàëó
Âàø áóäåò ïåðâûì.
Äîáàâèòü êîììåíòàðèé