Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Konvertierung Integer (3-stellig) in einzelne CHAR

  1. #1
    Registriert seit
    09.03.2006
    Beiträge
    137
    Danke
    19
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe ein Integer welche max. den Wert 999 erreichen kann -> Also max. 3-stellig. Alle drei Stellen muss ich in je ein CHAR umwandeln. Beispiel:

    #NR_Integer = 123 --> konvertieren nach -->
    #Nr_Hunderter_char = '1'
    #Nr_Zehner_char = '2'
    #Nr_Einer_char = '3'

    Ich habe das wie folgt gelöst, es erscheint mir aber irgendwie sehr umständlich. Hat jemand eine elegantere Möglichkeit?

    Code:
    // Nummer Hunderter konvertieren
          L     #NR_Integer
          ITD   
          DTR   
          L     1.000000e+002
          /R    
          TRUNC 
          T     #Nr_Hunderter_int               // Zwischenspeicher
          L     48
          +I    
          T     #Nr_Hunderter_char
    
    
    
    // Nummer Zehner konvertieren
          L     #Nr_Hunderter_int
          L     100
          *I    
          L     #NR_Integer
          TAK   
          -I    
          ITD   
          DTR   
          L     1.000000e+001
          /R    
          TRUNC 
          T     #Nr_Zehner_int              // Zwischenspeicher
          L     48
          +I    
          T     #Nr_Zehner_char
    
    
    
    
    // Nummer Einer konvertieren
          L     #NR_Integer
          L     10
          MOD   
          T     #Nr_Einer_int              // Zwischenspeicher
          L     48
          +I    
          T     #Nr_Einer_char
    Zitieren Zitieren Konvertierung Integer (3-stellig) in einzelne CHAR  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Mein FC der das tut sieht so aus:

    Code:
    //backup
          L     DBNO
          T     #backup_DB
          TAR1  
          T     #backup_AR1
    
    //Initialisieren
          L     #DINTVAL
          T     #ZAHL
    
    //Pointer auf Ascii laden
          L     P##ASCII
          LAR1  
    
    //Schleife mit Länge des Pointers initialisieren
          L     W [AR1,P#2.0]
          T     #SCHLEIFE_MAX
    
    //Datentyp ermitteln, nur Byte gültig!
    //      L     B [AR1,P#1.0]
    // 4 - 5 -->  Länge 2
    // 6 - 8 -->  Länge 4
    
    //DB des Pointers öffnen (falls vorhanden!)
          L     0
          L     W [AR1,P#4.0]
          ==I   
          SPB   spOK
          T     #DB_NR
          AUF   DB [#DB_NR]
    
    //Wenn Speicherbereich DI, in DB ändern
          L     B [AR1,P#6.0]
          L     B#16#85                     //Speicerbereich DI??
          ==I   
          SPBN  spOK
          L     B#16#84                     //Speicherberich DB
          T     B [AR1,P#6.0]
    
    //Startadresse in AR1 laden
    spOK: L     D [AR1,P#6.0]
          LAR1  
    
    //Potenzfaktor Startwert
          L     L#1
          T     #FAKTOR
    
    //max Potenzfaktor bestimmen (10^(LängeAny-1), ausser wenn Schleife_max = 1, da loop sonst ins negative dekrementiert!
          L     0
          L     #SCHLEIFE_MAX
          +     -1
          ==I   
          SPB   sl2
    
    sl1:  T     #SCHLEIFE
          L     L#10
          L     #FAKTOR
          *D    
          T     #FAKTOR
          L     #SCHLEIFE
          LOOP  sl1
    
    //Zahl zu groß, ergebniss = 0
          L     #FAKTOR
          L     10
          *D    
          L     #ZAHL
          >D    
          SPB   sl2
          L     0
          T     #ZAHL
    
    //Aktuelles Zeichen laden und prüfen ob Ziffer
    sl2:  L     #ZAHL
          L     #FAKTOR
          /D    
          T     B [AR1,P#0.0]               //Ziffer in DB eintragen
          L     #FAKTOR
          *D    
          NEGD  
          L     #ZAHL
          +D    
          T     #ZAHL
    
    //Ziffer in ascii wandeln...
          L     B [AR1,P#0.0]
          L     '0'
          +I    
          T     B [AR1,P#0.0]
    
          L     1
          L     #FAKTOR
          ==D   
          SPB   ende
    
          L     L#10
          /D    
          T     #FAKTOR
    
          L     P#1.0
          +AR1  
          SPA   sl2
    
    ende: AUF   DB [#backup_DB]
          L     #backup_AR1
          LAR1
    Wobei In DINTVAL ein DINT mit der Zahl ist und ASCII ein ANY of das Char Array. Kann beliebig große Dints in Ascii wandeln (die länge wird aus dem ANY ermittelt!)

    Da gibts bestimmt noch optimierungen in meinem FC aber er geht!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. Folgender Benutzer sagt Danke zu Jochen Kühner für den nützlichen Beitrag:

    MCerv (15.06.2011)

  5. #4
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Das hier ist meiner:
    Code:
          L     #INT_Wert                   // Eingangswert prüfen
          L     0
          >=I                               // auf größer oder gleich 0
          POP                               // und wieder in AKKU1 holen.
          SPB   ING0                        // Wenn >=0 überspringen,
          NEGI                              // ansonsten negieren, damit >=0.
    ING0: NOP   0
          L     10                          // Durch 10 teilen.
          /I    
          TAD                               // Reihenfolge der Bytes in AKKU1
    //                                      // tauschen damit der Divisionsrest
    //                                      // in AKKU1 LL und LH liegt.
          TAW                               // Bytes in AKKU1-L tauschen
    //                                      // damit der Divisionsrest in die
    //                                      // richtige Reihenfolge kommt.
          INC   48                          // + 48 ergibt den ASCII-Code
          T     #Einer                      // der Einerstelle.
          TAD                               // Reihenfolge der Bytes in AKKU1
    //                                      // tauschen damit das Divisions-
    //                                      // ergebnis wieder in AKKU1-L liegt.
          L     10                          // Und so weiter...
          /I    
          TAD   
          TAW   
          INC   48
          T     #Zehner
          TAD   
          L     10
          /I    
          TAD   
          TAW   
          INC   48
          T     #Hunderter
          TAD   
          L     10
          /I    
          TAD   
          TAW   
          INC   48
          T     #Tausender
    Gruß
    Michael

  6. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    man könnte die Zahl auch mit einer der (Siemens-)Konvertierungs-Funktionen (INT_to_String oder DINT_to_String) in einen String wandeln, auf den dann einen Pointer bilden und die beinhalteten Zeichen (die dann ja schon vom Fromat Char sind) einfach herauslesen ...

    Gruß
    Larry

  7. #6
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Siehe auch das folgende Programmbeispiel:

    Code:
    UNCTION FC 100 : VOID
    TITLE =Konvertierung INT Nummer in CHAR Nummer
    //INT  Nummer                 = 000...999
    //
    //CHAR Nummer Hunderterstelle = '0'...'9'
    //CHAR Nummer Zehnerstelle    = '0'...'9'
    //CHAR Nummer Einerstelle     = '0'...'9'
    //   
    AUTHOR : Kai
    FAMILY : SPSForum
    NAME : '45971'
    VERSION : 1.0
     
    VAR_INPUT
      INT_Nummer : INT ; //INT Nummer
    END_VAR
    VAR_OUTPUT
      CHAR_Hunderterstelle : CHAR ; //CHAR Nummer Hunderterstelle
      CHAR_Zehnerstelle : CHAR ; //CHAR Nummer Zehnerstelle
      CHAR_Einerstelle : CHAR ; //CHAR Nummer Einerstelle
    END_VAR
    BEGIN
    NETWORK
    TITLE =
          L     #INT_Nummer; // INT Nummer
          ITB   ; 
          SLW   4; 
          SRW   12; 
          L     48; 
          +I    ; 
          T     #CHAR_Hunderterstelle; // CHAR Nummer Hunderterstelle
     
          L     #INT_Nummer; // INT Nummer
          ITB   ; 
          SLW   8; 
          SRW   12; 
          L     48; 
          +I    ; 
          T     #CHAR_Zehnerstelle; // CHAR Nummer Zehnerstelle
     
          L     #INT_Nummer; // INT Nummer
          ITB   ; 
          SLW   12; 
          SRW   12; 
          L     48; 
          +I    ; 
          T     #CHAR_Einerstelle; // CHAR Nummer Einerstelle
    END_FUNCTION
    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien

  8. Folgende 2 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    HarryH (15.06.2011),MCerv (15.06.2011)

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard

    ... und das hier ist meiner:
    Code:
          L     #INT_Wert           // darf max 999 sein, Vorzeichen wird ignoriert
          ITB                       // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          PUSH                      // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          UW    W#16#F0             // 0000_0000_0000_0000|0000_0000_ZZZZ_0000
          RRD   12                  // 0000_ZZZZ_0000_0000|0000_0000_0000_0000
          TAK                       // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          UW    W#16#F0F            // 0000_0000_0000_0000|0000_HHHH_0000_EEEE
          OD                        // 0000_ZZZZ_0000_0000|0000_HHHH_0000_EEEE
          OD    DW#16#30303030      // 0011_ZZZZ_0011_0000|0011_HHHH_0011_EEEE
          T     #Einer
          TAW                       // 0011_ZZZZ_0011_0000|0011_EEEE_0011_HHHH
          T     #Hunderter
          TAD                       // 0011_HHHH_0011_EEEE|0011_0000_0011_ZZZZ
          T     #Zehner
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Nibble-Spiel  

  10. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    HarryH (15.06.2011),MCerv (15.06.2011)

  11. #8
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    @Harald
    Der dürfte schwer zu toppen sein.
    Den hast Du Dir aber nicht spontan aus dem Ärmel geschüttelt, oder?!
    Gruß
    Michael

  12. #9
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.626
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Eine Zeile ging noch:
    Code:
          L     #INT_Wert
          ITB   
          T     #ZE2
          UW    W#16#F0
          SRW   4
          INC   48
          T     #Zehner
          L     #ZE2
          UW    W#16#F0F
          OW    W#16#3030
          T     #Einer
          TAW   
          T     #Hunderter
    Gruß
    Michael

  13. Folgender Benutzer sagt Danke zu M-Ott für den nützlichen Beitrag:

    MCerv (15.06.2011)

  14. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.181
    Danke
    923
    Erhielt 3.289 Danke für 2.658 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von M-Ott Beitrag anzeigen
    Den hast Du Dir aber nicht spontan aus dem Ärmel geschüttelt, oder?!
    Nee, spontan war zunächst diese Variante:
    Code:
          L     #INT_Wert           // darf max 999 sein, Vorzeichen wird ignoriert
          ITB                       // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          PUSH                      // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          UW    W#16#FF0            // 0000_0000_0000_0000|0000_HHHH_ZZZZ_0000
          SLD   8                   // 0000_0000_0000_HHHH|ZZZZ_0000_0000_0000   
          SRW   4                   // 0000_0000_0000_HHHH|0000_ZZZZ_0000_0000
          TAK                       // 0000_0000_0000_0000|VVVV_HHHH_ZZZZ_EEEE
          UW    W#16#F              // 0000_0000_0000_0000|0000_0000_0000_EEEE
          OD                        // 0000_0000_0000_HHHH|0000_ZZZZ_0000_EEEE
          OD    DW#16#303030        // 0000_0000_0011_HHHH|0011_ZZZZ_0011_EEEE
          T     #Einer
          TAW                       // 0000_0000_0011_HHHH|0011_EEEE_0011_ZZZZ
          T     #Zehner
          TAD                       // 0001_ZZZZ_0011_EEEE|0011_HHHH_0000_0000
          TAW                       // 0001_ZZZZ_0011_EEEE|0000_0000_0011_HHHH
          T     #Hunderter
    Für die kürzere Variante in #7 mußte ich schon etwas länger nachdenken ...

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Char umwandeln in Integer
    Von viperserver im Forum Simatic
    Antworten: 47
    Letzter Beitrag: 07.03.2011, 15:23
  2. Integer in Char Array wandeln ?
    Von Power_Pete im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 28.01.2010, 15:26
  3. integer 32Bit in integer 16 Bit wandeln
    Von slk230-power im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 09.11.2009, 22:35
  4. BCD 4-stellig 0...9999 in Integer wandeln
    Von homei im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 24.11.2008, 18:01
  5. Umwandlung Integer(32bit) in Integer(16bit)
    Von Kojote im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.08.2005, 10:56

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •