lib/time_math.txt
changeset 0 fb772792efd1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/time_math.txt	Wed Jan 31 15:32:38 2007 +0100
@@ -0,0 +1,360 @@
+(*
+ * (c) 2005 Mario de Sousa
+ *
+ * Offered to the public under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ *)
+
+(*
+ * An IEC 61131-3 IL and ST compiler.
+ *
+ * Based on the
+ * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
+ *
+ *)
+
+(*
+ * This is part of the library conatining the functions
+ * and function blocks defined in the standard.
+ *
+ * Math functions on Time and Date data types.
+ * -------------------------------------------
+ *
+ * We also include the two data type conversions defined in table 30 of the IEC 61131-3 standard (version
+ *)
+
+
+(* NOTE: The IEC 61131-3 standard library includes overloaded functions, which are not
+ * allowed in user code. Since our compiler does not yet support overloaded functions, these
+ * are commented out in the following library for the moment...
+ *)
+
+(***************)
+(* TIME + TIME *)
+(***************)
+
+FUNCTION ADD : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : TIME;
+  END_VAR
+
+  ADD := IN1 + IN2;
+END_FUNCTION
+
+
+FUNCTION ADD_TIME : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : TIME;
+  END_VAR
+
+  ADD_TIME := IN1 + IN2;
+END_FUNCTION
+
+
+FUNCTION SUB : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : TIME;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_TIME : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : TIME;
+  END_VAR
+
+  SUB_TIME := IN1 - IN2;
+END_FUNCTION
+
+
+
+(**************)
+(* TIME + TOD *)
+(**************)
+
+FUNCTION ADD : TOD
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TIME;
+  END_VAR
+
+  ADD := IN1 + IN2;
+END_FUNCTION
+
+
+(* The following function is not defined in the standard, but its existance makes sense. *)
+FUNCTION ADD : TOD
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : TOD;
+  END_VAR
+
+  ADD := IN1 + IN2;
+END_FUNCTION
+
+
+FUNCTION ADD_TOD_TIME : TOD
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TIME;
+  END_VAR
+
+  ADD_TOD_TIME := IN1 + IN2;
+END_FUNCTION
+
+
+FUNCTION SUB : TOD
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TIME;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_TOD_TIME : TOD
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TIME;
+  END_VAR
+
+  SUB_TOD_TIME := IN1 - IN2;
+END_FUNCTION
+
+
+
+(*************)
+(* TIME + DT *)
+(*************)
+
+FUNCTION ADD : DT
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : TIME;
+  END_VAR
+
+  ADD := IN1 + IN2;
+END_FUNCTION
+
+
+(* The following function is not defined in the standard, but its existance makes sense. *)
+FUNCTION ADD : DT
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : DT;
+  END_VAR
+
+  ADD := IN1 + IN2;
+END_FUNCTION
+
+
+FUNCTION ADD_DT_TIME : DT
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : TIME;
+  END_VAR
+
+  ADD_DT_TIME := IN1 + IN2;
+END_FUNCTION
+
+
+
+(***************)
+(* DATE + DATE *)
+(***************)
+
+FUNCTION SUB : TIME
+  VAR_INPUT
+    IN1 : DATE;
+    IN2 : DATE;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_DATE_DATE : TIME
+  VAR_INPUT
+    IN1 : DATE;
+    IN2 : DATE;
+  END_VAR
+
+  SUB_DATE_DATE := IN1 - IN2;
+END_FUNCTION
+
+
+
+(*************)
+(* TOD + TOD *)
+(*************)
+
+FUNCTION SUB : TIME
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TOD;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_TOD_TOD : TIME
+  VAR_INPUT
+    IN1 : TOD;
+    IN2 : TOD;
+  END_VAR
+
+  SUB_TOD_TOD := IN1 - IN2;
+END_FUNCTION
+
+
+
+(*************)
+(* TIME + DT *)
+(*************)
+
+FUNCTION SUB : DT
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : TIME;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_DT_TIME : DT
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : TIME;
+  END_VAR
+
+  SUB_DT_TIME := IN1 - IN2;
+END_FUNCTION
+
+
+
+(***********)
+(* DT + DT *)
+(***********)
+
+FUNCTION SUB : TIME
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : DT;
+  END_VAR
+
+  SUB := IN1 - IN2;
+END_FUNCTION
+
+
+FUNCTION SUB_DT_DT : TIME
+  VAR_INPUT
+    IN1 : DT;
+    IN2 : DT;
+  END_VAR
+
+  SUB_DT_DT := IN1 - IN2;
+END_FUNCTION
+
+
+
+(******************)
+(* TIME * ANY_NUM *)
+(******************)
+
+FUNCTION MUL : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : LREAL;
+  END_VAR
+
+  MUL := IN1 * IN2;
+END_FUNCTION
+
+
+FUNCTION MULTIME : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : LREAL;
+  END_VAR
+
+  MULTIME := IN1 * IN2;
+END_FUNCTION
+
+
+FUNCTION DIV : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : LREAL;
+  END_VAR
+
+  DIV := IN1 / IN2;
+END_FUNCTION
+
+
+FUNCTION DIVTIME : TIME
+  VAR_INPUT
+    IN1 : TIME;
+    IN2 : LREAL;
+  END_VAR
+
+  DIVTIME := IN1 / IN2;
+END_FUNCTION
+
+
+
+(*************)
+(* DATE + DT *)
+(*************)
+
+FUNCTION CONCAT_DATE_TOD : DT
+  VAR_INPUT
+    IN1 : DATE;
+    IN2 : TOD;
+  END_VAR
+
+  CONCAT_DATE_TOD := IN1 + IN2;
+END_FUNCTION
+
+
+
+(*************************)
+(* Data Type Conversions *)
+(*************************)
+
+FUNCTION DT_TO_DATE : DATE
+  VAR_INPUT
+    IN1 : DT;
+  END_VAR
+
+  {DT_TO_DATE = IN1.__to_DATE();}
+END_FUNCTION
+
+
+
+FUNCTION DT_TO_TOD : TOD
+  VAR_INPUT
+    IN1 : DT;
+  END_VAR
+
+  {DT_TO_TOD = IN1.__to_TOD();}
+END_FUNCTION
+
+