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