Rechnen mit REAL in SCL ???

mkd

Level-2
Beiträge
197
Reaktionspunkte
30
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

ich habe ein Problemchen mit SCL. Wenn der unten angegebene Code ausgeführt wird, d.h. wenn 'FlankePos1' true ist, addiere ich auf die Variable 'temp' 0.1 . 'Store' stellt das Ergebnis dar.
Komischerweise wird nach mehreren Ausführungen nicht immer genau 0.1 addiert. Z.B. ist nach 5 Ausführungen das Ergebnis ~0,49999.
Alle relevanten Variablen sind als REAL deklariert. Ich dachte eigentlich 5*0.1 ist 0.5 und nicht 0.49999 :confused::confused::confused::confused:
Oder muss ich beim Umgang mit Variablen vom Typ REAL irgend etwas besonderes beachten?

Testumgebung ist PLCSim.

Vielen Dank
mkd

Code:
FUNCTION_BLOCK FB5 

(*hier werden alle Variablen deklariert*)  

   IF (manual=true) THEN
    
        //inkrementieren
        IF (FlankePos1) THEN        
            temp:=store+0.1; 
            
            (*Ergebnis kleiner 100 ??? *)
            IF (temp <=100.0) THEN
            store:=temp;
            END_IF;
   
        END_IF;
        
        
END_FUNCTION_BLOCK
 
Die Zahl 0,1 ist als Gleitpunktzahl nicht genau darstellbar, da keine Zweierpotenz.
Dass der Step7 Editor eine 0,1 genau anzeigt. liegt daran dass er die Anzeige auf eine bestimmte Anzahl von Stellen rundet. Wenn du die Zahl immer wieder aufaddierst, summiert sich der Fehler sodass der Editor diesen irgendwann anzeigt, obwohl er auch schon bei 0,1 vorhanden ist!

Am Besten du schaust dir den Wikipedia Artikel zum Gleitpunktformat IEEE-754 mal an, und versuchst mal die Binärdarstellung von 0,1 zu bestimmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas,


vielen Dank für deinen Hinweis. Wenn ich ehrlich bin, habe ich mir da noch nie Gedanken drüber gemacht wie so eine Gleitpunktzahl zusammengesetzt ist und welche Auflösungen sich daraus ergeben.

O.K. - soweit ich verstanden habe besteht das Siemens Format REAL aus 32 Bit. Bit 0...22 Mantisse und 23...30 als Exponent. Bit 31 bestimmt das Vorzeichen.

Das Vorzeichen wie 1*10^-1 ???

Ich habe da wohl ein Brett vorm Kopf :confused:
Denn 1*10^-1 wäre ja 0,1 - die sich ja offensichtlich nicht darstellen lassen.

Kannst du
Die Zahl 0,1 ist als Gleitpunktzahl nicht genau darstellbar, da keine Zweierpotenz.
Nochmal genau erläutern?


Danke!
 
Hallo,
was Thomas meinte ist hier sehr schön beschrieben. Zwar nicht mit 0,1 sondern mit 18,4 - das Wesentliche kann man m.E. aber schon erkennen.

Wenn du diese "Wandlungsfehler" bei REAL umgehen willst könntest du z.B. auf INT oder DINT ausweichen. Du mußt dann halt nur festlegen, um welchen Wert dein Komma in dieser Darstellung verschoben ist. Also 187 ind der INT-Variablen entspricht 1,87 in einer REAL-Variablen - alle Werte müßten durch 100 geteilt werden.

Gruß
LL
 
Zurück
Oben