String mit Hex-Ziffern in Zahl umwandeln?

jtm

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe hier bei einem Step7-Projekt folgendes (Teil-)Problem:

In einem Ethernet-Empfangsstring mit fixer Länge erhalte ich Werte, welche als Hex-Zahlen codiert sind. Diese Daten möchte ich dann in einen INT-Wert (2 Bytes vorzeichenbehaftet) umwandeln.
Sprich: Gibt es einen FC, der einen String als Eingang übernimmt, und die zugehörige Zahl als INT ausgibt?

Sprich: Im String steht z.B. "FD16" -> Ergebnis sollte -746 (dez) sein.

Ich habe schon Google und die Forumssuche intensiv bemüht, aber da gings meiner Meinung nach immer um etwas anderes.

Vielen Dank im Voraus,
Wolfgang
 
der string steht vermutlich ein einem DB (empfangspuffer?).
von dort die zeichen einzeln lesen (als byte) und dann wandeln:

wert -48 damit werden die zahlen richtig interpretiert (0 = 48dez in der ascii-tabelle)

wenn der wert >10 ist dann ist es ein buchstabe
deshalb dann nochmals -7 rechnen damit aus "A" der wert 10 wird
("A" = 65dez)

das ergebnis der stelle passend auf einen gesamtwert addieren
(multipliziert mit der stelle: x1 x16 x256 x4096 ...)

als awl geschrieben: (angenommen der String steht in db100 ab byte 0 - 3)

Code:
     L DB100.DBB3     // 1. Zeichen
     L 48
     -I
     L 10
     >I
     TAK
     SPBN W1
     L 7
     -I
W1:  T MW100        // Wert
 
     L DB100.DBB2     // 2. Zeichen
     L 48
     -I
     L 10
     >I
     TAK
     SPBN W2
     L 7
     -I
W2: L 16
     *I  
     L MW100        
     +I
     T MW100        // Wert erhöhen um 2. Stelle
 
     L DB100.DBB1     // 3. Zeichen
     L 48
     -I
     L 10
     >I
     TAK
     SPBN W3
     L 7
     -I
W3: L 256
     *I  
     L MW100        
     +I
     T MW100        // Wert erhöhen um 3. Stelle
 
     L DB100.DBB0     // 4. Zeichen
     L 48
     -I
     L 10
     >I
     TAK
     SPBN W4
     L 7
     -I
W4: L 4096
     *I  
     L MW100        
     +I
     T MW100        // Wert erhöhen um 4. Stelle

achtung: je nach wert muss evtl. auf doppelwort gewechselt werden (als MD100 statt MW100 und aus +I wird +D)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

vielen Dank für die schnelle Antwort!
Den Trick mit dem Umrechnen von den ASCII-Codes hatte ich auch schon im Visier, allerdings wollte ich mich zuerst vergewissern, dass für diese Aufgabe nicht schon ein SFC existiert, der das erledigt!

Mfg,
Wolfgang
 
In der Standard-Library/IEC FunctionBlocks findest du auch einen FC37 STRING_DI, der dürfte deiner Aufgabenstellung genügen.

MfG
 
Beschreibung aus der S7 Hilfe:

Beschreibung
Die Funktion FC 37 wandelt eine Zeichenkette in eine Variable im Format DINT. Das erste Zeichen in der Zeichenkette darf ein Vorzeichen oder eine Ziffer sein, die dann folgenden Zeichen müssen aus Ziffern bestehen. Ist die Länge der Zeichenkette Null oder größer als 11 oder befinden sich unerlaubte Zeichen in der Zeichenkette, findet keine Wandlung statt und das BIE­Bit wird auf "0" gesetzt. Liegt das Ergebnis der Wandlung außerhalb des DINT-Zahlenbereichs, wird das Ergebnis auf den entsprechenden Wert begrenzt und das Binärergebnis BIE auf "0" gesetzt.
 
Ist ja eine Hex-Zahl als String gegeben, der Standard-FC dürfte da nicht ohne "Vorbehandlung" funtionieren, tnt's Variante macht das doch hervorragend. Ok, Die reine Wandlung Hex in Integer macht Volker ein wenig eleganter, aber nun gut.
 
Zurück
Oben