Mit TwinCat 2 Werte in CSV File schreiben

Niklas412

Level-1
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein kleines Problem beim exportieren von Werten aus der CPU in ein CSV File.

Ich habe z.B. eine Real Zahl von 2.53 diese wird in meinem Baustein zu einem string gewandelt um sie in das CSV zu übertragen.
Diese ganze geschichte funktioniert auch ohne Probleme.

Nur wenn ich das CSV File mit Excel öffne zeigt er mir nicht die 2.53 sondern 2,53E+14 oder je nach formatierung der Zelle 252999997138977.
Kann mir da jemand weiterhelfen?
 
Hallo,

was steht drin wenn du das mit einem Texteditor öffnest?
Ich denke das muss in Excel eingestellt werden.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hack,

folgendes steht im Texteditor, 2.52999997138977 die Zahl mit den ganzen Nachkomma stellen.
Wenn ich im TwinCat online schaue steht nur 2.53 da, also die aufgerundete Zahl.
 
Hallo,

dann kann man es es in Excel umstellen. Mit Formatieren, Zahl und die Kommastellen angeben sollte das gehen.

Grüße
 
Das Hauptproblem bei Excel in diesem Fall ist die Zellformatierung und das Dezimalzeichen. Excel zeigt die Zahl schon richtig an, entfernt den Punkt weil im deutschen Excel das Komma (,) das Dezimaltrennzeichen ist - der Punkt hingegen dient als 1000er Trennzeichen.
Das kannst du aber beim Import noch einstellen oder du ersetzt direkt in der SPS beim Schreiben in die CSV den Punkt durch ein Komma (Stringfunktionen).
Wieviele Kommastellen du in Excel siehst oder ob die Zahl als Exponentialzahl angezeigt wird, liegt an der Zellformatierung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube ich habe das Problem lokalisiert, ich habe in der CPU eine Real zahl z.b. 2.5555555, dann schneide ich bis auf zwei alle nachkommastellen ab.
Wenn ich dann in meinem Baustein die Real Variable zu einer String Varible wandle macht mir die Software einfach mehrere nachkommastellen dazu.
Ich habe hier mal ein Bild von der Funktion und den Werten.
Vielleicht könnt ihr mir hier sagen woher das kommt.

Test.png
 
Soviel ich weiß:
REAL wird gerundet dargestellt. Eigentlich ist die Zahl im String die tatsächliche.
Du müsstest also zuerst runden und dann konvertieren. Aber du kannst doch die Lange Zahl in Excel übernehmen.

Wenn du mit REPLACE den . durch einen , ersetzt müsste das gehen.

Grüße
 
Hallo zusammen,
wäre es ggf. auch eine Option die real in INT zu verwandeln ?
Dann String > Export.
In Excel ist ja deutlich einfacher wieder zu rechnen ;)
LG
Shrimps
 
Morgen zusammen,

Danke für die Hilfreichen Tipps, aber auch mit der Konvertierung REAL_TO_LREAL und danach LREAL_TO_STRING() bringt es nichts die nachkommastellen bleiben.
 
Also wenn du auf 2 Dezimalstellen bestehst, kannst du deine LREAL in einen String wandeln, mit
Code:
Pos := Find(ZahlString,'.'); //ermittelt die Position des Punktes im String
CSVString := Left(ZahlString,Pos+2); //Kürzt den String auf die Länge mit 2 Stellen hinterm Punkt
CSVString := Replace(CSVString, ',' , 1, Pos); //ersetzt den Punkt durch ein Komma
bearbeiten.
(schnell aus dem Kopf geschrieben und ungetestet)

Mfg

Edit: Replace korrigiert
 
Zuletzt bearbeitet:
Also vorrerst habe ich es lösen können ich habe die Real Zahl durch die Berechnung Real*10 Real_to_Dint ---> Dint_to_Real Real/10 auf eine kommstelle begrenzt.
Dann wird mir nach der umwandlung zu string auch nur eine kommstelle angezeigt, wenn ich es aber mit 100 oder 1000 berechne so das ich auf 2 oder 3 kommastellen komme funktioniert es nicht.
:confused::confused::confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt folgende Funktion:

