Skip to content

Instantly share code, notes, and snippets.

@thetooth
Created September 1, 2023 11:05
Show Gist options
  • Save thetooth/c4856981330d121df59e885100756fbc to your computer and use it in GitHub Desktop.
Save thetooth/c4856981330d121df59e885100756fbc to your computer and use it in GitHub Desktop.
TYPE RTONPersistData :
STRUCT
Running : BOOL;
StartTime : TIME;
EndTime : TIME;
PausedTime : TIME;
CurrentTime : TIME := T#0s;
TotalTime : TIME;
END_STRUCT
END_TYPE
FUNCTION_BLOCK RTONP
VAR_IN_OUT
PersistData : RTONPersistData;
END_VAR
VAR_INPUT
Ru : BOOL;
PT : TIME;
Reset : BOOL;
END_VAR
VAR_OUTPUT
Q : BOOL;
ET : TIME;
END_VAR
VAR
ResetONS : R_TRIG;
PauseRunONS : F_TRIG;
StartRun : R_TRIG;
END_VAR
PauseRunONS(clk := Run);
StartRun(clk := Run);
IF Reset THEN
PersistData.Running := FALSE;
PersistData.StartTime := TIME();
PersistData.CurrentTime := T#0s;
PersistData.TotalTime := T#0s;
PersistData.PausedTime := T#0s;
END_IF
IF StartRun.Q AND NOT PersistData.Running THEN
PersistData.StartTime := TIME();
PersistData.EndTime := TIME();
PersistData.Running := TRUE;
END_IF
IF StartRun.Q AND PersistData.Running THEN
PersistData.StartTime := TIME();
PersistData.EndTime := TIME();
PersistData.PausedTime := PersistData.TotalTime;
END_IF
IF NOT Run AND NOT PersistData.Running THEN
PersistData.StartTime := TIME();
END_IF
IF Run AND PersistData.Running THEN
PersistData.CurrentTime := TIME() - PersistData.StartTime;
END_IF
IF PauseRunONS.Q AND PersistData.Running THEN
PersistData.EndTime := TIME();
PersistData.PausedTime := PersistData.EndTime - PersistData.StartTime;
PersistData.CurrentTime := T#0s;
END_IF
IF Run AND PersistData.Running THEN
PersistData.TotalTime := PersistData.PausedTime + PersistData.CurrentTime;
END_IF
IF PersistData.TotalTime > PT THEN
Q := TRUE;
ELSE
Q := FALSE;
END_IF
ET := PersistData.TotalTime;
END_FUNCTION_BLOCK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment