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