FUNCTION_BLOCK FB_SafeDelay
VAR_INPUT
    Execute : BOOL;
    Reset : BOOL;
    DelayTime : TIME;
END_VAR
VAR_OUTPUT
    Busy : BOOL;
    Done : BOOL;
END_VAR
VAR
    DelayTimer : TON;
END_VAR

IF Reset THEN
    DelayTimer(IN := FALSE, PT := DelayTime);
    Busy := FALSE;
    Done := FALSE;
ELSE
    DelayTimer(IN := Execute, PT := DelayTime);
    Busy := Execute AND NOT DelayTimer.Q;
    Done := DelayTimer.Q;
END_IF
END_FUNCTION_BLOCK
