Step 7 Word in Int konvertieren

Zuviel Werbung?
-> Hier kostenlos registrieren
Final wird das ganze auf einer 414 CPU laufen aber auch das wird dann nur mit geladenen ob121 dort laufen bzw. wird der Weg dahin gehen das mit dem Vorschlag weiter oben abzufangen das ich erst garnicht Buchstaben umwandeln werde.
 
dann werde ich mir wohl nur noch darüber Gedanken machen das ich den Fehlerfall abfangen muss falls sich doch mal ein Buchstabe einschleicht....
Hier eine Function, die die BCD-Wandlung ohne BCDF-Fehler macht:
Code:
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

Im Anhang die AWL-Quelle mit 3 Functions
BCD16INT : BCD-WORD mit 3 Ziffern Gültigkeit testen und wandeln in INT
BCD32DINT : BCD-DWORD mit 7 Ziffern Gültigkeit testen und wandeln in DINT
BCD4INT : BCD-WORD mit 4 Ziffern Gültigkeit testen und wandeln in INT
 

Anhänge

Zurück
Oben