TIA Umwandlung von Char nach INT

CZach001

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde gerne Zeichen aus einem Datenbaustein in eine Integer Variable umwandeln.

Hallo,
ich würde gerne Zeichen aus einem Datenbaustein in eine Integer Variable umwandeln.

Siehe Bild1 im Anhang


Ich benötige eine Variable aus den zeichen 2+3 (Wert 21) und eine aus den Zeichen 3+4 (Wert 16)
Mit diesen werten muss ich anschließend weiterarbeiten.

Aktuell habe ich es so gelößt.

Siehe Bild 2 im Anhang

Das erscheint mir jedoch sehr Umständlich.

Hat jemand eine Idee wie man soetwas eleganter lösen könnte?
Es könnten ja auch mal mehr als 2 Stellen sein.

Vielen Dank schon mal für eure bemühungen.

VG
CZach

S7 1500
TIA V14

Anhang anzeigen CHAR-INT.pdf
 
Ich kenne mich mit Siemens leider nicht so aus und mein Testaufbau ist auch gerade nicht greifbar, aber schau Dir mal Chars_TO_Strg und dann gibt es noch eine Funktion um einen String in eine Zahl zu wandeln und fertig.

Gruß

Oliver
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also so wie du das hast, mache ich das auch oft, nur in einem AWL Netzwerk.

Die einzige Alternative die mir einfällt ist wie Oliver schon erwähnt hat mit Chars_TO_Strg und dann im Anschluss mit STRG_VAL die Zeichenkette in eine Zahl wandeln.

Ich sehe aber deine Lösung nicht als unelegant an. Wenns um die Erweiterung geht, füge halt gleich die Schritte für 100er und 1000er Stelle hinzu, dann brauchst du wenn benötigt nur noch dein Char-Array mit den Daten füttern.

Gruß ThomasM
 
Hallo,

für kürzeres KOP/FUP könntest Du die Berechnungen in einer CALCULATE-Box zusammenfassen:
Code:
             +--------------+                          +--------------+                        +-----------+
             |     CONV     |                          |     CONV     |                        | CALCULATE |
             | Char to UInt |                          | Char to UInt |                        |   UInt    |
-------------|EN         ENO|--------------------------|EN         ENO|------------------------|EN      ENO|---
..Scanner[2]-|IN         OUT|-#tempUIntZ  ..Scanner[3]-|IN         OUT|-#tempUIntE  #tempUIntZ-|IN1     OUT|-#UIntResult
             +--------------+                          +--------------+             #tempUIntE-|IN2        |
                                                                                            48-|IN3        |
                                                                                            10-|IN4        |
                                                                                               +-----------+
                                                                                            OUT:=(IN1-IN3)*IN4+IN2-IN3

Es ist aber besser, die Zeichen vom Scanner auch noch zu überprüfen, ob sie wirklich ASCII-Ziffern sind.
Man könnte eine (mehrfach verwendbare) FC in SCL programmieren:
Code:
FUNCTION "2CharToUInt" : UInt
VAR_INPUT
  Zehner : Char;
  Einer : Char;
END_VAR
VAR_TEMP
  tempZ : Char;
  Result : UInt;
END_VAR

BEGIN
  IF #Zehner = ' ' OR #Zehner = Char#0 THEN
    #tempZ := '0';
  ELSE
    #tempZ := #Zehner;
  END_IF;

  IF #tempZ < '0' OR #tempZ > '9' OR #Einer < '0' OR #Einer > '9' THEN
    #Result := 0;
  ELSE
    #Result := (CHAR_TO_UINT(#tempZ) - CHAR_TO_UINT('0')) * 10 + CHAR_TO_UINT(#Einer) - CHAR_TO_UINT('0');
  END_IF;

  #"2CharToUInt" := #Result;

END_FUNCTION
Code:
             +---------------+
             | "2CharToUInt" |
-------------|EN          ENO|---
..Scanner[2]-|Zehner  Ret_Val|-#UIntResult
..Scanner[3]-|Einer          |
             +---------------+

Harald
 
Zurück
Oben