lib/int_to_bcd.txt
changeset 0 fb772792efd1
equal deleted inserted replaced
-1:000000000000 0:fb772792efd1
       
     1 (*
       
     2  * (c) 2003 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  * Conversion to BCD
       
    30  * -----------------
       
    31  *)
       
    32 
       
    33 
       
    34 
       
    35 
       
    36 FUNCTION USINT_TO_BCD_BYTE: BYTE
       
    37   VAR_INPUT
       
    38     VALUE : USINT;
       
    39   END_VAR
       
    40 
       
    41   USINT_TO_BCD_BYTE := VALUE MOD 10;
       
    42   VALUE := VALUE / 10;
       
    43   USINT_TO_BCD_BYTE := USINT_TO_BCD_BYTE + 16*VALUE;
       
    44   IF VALUE > 9
       
    45   THEN
       
    46     (* The standard is silent on how to handle overflows!! *)
       
    47     (* We simply set it to the highets value!              *)
       
    48     USINT_TO_BCD_BYTE := 16#99;
       
    49   END_IF;
       
    50 END_FUNCTION
       
    51 
       
    52 
       
    53 
       
    54 
       
    55 FUNCTION UINT_TO_BCD_WORD: WORD
       
    56   VAR_INPUT
       
    57     VALUE : UINT;
       
    58   END_VAR
       
    59 
       
    60   UINT_TO_BCD_WORD := VALUE MOD 10;
       
    61   VALUE := VALUE / 10;
       
    62   UINT_TO_BCD_WORD := UINT_TO_BCD_WORD + 16*(VALUE MOD 10);
       
    63   VALUE := VALUE / 10;
       
    64   UINT_TO_BCD_WORD := UINT_TO_BCD_WORD + 16*16*(VALUE MOD 10);
       
    65   VALUE := VALUE / 10;
       
    66   UINT_TO_BCD_WORD := UINT_TO_BCD_WORD + 16*16*16*VALUE;
       
    67   IF VALUE > 9
       
    68   THEN
       
    69     (* The standard is silent on how to handle overflows!! *)
       
    70     (* We simply set it to the highets value!              *)
       
    71     UINT_TO_BCD_WORD := 16#9999;
       
    72   END_IF;
       
    73 END_FUNCTION
       
    74 
       
    75 
       
    76 
       
    77 
       
    78 FUNCTION UDINT_TO_BCD_DWORD: DWORD
       
    79   VAR_INPUT
       
    80     VALUE : UINT;
       
    81   END_VAR
       
    82 
       
    83   UDINT_TO_BCD_DWORD := VALUE MOD 16;
       
    84   VALUE := VALUE / 10;
       
    85   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 16*(VALUE MOD 10);
       
    86   VALUE := VALUE / 10;
       
    87   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 256*(VALUE MOD 10);
       
    88   VALUE := VALUE / 10;
       
    89   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 16*256*(VALUE MOD 10);
       
    90   VALUE := VALUE / 10;
       
    91   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 256*256*(VALUE MOD 10);
       
    92   VALUE := VALUE / 10;
       
    93   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 16*256*256*(VALUE MOD 10);
       
    94   VALUE := VALUE / 10;
       
    95   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 256*256*256*(VALUE MOD 10);
       
    96   VALUE := VALUE / 10;
       
    97   UDINT_TO_BCD_DWORD := UDINT_TO_BCD_DWORD + 16*256*256*256*VALUE;
       
    98   IF VALUE > 9
       
    99   THEN
       
   100     (* The standard is silent on how to handle overflows!! *)
       
   101     (* We simply set it to the highest value!              *)
       
   102     UDINT_TO_BCD_DWORD := 16#9999_9999;
       
   103   END_IF;
       
   104 END_FUNCTION
       
   105 
       
   106 
       
   107 
       
   108 
       
   109 FUNCTION ULINT_TO_BCD_LWORD: LWORD
       
   110   VAR_INPUT
       
   111     VALUE : UINT;
       
   112   END_VAR
       
   113 
       
   114   ULINT_TO_BCD_LWORD := UDINT_TO_BCD_DWORD(VALUE MOD 1_0000_0000);
       
   115   VALUE := VALUE / 1_0000_0000;
       
   116   ULINT_TO_BCD_LWORD := ULINT_TO_BCD_LWORD + 256*256*256*256*UDINT_TO_BCD_DWORD(VALUE);
       
   117 END_FUNCTION