String to Real ; NaN in Visu

Gärtner

Level-2
Beiträge
49
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
folgendes Problem. Ich ermittel aus einer CS einen Preis wie folgt:
VAR
...
RxBuffer: ARRAY[0..16000] OF BYTE;
zeichen10:STRING(10);
tempgaspreis2:REAL;
end_var

zeichen10:='';
zeichen10[0]:=RxBuffer[15425];
zeichen10[1]:=RxBuffer[15426];
zeichen10[2]:=RxBuffer[15427];
zeichen10[3]:=RxBuffer[15428];
zeichen10[4]:=RxBuffer[15429];
zeichen10[5]:=RxBuffer[15430];
tempgaspreis2:=STRING_TO_REAL(zeichen10);

Die Variable Zeichen10 enthält zum Beispiel = '36.233'
die Variable Tempgaspreis2 aber = 36.2329979

Ich kann mit der Variable Tempgaspreis2 normal rechnen und diese Ungenauigkeit würde mich nicht stören, jedoch verstehe ich nicht, wie diese zu Stande kommt.
Wenn ich nun die Variable Tempgaspreis2 in einer Visualisiertung anzeige erhalte ich NaN. Wenn ich aber zum Beispiel TempGasPreis2/10 wähle wird mir ein Zehntel angezeigt.
Wo liegt der Fehler?
in Seltenen fällen wird der in der Variable TempGasPreis2 er exakte Wert angezeigt und ich erhalte in der Visu auch kein NaN.
Danke!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Gärtner :
Deine Anfrage ist mir "ein wenig" zu difus - deshalb bitte noch einmal für mich :
TempGasPreis2 ist ein REAL und in der SPS wird dir der korrekte Werte angezeigt ?
Als was zeigst du sie in der Visu an ?
Was wird daraus wenn du durch 10 dividierst ?
Was ist mit Zeichen10 ?

Ansonsten hat dir die Sache mit den Gleitpunktzahlen der @Pferdle ja zu erklären versucht ... das war aber, so glaube ich, gar nicht wirklich dein Problem ...?
 
Die Variable Zeichen10 enthält zum Beispiel = '36.233'
die Variable Tempgaspreis2 aber = 36.2329979
Bist du sicher mit den genauen Zahlenwerten?
STRING_TO_REAL('36.233') sollte 36.233001708984375 ergeben = 16#4210EE98
Welche Codesys-Version verwendest du mit welcher SPS?

Ich kann mit der Variable Tempgaspreis2 normal rechnen und diese Ungenauigkeit würde mich nicht stören, jedoch verstehe ich nicht, wie diese zu Stande kommt.
Das liegt an der Codierung des Datentyps Real. Real kann nicht alle Werte exakt speichern, sondern ist immer eine Rundung zum nächsten darstellbaren Wert.

Wenn ich nun die Variable Tempgaspreis2 in einer Visualisiertung anzeige erhalte ich NaN.
Das kommt vermutlich daher, dass dein String (manchmal?) ein ungültiges Format hat und STRING_TO_REAL dann einen ungültigen Real-Wert oder direkt NaN liefert? Hinter dem letzten Zeichen des Strings muß noch ein String-Endezeichen sein (ein Byte mit dem Wert 0) ---> zeichen10[6] := 0;

Wenn ich aber zum Beispiel TempGasPreis2/10 wähle wird mir ein Zehntel angezeigt.
Wie sieht "ein Zehntel" aus?? Was genau wird da angezeigt? Wie ist die Variable in welcher Visu projektiert?
 
Also CoDeSys schreibt in seiner Online-Hilfe:
Konvertierbare Strings enthalten:
  • Zahl mit Typpräfix (Beispiel: '16#FFFFFFFF')
  • Zahl mit Gruppierungszeichen (Beispiel: '2#1111_1111')
    Hinweis: Das internationale Gewichtungs- und Maßgruppierungszeichen (Thinspace) wird nicht akzeptiert, nur der Unterstrich.
  • Gleitpunktzahl, auch in Exponentialschreibweise (Beispiel: '9.876' oder '1.2E-34')
    Hinnweis: Gleitkommazahlen sind nicht konvertierbar. Das Komma wird wie ein nachstehendes Zeichen behandelt und abgeschnitten.
  • Zeit- Uhrzeit- und Datumsangabe mit Präfix und Größe (Beispiel: 'T#2h', 'DT#2019-9-9-12:30:30.9')
  • Infinite Werte (Beispiel: '1.7E+400')
  • Zusätzliche Zeichen hinter einer Zahl (Beispiel: '2m' oder '3,14')
    Diese werden abgeschnitten. Zusätzliche Zeichen vor einer Zahl sind nicht erlaubt.
  • Leerzeichen davor (Beispiel: '3.14')

Das mußt Du erst einmal abprüfen. Dann kommt der Hinweis von PN/DP dazu, dß Du Deinen String nicht abschließt, Du weißt also nie, was dahinter noch an Zeichen rumvegetiert und Dir die Konvertierung versaut.

Anstatt die Zeichen einzeln zu kopieren, gibt es in vielen Systemen auch unter den String-Funktionen eine MID-Funktion, um einen bestimmten Teil aus einem String in einen anderen zu kopieren. Dann brauchst Du Dir über das Initialisieren und den Abschluß des Ziel-Strings keine Gedanken zu machen.
 
Zurück
Oben