Modular PID Control ÷òî âíóòðè? ×àñòü 5 - çàêëþ÷èòåëüíàÿ.
Äàòà: 2009-04-03
Äîáàâëåíî: komatic
Òåìà: ModPID
Ñîäåðæàíèå
1.DEAD_T Ââîäèò ðåãóëèðóåìîå âðåìÿ çàäåðæêè ïðîõîæäåíèÿ âõîäíîãî ñèãíàëà.
2.NONLIN Âõîäíîéñèãíàë ìîæåòáûòü ïðåîáðàçîâàí â âûõîäíîé ñèãíàë ñîãëàñíî òðåáóåìîìó çàêîíóïðåîáðàçîâàíèÿ.
3.PULSEGEN Áëîê PULSEGEN èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ ñòðóêòóðû ÏÈÄ-ðåãóëÿòîðàñ èìïóëüñíûì âûõîäîì äëÿ ïðîïîðöèîíàëüíûõ ïðèâîäîâ.
4.RMP_SOAK Ãåíåðàòîð ñèãíàëà óñòàâêè â ðåãóëÿòîðàõ
×òîáû íå ïîâòîðÿòü ïîäðîáíîå îïèñàíèå ýòèõ ôóíêöèé â ðàçäåëå download âû ìîæåòå çàãóðçèòü îôèöèàëüíóþ äîêóìåíòàöèþ íà ðóññêîì è àíãëèéñêîì ÿçûêå, ïåðåéòè.
Âðåìÿ çàäåðæêè.
// Áëîê áûë ïðàâëåí â STL ïîýòîìó íå ñîâïàäàåò ïî checksum ñ îðèãèíàëîì
// Íå òåñòèðîâàí
FUNCTION_BLOCK FB104
TITLE =" dead time"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : DEAD_T
VERSION : " 1.0"
// reverse by komatic
(*
Âðåìÿ çàäåðæêè.
Ââîäèò ðåãóëèðóåìîå âðåìÿ çàäåðæêè ïðîõîæäåíèÿ âõîäíîãî ñèãíàëà.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåíàíÿ
DB_NBR : BLOCK_DB ; //íîìåð áëîêà äàííûõ
DEAD_TM : TIME := T#10S; //âðåìÿ çàäåðæêè
TRACK : BOOL ; //ðåæèì îòñëåæèâàíèÿ OUTV=INV
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
END_VAR
VAR
siPtr : INT := 1;
END_VAR
VAR_TEMP
diMax : INT ; //êîëè÷åñòâî çàïèñåé â áëîêå äàííûõ
diLauf : INT ; //ñ÷åò÷èê â öèêëå
drOutv : REAL ; //ïðîìåæóòî÷íàÿ ïåðåìåíàÿ äëÿ OUTV
// dDummy : DWORD ; //Platzhalter für L 8.1, LW 10
END_VAR
BEGIN
// îïðåäåëÿåì êîëè÷åñòâî çàïèñåé â áëîêå äàííûõ
diMax:= REAL_TO_INT(DINT_TO_REAL(TIME_TO_DINT(DEAD_TM)) / DINT_TO_REAL(TIME_TO_DINT(CYCLE)));
IF COM_RST
THEN // Ñáðîñ
drOutv:=0.0;
siPtr:=1;
FOR diLauf:=1 TO diMax BY 1 DO // çàäà÷à ýòîãî öèêëà çàïèñàòü 0.0 â âåñü áëîê äàííûõ
DB_NBR.DD[(diLauf-1)*4]:=REAL_TO_DWORD(drOutv);
END_FOR;
ELSE // Íîðìàëüíàÿ ðàáîòà
IF (siPtr > diMax) OR (siPtr < 1) THEN siPtr:=1; END_IF;
drOutv:=DWORD_TO_REAL(DB_NBR.DD[(siPtr-1)*4]);
DB_NBR.DD[(siPtr-1)*4]:=REAL_TO_DWORD(INV);
siPtr:=siPtr+1;
IF TRACK THEN drOutv:=INV; END_IF;
END_IF;
OUTV:=drOutv;
END_FUNCTION_BLOCK
Èçìåíåíèå âõîäíîãî ñèãíàëà ïî çàäàíîé êðèâîé ïðåîáðàçîâàíèÿ
FUNCTION_BLOCK FB115
TITLE =" nonlinear static funktion"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : NONLIN
VERSION : " 1.0"
// reverse by komatic
(*
Ñ ïîìîùüþ íåëèíåéíîé ñòàòè÷åñêîé ôóíêöèè NONLIN âõîäíîé
ñèãíàë, íàïðèìåð, èçìåðåííûé ñèãíàë îò òåðìîýëåìåíòà, ìîæåò
áûòü ïðåîáðàçîâàí â âûõîäíîé ñèãíàë ñîãëàñíî òðåáóåìîìó çàêîíó
ïðåîáðàçîâàíèÿ.
Òî÷êè ôóíêöèè NONLIN õðàíÿòñÿ â áëîêå äàííûõ îáùåãî
èñïîëüçîâàíèÿ. Ôóíêöèÿ NONLIN íàçíà÷àåò êàæäîìó âõîäíîìó
çíà÷åíèþ îïðåäåëåííîå âûõîäíîå çíà÷åíèå. Åñëè óðîâåíü
âõîäíîãî ñèãíàëà íèæå, ÷åì çíà÷åíèå â òî÷êå 0, òî
ñîîòâåòñòâóþùåå åìó çíà÷åíèå ýêñòðàïîëèðóåòñÿ ñ íàêëîíîì
ôóíêöèè, êàê ìåæäó òî÷êàìè 0 è 1; åñëè æå çíà÷åíèå âõîäíîãî
ñèãíàëà âûøå, ÷åì çíà÷åíèå â ïîñëåäíåé òî÷êå (NBR_PTS), òî
ñîîòâåòñòâóþùåå åìó çíà÷åíèå ýêñòðàïîëèðóåòñÿ ñ íàêëîíîì
ôóíêöèè, êàê ìåæäó òî÷êàìè NBR_PTS è (NBR_PTS –1). Äëÿ
ïîëó÷åíèÿ ïðàêòè÷åñêè ïðèãîäíûõ ðåçóëüòàòîâ ñ èñïîëüçîâàíèåì
äàííîãî áëîêà çíà÷åíèÿ ôóíêöèè äëÿ ñîñåäíèõ òî÷åê äîëæíû
ïðåäñòàâëÿòü ñîáîé ìîíîòîííî âîçðàñòàþùóþ
ïîñëåäîâàòåëüíîñòü.
Ïðè èñïîëüçîâàíèè îïðåäåëåííûõ ïàðàìåòðîâ óïðàâëåíèÿ
îòäåëüíûå âûáðàííûå âõîäíûå ñèãíàëû èëè ñîáñòâåííî âõîäíàÿ
ïåðåìåííàÿ ìîãóò íåïîñðåäñòâåííî ïåðåäàâàòüñÿ íà âûõîä áëîêà
â êà÷åñòâå âûõîäíîé ïåðåìåííîé.
Áëîê-ñõåìà NONLIN Îáîçíà÷åíèå
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
DF_OUTV : REAL ; //çíà÷åíèå âûõîäà ïî óìîë÷àíèþ
DB_NBR : BLOCK_DB ; //íîìåð áëîêà äàííûõ
DFOUT_ON : BOOL ; //âêëþ÷èòü âûõîä ïî óìîë÷àíèþ
TRACK : BOOL ; //ïåðåäà÷à âõîäà íà ïðÿìóþ íà âûõîä OUTV=INV
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
END_VAR
VAR
n : INT := 1; //òåêóùèé óêàçàòåëü íà ìàñèâ
END_VAR
VAR_TEMP
EndPosition : BOOL ; //ïðèçíàê çàâåðøåíèÿ ïîèñêà
Factor : REAL ; //êôò íàêëîíà (y2 - y1)/(x2 - x1)
rBegin : REAL ; //àêòóàëüíîå íà÷àëî âõîäíîãî äèàïàçîíà
rEnd : REAL ; //àêòóàëüíûé êîíåö âõîäíîãî äèàïàçîíà
END_VAR
BEGIN
IF COM_RST // Åñëè ñáðîñ
THEN
n:=1;
OUTV:=0.0;
ELSIF TRACK // Åñëè ïåðåäà÷à âõîäà íà âûõîä
THEN
OUTV:=INV;
ELSE
EndPosition:=0; // ïðèçíàê êîíöà ïîèñêà
//------------------------------------------------------------------
REPEAT
rBegin:=DWORD_TO_REAL(DB_NBR.DD[(n-1)*8+2]); // ñ÷èòàëè âõîä ïåðâîé òî÷êè X1
rEnd:=DWORD_TO_REAL(DB_NBR.DD[n*8+2]); // ñ÷èòàëè âõîä âòîðîé òî÷êè X2
IF INV>rBegin // åñëè âõîäíàÿ ïåðåìåííàÿ áîëüøå X1
THEN
IF INV>rEnd // è åñëè âõîäíàÿ ïåðåìåííàÿ áîëüøå X2
THEN
IF n < WORD_TO_INT(DB_NBR.DW[0]) // åñëè óêàçàòåëü ìåíüøå ðàçìåðà òàáëèöû
THEN
rBegin:=rEnd; // X1:=X2
n:=n+1; // óâåëè÷èâàåì óêàçàòåëü
rEnd:=DWORD_TO_REAL(DB_NBR.DD[n*8+2]); // X2:=X2[n]
ELSE
EndPosition:=1; // ïîèñê çàêîí÷åí
END_IF;
ELSE
EndPosition:=1; // ïîèñê çàêîí÷åí
END_IF;
ELSE
IF n > 1 // åñëè óêàçàòåëü áîëüøå 1
THEN
n:=n-1; // óìåíüøàåì óêàçàòåëü
rEnd:=rBegin; // X2:=X1
rBegin:=DWORD_TO_REAL(DB_NBR.DD[(n-1)*8+2]); // X1:=X[n-1]
ELSE
EndPosition:=1; // ïîèñê çàâåðøåí
END_IF;
END_IF;
UNTIL EndPosition // äî òåõ ïîð ïîêà ïîèñê íå çàâåðøåí
END_REPEAT;
//------------------------------------------------------------------
//Factor:=(Y2 - Y1)/(X2 - X1)
Factor:=(DWORD_TO_REAL(DB_NBR.DD[n*8+6]) - DWORD_TO_REAL(DB_NBR.DD[(n-1)*8+6]))/(rEnd-rBegin);
// OUTV:=Factor*INV+Y1-(X1*rFactor)
OUTV:=INV*Factor + DWORD_TO_REAL(DB_NBR.DD[(n-1)*8+6]) - rBegin*Factor;
END_IF;
IF DFOUT_ON THEN OUTV:=DF_OUTV; END_IF; // åñëè âûõîä ïî óìîë÷àíèþ
END_FUNCTION_BLOCK
Áëîê PULSEGEN èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ ñòðóêòóðû ÏÈÄ-ðåãóëÿòîðàñ èìïóëüñíûì âûõîäîì äëÿ ïðîïîðöèîíàëüíûõ ïðèâîäîâ.
FUNCTION_BLOCK FB120
TITLE =" pulse generator"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : PULSEGEN
VERSION : " 1.1"
// reverse by komatic
(*
Áëîê PULSEGEN èñïîëüçóåòñÿ äëÿ ñîçäàíèÿ ñòðóêòóðû ÏÈÄ-ðåãóëÿòîðà
ñ èìïóëüñíûì âûõîäîì äëÿ ïðîïîðöèîíàëüíûõ ïðèâîäîâ. Áëîê
PULSEGEN ìîæåò èñïîëüçîâàòüñÿ â ðåãóëÿòîðàõ ñ òðåõóðîâíåâûì è
äâóõóðîâíåâûì èìïóëüñíûì âûõîäîì ñ ØÈÌ-ìîäóëÿöèåé.
Èñïîëüçóÿ ØÈÌ-ìîäóëÿöèþ, áëîê PULSEGEN òðàíñôîðìèðóåò
âõîäíóþ ïåðåìåííóþ INV (äëÿ áëîêà ãåíåðàòîðà èìïóëüñîâ
âõîäíîé ïåðåìåííîé INV ÿâëÿåòñÿ óïðàâëÿþùàÿ ïåðåìåííàÿ LMN
PID-áëîêà) â ïîñëåäîâàòåëüíîñòü èìïóëüñîâ, èìåþùèõ
ïîñòîÿííûé ïåðèîä PER_TM. Ýòîò ïåðèîä ñîîòâåòñòâóåò ïåðèîäó
âðåìåíè, ñ êîòîðûì ïðîèñõîäèò îáíîâëåíèå âõîäíîé ïåðåìåííîé.
*)
VAR_INPUT
INV : REAL ; //âõîäíàÿ ïåðåìåííàÿ
PER_TM : TIME := T#1S; //ïåðèîä
P_B_TM : TIME := T#50MS; //ìèíèìàëüíûé èìïóëüñ/ïàóçà
RATIOFAC : REAL := 1.000000e+000; //ôàêòîð ñîîòíîøåíèÿ
STEP3_ON : BOOL := TRUE; //òðåõóðîâíåâûé ñèãíàë âêëþ÷èòü
ST2BI_ON : BOOL ; //äâóõóðîâíåâûé ñèãíàë äëÿ áèïîëÿðíîãî âûõîäà
MAN_ON : BOOL ; //âêëþ÷èòü ðó÷íîé ðåæèì
POS_P_ON : BOOL ; //ïîëîæèòåëüíûé èìïóëüñ
NEG_P_ON : BOOL ; //îòðèöàòåëüíûé èìïóëüñ
SYN_ON : BOOL := TRUE; //èìïóëüñ âûõîäíîé ñèíõðîíèçàöèè
COM_RST : BOOL ; //ïîëíûé ðåñòàðò
CYCLE : TIME := T#10MS; //âðåìÿ âûïîëíåíèÿ
END_VAR
VAR_OUTPUT
QPOS_P : BOOL ; //ïîëîæèòåëüíûé èìïóëüñ
QNEG_P : BOOL ; //îòðèöàòåëüíûé èìïóëüñ
END_VAR
VAR
sInvAlt : REAL ;
siZaehlPer : INT ;
siZaehlPTm : INT ;
sbPosP : BOOL := TRUE;
END_VAR
VAR_TEMP
rCycle : REAL ; //Abtastzeit in real
rPerTm : REAL ; //Periodendauer in real
rMinPTm : REAL ; //Mindestimpulsdauer in real
rRatioFac : REAL ; //Verhältnisfaktor
Offset : REAL ; //Offset
PTm : REAL ; //Impulsdauer
PTmHlm : REAL ; //Obere Begrenzung der Impulsdauer
PTmLlm : REAL ; //Untere Begrenzung der Impulsdauer
END_VAR
BEGIN
IF COM_RST
THEN
QPOS_P:=0;
QNEG_P:=0;
siZaehlPer:=0;
siZaehlPTm:=0;
sbPosP:=1;
ELSE
IF MAN_ON
THEN
IF STEP3_ON
THEN
IF POS_P_ON XOR NEG_P_ON
THEN
IF POS_P_ON
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
ELSE
QPOS_P:=0;
QNEG_P:=0;
END_IF;
ELSE
IF POS_P_ON
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
END_IF;
siZaehlPer:=0;
siZaehlPTm:=0;
sbPosP:=1;
ELSE
IF siZaehlPer <= 0
THEN
rCycle:=DINT_TO_REAL(TIME_TO_DINT(CYCLE));
rPerTm:=DINT_TO_REAL(TIME_TO_DINT(PER_TM));
rMinPTm:=DINT_TO_REAL(TIME_TO_DINT(P_B_TM));
siZaehlPer:=DINT_TO_INT(REAL_TO_DINT(rPerTm/rCycle));
IF siZaehlPer < 0
THEN
siZaehlPer:=0;
END_IF;
IF STEP3_ON
THEN
IF INV > 0.0
THEN
IF RATIOFAC > 1.0
THEN
rRatioFac:=1.0/RATIOFAC;
ELSE
rRatioFac:=1.0;
END_IF;
sbPosP:=1;
ELSE
IF RATIOFAC > 1.0
THEN
rRatioFac:=1.0;
ELSE
rRatioFac:=RATIOFAC;
END_IF;
sbPosP:=0;
END_IF;
Offset:=0.0;
ELSE
IF ST2BI_ON
THEN
IF INV<-100.0
THEN
Offset:=0.0;
rRatioFac:=0.0;
ELSE
Offset:=0.5*rPerTm;
rRatioFac:=0.5;
END_IF;
ELSE
Offset:=0.0;
IF INV < 0.0
THEN
rRatioFac:=0.0;
ELSE
rRatioFac:=1.0;
END_IF;
END_IF;
sbPosP:=1;
END_IF;
PTm:=ABS(INV*rRatioFac*rPerTm*0.01+Offset);
IF (NOT STEP3_ON) AND ST2BI_ON
THEN
rRatioFac:=1.0;
END_IF;
PTmHlm:=(rPerTm-rMinPTm)*rRatioFac;
PTmLlm:=rMinPTm*rRatioFac;
IF PTm > PTmHlm
THEN
PTm:=rPerTm*rRatioFac;
END_IF;
siZaehlPTm:=DINT_TO_INT(REAL_TO_DINT(PTm/rCycle));
IF PTm < PTmLlm
THEN
siZaehlPTm:=0;
END_IF;
END_IF;
IF ((INV <> sInvAlt) AND SYN_ON) AND (siZaehlPer > 2)
THEN
siZaehlPer:=1;
siZaehlPTm:=0;
END_IF;
IF STEP3_ON
THEN
IF siZaehlPTm = 0
THEN
QPOS_P:=0;
QNEG_P:=0;
ELSE
IF sbPosP
THEN
QPOS_P:=1;
QNEG_P:=0;
ELSE
QPOS_P:=0;
QNEG_P:=1;
END_IF;
END_IF;
ELSE
IF siZaehlPTm = 0
THEN
QPOS_P:=0;
ELSE
QPOS_P:=1;
END_IF;
QNEG_P:= NOT QPOS_P;
END_IF;
siZaehlPer:=siZaehlPer-1;
IF siZaehlPTm>0
THEN
siZaehlPTm:=siZaehlPTm-1;
ELSE
siZaehlPTm:=0;
END_IF;
END_IF;
END_IF;
sInvAlt:=INV;
END_FUNCTION_BLOCK
Áëîê RMP_SOAK èñïîëüçóåòñÿ, ãëàâíûì îáðàçîì, êàê ãåíåðàòîð(ôîðìèðîâàòåëü) ñèãíàëà óñòàâêè â ðåãóëÿòîðàõ
// íå ñîâïàäàåò ïî checksum ñ îðèãèíàëîì
// íå òåñòèðîâàëîñü
FUNCTION_BLOCK FB121
TITLE =" ramp soak"
AUTHOR : AUT_1
FAMILY : MODCONT
NAME : RMP_SOAK
VERSION : " 1.1"
// reverse by komatic
(*
Áëîê RMP_SOAK èñïîëüçóåòñÿ, ãëàâíûì îáðàçîì, êàê ãåíåðàòîð
(ôîðìèðîâàòåëü) ñèãíàëà óñòàâêè â ðåãóëÿòîðàõ, ðàáîòàþùèõ ñ
íàáîðîì óñòàâîê, êàæäàÿ èç êîòîðûõ âûáèðàåòñÿ â çàäàííîå
âðåìÿ.
Ôóíêöèÿ RMP_SOAK ïîçâîëÿåò ñôîðìèðîâàòü âðåìåííîé ãðàôèê
èçìåíåíèÿ ñèãíàëà, îòäåëüíûå êîîðäèíàòû êîòîðîãî äîëæíû
õðàíèòüñÿ â îáùåì áëîêå äàííûõ. Çíà÷åíèÿ ñèãíàëà â îòðåçêàõ
âðåìåíè ìåæäó êîîðäèíàòàìè èíòåðïîëèðóþòñÿ.
Ñ ïîìîùüþ óïðàâëÿþùèõ ïàðàìåòðîâ ìîãóò áûòü âûáðàíû
ñëåäóþùèå ðåæèìû:
• Àêòèâàöèÿ ôóíêöèè RMP_SOAK;
• Âûäà÷à âûõîäíîãî ñèãíàëà ñ çàðàíåå çàäàííûì çíà÷åíèåì;
• Çàäåðæêà "çàìîðàæèâàíèå" ðàáîòû;
• Çàäàíèå íîìåðà êîîðäèíàòû è âðåìåíè äëÿ ïðîäîëæåíèÿ ðàáîòû;
• Ïîâòîðíûé çàïóñê ôóíêöèè;
• Èçìåíåíèå îáùåãî âðåìåíè ðàáîòû è îáùåãî îñòàâøåãîñÿ
âðåìåíè.
*)
VAR_INPUT
DF_OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ ïî óìîë÷àíèþ
DB_NBR : BLOCK_DB ; //íîìåð áëîêà äàííûõ
TM_SNBR : INT ; //íîìåð øàãà ïðè ïðäîëæåíèè (CONT_ON)
TM_CONT : TIME ; //âðåìÿ ïðè ïðîäîëæåíèè (CONT_ON)
DFOUT_ON : BOOL ; //âûõîäíàÿ ïåðåìåííàÿ ïî óìîë÷àíèþ âêëþ÷èòü
RMPSK_ON : BOOL ; //âêëþ÷èòü âûïîëíåíèå øàãîâ
HOLD : BOOL ; //ðåæèì óäåðæàíèÿ
CONT_ON : BOOL ; //ïðîäîëæèòü ñ çàäàíûõ ïàðàìåòðîâ
CYC_ON : BOOL ; //âêëþ÷èòü öèêëè÷åñêîå ïîâòîðåíèå
TUPDT_ON : BOOL ; //îáíîâèòü îáùåå âðåìÿ
COM_RST : BOOL ; //ïðèçíàê ïîëíîãî ðåñòàðòà
CYCLE : TIME := T#1S; //âðåìÿ âûïîëíåíèÿ äàííîãî áëîêà
END_VAR
VAR_OUTPUT
OUTV : REAL ; //âûõîäíàÿ ïåðåìåííàÿ
QR_S_ACT : BOOL ; //ïðèçíàê - ôóíêöèÿ îòðàáàòûâàåò øàãè
NBR_ATMS : INT ; //íîìåð òåêóùåãî øàãà
RS_TM : TIME ; //îñòàâøååñÿ âðåìÿ íà äàííîì øàãå
T_TM : TIME ; //îáùåå âðåìÿ äëÿ âñåõ øàãîâ
RT_TM : TIME ; //îñòàâøååñÿ âðåìÿ äëÿ âñåõ øàãîâ
END_VAR
VAR
sOutEnd : REAL ;
sOutOld : REAL ;
siNbratms : INT ;
stRstm : TIME ;
stTtm : TIME ;
stRttm : TIME ;
sbStart : BOOL ; //ïðèçíàê ñòàðòà îáðàáîòêè øàãîâ
sbQrsact : BOOL ; //ïðèçíàê âûïîëíåíèå ïðîãðàììû îáðàáîòêè øàãîâ
END_VAR
VAR_TEMP
Sollwert : REAL ;
dOutNeu : REAL ; //àêòóëüíûé âûõîä
dJ : INT ; //èíäåêñíàÿ ïåðåìåííàÿ äëÿ öèêëîâ
END_VAR
BEGIN
Sollwert:=DF_OUTV; // ïîäãîòàâëèâàåì âûõîä ïî óìîë÷àíèþ
IF COM_RST // åñëè åñòü ïðèçíàê ïîëíîãî ñáðîñà
THEN
stTtm:=T#0MS; // îáíóëåíèå âðåìåíè îáùåãî âûïîëíåíèÿ çàäàíèÿ
FOR dJ:=0 TO WORD_TO_INT(DB_NBR.DW0) - 1 BY 1 DO
stTtm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD[dJ*8+6]))+stTtm;
// ïîäñ÷åò îáùåãî âðåìåíè âûïîëíåíèÿ çàäàíèÿ
END_FOR;
dOutNeu:=0.0; // âûõîä
stRttm:=stTtm;
sOutEnd:=0.0;
siNbratms:=0;
stRstm:=T#0MS;
sbStart:=1;
sbQrsact:=0;
ELSE
IF RMPSK_ON
THEN
IF sbStart
THEN
dOutNeu:=DWORD_TO_REAL(DB_NBR.DD2);
// òåêóùàÿ âûõîäíÿ ïåðåìåííàÿ
sOutEnd:=DWORD_TO_REAL(DB_NBR.DD10);
// ñëåäóþùÿ âûõîäíàÿ ïåðåìåííàÿ
stRstm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD6));
// âðåìÿ âûäåðæêè òåêóùåé âûõîäíîé ïåðåìåííîé
stRttm:=stTtm;
siNbratms:=1;
sbStart:=0;
sbQrsact:=1;
ELSE
IF HOLD
THEN
sbQrsact:=0;
dOutNeu:=sOutOld;
IF CONT_ON
THEN
sOutEnd:=DWORD_TO_REAL(DB_NBR.DD[TM_SNBR*8+2]);
stRttm:=TM_CONT;
stRstm:=TM_CONT;
siNbratms:=TM_SNBR;
FOR dJ:=siNbratms TO WORD_TO_INT(DB_NBR.DW0) - 1 BY 1 DO
stRttm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD[dJ*8+6]))+stRttm;
END_FOR;
END_IF;
ELSE
IF stRstm > CYCLE
THEN
dOutNeu:=(sOutEnd-sOutOld) / DINT_TO_REAL(TIME_TO_DINT(stRstm))
* DINT_TO_REAL(TIME_TO_DINT(CYCLE)) + sOutOld;
stRstm:=stRstm-CYCLE;
stRttm:=stRttm-CYCLE;
ELSE
IF siNbratms < WORD_TO_INT(DB_NBR.DW0)
THEN
sOutEnd:=DWORD_TO_REAL(DB_NBR.DD[(siNbratms+1)*8+2]);
dOutNeu:=DWORD_TO_REAL(DB_NBR.DD[siNbratms*8+2]);
stRstm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD[siNbratms*8+6]));
siNbratms:=siNbratms+1;
sbQrsact:=1;
stRttm:=stRttm-CYCLE;
ELSE
IF CYC_ON
THEN
sbStart:=1;
ELSE
sbQrsact:=0;
END_IF;
dOutNeu:=DWORD_TO_REAL(DB_NBR.DD[siNbratms*8+2]);
END_IF;
END_IF;
END_IF;
END_IF;
ELSE
sbStart:=1;
dOutNeu:=0.0;
QR_S_ACT:=0;
END_IF;
IF TUPDT_ON // îáíîâèòü ðàñ÷åò âðåìåíè
THEN
stTtm:=T#0MS;
stRttm:=stRstm;
FOR dJ:=0 TO WORD_TO_INT(DB_NBR.DW0)-1 BY 1 DO
stTtm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD[dJ*8+6]))+stTtm;
END_FOR;
FOR dJ:=siNbratms TO WORD_TO_INT(DB_NBR.DW0)-1 BY 1 DO
stRttm:=DINT_TO_TIME(DWORD_TO_DINT(DB_NBR.DD[dJ*8+6]))+stRttm;
END_FOR;
END_IF;
END_IF;
IF DFOUT_ON
THEN
dOutNeu:=Sollwert;
sbQrsact:=0;
END_IF;
OUTV:=dOutNeu;
sOutOld:=dOutNeu;
QR_S_ACT:=sbQrsact;
NBR_ATMS:=siNbratms;
RS_TM:=stRstm;
T_TM:=stTtm;
RT_TM:=stRttm;
END_FUNCTION_BLOCK
Ïðîñìîòðîâ: 18153
Êîììåíòàðèè ê ìàòåðèàëó
Äîáàâëåí: Pie-Man Äàòà: 2011-04-21
Èñõîäíèêè íîâîé âåðñèè áèáëèîòåêè Modular Pid Control òóò http://plcforum.uz.ua/viewtopic.php?f=9&t=15245
Äîáàâëåí: Äìèòðèé Äàòà: 2013-06-18
Ýòî âñå î÷åíü õîðîøî. Âîò òîëüêî ïðîáëåìà ñ íîâûì TIA è åãî ñèìâîëüíîé àäðåñàöèåé... Äàííûé èñõîäíèê íå óäàåòñÿ ïîðòèðîâàòü â TIA...
Äîáàâëåí: liping wei Äàòà: 2017-04-29
Very good
Äîáàâèòü êîììåíòàðèé