lib/time_math.txt
author etisserant
Wed, 31 Jan 2007 15:32:38 +0100
changeset 0 fb772792efd1
permissions -rwxr-xr-x
Initial commit. Last MatPLC CVS with some makefile inclusion removed in order to compile fine out of MatPLC.
(*
 * (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