Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

PFC200 rundet falsch (REAL_TO_INT)

jago85
2021-07-08
2021-07-08
  • jago85

    jago85 - 2021-07-08

    Hi,

    wir haben festgestellt, dass unser Steuerungsprogramm in manchen Fällen falsch rundet. Daraufhin haben wir ein Testprogramm erstellt, welches das Problem bestätigt. Das Ergebnis ist mit REAL_TO_INT oder LREAL_TO_INT das gleiche. Es wird nicht bei jeder Zahl bei x.5 aufgerundet.
    Getestet: CODESYS for PFC200 4.0.1.0 / 3.5.15.0

    Wenn man das Programm auf CODESYS for Windows laufen lässt, passt das Ergebnis.

    Ist das Problem bekannt? Gibt es einen Workaround oder Bugfix?

    VG,
    Jan

     

    Last edit: jago85 2021-07-08
  • m.prestel

    m.prestel - 2021-07-08

    Hallo Jan,

    Ich muss mich wohl korrigieren. Anscheinend ist das so, siehe Kommentar von Ian

    LG
    Marcel

     

    Last edit: m.prestel 2021-07-08
  • jago85

    jago85 - 2021-07-08

    Hallo Marcel, hallo Ian,

    danke für den Hinweis. Ich habe soeben den Entsprechenden Hinweis in der CODESYS-Dokumentation zur Target-Abhängigkeit gefunden. So richtig logisch finde ich das allerdings nicht. Sollte das Laufzeitsystem nicht genau solche plattformabhängigen Eigenheiten vereinheitlichen. Damit verhalten sich die Programme unterschiedlich auf verschiedenen Targets.

    Und: Warum rundet REAL_TO_LINT dann anders als REAL_TO_INT?

    Erschwerend kommt hinzu, dass es keine echte ROUND-Funktion gibt (kenne ich zumindest noch nicht). In der Lib FloatingPointUtils gibt es nur die Funktionen CEIL, FLOOR und TRUNCATE. Wenn die Konvertierung dies erledigen würde, wäre das kein Problem. Aber so fehlt mir nach wie vor ein Workaround, da ich leider darauf angewiesen bin, dass mein Programm mathematisch korrekt rundet.

    Mir fällt nur sowas hier ein:

        IF ABS(x - FLOOR(x)) >= 0.5 THEN
            RES := CEIL(x);
        ELSE
            RES := FLOOR(x);
        END_IF
    

    Gibt es bessere Vorschläge?

    VG,
    Jan

     

Log in to post a comment.