Âåðñèÿ äëÿ ïå÷àòè

Modular PID Control ÷òî âíóòðè? ×àñòü 5 - çàêëþ÷èòåëüíàÿ.

Äàòà: 2009-04-03

Äîáàâëåíî: komatic

Òåìà: ModPID



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

Äîáàâèòü êîììåíòàðèé

Âàøå èìÿ:

Òåêñò êîììåíòàðèÿ (4000 max):

Ââåäèòå ñóììó ñ êàðòèíêè: