вариации на тему)
Код:
FUNCTION_BLOCK TIMER
VAR_INPUT
iCntUp : BOOL;
iCntDn : BOOL;
iCntRes : BOOL;
iCntSP : TIME;
END_VAR
VAR_OUTPUT
OutTime : TIME;
OutAlm : BOOL;
END_VAR
VAR
TimeAct : TIME;
TimeOld : TIME;
TimeDelta : TIME;
DoCalc : UINT;
Init: BOOL;
CntUpOld :BOOL;
CntDnOld : BOOL;
END_VAR
IF iCntRes THEN Init := FALSE; END_IF
(*INIT*)
IF NOT Init THEN
Init := TRUE;
iCntUp := iCntDn := CntUpOld := CntDnOld := OutAlm := FALSE;
TimeAct := TimeOld := TimeDelta := OutTime := t#0ms;
DoCalc := 0;
RETURN;
END_IF
(*DOCALC*)
DoCalc := DoCalc +1;
IF (DoCalc MOD 10=0) OR (iCntUp <> CntUpOld) OR (iCntDn <> CntDnOld) THEN
TimeAct :=TIME();
IF TimeOld > t#0ms THEN
TimeDelta := TimeAct - TimeOld;
(*COUNT_UP*)
IF iCntUp OR (CntUpOld > iCntUp) THEN
IF iCntSP > OutTime THEN OutTime := OutTime + TimeDelta;
IF OutTime > iCntSP THEN OutTime := iCntSP; END_IF
END_IF;
END_IF
(*COUNT_DOWN*)
IF iCntDn OR (CntDnOld > iCntDn) THEN
IF OutTime > TimeDelta THEN OutTime := OutTime - TimeDelta;
ELSE OutTime := t#0ms;
END_IF;
END_IF
OutAlm := iCntSP > t#0ms AND OutTime = iCntSP;
END_IF
TimeOld := TimeAct;
END_IF
CntUpOld := iCntUp;
CntDnOld := iCntDn;