lib/time_math.txt
changeset 0 fb772792efd1
equal deleted inserted replaced
-1:000000000000 0:fb772792efd1
       
     1 (*
       
     2  * (c) 2005 Mario de Sousa
       
     3  *
       
     4  * Offered to the public under the terms of the GNU General Public License
       
     5  * as published by the Free Software Foundation; either version 2 of the
       
     6  * License, or (at your option) any later version.
       
     7  *
       
     8  * This program is distributed in the hope that it will be useful, but
       
     9  * WITHOUT ANY WARRANTY; without even the implied warranty of
       
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
       
    11  * Public License for more details.
       
    12  *
       
    13  * This code is made available on the understanding that it will not be
       
    14  * used in safety-critical situations without a full and competent review.
       
    15  *)
       
    16 
       
    17 (*
       
    18  * An IEC 61131-3 IL and ST compiler.
       
    19  *
       
    20  * Based on the
       
    21  * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
       
    22  *
       
    23  *)
       
    24 
       
    25 (*
       
    26  * This is part of the library conatining the functions
       
    27  * and function blocks defined in the standard.
       
    28  *
       
    29  * Math functions on Time and Date data types.
       
    30  * -------------------------------------------
       
    31  *
       
    32  * We also include the two data type conversions defined in table 30 of the IEC 61131-3 standard (version
       
    33  *)
       
    34 
       
    35 
       
    36 (* NOTE: The IEC 61131-3 standard library includes overloaded functions, which are not
       
    37  * allowed in user code. Since our compiler does not yet support overloaded functions, these
       
    38  * are commented out in the following library for the moment...
       
    39  *)
       
    40 
       
    41 (***************)
       
    42 (* TIME + TIME *)
       
    43 (***************)
       
    44 
       
    45 FUNCTION ADD : TIME
       
    46   VAR_INPUT
       
    47     IN1 : TIME;
       
    48     IN2 : TIME;
       
    49   END_VAR
       
    50 
       
    51   ADD := IN1 + IN2;
       
    52 END_FUNCTION
       
    53 
       
    54 
       
    55 FUNCTION ADD_TIME : TIME
       
    56   VAR_INPUT
       
    57     IN1 : TIME;
       
    58     IN2 : TIME;
       
    59   END_VAR
       
    60 
       
    61   ADD_TIME := IN1 + IN2;
       
    62 END_FUNCTION
       
    63 
       
    64 
       
    65 FUNCTION SUB : TIME
       
    66   VAR_INPUT
       
    67     IN1 : TIME;
       
    68     IN2 : TIME;
       
    69   END_VAR
       
    70 
       
    71   SUB := IN1 - IN2;
       
    72 END_FUNCTION
       
    73 
       
    74 
       
    75 FUNCTION SUB_TIME : TIME
       
    76   VAR_INPUT
       
    77     IN1 : TIME;
       
    78     IN2 : TIME;
       
    79   END_VAR
       
    80 
       
    81   SUB_TIME := IN1 - IN2;
       
    82 END_FUNCTION
       
    83 
       
    84 
       
    85 
       
    86 (**************)
       
    87 (* TIME + TOD *)
       
    88 (**************)
       
    89 
       
    90 FUNCTION ADD : TOD
       
    91   VAR_INPUT
       
    92     IN1 : TOD;
       
    93     IN2 : TIME;
       
    94   END_VAR
       
    95 
       
    96   ADD := IN1 + IN2;
       
    97 END_FUNCTION
       
    98 
       
    99 
       
   100 (* The following function is not defined in the standard, but its existance makes sense. *)
       
   101 FUNCTION ADD : TOD
       
   102   VAR_INPUT
       
   103     IN1 : TIME;
       
   104     IN2 : TOD;
       
   105   END_VAR
       
   106 
       
   107   ADD := IN1 + IN2;
       
   108 END_FUNCTION
       
   109 
       
   110 
       
   111 FUNCTION ADD_TOD_TIME : TOD
       
   112   VAR_INPUT
       
   113     IN1 : TOD;
       
   114     IN2 : TIME;
       
   115   END_VAR
       
   116 
       
   117   ADD_TOD_TIME := IN1 + IN2;
       
   118 END_FUNCTION
       
   119 
       
   120 
       
   121 FUNCTION SUB : TOD
       
   122   VAR_INPUT
       
   123     IN1 : TOD;
       
   124     IN2 : TIME;
       
   125   END_VAR
       
   126 
       
   127   SUB := IN1 - IN2;
       
   128 END_FUNCTION
       
   129 
       
   130 
       
   131 FUNCTION SUB_TOD_TIME : TOD
       
   132   VAR_INPUT
       
   133     IN1 : TOD;
       
   134     IN2 : TIME;
       
   135   END_VAR
       
   136 
       
   137   SUB_TOD_TIME := IN1 - IN2;
       
   138 END_FUNCTION
       
   139 
       
   140 
       
   141 
       
   142 (*************)
       
   143 (* TIME + DT *)
       
   144 (*************)
       
   145 
       
   146 FUNCTION ADD : DT
       
   147   VAR_INPUT
       
   148     IN1 : DT;
       
   149     IN2 : TIME;
       
   150   END_VAR
       
   151 
       
   152   ADD := IN1 + IN2;
       
   153 END_FUNCTION
       
   154 
       
   155 
       
   156 (* The following function is not defined in the standard, but its existance makes sense. *)
       
   157 FUNCTION ADD : DT
       
   158   VAR_INPUT
       
   159     IN1 : TIME;
       
   160     IN2 : DT;
       
   161   END_VAR
       
   162 
       
   163   ADD := IN1 + IN2;
       
   164 END_FUNCTION
       
   165 
       
   166 
       
   167 FUNCTION ADD_DT_TIME : DT
       
   168   VAR_INPUT
       
   169     IN1 : DT;
       
   170     IN2 : TIME;
       
   171   END_VAR
       
   172 
       
   173   ADD_DT_TIME := IN1 + IN2;
       
   174 END_FUNCTION
       
   175 
       
   176 
       
   177 
       
   178 (***************)
       
   179 (* DATE + DATE *)
       
   180 (***************)
       
   181 
       
   182 FUNCTION SUB : TIME
       
   183   VAR_INPUT
       
   184     IN1 : DATE;
       
   185     IN2 : DATE;
       
   186   END_VAR
       
   187 
       
   188   SUB := IN1 - IN2;
       
   189 END_FUNCTION
       
   190 
       
   191 
       
   192 FUNCTION SUB_DATE_DATE : TIME
       
   193   VAR_INPUT
       
   194     IN1 : DATE;
       
   195     IN2 : DATE;
       
   196   END_VAR
       
   197 
       
   198   SUB_DATE_DATE := IN1 - IN2;
       
   199 END_FUNCTION
       
   200 
       
   201 
       
   202 
       
   203 (*************)
       
   204 (* TOD + TOD *)
       
   205 (*************)
       
   206 
       
   207 FUNCTION SUB : TIME
       
   208   VAR_INPUT
       
   209     IN1 : TOD;
       
   210     IN2 : TOD;
       
   211   END_VAR
       
   212 
       
   213   SUB := IN1 - IN2;
       
   214 END_FUNCTION
       
   215 
       
   216 
       
   217 FUNCTION SUB_TOD_TOD : TIME
       
   218   VAR_INPUT
       
   219     IN1 : TOD;
       
   220     IN2 : TOD;
       
   221   END_VAR
       
   222 
       
   223   SUB_TOD_TOD := IN1 - IN2;
       
   224 END_FUNCTION
       
   225 
       
   226 
       
   227 
       
   228 (*************)
       
   229 (* TIME + DT *)
       
   230 (*************)
       
   231 
       
   232 FUNCTION SUB : DT
       
   233   VAR_INPUT
       
   234     IN1 : DT;
       
   235     IN2 : TIME;
       
   236   END_VAR
       
   237 
       
   238   SUB := IN1 - IN2;
       
   239 END_FUNCTION
       
   240 
       
   241 
       
   242 FUNCTION SUB_DT_TIME : DT
       
   243   VAR_INPUT
       
   244     IN1 : DT;
       
   245     IN2 : TIME;
       
   246   END_VAR
       
   247 
       
   248   SUB_DT_TIME := IN1 - IN2;
       
   249 END_FUNCTION
       
   250 
       
   251 
       
   252 
       
   253 (***********)
       
   254 (* DT + DT *)
       
   255 (***********)
       
   256 
       
   257 FUNCTION SUB : TIME
       
   258   VAR_INPUT
       
   259     IN1 : DT;
       
   260     IN2 : DT;
       
   261   END_VAR
       
   262 
       
   263   SUB := IN1 - IN2;
       
   264 END_FUNCTION
       
   265 
       
   266 
       
   267 FUNCTION SUB_DT_DT : TIME
       
   268   VAR_INPUT
       
   269     IN1 : DT;
       
   270     IN2 : DT;
       
   271   END_VAR
       
   272 
       
   273   SUB_DT_DT := IN1 - IN2;
       
   274 END_FUNCTION
       
   275 
       
   276 
       
   277 
       
   278 (******************)
       
   279 (* TIME * ANY_NUM *)
       
   280 (******************)
       
   281 
       
   282 FUNCTION MUL : TIME
       
   283   VAR_INPUT
       
   284     IN1 : TIME;
       
   285     IN2 : LREAL;
       
   286   END_VAR
       
   287 
       
   288   MUL := IN1 * IN2;
       
   289 END_FUNCTION
       
   290 
       
   291 
       
   292 FUNCTION MULTIME : TIME
       
   293   VAR_INPUT
       
   294     IN1 : TIME;
       
   295     IN2 : LREAL;
       
   296   END_VAR
       
   297 
       
   298   MULTIME := IN1 * IN2;
       
   299 END_FUNCTION
       
   300 
       
   301 
       
   302 FUNCTION DIV : TIME
       
   303   VAR_INPUT
       
   304     IN1 : TIME;
       
   305     IN2 : LREAL;
       
   306   END_VAR
       
   307 
       
   308   DIV := IN1 / IN2;
       
   309 END_FUNCTION
       
   310 
       
   311 
       
   312 FUNCTION DIVTIME : TIME
       
   313   VAR_INPUT
       
   314     IN1 : TIME;
       
   315     IN2 : LREAL;
       
   316   END_VAR
       
   317 
       
   318   DIVTIME := IN1 / IN2;
       
   319 END_FUNCTION
       
   320 
       
   321 
       
   322 
       
   323 (*************)
       
   324 (* DATE + DT *)
       
   325 (*************)
       
   326 
       
   327 FUNCTION CONCAT_DATE_TOD : DT
       
   328   VAR_INPUT
       
   329     IN1 : DATE;
       
   330     IN2 : TOD;
       
   331   END_VAR
       
   332 
       
   333   CONCAT_DATE_TOD := IN1 + IN2;
       
   334 END_FUNCTION
       
   335 
       
   336 
       
   337 
       
   338 (*************************)
       
   339 (* Data Type Conversions *)
       
   340 (*************************)
       
   341 
       
   342 FUNCTION DT_TO_DATE : DATE
       
   343   VAR_INPUT
       
   344     IN1 : DT;
       
   345   END_VAR
       
   346 
       
   347   {DT_TO_DATE = IN1.__to_DATE();}
       
   348 END_FUNCTION
       
   349 
       
   350 
       
   351 
       
   352 FUNCTION DT_TO_TOD : TOD
       
   353   VAR_INPUT
       
   354     IN1 : DT;
       
   355   END_VAR
       
   356 
       
   357   {DT_TO_TOD = IN1.__to_TOD();}
       
   358 END_FUNCTION
       
   359 
       
   360