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

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

Thema: Mit einem SCL Programm auf 0 oder 5 runden

  1. #1
    Registriert seit
    03.09.2015
    Beiträge
    21
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Idee


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ihr im Forum,

    ich benötige eure Hilfe. Ich muss eine die letzte Stelle einer Zahl auf 0 oder 5 runden. Das ganze sieht in etwa so aus:
    Ich möchte einen SCL Baustein dafür schreiben eine DINT Zahl rein und eine DINT Zahl wieder raus.

    Eigentliche Zahl | gerundet
    241 | 240
    353 | 350
    154 | 150
    456 | 460
    379 | 380

    Habt ihr da eine Idee für mich??

    schönen Gruß
    Mirko
    Zitieren Zitieren Gelöst: Mit einem SCL Programm auf 0 oder 5 runden  

  2. "
    Code:
    If (Zahl mod 5) <> 0 Then
        Ergebnis:=Zahl+(5-(Zahl mod 5));
    Else 
        Ergebnis:=Zahl;
    End_if
    "


  3. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Wellermann Beitrag anzeigen
    Ich muss eine die letzte Stelle einer Zahl auf 0 oder 5 runden.
    Und wann soll auf 5 gerundet werden? Deine Beispiele runden immer auf 0.
    Und was genau soll passieren wenn die letzte Ziffer 5 ist?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    in deinem Beispiel möchtest du anscheinend auf ganze Zehner runden. Das ist recht einfach :
    Code:
    myNeuInt := 10 * ((myOriginalInt + 5) / 10) ;
    Selbstverständlich lassen sich auf die Weise auch noch andere Rundungsschritte realisieren ...

    Gruß
    Larry

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Das einfache Verfahren mit /10*10 kann man anwenden, wenn der tatsächlich mögliche Wertebereich des Eingangswertes begrenzt ist, weil das Verfahren am unteren und am oberen Ende des INT/DINT-Wertebereiches völlig falsche Ergebnisse liefert, weil ein Aufrunden da nicht möglich ist. Das Addieren von 5 vor der Division schränkt den zulässigen Wertebereich noch ein klein wenig mehr ein. Und man muß hoffen, daß die SCL-Compilerbauer niemals auf die Idee kommen, daß das /10*10 zur Optimierung zusammengefasst werden könnte.

    Hier ein Beispiel für Runden auf Endziffer 0 oder 5, welches für den kompletten Wertebereich von DINT funktioniert:
    Code:
    FUNCTION FC_RND5 : DINT
    VAR_INPUT
      IN : DINT;
    END_VAR
    VAR_TEMP
      tmp_dDigit : DINT;
    END_VAR
    
    IF IN = -2147483648 THEN          //(-2147483648 = 16#8000_0000)
      FC_RND5 := -2147483645;         //Runden zu -2147483650 wäre außerhalb DINT-Wertebereich
    ELSE
      tmp_dDigit := IN MOD 5;                          //letzte/Einer-Ziffer Basis 5 (0..4 mit Vorzeichen)
    //  FC_RND5 := IN - tmp_dDigit + tmp_dDigit/3*5;   //so besser verstehbar: Wert abrunden + eventuell aufrunden
      FC_RND5 := tmp_dDigit/3*5 - tmp_dDigit + IN ;    //doch umgestellt wird 10 Byte kürzer compiliert
    END_IF;
    END_FUNCTION
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #5
    Wellermann ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.09.2015
    Beiträge
    21
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Und wann soll auf 5 gerundet werden? Deine Beispiele runden immer auf 0.
    Und was genau soll passieren wenn die letzte Ziffer 5 ist?

    Harald
    Entschuldigung, ich habe mich vertan... so ist es richtig:
    Eigentliche Zahl | gerundet
    241 | 240
    353 | 355
    154 | 155
    456 | 460
    379 | 380

  7. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von Wellermann Beitrag anzeigen
    241 | 240
    456 | 460
    Nach welcher Logik wird da denn abgerundet?
    Ich hätte bei 456 ja 455 als gerundeten Wert erwartet.
    Und das dürfte Haralds Code auch machen.

  8. #7
    Wellermann ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.09.2015
    Beiträge
    21
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    genau dieses Thema wird gerade bei uns geklärt!

    Dankeschön für eure Hilfe!!!

  9. #8
    Wellermann ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.09.2015
    Beiträge
    21
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    also ich habe nochmal Rücksprache gehalten. So soll wie folgt programmiert sein:
    241 -> 245
    353 -> 355
    154 -> 155
    456 -> 460
    379 -> 380
    355 -> 355
    400 -> 400

    also immer Aufrunden.


    Gruß
    Mirko

  10. #9
    Registriert seit
    21.11.2014
    Beiträge
    228
    Danke
    7
    Erhielt 30 Danke für 28 Beiträge

    Standard

    Code:
    If (Zahl mod 5) <> 0 Then
        Ergebnis:=Zahl+(5-(Zahl mod 5));
    Else 
        Ergebnis:=Zahl;
    End_if

  11. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Man könnte also auch gleich übersichtlich und exakt schreiben:
    Code:
    letzte Ziffer --> runden zu
    --------------------------------
    1, 2, 3, 4    --> 5 (aufrunden)
    5             --> 5 (übernehmen)
    6, 7, 8, 9    --> 0 (aufrunden)
    0             --> 0 (übernehmen)
    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. Real Zahl auf Nachkommastelle runden
    Von digga im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 19.10.2017, 16:27
  2. auf bestimmte Nachkommastellen runden
    Von Thomas E. im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 27.08.2010, 15:07
  3. SCL Runden
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 03.12.2005, 10:24
  4. Antworten: 6
    Letzter Beitrag: 26.10.2005, 18:20
  5. Antworten: 1
    Letzter Beitrag: 10.10.2005, 09:09

Stichworte

Lesezeichen

Berechtigungen

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