RS485 Daten

tiego

Level-1
Beiträge
51
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

bin leider mit meinem Latein wieder am ende und benötige eure hilfe.

ich erhalte im Ringpuffer des SPS baustein die Messwerte in Dezimale zahlen welche ASCII codiert sind.
nun müsste ich diese 48,68,52,53 was HEX 0D45H entspricht in ein Word umwandeln was 3397 wäre.

nun habe ich aber leider keinen plan wie ich einen solche umrechnung starten könnte.
ist es notwendig die zahlen von ASCII in HEX zu wandel und danach umzurechenen?

wäre super wenn ihr mir weiterhelfen könnt.

danke

 
Ziffern 0..9 : ASCII-Codes 48..57 -> Ziffernwert := ASCII-Code - 48
Ziffern A..F : ASCII-Codes 65..70 -> Ziffernwert := ASCII-Code - 55

Zahlenwert := Ziffernwert1 * 4096 + Ziffernwert2 * 256 + Ziffernwert3 * 16 + Ziffernwert4
(mit Ziffernwert1 als höchste Ziffer)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Welche Steuerung benutzt du denn? Bei Beckhoff gibt es die Funktion HEXSTR_TO_DATA die dir einen Hex String in ein Byte Array umwandelt. In TwinCAT 3 kann man dann dieses Byte Array in einer UNION auf ein WORD mappen.
 
danke,
sorry ich kann dir nicht folgen,...
ich bitte dich mir eine kurze erklärung zu geben.

danke
 
Die ASCII-Codes 48..57 stehen für die Ziffern 0 bis 9. Da musst Du also 48 subtrahieren, um den Ziffernwert zu erhalten.
Die ASCII-Codes 65..70 stehen für die Ziffern A bis F. Da musst Du 55 subtrahieren, um den Ziffernwert 10..15 zu erhalten.

Für Dein Beispiel müsstest Du rechnen:
( 48 - 48 ) * 4096 + ( 68 - 55 ) * 256 + ( 52 - 48 ) * 16 + ( 53 - 48 ) = 3397
 
Zuletzt bearbeitet:
Kann Deine SPS ST? Dann könntest Du etwa so wandeln:
4 ASCII-Hex-Ziffern ('0000' .. 'FFFF') zu WORD wandeln
(hier SendReceiveTelegramm.RECEIVE.Zeichen[3..6], Code wird für SendReceiveTelegramm.RECEIVE.Zeichen[7..10] nochmal gebraucht)
Code:
        tmp_WORD := 0;  //(kann auch weglassen)
        FOR tmp_Zaehler := 1 TO 4 DO

            // Daten von ASCII-HEX in Dezimal umwandeln
            tmp_c := BYTE_TO_INT(CHAR_TO_BYTE(SendReceiveTelegramm.RECEIVE.Zeichen[tmp_Zaehler + 2]));
            CASE tmp_c OF
              '0'..'9': tmp_c := tmp_c - '0';        //ASCII '0'..'9' --> dez  0 .. 9
              'A'..'F': tmp_c := tmp_c - 'A' + 10;   //ASCII 'A'..'F' --> dez 10 .. 15
              'a'..'f': tmp_c := tmp_c - 'a' + 10;   //ASCII 'a'..'f' --> dez 10 .. 15
            ELSE
                tmp_c := 0;     //unzulässiges Zeichen ---> sollte Fehlerbehandlung
            END_CASE;

            tmp_WORD := SHL(IN:= tmp_WORD, N := 4) OR INT_TO_WORD(tmp_c);
        END_FOR;
alternativ für "CASE tmp_c .. END_CASE;":
Code:
            IF tmp_c >= '0' AND tmp_c <= '9' THEN
                tmp_c := tmp_c - '0';                //ASCII '0'..'9' --> dez  0 .. 9
            ELSIF tmp_c >= 'A' AND tmp_c <= 'F' THEN
                tmp_c := tmp_c - 'A' + 10;           //ASCII 'A'..'F' --> dez 10 .. 15
            ELSIF tmp_c >= 'a' AND tmp_c <= 'f' THEN
                tmp_c := tmp_c - 'a' + 10;           //ASCII 'a'..'f' --> dez 10 .. 15
            ELSE
                tmp_c := 0;     //unzulässiges Zeichen ---> sollte Fehlerbehandlung
            END_IF;

Alternative: ohne Schleife und ohne Fehlerprüfung (verarbeitet auch eigentlich unzulässige Zeichen):
Code:
    X3 := CHAR_TO_INT(SendReceiveTelegramm.RECEIVE.Zeichen[7] ;
    X2 := CHAR_TO_INT(SendReceiveTelegramm.RECEIVE.Zeichen[8] ;
    X1 := CHAR_TO_INT(SendReceiveTelegramm.RECEIVE.Zeichen[9] ;
    X0 := CHAR_TO_INT(SendReceiveTelegramm.RECEIVE.Zeichen[10] ;
    // ASCII-Zeichen dekodieren
    // Ziffer '0'=48 ; ggfs GrossBuchstabe 'A'=65 ; ggfs KleinBuchstabe ('a'='A'+32)
    X3 := X3 - 48 ; IF X3 > 9 THEN X3 := X3 - 7 ; IF X3 > 32 THEN X3 := X3 - 32 ; END_IF ; END_IF ;  
    X2 := X2 - 48 ; IF X2 > 9 THEN X2 := X2 - 7 ; IF X2 > 32 THEN X2 := X2 - 32 ; END_IF ; END_IF ;
    X1 := X1 - 48 ; IF X1 > 9 THEN X1 := X1 - 7 ; IF X1 > 32 THEN X1 := X1 - 32 ; END_IF ; END_IF ;
    X0 := X0 - 48 ; IF X0 > 9 THEN X0 := X0 - 7 ; IF X0 > 32 THEN X0 := X0 - 32 ; END_IF ; END_IF ;
    STATUS.AKTIVER_JOB := X3 * 4096 + X2 * 256 + X1 * 16 + X0

Übrigens listet die Forumssuche mit den Suchbegriffen "ascii hex" das Thema mit diesen beiden Programmbeispielen direkt nach Deinen beiden Fragethemen ...

Harald
 
Zurück
Oben