lib/bcd_to_int.txt
changeset 0 fb772792efd1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/bcd_to_int.txt	Wed Jan 31 15:32:38 2007 +0100
@@ -0,0 +1,98 @@
+(*
+ * (c) 2003 Mario de Sousa
+ *
+ * Offered to the public under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ *)
+
+(*
+ * An IEC 61131-3 IL and ST compiler.
+ *
+ * Based on the
+ * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
+ *
+ *)
+
+(*
+ * This is part of the library conatining the functions
+ * and function blocks defined in the standard.
+ *
+ * Conversion from BCD
+ * -------------------
+ *)
+
+
+
+FUNCTION BYTE_BCD_TO_USINT: USINT
+  VAR_INPUT
+    BCD : BYTE;
+  END_VAR
+
+  BYTE_BCD_TO_USINT := BCD MOD 16;
+  BCD := BCD / 16;
+  BYTE_BCD_TO_USINT := BYTE_BCD_TO_USINT + 10*BCD;
+END_FUNCTION
+
+
+
+
+FUNCTION WORD_BCD_TO_UINT: UINT
+  VAR_INPUT
+    BCD : WORD;
+  END_VAR
+
+  WORD_BCD_TO_UINT := BCD MOD 16;
+  BCD := BCD / 16;
+  WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 10*(BCD MOD 16);
+  BCD := BCD / 16;
+  WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 100*(BCD MOD 16);
+  BCD := BCD / 16;
+  WORD_BCD_TO_UINT := WORD_BCD_TO_UINT + 1000*BCD;
+END_FUNCTION
+
+
+
+
+FUNCTION DWORD_BCD_TO_UDINT: UDINT
+  VAR_INPUT
+    BCD : DWORD;
+  END_VAR
+
+  DWORD_BCD_TO_UDINT := BCD MOD 16;
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 10*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 100*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1000*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1_0000*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 10_0000*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 100_0000*(BCD MOD 16);
+  BCD := BCD / 16;
+  DWORD_BCD_TO_UDINT := DWORD_BCD_TO_UDINT + 1000_0000*BCD;
+END_FUNCTION
+
+
+
+
+FUNCTION LWORD_BCD_TO_ULINT: ULINT
+  VAR_INPUT
+    BCD : LWORD;
+  END_VAR
+
+  LWORD_BCD_TO_ULINT := DWORD_BCD_TO_UDINT(BCD MOD (256*256*256*256));
+  BCD := BCD / (256*256*256*256);
+  LWORD_BCD_TO_ULINT := LWORD_BCD_TO_ULINT + 1_0000_0000*DWORD_BCD_TO_UDINT(BCD);
+END_FUNCTION