--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/rtc.txt Sat Mar 31 15:34:33 2012 +0100
@@ -0,0 +1,51 @@
+(****************************************************************
+
+ RTC - Real-time clock
+
+Q is a copy of IN.
+
+When IN = FALSE, CDT is the current date and time as set by the
+PLC driver.
+
+When IN changes from FALSE to TRUE, PDT is stored. As long as IN is
+TRUE, CDT is equal to PDT + the amount of time since PDT was loaded.
+
+****************************************************************)
+
+FUNCTION_BLOCK RTC
+ VAR_INPUT
+ IN : BOOL; (* 0 - current time, 1 - load time from
+PDT *)
+ PDT : DT; (* Preset datetime *)
+ END_VAR
+ VAR_OUTPUT
+ Q : BOOL := FALSE; (* Copy of IN *)
+ CDT : DT; (* Datetime, current or relative to PDT *)
+ END_VAR
+
+ VAR
+ PREV_IN : BOOL := FALSE;
+ OFFSET : TIME;
+ CURRENT_TIME : DT;
+ END_VAR
+
+ {__SET_VAR(data__->,CURRENT_TIME,__CURRENT_TIME)}
+
+ IF IN
+ THEN
+ IF NOT PREV_IN
+ THEN
+ OFFSET := PDT - CURRENT_TIME;
+ END_IF;
+
+ (* PDT + time since PDT was loaded *)
+ CDT := CURRENT_TIME + OFFSET;
+ ELSE
+ CDT := CURRENT_TIME;
+ END_IF;
+
+ Q := IN;
+ PREV_IN := IN;
+
+END_FUNCTION_BLOCK
+