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

Ergebnis 1 bis 5 von 5

Thema: LREAL Variable, merkwürdiges Verhalten bei IF Abfrage auf < 0 bzw. > 0

  1. #1
    Registriert seit
    22.08.2013
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    auf meinem System, CX9020, TC2 (CODESYS) habe ich ein merkwürdiges Verhalten bei folgendem Programmcode:

    TestIstPosition : LREAL:=2;

    IF iState = 30 THEN
    IF TestIstPosition=0 THEN
    iState:=120;
    END_IF

    IF TestIstPosition > 0 THEN
    TestIstPosition:=TestIstPosition - 0.2;
    END_IF
    ELSE IF TestIstPosition < 0 THEN
    TestIstPosition:=TestIstPosition + 0.2;
    END_IF
    END_IF

    TestIstPosition wird runtergezählt und ist irgendwann mal -1.27656e-015, also kleiner 0.
    Dann müßte eigentlich bei IF TestIstPosition < 0 die TestIstPosition um 0.2 erhöht werden.
    Jedoch kommt man in TestIstPosition:=TestIstPosition + 0.2; der IF Abfrage nicht rein, also ist TestIstPosition nicht kleiner 0 (ist aber doch = -1.27656e-015)

    Wie ist das zu erklären.
    Danke für eure Antworten.
    Zitieren Zitieren LREAL Variable, merkwürdiges Verhalten bei IF Abfrage auf < 0 bzw. > 0  

  2. #2
    Registriert seit
    11.12.2009
    Beiträge
    2.113
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Code:
        TestIstPosition :   LREAL:=2;
    
        IF iState = 30 THEN
              IF TestIstPosition=0 THEN
                   iState:=120;
              END_IF
    
              IF TestIstPosition > 0 THEN
                    TestIstPosition:=TestIstPosition - 0.2;
              END_IF
         ELSE 
              IF TestIstPosition < 0 THEN
                   TestIstPosition:=TestIstPosition + 0.2;
              END_IF
        END_IF
    Siehst Du einen Fehler?

    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  3. #3
    vo13 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.08.2013
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    ... jetzt klar, ist Montag morgen!

    IF TestIstPosition > 0 THEN
    TestIstPosition:=TestIstPosition - 0.2;
    END_IF
    ELSIF TestIstPosition < 0 THEN
    TestIstPosition:=TestIstPosition + 0.2;
    END_IF

    Danke...

  4. #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

    Kann es sein, daß Deine "END_IF ELSE IF"-Kombination eigentlich ELSIF heißen müsste? Das ELSE in Deinem Code bezieht sich auf "IF iState = 30".

    Packe Programmcode in [CODE]-Tags (der #-Button im Beitragseditor), dann wird er im Browser besser lesbar dargestellt und die falsche Einrückung des ELSE wird auffälliger:
    Code:
        TestIstPosition :   LREAL:=2.0;
    
        IF iState = 30 THEN
         IF TestIstPosition=0.0 THEN
          iState:=120;
         END_IF
    
         IF TestIstPosition > 0.0 THEN
          TestIstPosition:=TestIstPosition - 0.2;
         END_IF
         ELSE IF TestIstPosition < 0.0 THEN
          TestIstPosition:=TestIstPosition + 0.2;
         END_IF
        END_IF

    IF TestIstPosition=0 THEN
    Einen REAL-Wert auf = 0.0 abfragen ist oft ein Glücksspiel, wenn die 0.0 als Ergebnis einer Berechnung erwartet wird. Das Ergebnis wird durch Rundungsfehler eher nahe 0.0 statt genau 0.0 sein.

    PS: Obwohl der Compiler einige Programmierer-Schlampigkeiten toleriert, solltest Du Dir angewöhnen, bei Benutzung von REAL-Konstanten diese auch als REAL-Konstanten zu schreiben, sprich 2.0 statt 2 und 0.0 statt 0. Das macht den Code viel besser lesbar.

    PPS: zu langsam..

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    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
    Zitat Zitat von vo13 Beitrag anzeigen
    ... jetzt klar, ist Montag morgen!

    IF TestIstPosition > 0 THEN
    TestIstPosition:=TestIstPosition - 0.2;
    END_IF
    ELSIF TestIstPosition < 0 THEN
    TestIstPosition:=TestIstPosition + 0.2;
    END_IF
    Immer noch ein END_IF zuviel.

    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. VBSkritpt: Variable in einer if-Abfrage testen
    Von mechatroniker2011 im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 17.02.2017, 09:13
  2. TIA merkwürdiges(?) Verhalten Schnittstelle OUT
    Von Lockenfrosch im Forum Simatic
    Antworten: 31
    Letzter Beitrag: 09.04.2015, 12:45
  3. Step 7 Verhalten Temp Variable in einem Multi-FB
    Von DDuesentrieb im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 11.06.2014, 08:37
  4. Abfrage der Maus bzw. Cursorposition
    Von bonatus im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 11.02.2009, 09:26
  5. Antworten: 2
    Letzter Beitrag: 21.12.2005, 14:29

Lesezeichen

Berechtigungen

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