|
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 from BCD |
|
30 * ------------------- |
|
31 *) |
|
32 |
|
33 |
|
34 |
|
35 FUNCTION BYTE_BCD_TO_USINT: USINT |
|
36 VAR_INPUT |
|
37 BCD : BYTE; |
|
38 END_VAR |
|
39 |
|
40 BYTE_BCD_TO_USINT := BCD MOD 16; |
|
41 BCD := BCD / 16; |
|
42 BYTE_BCD_TO_USINT := BYTE_BCD_TO_USINT + 10*BCD; |
|
43 END_FUNCTION |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 FUNCTION WORD_BCD_TO_UINT: UINT |
|
49 VAR_INPUT |
|
50 BCD : WORD; |
|
51 END_VAR |
|
52 |
|
53 WORD_BCD_TO_UINT := BCD MOD 16; |
|
54 BCD := BCD / 16; |
|
55 WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 10*(BCD MOD 16); |
|
56 BCD := BCD / 16; |
|
57 WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 100*(BCD MOD 16); |
|
58 BCD := BCD / 16; |
|
59 WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 1000*BCD; |
|
60 END_FUNCTION |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 FUNCTION DWORD_BCD_TO_UDINT: UDINT |
|
66 VAR_INPUT |
|
67 BCD : DWORD; |
|
68 END_VAR |
|
69 |
|
70 DWORD_BCD_TO_UDINT := BCD MOD 16; |
|
71 BCD := BCD / 16; |
|
72 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 10*(BCD MOD 16); |
|
73 BCD := BCD / 16; |
|
74 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 100*(BCD MOD 16); |
|
75 BCD := BCD / 16; |
|
76 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1000*(BCD MOD 16); |
|
77 BCD := BCD / 16; |
|
78 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1_0000*(BCD MOD 16); |
|
79 BCD := BCD / 16; |
|
80 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 10_0000*(BCD MOD 16); |
|
81 BCD := BCD / 16; |
|
82 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 100_0000*(BCD MOD 16); |
|
83 BCD := BCD / 16; |
|
84 DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1000_0000*BCD; |
|
85 END_FUNCTION |
|
86 |
|
87 |
|
88 |
|
89 |
|
90 FUNCTION LWORD_BCD_TO_ULINT: ULINT |
|
91 VAR_INPUT |
|
92 BCD : LWORD; |
|
93 END_VAR |
|
94 |
|
95 LWORD_BCD_TO_ULINT := DWORD_BCD_TO_UDINT(BCD MOD (256*256*256*256)); |
|
96 BCD := BCD / (256*256*256*256); |
|
97 LWORD_BCD_TO_ULINT := LWORD_BCD_TO_ULINT + 1_0000_0000*DWORD_BCD_TO_UDINT(BCD); |
|
98 END_FUNCTION |