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