Step 7 Int in Char Umwandeln

NWGauggelTech

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo :)
Ich habe das Problem das ich einen Stückzähler habe der im Format Int angegeben wird.
Dieser muss nun aber zu einem Laser geschickt werden der die Nummer nur in 4 Char nimmt. Nun habe ich schon viele erfolglose versuche unternommen den Int in die Chars aufzuteilen.

Als Beispiel muss die Zahl 1234(Int) aufgeteilt werden in 1, 2, 3 und 4(Char) jeweils in einem Char.

vielen Dank im vorraus schonmal für die Hilfe :)
 
Du kannst z.B. den INT in BCD wandeln und dann für die 4 Chars jeweils das entsprechende Halbbyte ausmaskieren, an die letzte Stelle verschieben und umwandeln.
 
Unbenannt.PNG Ich habe das jetzt sogemacht allerdings wenn ich eine zahl z.B. 9999 eingebe kommt in meinen Char nur Müll raus.:confused:
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    9,5 KB · Aufrufe: 58
Hallo,

hier mal ein Beispiel für DINT nach CHR in SCL. Nur für positive Zahlen.

Code:
FUNCTION FC999 : VOID

VAR_INPUT
    Value : DINT;
END_VAR


VAR_OUTPUT
    CHR : ARRAY[1..10] OF CHAR;
END_VAR


VAR_TEMP
    i : INT;
    tDI : DINT;
END_VAR


BEGIN


tDI := Value;


FOR i := 10 TO 1 BY -1 DO
    CHR[i] := BYTE_TO_CHAR(DINT_TO_BYTE(tDI MOD 10 + 48));
    tDI := (tDI - tDI MOD 10) / 10;
END_FOR;




END_FUNCTION
 
ok ich habe das jetzt mit dem FC5 hinbekommen nur bekomme ich jetzt die Zahlen in der falschen reihenfolge, also wenn ich eine 10 habe brauche ich das in dem Format 0 0 1 0 . Ich bekomme aber vom FC5 eine 10 als 1 0.
Wie kann ich das jetzt am einfachsten umsetzen? Das muss ja dann auch für zahlen wie 7894 funktionieren??Unbenannt.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest nach dem FC5 einfach die Zeichen vertauschen oder vertauscht aus dem String in Dein Ziel-Array kopieren?
Oder bei so einer simplen 4-Ziffern-Wandlung anstatt dem String-Overhead den Vorschlag von hucki ausprogrammieren und die 4 Ziffern gleich in der gewünschten Reihenfolge erzeugen.

PS: oder hast Du Dich falsch ausgedrückt und Du meinst, daß Du Vornullen brauchst, um immer auf 4 Ziffern zu kommen?

Harald
 
Zuletzt bearbeitet:
Ja ich Muss das eben so darstellen das wenn die Laufende Nummer z.b.10 ist muss der laser das als 0 0 1 0 bekommen.

@hucki du musst mir das schon genauer erklären damit ich das verstehe :D ich bin noch ziemlich neu im Programmieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst Du Dich auch mal eindeutig ausdrücken? (Worauf bezieht sich Dein "Ja"?)

Ich glaube, bei Dir ist gar nichts vertauscht. Ich behaupte: wenn Dein Zählerstand 123 ist, dann willst Du folgendes Ergebnis:
DB422.DBB286 = '0'
DB422.DBB287 = '1'
DB422.DBB288 = '2'
DB422.DBB289 = '3'

Das kann man am effizientesten über die BCD-Wandlung von hucki erreichen, sogar noch effizienter wenn man gleich alle 4 Ziffern gleichzeitig in CHARs wandelt.

Harald
 
Ich glaube, bei Dir ist gar nichts vertauscht. Ich behaupte: wenn Dein Zählerstand 123 ist, dann willst Du folgendes Ergebnis:
DB422.DBB286 = '0'
DB422.DBB287 = '1'
DB422.DBB288 = '2'
DB422.DBB289 = '3'

Das kann man am effizientesten über die BCD-Wandlung von hucki erreichen, sogar noch effizienter wenn man gleich alle 4 Ziffern gleichzeitig in CHARs wandelt.


Genau so möchte ich das haben. Ich bekomme das mit dem Umwandeln aber nicht hin bei mir kommen da immer komische Ziffern raus.:confused:
 
@hucki du musst mir das schon genauer erklären damit ich das verstehe :D ich bin noch ziemlich neu im Programmieren.
In den Bytes eines Words befinden sich bei Siemens im ersten Byte die niederwertigen Bits (x.7-x.0) und im 2. Byte die höherwertigen (x.15 - x.8). Deswegen "Big Endian".

Demzufolge ist in Deinem Code oben die Zuordnung von Halbbyte zu Chart vertauscht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kann man am effizientesten über die BCD-Wandlung von hucki erreichen, sogar noch effizienter wenn man gleich alle 4 Ziffern gleichzeitig in CHARs wandelt.
Grundlagen: BCD, Nibble, ASCII-Tabelle
BINÄR (0..9) --> CHAR/ASCII ('0'..'9'): Ziffer OR 16#30 (oder auch: Ziffer + 48)

Schnelle Umwandlung 4 Ziffern 0..9999 --> '0000'..'9999':
Code:
L #MyInt           // 0..9999
DTB                // Int-->BCD
SLD 4              // BCD-Ziffern (Nibbles) auseinanderziehen
SRW 4              // und 4 0-Bits einfügen
SLD 12             // ...
SRW 4              // ...
SRD 4              // ...
SRW 4              // ...
OD  DW#16#30303030 // BIN-->ASCII
[COLOR="#FF0000"]//(A) alle 4 CHARs in ein DWORD (oder CHAR-Array) speichern:
T DB422.DBD286[/COLOR]

[COLOR="#008000"]//(B) oder ziffernweise
TAD
T #Ziffer1
SRD 8
T #Ziffer2
SRD 8
T #Ziffer3
SRD 8
T #Ziffer4[/COLOR]

[COLOR="#0000FF"]//(C) oder ziffernweise
T #Ziffer4
TAW
T #Ziffer3
TAD
T #Ziffer1
TAW
T #Ziffer2[/COLOR]

Falls ein DINT schnell in 7 Ziffern zerlegt/konvertiert werden soll siehe HIER

Harald
 
Zuletzt bearbeitet:
Hier mal eine Lösung die vor Jahren mal im Forum erwähnt wurde. Das ist auch so wie ich das zur Zeit mache


Code:
     L     "DB Telegramm 0".Telegrammzaehler  // INT
      L     1000
      MOD   
      T     #MOD_100
      L     100
      MOD   
      T     #MOD_10
      L     10
      MOD   
      T     #MOD_1


      L     "DB Telegramm 0".Telegrammzaehler
      L     1000
      /I    
      L     W#16#30
      +I    
      T     "DB Telegramm 0".Telegramm_ID_1   // Byte

      L     #MOD_100
      L     100
      /I    
      L     W#16#30
      +I    
      T     "DB Telegramm 0".Telegramm_ID_2   // Byte

      L     #MOD_10
      L     10
      /I    
      L     W#16#30
      +I    
      T     "DB Telegramm 0".Telegramm_ID_3    // Byte

      L     #MOD_1
      L     W#16#30
      +I    
      T     "DB Telegramm 0".Telegramm_ID_4     // Byte
 
Zuletzt bearbeitet:
Zurück
Oben