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

vo13

Level-1
Beiträge
31
Reaktionspunkte
0
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.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... 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...
 
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;
     [COLOR="#FF0000"]END_IF
     ELSE IF[/COLOR] 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
 
Zurück
Oben