TIA DINT Zahl zerlegen

bmwled

Level-2
Beiträge
62
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
hat jemand eine Idee, wie man in TIA ein DINT Wert in einzelne Zahlen zerlegt?
Also z.B. DINT = 987654321

Erster Wert 9
Zweiter Wert 8
...usw.

Am besten in SCL.

Danke und Grüße!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin bmwled,

was für ein Datentyp sollen die einzelnen Zahlen haben?
Int? Char?

Meine Glaskugel sagt char.

Code:
 #Tws_char[0] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 100_000_000 MOD 10) + 16#30));
 #Tws_char[1] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 10_000_000 MOD 10) + 16#30));
 #Tws_char[2] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 1_000_000 MOD 10) + 16#30));
 #Tws_char[3] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 100_000 MOD 10) + 16#30));
 #Tws_char[4] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 10_000 MOD 10) + 16#30));
 #Tws_char[5] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 1_000 MOD 10) + 16#30));
 #Tws_char[6] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 100 MOD 10) + 16#30));
 #Tws_char[7] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 10 MOD 10) + 16#30));
 #Tws_char[8] := CHAR_TO_WCHAR(BYTE_TO_CHAR(DINT_TO_BYTE(myDint / 1 MOD 10) + 16#30));
 
VAR
InputDINT: DINT := 12345; // Die zu zerlegende DINT-Zahl
Ziffer: ARRAY [1..5] OF INT; // Array zur Speicherung der Ziffern
Temp: DINT;
i: INT;
END_VAR

BEGIN
Temp := InputDINT;
FOR i := 5 TO 1 BY -1 DO
Ziffer := Temp MOD 10; // Extrahieren der letzten Ziffer
Temp := Temp / 10; // Entfernen der letzten Ziffer
END_FOR;

// Jetzt enthält das Array 'Ziffer' die Werte 1, 2, 3, 4, 5
END_FUNCTION
 
Was sagt Deine Glaskugel, Mario, was passieren soll, wenn das Quellfeld vom Typ DINT eine negative Zahl enhält? ;)
Tja, so eine Glaskugel zeigt ja mehr einen diffusen Ausschnitt, als das klare Ganze.

Und negativ war die Beispielzahl ja nicht ... :cool:
Was macht die Lösung aus #4 mit einer negativen Zahl?

@bmwled : interessieren würde mich noch der Anwendungsfall.
 
Je nachdem, was man für eine CPU hat, gibt es verschiedene fertige "Explizite Konvertierungen von DINT" zu String und Char. siehe TIA Hilfe. oder LGF_IntToString
so macht es der LGF_IntToString (kompletter SCL-Quelltext siehe angehängte Datei):
Code:
REGION CONVERSION
  VAL_STRG(IN     := #value,
           SIZE   := #CONVERT_SIZE,
           PREC   := #CONVERT_PRECISION,
           FORMAT := #CONVERT_FORMAT_TO_STRING,
           P      := #CONVERT_START_POSITION,
           OUT    => #tempString);
END_REGION

REGION OUTPUT
  #LGF_IntToString := #tempString;
  // no error handling needed
  ENO := TRUE;
END_REGION
 

Anhänge

Zurück
Oben