Code:
(* Variable als String *) := LREAL_TO_FMTSTR( in := (* Varible in Real *) , iPrecision := 3, bRound := TRUE );

Diese rundet die Real auf 3 Nachkommastellen. Die 3 kannst du auch ändern.
Die Kommentare sind die Variablen.
Dass Excel das falsch anzeigt, ist normal. Wie oben geschrieben ist der Punkt daran schuld. Excel erkennt das als 1000er Trennzeichen.
Du musst in Excel zur richtigen Darstellung einfach "Text" als Format für die Zelle wählen. Dann bleibt der Wert unverändert.

ABER: Wenn du eine CSV Datei in Excel öffnest, er dir direkt das Format falsch auswählt und das Feld schon falsch dargestellt wird, dann hilft auch das ändern in Text nichts.
Excel ändert nämlich dann den Wert schon. Ich glaube, man kann aber diese automatische Formatierung ausschalten...
 
dann schneide ich bis auf zwei alle nachkommastellen ab.
Tatsächlich rundest Du auf 3 Nachkommastellen...
Da Du aber nach dem Runden wieder Gleitpunkt-Berechnung machst, wird es wieder ungenau und es tauchen wieder mehr Nachkommastellen auf.
Musst Du denn nach dem Wandeln in Ganzzahl wieder zurück in Gleitpunkt? Kannst Du vielleicht den Wert als Ganzzahl mit einer anderen Zehnerpotenz bzw. in einer anderen Einheit in die csv-Datei schreiben? (z.B. 2553g statt 2,553kg)

Musst Du tatsächlich die Nachkommastellen begrenzen? Das ist doch nur Kosmetik für die csv-Datei, welche auch noch die Genauigkeit verschlechtert, weil es den Wert verfälscht. Schaut sich denn jemand die csv-Datei an?

Ansonsten würde ich es etwa so machen:
Code:
sDelimiter : = ',';  [COLOR="#008000"]//hier einstellen, ob Dezimalkomma oder Dezimalpunkt[/COLOR]

diTemp := REAL_TO_DINT(rEingangswert * 1000.0);  [COLOR="#008000"]// -2.553xxx --> -2553[/COLOR]
sAusgabe := CONCAT(DINT_TO_STRING(diTemp / 1000), sDelimiter);  [COLOR="#008000"]// --> '-2,'[/COLOR]
sAusgabe := CONCAT(sAusgabe, [COLOR="#FF0000"]DINT_TO_STRING(diTemp MOD 1000)[/COLOR]);  [COLOR="#008000"]// --> '-2,553'[/COLOR]

Ich kenne die TwinCat *_TO_STRING-Funktionen nicht, eventuell mußt Du da noch führende Leerzeichen entfernen.

Nachtrag:
Die letzte Zeile mit dem Anhängen der Nachkommastellen wird nicht korrekt funktionieren. :oops:
Besser so:
Code:
sDelimiter : = ',';  [COLOR="#008000"]//hier einstellen, ob Dezimalkomma oder Dezimalpunkt[/COLOR]

diTemp := REAL_TO_DINT(rEingangswert * 1000.0);  [COLOR="#008000"]// -2.553xxx --> -2553[/COLOR]
sAusgabe := CONCAT(DINT_TO_STRING(diTemp / 1000), sDelimiter);  [COLOR="#008000"]// --> '-2,'[/COLOR]
sAusgabe := CONCAT(sAusgabe, RIGHT(CONCAT('00', DINT_TO_STRING(ABS(diTemp))), 3) );  [COLOR="#008000"]// --> '-2,553'[/COLOR]

Harald
 
Zuletzt bearbeitet:
Zurück
Oben