FUNCTION "ASCII_DINT" : DINT
TITLE =
//ASCII -> DINT (ASCII in Doppelwort)
AUTHOR : MF
FAMILY : CONVERT
NAME : ASC_DINT
VERSION : 1.0
VAR_INPUT
Idw_ASCII : DWORD ; //Zeichenfolge (ASCII-Zeichen) - 4 Stellen
END_VAR
VAR_TEMP
Tdw_Eingang : DWORD ; //Zwischenspeicher Eingangsstring
END_VAR
BEGIN
NETWORK
TITLE =ASCII in DINT
//Historie:
//------------------------------------------------------------------------------
//Release: 15.10.2013 MF
//
//
//Benötigte Bausteine:
//------------------------------------------------------------------------------
// -
//
//
//Beschreibung:
//------------------------------------------------------------------------------
//ASCII-Code
//
//Zeichen Hex Dez BCD
//----------------------------------------
// '0' 30h 48 1111 0000
// '1' 31h 49 1111 0001
// '2' 32h 50 1111 0010
// '3' 33h 51 1111 0011
// '4' 34h 52 1111 0100
// '5' 35h 53 1111 0101
// '6' 36h 54 1111 0110
// '7' 37h 55 1111 0111
// '8' 38h 56 1111 1000
// '9' 39h 57 1111 1001
//
//Daraus folgt: immer die 1. Tetrade enthält den gesuchten Wert. Nur BCD-Zahlen
//sind gültig. D.h. die 1. Tetrade muss eine gültige BCD-Zahl enthalten. Dann
//kann
//die 1. Tetrade als Zahl verwendet werden.
//
//
//
//*** Initialisierung ***
SET ;
SAVE ; // BIE-Bit vorbelegen
//*** Daten gültig? ***
L #Idw_ASCII;
PUSH ;
UD DW#16#F0F0F0F0;
XOD DW#16#30303030;
SPN FEHL; // Wenn ASCII-Bereich != 0-9 >> springe zu FEHL
TAK ;
UD DW#16#F0F0F0F; // 1. Tetrade ausmaskieren MASKE: 0F0F0F0F
T #Tdw_Eingang;
UD DW#16#6060606; // 0,1,8 und 9 ausmaskieren MASKE: 06060606
SPZ OK; // wenn 0,1,8 oder 9 >> springe zu OK
SLD 1;
L #Tdw_Eingang;
UD ;
UD DW#16#8080808;
SPN FEHL; // wenn 10-15 >> springe zu FEHL
TAK ;
UD DW#16#4040404;
SLD 1;
L #Tdw_Eingang;
UD ;
SPN FEHL;
//*** ASCII-Eingang in DINT wandeln ***
OK: L #Tdw_Eingang;
PUSH ;
SLD 28;
SRD 28;
TAK ;
SRD 4;
OD ;
PUSH ;
SLD 24;
SRD 24;
TAK ;
SRD 8;
SLD 4;
OD ;
PUSH ;
SLD 20;
SRD 20;
TAK ;
SRD 12;
SLD 8;
OD ;
BTD ;
T #RET_VAL; // Wert ausgeben
BEA ; // Baustein beenden
//*** Fehler ***
FEHL: CLR ;
SAVE ; // BIE-bit setzen
END_FUNCTION
FUNCTION "DINT_ASCII" : DWORD
TITLE =
//DINT -> ASCII (ASCII in Doppelwort)
AUTHOR : MF
FAMILY : CONVERT
NAME : DINT_ASC
VERSION : 1.0
VAR_INPUT
Idi_DINT : DINT ; //Zahl in DINT-Format
END_VAR
BEGIN
NETWORK
TITLE =ASCII in DINT
//Historie:
//------------------------------------------------------------------------------
//Release: 15.10.2013 MF
//
//
//Benötigte Bausteine:
//------------------------------------------------------------------------------
// -
//
//
//Beschreibung:
//------------------------------------------------------------------------------
//ASCII-Code
//
//Zeichen Hex Dez BCD
//----------------------------------------
// '0' 30h 48 0011 0000
// '1' 31h 49 0011 0001
// '2' 32h 50 0011 0010
// '3' 33h 51 0011 0011
// '4' 34h 52 0011 0100
// '5' 35h 53 0011 0101
// '6' 36h 54 0011 0110
// '7' 37h 55 0011 0111
// '8' 38h 56 0011 1000
// '9' 39h 57 0011 1001
//
//
//
//
//
//*** Initialisierung ***
SET ;
SAVE ; // BIE-Bit vorbelegen
//*** DINT-Eingang in ASCII wandeln ***
L #Idi_DINT;
DTB ;
PUSH ;
SRD 12;
SLD 16;
TAK ;
SLD 20;
SRD 20;
OD ;
PUSH ;
SRD 8;
SLD 12;
TAK ;
SLD 24;
SRD 24;
OD ;
PUSH ;
SRD 4;
SLD 8;
TAK ;
SLD 28;
SRD 28;
OD ;
OD DW#16#30303030; //ASCII-Offset für 0-9
T #RET_VAL;
END_FUNCTION