WinCC Unified WriteLine - Real Wert "runden"

al3x

Level-2
Beiträge
173
Reaktionspunkte
28
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hab hier ein "seltsames" Verhalten. Werte werden über ein Skript in eine Textdatei geschrieben.
Aus der REAL Zahl 0.77 wird in der Textdatei 0.7770000100135803. Wie kann ich das Verhindern?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das kannst du gar nicht verhindern - das ist typisch für REAL-Zahlen. Wie schreibst du den Wert denn in eine Textdatei ? Wenn das von der Visu aus mit VB passiert dann hast du da die Möglichkeit die Variable erst zu einen String zu machen und den dann passend zu formatieren damit nur das geschrieben wird was du schreiben willst ...
 
Wie schreibst du den Wert in die Textdatei? Bei WinCC Unified kenne ich mich nicht aus, doch da sollte es in JavaScript eine Funktion oder Methode geben, um den REAL-Wert in einen String mit vorgegebenem Format zu wandeln. Geht in WinCC Unified JavaScript die Methode toFixed() ?
Rein mathematisch kann man die Anzahl von Nachkommastellen bei REAL nicht erfolgreich festlegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Methode toFixed() funktioniert bei Tia v20 und liefert ein String zurück. Habs mal einfach mit einem E/A-Feld getestet.
Javascript:
export function EA_Feld_5_ProcessValue_Trigger(item) {
    let tag = Tags("value");
    tag.Write(42.1337);
    return tag.Read();
}

Ergebnis {F4}:

42.1337.png


Javascript:
export function EA_Feld_5_ProcessValue_Trigger(item) {
    let tag = Tags("value");
    tag.Write(42.1337);
    return tag.Read().toFixed(2);
}

Ergebnis {F4}:

42.1300.png


Ich weiß jetzt nicht, ob ich mit der Simulation auch schreiben kann und habe deswegen nur ein E/A-Feld verwendet. Das Ausgabeformat {F4} ist eine Gleitkommazahl mit 4 Dezimalstellen.

Hinweis: Bei E/A-Feldern kann man die Anzahl der Dezimalstellen definieren und die Dezimalstellen lassen sich auch verschieben. Dafür braucht man kein Javascript. Nur falls jemand auf die Idee kommt den Code zu verwenden, um E/A-Felder zu formatieren.
 
Hinweis: Bei E/A-Feldern kann man die Anzahl der Dezimalstellen definieren und die Dezimalstellen lassen sich auch verschieben. Dafür braucht man kein Javascript. Nur falls jemand auf die Idee kommt den Code zu verwenden, um E/A-Felder zu formatieren.
Kleiner Zusatzhinweis da es hier ja um Unified geht. Das verschieben von Dezimalstellen geht ohne Skript nur mit TIA V20 Update 3. In allen Versionen darunter muss man Java-Skripte nutzen.

EDIT:
Wobei ich mir nicht ganz sicher bin bei REAL-Zahlen. Bei INT / DINT ist es so.
 
Zuletzt bearbeitet:
Bei REAL (Float) Zahlen ist das Runden auf eine bestimmte Anzahl Nachkommastellen prinzipiell nicht möglich (auch nicht mit noch so clever aussehenden mathematischen Formeln) - das liegt am internen Aufbau des REAL-Formates, das den (Ergebnis-)Wert immer zum nächstliegenden darstellbaren Wert rundet - und der ist fast immer "krumm". Bei REAL Zahlen kann man nur die Ausgabe (per String) formatieren.
 
das was ich im post 2 geschrieben habe funktioniert definitiv. ich nutze das mehrfach
Wenn man einen INT durch 100 dividiert, dann entstehen keine 2 Nachkommastellen, weil INT ja keine Nachkommastellen hat. Und wenn man das Ergebnis auf REAL konvertiert oder in REAL rechnet, dann wird auf den nächsten mit REAL darstellbaren Wert gerundet. Z. B. 12345 / 100 ergibt eher 123.00 oder vielleicht was "krummes", wenn man in REAL rechnet, oder es funktioniert nur in einem bestimmten Wertebereich mit wenigen Ziffern und nur im Spezialfall bei Division mit Zehnerpotenzen?
Vielleicht zeigst du uns mal genauer, wie das bei dir funktioniert. Deine Formel in Post 2 dürfte so wie angegeben nicht ganz korrekt sein.
 
Wenn man einen INT durch 100 dividiert, dann entstehen keine 2 Nachkommastellen, weil INT ja keine Nachkommastellen hat.
genau. deswegen wird ja auch zuerst der realwert multipliziert, dann die nachkommastellen abgeschnitten und dann durch 100 geteilt was dann 2 nachkommastellen erzeugt

PS: Falls in der Formel in Post #2 die Division eine REAL-Division durch 100.0 ist, dann könnte die Formel für kleine Werte z.B. 0 bis 100 bzw. -327.68 bis +327.67 anwendbar sein (nicht getestet).
sowas gibt es in vbsript nicht. wenn das n der steuerung gemacht würde sehe das evtl anders aus

Hier ein Beispiel aus einem meiner Projekte
Wert in der txt stimmt nicht genau hinter dem Komma weil die nicht in Echtzeit geschrieben wird.
Aber das Prinzip sollte klar sein.
Und ok ich verwende hier round und nicht int aber das ergebnis ist das gleiche.
im vbscript gibt es nicht so merkwürdige nachkommastellen wie in der sps. 19,5 sind 19,5 und nicht 19,5001 oder so

1750073438778.png
 
Zuletzt bearbeitet:
Dein Code funktioniert in deinem Fall, weil beim "/10" das Ergebnis eine 64Bit Gleitpunktzahl wird.
Und 19,8 ist mit 64Bit Float genau darstellbar aber mit 32Bit nicht.

1750075016004.png

EDIT: Ok. Hab gerade herausgefunden, dass die 19.8 auch im 64float nicht genau darstellbar ist. Aber die VB-Funktion die es zum string wandelt rundet es so.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
z.b. so
meinwert = int(meinwert x 100) / 100 '2 nachkommastellen
Wenn man einen INT durch 100 dividiert, dann entstehen keine 2 Nachkommastellen, weil INT ja keine Nachkommastellen hat.
genau. deswegen wird ja auch zuerst der realwert multipliziert, dann die nachkommastellen abgeschnitten und dann durch 100 geteilt was dann 2 nachkommastellen erzeugt
Das sieht man deiner Formel nicht an, dass int(...) / 100 eine implizit konvertierte REAL-Division sein soll. Als Ganzzahl-Division int / 100 entstehen keine Nachkommastellen.
Mit länger hinschauen fällt vielleicht auf, dass das Ergebnis wieder der Eingangsvariable "meinwert" zugewiesen wird und "meinwert" im Diskussionskontext wahrscheinlich eine REAL-Variable ist. Daher besser deutlicher schreiben int(...) / 100.0 (100.0 als REAL-Konstante) oder überhaupt den Datentyp der verwendeten Variablen erwähnen.
 
Zurück
Oben