FUNCTION "BCD4INT" : INT
TITLE =BCD-WORD mit 4 Ziffern Gültigkeit testen und wandeln in INT
//Der BCD-Wert wird vor der Wandlung auf Gültigkeit getestet, so dass es nicht
//zu einem BCDF-Fehler kommt (CPU kein SF-LED und kein STOP).
//Wenn der BCD-Wert illegal ist, wird als Ersatzwert 0 ausgegeben und BIE/ENO=0
//Step7 Hilfe zu AWL:
//BTD Umwandlung einer siebenstelligen BCD-Zahl (32 Bit) in Ganzzahl (32 Bit)
//(Vorzeichen wird hier in BCD4INT nicht verwendet)
//Wenn eine Dezimalziffer (eine 4-Bit-Tetrade in der BCD-Darstellung) im
//ungültigen Bereich von 10 bis 15 liegt, tritt während einer versuchten
//Umwandlung ein BCDF-Fehler auf --> OB121 oder CPU STOP
AUTHOR : 'PN/DP'
NAME : BCD4INT
VERSION : 1.0
VAR_INPUT
inBCD : WORD ; //BCD-Zahl
END_VAR
BEGIN
NETWORK
TITLE =
L #inBCD;
LAR1 ; // AR1 als dritten Akku nutzen für #inBCD nur einmal lesen
UW W#16#8888; // Achter-Bits maskieren
SRD 1; // auf Vierer-Bits-Pos schieben
PUSH ; // in AKKU2 merken
SRD 1; // auf Zweier-Bits-Pos schieben
OD ; // Achter Bits an Vierer und Zweier Pos
TAR1 ; // #inBCD zurück in AKKU1
UD ; // Wenn Achter-Bit und (Zweier- oder Vierer-Bit)
L B#16#0; // Vergleichswert, bei Fehler als Ersatzwert
<>D ; // <> 0 ?
SPB BAD; // dann illegaler Wert
TAR1 ; // #inBCD ist legaler BCD-Wert
BTD ; // also wandeln
SPA GOOD; // und ausgeben
BAD: CLR ; // VKE=0 für BIE/ENO Fehler (AKKU1 ist 0)
GOOD: T #RET_VAL; // gewandelten Wert oder Ersatzwert ausgeben
SAVE ; // mit BIE/ENO Fehler signalisieren
END_FUNCTION