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

Modular PID Control ÷òî âíóòðè? ×àñòü 3.

Äàòà: 2009-03-23

Äîáàâëåíî: komatic

Òåìà: ModPID



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

Êîììåíòàðèè ê ìàòåðèàëó

Âàø áóäåò ïåðâûì.

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

Âàøå èìÿ:

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

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