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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: REAL Zahl in ein festes Format

  1. #1
    Registriert seit
    08.01.2015
    Beiträge
    20
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen,
    ich brauche Hilfe bei einer Zahl Anpassung. Es liegt ein Wert im Format REAL vor den ich in ein definierte Länge formatieren muss, für eine Übertragung im späteren Verlauf.

    z.B.:
    IST SOLL
    1.578 001.57
    33.1 033.10

    Ich probiere gerade einige Lösungen, die Wuchern bei mir aber derart aus. Vielleicht hat jemand einen gute idee.
    Grüße xenon185
    Zitieren Zitieren REAL Zahl in ein festes Format  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo,
    ich würde die Variable zunächst mit 100 multiplizieren, dann in einen DINT wandeln, nun zu einem String wandeln / konvertieren und bei diesem dann vorne die noch benötigten Nullen davor setzen und anschließend an der 2. Stelle von hinten noch ein Komma einschieben ...

    Gruß
    Larry

  3. #3
    Registriert seit
    28.03.2014
    Ort
    Schweiz
    Beiträge
    112
    Danke
    34
    Erhielt 15 Danke für 12 Beiträge

    Standard

    In der oscat lib gibts den Befehl RND()

    dabei wird aber nicht abgeschnitten, sondern wie der Name sagt, gerundet.

    Die Funktion RND rundet den Eingangswert IN auf N Stellen. Folgt der letzten
    Stelle eine Stelle größer 5 wird die letzte Stelle aufgerundet. RND
    nutzt intern die Standard Funktion TRUNC() welche den Eingangswert in
    einen INTEGER vom Typ DINT wandelt. Hierbei kann es zu einem Überlauf
    kommen weil DINT maximal +/- 2.14 * 10^9 speichern kann. Der Wertebereich
    von RND ist deshalb auf +/- 2.14 * 10^9 begrenzt. Siehe hierzu auch
    die Funktion ROUND welche den Eingangswert auf N Nachkommastellen
    rundet.
    Beispiel: RND(355.55, 2) = 360
    RND(3.555, 2) = 3.6
    ROUND(3.555, 2) = 3.56
    EDIT: Geht wohl doch nicht so einfach, da die Anzahl der Ziffern bei deiner Aufgabe variabel sind.
    Geändert von manseluk (18.02.2015 um 16:48 Uhr)

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    xenon185 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.01.2015
    Beiträge
    20
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ich habe mir eure Vorschläge mal zugemüte gezogen und habe mich dafür entschieden, die Zahl mit ROUND auf zwei Stellen zu runden und dann eine Abfrage der Zahl zwischen den Zehnerstritten zu machen.
    0-10 ---> Bool x1 -- '00'
    10-100 ---> Bool x2 -- '0'
    100-xxx ---> Bool x3 -- ''

    mit den ergebnis dann einfach die Zahl mit '00' oder '0' aufzufüllen als String.

    Ich brauche nur noch eine Idee wie ich aus den ergebnisse x1-3 eine Abfrage machen kann.
    Ich arbeite mit der CFC-Sparche -> Anfänger

    Thx

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Diese Lösung "wuchert" auch schon wieder aus...

    Gibt es in Deinem Programmiersystem die Funktion LREAL_TO_FMSTR() nicht? Womit programmierst Du welche CPU?

    Du könntest einfacher grundsätzlich '00' vorne dranhängen (oder 100000000 zu der DINT addieren) und dann die letzten 5 Zeichen nehmen.
    Kann Deine Zahl auch ein Vorzeichen haben?
    Die Zahl kann auch "glatt" sein, da mußt Du auch noch 2 Nachkommastellen erzeugen.
    Benutze ein Verfahren was nicht so viele IF... oder Vergleiche für bedingte Programmausführungen erfordert, sondern immer funktioniert.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ok, ich hab das mal in ST zusammengebaut, so auf die Schnelle.
    Damit funktioniert es, aber nur für positive Werte, sollen es auch negative sein, muss man da noch eine gesonderte Behandlung einbauen.
    Ist aber in ST, nicht in CFC, ich habe das als FB aufgebaut, hier reicht auch ein FC, wenn nötig. Diesen Baustein kann man dann evtl. in CFC verwenden? Das hab ich aber nicht nie probiert.


    FB-Variablendeklaration:
    Code:
    FUNCTION_BLOCK ZAHL_TO_STR
    VAR_INPUT
        rWert: REAL;
    END_VAR
    VAR_OUTPUT
        sWert: STRING(6);
    END_VAR
    VAR
        diWert, helper_diWert: DINT;
        aByWert: ARRAY[0..5] OF BYTE;
        I: INT;
    END_VAR
    FB-Code:
    Code:
            diWert := REAL_TO_DINT(rWert * 100);
    
    
        FOR I := 0 TO 5 DO
            IF I = 2 THEN                                            (*3. Stelle von rechts soll Dezimalzeichen sein*)
                aByWert[5- I] := 46;                                  (*46 = ASCII-Code für '.'  *)
            ELSE
                helper_diWert := diWert MOD 10;                     (*Zahlenwert letzte Stelle ermitteln*)
                aByWert[5- I] := DINT_TO_BYTE(helper_diWert) + 48;     (* 48 addieren macht aus einer Zahl den dazugehörigen ASCII-Code *)
                diWert := diWert / 10;                                (*duch 10 dividieren, um oben in der Schleife den nächsten Zahlenwert zu ermitteln*)
            END_IF;
        END_FOR;
    
    
        MEMCPY(ADR(sWert), ADR(aByWert), 6);                        (*Array of Byte mit Char gefüllt in einen String kopieren*)
    Wie immer gibt es viele Möglichkeiten, diese hier ist halt so richtig zu Fuß!

    PS: Warum haut unsere Forensoftware eigentlich immer die Formatierung halb in den Eimer?

    PS2: Ach so, wenn man anders runden will, dann in der ersten Zeile ins andere Wandlung vornehmen.
    Geändert von Ralle (19.02.2015 um 12:02 Uhr) Grund: fehlte etwas Code
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #8
    xenon185 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.01.2015
    Beiträge
    20
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    danke für eure schneller antworten.
    Ich werde mir eure Vorschläge mal ausprobieren

    danke schonmal bis hierhin.

  9. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Folgendes sollte auch einfach in CFC übersetzbar sein:
    Code:
    diTemp1 := REAL_TO_DINT(rEingangswert * 100.0);
    diTemp2 := ABS(diTemp1);
    
    sAusgabe := '';
    IF diTemp1 <> diTemp2 THEN
      sAusgabe := '-';
    END_IF;
    
    sTemp := DINT_TO_STRING(diTemp2 + 100000000);
    sAusgabe := CONCAT(sAusgabe, MID(sTemp, 3, 5);
    sAusgabe := CONCAT(sAusgabe, '.');
    sAusgabe := CONCAT(sAusgabe, RIGHT(sTemp, 2));
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  10. #10
    xenon185 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.01.2015
    Beiträge
    20
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke Leute,
    ich habe jetzt ein wenig gesündigt, bin einfach noch Anfänger.
    Hab die Idee mit den addieren aufgenommen ist für mich das einfachste, da ich nur positive Werte erwarte mit einem festen Werte Berreich von 0.00 - 400.00

    Zahl: 0.1
    addiere: 1000.001
    Ergebiss: 1000.101
    MID() selektiere ich dann ab der zweiten Stelle sechs ziffern 000.10.
    das reicht für mich als ergebiss.
    Wenn ich später mehr vom ST verstehe mach ich das in neuen Programm anständig

Ähnliche Themen

  1. Step 7 REAL Zahl mit Komma?
    Von ds-90 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 10.10.2014, 19:04
  2. Antworten: 20
    Letzter Beitrag: 18.07.2012, 16:17
  3. Anzeige einer Real-Zahl
    Von Azuel im Forum HMI
    Antworten: 2
    Letzter Beitrag: 02.03.2010, 15:18
  4. Divisionsrest einer Real-Zahl
    Von Mütze im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 08.11.2006, 09:48
  5. REAL Zahl
    Von Stussi im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 04.05.2006, 18:37

Lesezeichen

Berechtigungen

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