Íåïðåðûâíûé ðåãóëÿòîð CONT_C (FB41) ñòàíäàðòíûé áëîê ÏÈÄ ðåãóëÿòîðà Siemens
 ýòîì ìàòåðèàëå ðàññìîòðèì ñòàíäàðòíûé áëîê ÏÈÄ ðåãóëÿòîðà Siemens (CONT_C)
Ëó÷øàÿ äîêóìåíòàöèÿ ê ïðîãðàììíîìó áëîêó - åå èñõîäíûé òåêñò.
Ñêîìïèëèðîâàííûé áëîê èäåíòè÷åí îðèãèíàëüíîìó.
Äîêóìåíòàöèÿ ïî ôóíêöèè:
english - download .pdf 0.3Ìá
ðóññêàÿ - ñêà÷àòü .pdf 0.3Ìá
FUNCTION_BLOCK FB41
TITLE =
AUTHOR : SIMATIC
FAMILY : ICONT
NAME : CONT_C
VERSION : " 1.5"
//reversed by komatic
VAR_INPUT
COM_RST : BOOL ; //
MAN_ON : BOOL :=
PVPER_ON : BOOL ; //×òåíèå âõîäíîé ïåðåìåííîé ñ ïåðèôåðèè âêëþ÷èòü
P_SEL : BOOL
I_SEL : BOOL
INT_HOLD : BOOL ; //Óäåðæàíèå èíòåãðàëüíîé ñîñòàâëÿþùåé
I_ITL_ON : BOOL ; //Èíèöèàëèçèðîâàòü èíòåãðàëüíóþ ñîñòàâëÿþùóþ
D_SEL : BOOL ;
CYCLE : TIME
SP_INT : REAL ; //Âíóòðåííåå çàäàíèå
PV_IN : REAL ; //Âõîäíàÿ ïåðåìåííàÿ
PV_PER : WORD ; //Âõîäíàÿ ïåðåìåííàÿ (ïåðèôåðèÿ)
MAN : REAL ; //Ðó÷íîé âûõîä
GAIN : REAL
TI : TIME
TD : TIME
TM_LAG : TIME
DEADB_W : REAL ; //Øèðèíà çîíû íå÷óâñòâèòåëüíîñòè
LMN_HLM : REAL
LMN_LLM : REAL ; //Íèæíèé ïðåäåë âûõîäíîãî ñèãíàëà
PV_FAC : REAL
PV_OFF : REAL ; //Êîýôôèöèåíò äëÿ êîððåêòèðîâêè âõîäíîé ïåðåìåííîé (ñëîæåíèå)
LMN_FAC : REAL
LMN_OFF : REAL ; //Êîýôôèöèåíò äëÿ êîððåêòèðîâêè âõîäíîé ïåðåìåííîé (ñëîæåíèå)
I_ITLVAL : REAL ; //Íà÷àëüíîå çíà÷åíèå èíòåãðàëüíîé ñîñòàâëÿþùåé
DISV : REAL ; //Âîçìóùàþùàÿ ïåðåìåííàÿ
END_VAR
VAR_OUTPUT
LMN : REAL ; //Âûõîäíîå çíà÷åíèå
LMN_PER : WORD ; //Âûõîäíîå çíà÷åíèå (ïåðåôåðèÿ)
QLMN_HLM : BOOL ; //Âåðõíèé ïðåäåë âûõîäà äîñòèãíóò
QLMN_LLM : BOOL ; //Íèæíèé ïðåäåë âûõîäà äîñòèãíóò
LMN_P : REAL ; //Ïðîïîðöèîíàëüíàÿ ñîñòàâëÿþùàÿ
LMN_I : REAL ; //Èíòåãðàëüíàÿ ñîñòàâëÿþùàÿ
LMN_D : REAL ; //Äèôôåðåíöèàëüíàÿ ñîñòàâëÿþùàÿ
PV : REAL ; //Âõîäíàÿ ïåðåìåííàÿ
ER : REAL ; //Ñèãíàë ðàññîãëàñîâàíèÿ
END_VAR
VAR
sInvAlt : REAL ;
sIanteilAlt : REAL ;
sRestInt : REAL ;
sRestDif : REAL ;
sRueck : REAL ;
sLmn : REAL ;
sbArwHLmOn : BOOL ; //Âûõîä äîñòèã ìàêñèìàëüíîãî çíà÷åíèÿ
sbArwLLmOn : BOOL ; //Âûõîä äîñòèã ìèíèìàëüíîãî çíà÷åíèÿ
sbILimOn : BOOL :=
END_VAR
VAR_TEMP
Hvar : REAL ; //Hilfsvariable
rCycle : REAL ; //Abtastzeit in real
Diff : REAL ; //
Istwert : REAL ; //Istwert
ErKp : REAL ; //
rTi : REAL ; //Integrationszeit in real
rTd : REAL ; //Differentiationszeit in real
rTmLag : REAL ; //Verz
Panteil : REAL ; //P-Anteil
Ianteil : REAL ; //I-Anteil
Danteil : REAL ; //D-Anteil
Verstaerk : REAL ; //Verst
RueckDiff : REAL ; //Differenz des R
RueckAlt : REAL ; //Alter R
dLmn : REAL ; //Stellwert
gf : REAL ; //Hilfwert
rVal : REAL ; //Real Hilfsvariable
END_VAR
BEGIN
IF COM_RST //
THEN
//
sIanteilAlt:=I_ITLVAL;
LMN
QLMN_HLM:=0; //Âåðõíèé ïðåäåë âûõîäà äîñòèãíóò
QLMN_LLM:=0; //Íèæíèé ïðåäåë âûõîäà äîñòèãíóò
LMN_P:=0.0; //Ïðîïîðöèîíàëüíàÿ ñîñòàâëÿþùàÿ
LMN_I:=0.0; //Èíòåãðàëüíàÿ ñîñòàâëÿþùàÿ
LMN_D:=0.0; //Äèôôåðåíöèàëüíàÿ ñîñòàâëÿþùàÿ
LMN_PER:=0; //Âûõîäíîå çíà÷åíèå (ïåðèôåðèÿ)
PV:=0.0; //Âõîäíàÿ ïåðåìåííàÿ
ER:=0.0; //Ñèãíàë ðàññîãëàñîâàíèÿ
sInvAlt
sRestInt:=
sRestDif:=
sRueck:=
sLmn:=
sbArwHLmOn:=
sbArwLLmOn:=
ELSE
rCycle:=
Istwert
Istwert:=Istwert * PV_FAC + PV_OFF;
IF NOT PVPER_ON THEN Istwert
PV:= Istwert;
ErKp:=SP_INT - PV; // Ïîëó÷èëè ðàññîãëàñîâàíèå ìåæäó çàäàíèåì è âõîäîì
IF ErKp < (-DEADB_W) THEN ER:=ErKp+DEADB_W; // Åñëè ðàññîãëàñîâàíèå áîëüøå çîíû íå÷óâñòâèòåëüíîñòè
ELSIF ErKp > DEADB_W THEN ER
ELSE ER
END_IF;
ErKp:=ER * GAIN; // Ðàññîãëàñîâàíèå, óìíîæåííîå íà êôò ïðîïîðöèîíàëüíîñòè
rTi
rTd:=
rTmLag:=
// Ïðîâåðêà íà äîïóñòèìîñòü âðåìåííûõ íàñòðîåê ðåãóëÿòîðà
IF rTi < (rCycle
IF rTd
IF rTmLag
// Âû÷èñëåíèå ïðîïîðöèîíàëüíîé ñîñòàâëÿþùåé
IF P_SEL
THEN
Panteil:=ErKp; // Åñëè âûáðàíà ïðîïîðöèîíàëüíàÿ ñîñòàâëÿþùàÿ
ELSE
Panteil:=0.0;
END_IF;
//---------------------------------------------------------------------------------------------
// Âû÷èñëåíèå èíòåãðàëüíîé ñîñòàâëÿþùåé
//---------------------------------------------------------------------------------------------
IF I_SEL
THEN
IF I_ITL_ON
THEN
Ianteil:=I_ITLVAL;
sRestInt:=
ELSE
IF MAN_ON //
THEN
Ianteil:=sLmn - Panteil - DISV;
sRestInt:=
ELSE //Àâòîìàòè÷åñêèé
Diff:=rCycle / rTi *(ErKp
IF ((Diff>0.0) AND sbArwHLmOn OR INT_HOLD)OR ((Diff<
Ianteil:=sIanteilAlt + Diff;
sRestInt:=sIanteilAlt - Ianteil + Diff;
END_IF;
END_IF;
ELSE
Ianteil:=
sRestInt:=
END_IF;
//---------------------------------------------------------------------------------------------
//Ôîðìèðîâàíèå äèôôåðåíöèàëüíîé ñîñòàâëÿþùåé
//---------------------------------------------------------------------------------------------
Diff:=ErKp;
IF (
THEN
Verstaerk:= rTd
Danteil:= (Diff
RueckAlt:= sRueck;
RueckDiff:= rCycle
sRueck:= RueckDiff
sRestDif:=RueckAlt
ELSE
Danteil:=
sRestDif:=
sRueck:=Diff;
END_IF;
//---------------------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------------------
dLmn:=Panteil
IF MAN_ON // Åñëè ðó÷íîé ðåæèì
THEN
dLmn:=MAN;
ELSE
IF (
THEN
IF (Ianteil > (LMN_HLM - DISV)) AND (dLmn
THEN
rVal:=LMN_HLM - DISV;
gf:= dLmn
rVal:=Ianteil - rVal;
IF rVal > gf THEN rVal:=gf; END_IF;
Ianteil:=Ianteil - rVal;
ELSE
IF (Ianteil < (LMN_LLM - DISV)) AND (dLmn
THEN
rVal:=LMN_LLM - DISV;
gf:=dLmn - LMN_LLM;
rVal:=Ianteil - rVal;
IF rVal < gf THEN rVal:=gf; END_IF;
Ianteil:=Ianteil - rVal;
END_IF;
END_IF;
END_IF;
END_IF;
LMN_P:=Panteil;
LMN_I:=Ianteil;
LMN_D:=Danteil;
sInvAlt:=ErKp;
sIanteilAlt:=Ianteil;
sbArwHLmOn:=
sbArwLLmOn:=
IF (dLmn
THEN
QLMN_HLM:=
QLMN_LLM:=
dLmn:=LMN_HLM;
sbArwHLmOn:=
ELSE
QLMN_HLM:=
IF (dLmn
THEN
QLMN_LLM:=
dLmn:=LMN_LLM;
sbArwLLmOn:=
ELSE
QLMN_LLM:=
END_IF;
END_IF;
sLmn:=dLmn;
dLmn:=sLmn
LMN:=dLmn;
dLmn:=LMN
IF dLmn
THEN
dLmn:=
ELSE
IF dLmn
THEN
dLmn:=-
END_IF;
END_IF;
LMN_PER:=
END_IF;
END_FUNCTION_BLOCK