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

Ergebnis 1 bis 5 von 5

Thema: Aus zweisselliger Interger beide Ziffern auslesen

  1. #1
    Registriert seit
    21.04.2009
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Ich muss aus einem Integer (die maximal zweistellig ist 00-99) die einzelnen Zahlen auslesen.

    Also au 32 die 3 und die 2, damit ich die per ASCII Code weiter verarbeiten kann.

    Muss an einen Beschrifter die Zahl einzeln per Byte senden.

    Vielleicht lachen sich jetzt einige kaputt aber im Moment stehe ich voll auf der Leitung.
    Zitieren Zitieren Aus zweisselliger Interger beide Ziffern auslesen  

  2. #2
    Registriert seit
    19.10.2010
    Beiträge
    325
    Danke
    15
    Erhielt 36 Danke für 31 Beiträge

    Standard

    Guten Abend,

    um jetzt mal so schnell aus der Hüfte geschossen einen Vorschlag zu machen würde ich die Integerzahl durch 10 teilen, d.h. ich bekomme auf dein Beispiel bezogen 3.2 herraus, durch "Runden durch Abschneiden" (Müsste TRUNC sein) die daraus 3 isolieren. Jetzt diese 3 mit 10 Multiplizieren und von 32 abziehen, jetzt hast du nur noch die einer Stelle. So hast du dann ja beide Ziffern einzeln. Natürlich könnte es auch einen einfacheren Befehl geben, aber das wäre jetzt meine Version ohne die "F1"-Taste drücken zu können Schließlich aus der Integer noch ein ASCII-Zahl machen.

    Schönen Abend

  3. #3
    Registriert seit
    18.09.2004
    Ort
    Münsterland/NRW
    Beiträge
    4.718
    Danke
    729
    Erhielt 1.158 Danke für 969 Beiträge

    Standard

    In diesem Thema findest du die Lösung für den ersten Teil
    http://www.sps-forum.de/showthread.p...ht=modulo+rest

  4. #4
    Registriert seit
    08.04.2008
    Ort
    Köln
    Beiträge
    844
    Danke
    39
    Erhielt 244 Danke für 199 Beiträge

    Standard

    Warum denn so schwierig?
    Bei zwei Ziffern gehts doch auch so:
    Code:
    L #Zahl  // Zahl von 0-99
    ITB // BCD-Codiert
    L W#16#F // nur 1er Stelle
    UW
    + 48 // In ASCII Wandeln
    T #Einer // Einer Stelle als ASCII
    
    L #Zahl  // Zahl von 0-99
    ITB // BCD-Codiert
    SRW 4 // 1er Stelle rausschieben
    + 48 // In ASCII Wandeln
    T #Zehner // Zehner Stelle als ASCII
    Es geht bestimmt auch eleganter, aber das hier ist recht einfach.

    Grüße
    Gebs

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    DINT zu ASCII...

    Länge des Any's auf die Ascii Zahl bestimmt die Größe...

    Code:
    FUNCTION FC 140 : VOID
    TITLE =
    //Beschreibung:
    //
    //Dieser FC wandelt einen DINT in Ascii Zeichen um. 
    //Falls der DINT Wert zu groß ist, als nicht in den Ascii
    //Wert passt, wird '0' ausgegeben. Führende leerstellen
    //werden mit '0' gefüllt!
    VERSION : 0.1
    
    
    
    
    VAR_INPUT
      DINTVAL : DINT ;	
    END_VAR
    VAR_OUTPUT
      ASCII : ANY ;	
    END_VAR
    VAR_TEMP
      ASCII_LOC : DWORD ;	
      RETVAL : INT ;	
      SCHLEIFE_MAX : INT ;	
      SCHLEIFE : INT ;	
      FAKTOR : DINT ;	
      ZAHL : DINT ;	
      ZAHL_WAR_DA : BOOL ;	
      DB_NR : INT ;	
      backup_DB : INT ;	
      backup_AR1 : DWORD ;	
    END_VAR
    BEGIN
    NETWORK
    TITLE =
    
    
    //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  ; 
    END_FUNCTION
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 27.12.2010, 11:17
  2. IPC 427C - beide LAN in ein Ethernet
    Von Gerri im Forum Simatic
    Antworten: 28
    Letzter Beitrag: 11.11.2010, 15:15
  3. String in Interger verwandeln
    Von Black Scorpion im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 11.07.2009, 12:16
  4. erste ziffern als Zahl darstellen
    Von Snoopy123123 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 22.02.2007, 18:06
  5. 2Signale und beide sollen gezählt werden
    Von Anonymous im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 16.06.2004, 19:05

Lesezeichen

Berechtigungen

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