--- a/lib/accessor.h Tue Feb 07 20:18:11 2012 +0100
+++ b/lib/accessor.h Tue Feb 07 20:20:19 2012 +0100
@@ -57,6 +57,7 @@
__INIT_RETAIN(domain##__##name, retained)
#define __INIT_EXTERNAL(type, global, name, retained)\
{\
+ type* __GET_GLOBAL_##global();\
name.value = __GET_GLOBAL_##global();\
__INIT_RETAIN(name, retained)\
}
--- a/lib/ieclib.txt Tue Feb 07 20:18:11 2012 +0100
+++ b/lib/ieclib.txt Tue Feb 07 20:20:19 2012 +0100
@@ -38,6 +38,7 @@
{#include "integral_st.txt" }
{#include "pid_st.txt" }
{#include "ramp_st.txt" }
+{#include "rtc.txt" }
(* Not in the standard, but useful nonetheless. *)
{#include "sema.txt" }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/rtc.txt Tue Feb 07 20:20:19 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
+