FUNCTION_BLOCK FB1
TITLE = 'chronometer'
//
// Block Comment...
//
VERSION: '1.0'
AUTHOR:
NAME:
FAMILY: Family
VAR_INPUT
ENABLE : BOOL;
RESET : BOOL;
END_VAR
VAR_OUTPUT
OUT : TIME;
RESET_ACTIV : BOOL;
OVERFLOW : BOOL;
END_VAR
VAR
LAST_TIME : TIME;
ACTUAL_TIME : TIME;
SECOND_SCAN : BOOL;
END_VAR
OK := TRUE;
// Reset / Rücksetzen
RESET_ACTIV := RESET;
IF RESET = TRUE THEN
OUT := DINT_TO_TIME (0);
LAST_TIME := ACTUAL_TIME;
ACTUAL_TIME :=TIME_TCK();
SECOND_SCAN := FALSE;
OVERFLOW := FALSE;
ELSIF ENABLE = FALSE THEN
SECOND_SCAN := FALSE;
ELSE
// First cyclus of Time count
IF SECOND_SCAN = FALSE THEN
// Statement Section_IF
ACTUAL_TIME :=TIME_TCK();
LAST_TIME := ACTUAL_TIME;
SECOND_SCAN:=TRUE;
ELSIF OVER_FLOW = FALSE THEN
// Input
ACTUAL_TIME := TIME_TCK();
//Overflow correction part 1 /
IF ACTUAL_TIME < LAST_TIME THEN
OUT := DINT_TO_TIME(TIME_TO_DINT(ACTUAL_TIME) - TIME_TO_DINT(LAST_TIME) + 2147483647 + TIME_TO_DINT(OUT));
ELSE
OUT := DINT_TO_TIME(TIME_TO_DINT(ACTUAL_TIME) - TIME_TO_DINT(LAST_TIME) + TIME_TO_DINT(OUT));
END_IF;
IF OK = FALSE THEN
OVERFLOW :=TRUE;
OUT := DINT_TO_TIME (2147483647);
END_IF;
LAST_TIME := ACTUAL_TIME;
ELSE
LAST_TIME := ACTUAL_TIME;
END_IF;
END_IF;
END_FUNCTION_BLOCK