FUNCTION FC 138 : VOID
TITLE =
//===================================================
//Technische Daten:
//====================================================
// Version: 2.00
// Datum: 01.09.2009
//====================================================
// Autor: Kühner J.
//Baustein Name Symb: STD_ASCII_TO_DINT
//====================================================
//Beschreibung:
//
//Dieser FC wandelt einen Pointer auf Ascii Zeichen in
//einen DINT um. Falls zwischen den Ziffern noch andere
//Zeichen stehen gibt er 0 raus. Am Anfang dürfen noch
//andere Zeichen stehen, nur nicht dazwischen!
//====================================================
//Versionsänderungen:
//
//von 1.00 auf 2.00
// - backup DB, AR1
VERSION : 0.1
VAR_INPUT
ASCII : ANY ;
END_VAR
VAR_OUTPUT
DINTVAL : DINT ;
END_VAR
VAR_TEMP
ASCII_LOC : DWORD ;
RETVAL : INT ;
SCHLEIFE_MAX : INT ;
SCHLEIFE : INT ;
FAKTOR : DINT ;
ZAHL : DINT ;
ZAHL_WAR_DA : BOOL ;
DB_NR : INT ;
backup_DB : INT ;
backup_AR1 : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =
//Backup
L DBNO;
T #backup_DB;
TAR1 ;
T #backup_AR1;
//Initialisieren
L 0;
T #ZAHL;
T #DINTVAL;
SET ;
R #ZAHL_WAR_DA; //Es wurde schon eine Zahl gelesen. (Es wird damit geprüft ob zwischen den Ascii Zeichen ein Buchstabe kommt, dann 0 als ergebniss!)
//Pointer auf Ascii laden
L P##ASCII;
LAR1 ;
//Schleife mit Länge des Pointers initialisieren
L W [AR1,P#2.0];
T #SCHLEIFE_MAX;
//Datentyp ermitteln, nur Byte gültig!
// L B [AR1,P#1.0]
// 4 - 5 --> Länge 2
// 6 - 8 --> Länge 4
//DB des Pointers öffnen (falls vorhanden!)
L 0;
L W [AR1,P#4.0];
==I ;
SPB spOK;
T #DB_NR;
AUF DB [#DB_NR];
//Wenn Speicherbereich DI, in DB ändern
L B [AR1,P#6.0];
L B#16#85; //Speicerbereich DI??
==I ;
SPBN spOK;
L B#16#84; //Speicherberich DB
L B [AR1,P#6.0];
//Startadresse in AR1 laden
spOK: L D [AR1,P#6.0];
LAR1 ;
//Potenzfaktor Startwert
L L#1;
T #FAKTOR;
//max Potenzfaktor bestimmen (10^(LängeAny-1), ausser wenn Schleife_max = 1, da loop sonst ins negative dekrementiert!
L 0;
L #SCHLEIFE_MAX;
+ -1;
==I ;
SPB sl2;
sl1: T #SCHLEIFE;
L L#10;
L #FAKTOR;
*D ;
T #FAKTOR;
L #SCHLEIFE;
LOOP sl1;
//Aktuelles Zeichen laden und prüfen ob Ziffer
sl2: U( ;
L '0';
L B [AR1,P#0.0];
>I ;
) ;
O( ;
L '9';
>I ;
) ;
SPBN GU;
//Ungültige Ziffer in den Zahlen
U #ZAHL_WAR_DA;
SPB ende;
SPA niGU;
//Wenn Ziffer dann zu Zahl addieren
GU: L B [AR1,P#0.0];
L '0';
-I ;
L #FAKTOR;
*D ;
L #ZAHL;
+D ;
T #ZAHL;
SET ;
S #ZAHL_WAR_DA;
niGU: L 1;
L #FAKTOR;
==D ;
SPB Fin;
L L#10;
/D ;
T #FAKTOR;
L P#1.0;
+AR1 ;
SPA sl2;
Fin: L #ZAHL;
T #DINTVAL;
ende: L #backup_DB;
AUF DB [#backup_DB];
L #backup_AR1;
LAR1 ;
END_FUNCTION