--- /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
+
+