Step 7 Wincc Flex Datei erstellen und schreiben

Junge

Level-2
Beiträge
226
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich würde gerne mit meinem TP eine Datei erstelln (CSV oder TXT) die als Name das Datum haben soll und entsprechend täglich neu erzeugt wird, dabei soll natürlich die Datei vom Tag zuvor nicht gelöscht werden.

In der Datei selber soll dann mehrmals täglich zeilenweise etwas geschrieben und beigefügt werden.
D.h.

Dateiname: 13.09.2015.txt

1.Zeile WERT; Uhrzeit
2.Zeile WERT; Uhrzeit
...
..
.
usw.

Das ganze soll dann auf eine Festplatte die an dem HMI über USB verbunden ist abgespeichert werden.

Ich hab nur eine ganz magere Ahnung was ich zu tun habe, wobei mir dazu noch das wissen fehlt wie ich das ganze Programmieren soll.

Grob meine ich es folgendeweise machen zu müssen:

1. Datei erstellen und abfragen ob diese existiert wenn nicht erstelle diese mit dem neuen Datum. Wenn die Datei existiert öffne diese..
2. Datei öffnen Wert und datum in die neue Zeile schreiben
3. Datei schliessen.

Ich hab bisher nur sehr wenig mit VB programmiert, deswegen würde ich mich über jede Hilfe freuen.Und ich sehe dass es auch noch unterschiede gibt wenn man mit CE arbeitet

Das ist mein erster Ansatz derzeit unter Windows

Code:
Dim fso, Datei, f

[U][B]Datei abfragen und erstellen:[/B][/U]
  
Datei=“D:\Daten.txt"                                                    //wie kann ich meine txt mit dem heutigen Datum benennen
 
Set fso = Createobject ("scripting.FileSystemObject")     //FileSystem bedeutet, dass die Datei lokal abgespeicher wird?!
 
If fso.fileExists.(Datei) then
Fso.createtextfile (Datei)                                             //Wenn die Datei mit dem aktuellt Date nicht exisitiert erstelle diese
End if
 
 
[U][B]Schreiben:[/B][/U]
 
set f=fso.getfile(datei)
set ts=f.openastextstream (8,-2) 

ts.writeline ("Datum; " &date &";" &smarttags("Wert") &";")
ts.close
 
Zuletzt bearbeitet:
Wie kann ich eigtl. einen Wert aus dem HMI einer Variable hier "WERT" zuweisen? einfach so?!: db100.dbd10= wert
Hatte hier mal sämtliche Möglichkeiten für den HMI-Variablen-Zugriff innerhalb von Flex-Skripten gepostet.
http://www.sps-forum.de/hmi/77312-wincc-variablen-per-skript-erstellen-2.html#post543437

Zum Thema "Dateien schreiben mit Vbs" empfehle ich als Start das zugehörige FAQ
http://www.sps-forum.de/faq/15348-protool-winccflex-daten-lesen-schreiben-mit-vb-script.html

Es gibt auch noch viele andere Beiträge zu dem Thema hier, auch über die Ablage mittels Netzwerkpfad.
Einfach mal die Forensuche anstarten.

Code:
Datei=“D:\“now.date.txt“                                                    //kann ich so meine txt mit dem heutigen Datum benennen
 
Set fs = Createobject (Datei.FileSystem)                             //FileSystem bedeutet, dass die Datei lokal abgespeicher wird?!
 
If fs.dir fileExists.(Datei) =now.date"txt" then
Der Zusammenbau deines Dateinamen wird so kaum hinhauen. Strings fügt man in VBS mit "&" zusammen, die Datentypen
muss man logischerweise auch von DateTime, Date auf String konvertieren.
Auch der der fileExist Aufruf passt so nicht. Müsste mindestens...
Code:
Dim fso,fs,datum,zeit,datei,textfile1

Datei=“D:\“ & CStr(Now) & "." & CStr(Date) & ".txt“
If Not fso.FileExists (datei) Then[INDENT]Set TextFile1 = fso.CreateTextFile(datei, true)[/INDENT]

'usw... Siehe FAQ
...heißen.

Hier noch ein schönes Beispiel von PN/DP wie man einen Datum-String ganz besonders gut als Dateinamen formatieren kann.
http://www.sps-forum.de/hmi/64845-uhrzeit-und-datum-char-variable-speichern.html#post454755
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also mit

Code:
..
..
Datum = Date
Datei= "D:\" &(Datum) & ".txt"
..
..


Kann ich mir eine Datei erstellen die das als Name das Aktuelle Datum hat :) jippi.
Und der Rest hat auch funktioniert, also Werte in die Textdatei schreiben und weitere Werte unten dran hängen.

Jetzt bleiben für mich nur noch die Fragen:

-( ich möchte ja gern eine Festplatte mit USB an das HMI stecken)
Woher weiss ich den Pfad?

und

-wie ist jetzt der richtige Quelltext für Windows CE!! so wie ich das hier lesen kann unterscheiden die sich ja.


Für Leute mit ähnliche Probleme hier nochmal der ganze Quellcode mit WinccFlex Simuliert noch nicht aufn HMI getestet: D.H. mit Windows 7 funktioniert es mit Windows CE k.a.

Code:
Dim fso, Datei, f, ts, Datum

Datum= Date
Datei= "D:\" &(Datum) & ".txt"

set fso CreateObject("Scripting.FileSystemObject")

If Not fso.FileExists(Datei) Then
fso.CreateTextFile Datei
End If

Set f=fso.GetFile(Datei)

Set ts=f.OpenAsTextStream(8,-2)
ts.WriteLine("Datum;"&Date&";"&"Uhrzeit";"&Time"&Smarttags("Wert")&";")
ts.Close

Set ts=Nothing
Set f=Nothing
Set fso=Nothing
 
Zuletzt bearbeitet:
Dateiname: 13.09.2015.txt
Ich würde keine Punkte oder sonstige Trennzeichen zwischen die Datumsteile setzen und das Datum umgekehrt angegeben, also YYYYMMDD --> 20150913.txt, dann werden Dateinamen in Listen sinnvoller sortiert angezeigt.

Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:
Code:
' aus der Systemzeit einen String in der Form "31.12.2099 01:59:59" erzeugen
Dim t, s
t = Now ' Systemzeit
s = Right("0" & DatePart("d", t), 2) & "." & Right("0" & DatePart("m", t), 2) & "." & DatePart("yyyy", t) & " " _
  & Right("0" & DatePart("h", t), 2) & ":" & Right("0" & DatePart("n", t), 2) & ":" & Right("0" & DatePart("s", t), 2)

Datum_Uhrzeit-String für Dateinamen erzeugen:
Code:
' aus der Systemzeit einen String in der Form "20991231_015959" erzeugen
Dim t, s
t = Now ' Systemzeit
s = DatePart("yyyy", t) & Right("0" & DatePart("m", t), 2) & Right("0" & DatePart("d", t), 2) & "_" _
  & Right("0" & DatePart("h", t), 2) & Right("0" & DatePart("n", t), 2) & Right("0" & DatePart("s", t), 2)

Harald
 
Das ist auf jeden Fall ein guter Einwand!

...aber könnte mir bitte einer noch dabei helfen/Tipp geben das ganze für Windows CE kompatibel zu machen?! Und dann noch die Frage mit dem Festplattenpfad ...

Code:
DIM Datum, f

Datum=date
Datei="\Storage Card2\"&(Datum)&".txt"

set f=createobject ("fileCtl.File")

if not f.dir("datei")then
f.mkdir("datei")
end if

f.open Datei, 8
f.lineprint("Datum; "&Date&"; "&"Uhrzeit"&Time";"&SmartTags("Wert")&";")
f.close
set f=nothing


auspobieren kann ich das zwar jetzt nicht, weil ich kein Panel hier hab, aber so sollte es dann hoffentlich funktionieren...
obwohl mir jetzt immer noch nicht klar ist wieso das USB Verzeichnis so heißt und wieso da so ein unterschied in der Programmierung ist (CE vs. Win7)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
-( ich möchte ja gern eine Festplatte mit USB an das HMI stecken)
Woher weiss ich den Pfad?
- auf dem HMI-Panel den Windows Explorer öffnen und schauen, unter welchem Name der USB-Stick erscheint
- oder im WinCC flex Projekt ein Meldearchiv oder Variablenarchiv anlegen und sehen, welchen Ablage-Pfad man wählen kann

Beides wird Dir wahrscheinlich zeigen, daß der USB-Stick als "\Storage Card USB\" angesprochen wird.


Für Leute mit ähnliche Probleme hier nochmal der ganze Quellcode mit WinccFlex Simuliert noch nicht aufn HMI getestet: D.H. mit Windows 7 funktioniert es mit Windows CE k.a.
Dein Quellcode erzeugt die Formatierung von Datum und Uhrzeit entsprechend den regionalen Settings des darunterliegenden Windows. Solange Du die CSV-Datei mit dem selben PC öffnest, mit dem die Datei erzeugt wurde, wirst Du kein Problem bemerken. Sobald Du aber die CSV-Datei mit einem anderen Computer öffnest sind Probleme vorprogrammiert. Also gib Dir etwas mehr Mühe und formatiere Datum und Uhrzeit unabhängig von den Windows-Einstellungen.

Stolpersteine bei der CSV-Erstellung


-wie ist jetzt der richtige Quelltext für Windows CE!! so wie ich das hier lesen kann unterscheiden die sich ja.
In dem von RONIN verlinkten FAQ findest Du eine PDF mit den Namen und Beschreibung der WinCE-VBScript-File-Funktionen. Und Skript-Beispiele in der Windos32- und WinCE-Version. Kriegst Du die Übersetzung hin?

Harald
 
Ok danke, damit sollte ich es eigentlich schaffen :D

Und ich werde auch das mit dem Dateinamen anpassen, allerdings kann ich das alles erst morgen mit dem Panel ausprobieren, weil da CE drauf ist.
Falls ich dann auf Schwierigkeiten stoßen sollte würde ich mich nochmal an euch wenden mit der Hoffnung auf erneute Hilfe.

Vielen Dank dass hier euch an einem Sonntag Zeit nimmt für solche sachen! ..naja es regnet ja eh draussen, zumindest bei uns :ROFLMAO:
 
Versuche es mal so:
Code:
'VBS für WinCE
Const ForAppend = 8
DIM t, fDatum, Datum, Uhrzeit, USB, path, datei, fso, f

t=now
fDatum  = DatePart("yyyy", t) & Right("0" & DatePart("m", t), 2) & Right("0" & DatePart("d", t), 2)
Datum   = Right("0" & DatePart("d", t), 2) & "." & Right("0" & DatePart("m", t), 2) & "." & DatePart("yyyy", t)
Uhrzeit = Right("0" & DatePart("h", t), 2) & ":" & Right("0" & DatePart("n", t), 2) & ":" & Right("0" & DatePart("s", t), 2)

USB   = "\Storage Card USB"
path  = USB & "\Logs"
datei = path & "\" & fDatum & ".txt" ' --> "\Storage Card USB\Logs\20150913.txt"


Set fso = CreateObject("FileCtl.FileSystem")
If fso.Dir(USB) <> "" Then 'USB-Stick gesteckt?

  'Ordner \Logs\ ggf. erstellen
  If fso.Dir(path) = "" Then 'Ordner \Logs\ existiert noch nicht?
    fso.MkDir path
  End If

  'CSV-Datei öffnen oder erstellen (Tip: wenn nicht exist --> erstellen + Kopfzeilen)
  Set f = CreateObject("FileCtl.File")
  f.Open datei, ForAppend
  f.LinePrint "Datum; " & Datum & "; Uhrzeit" & Uhrzeit "; Wert; " & SmartTags("Wert") & ";"
  f.Close

Else 'kein USB-Stick gesteckt
  ...
End If

Tip: mache Dir eine Meldeanzeige für Systemmeldungen in ein Bild, damit Du die Runtime-Fehlermeldungen siehst und nachlesen kannst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wow, Danke schön!

Genauso hatte ich es mir vorgestellt nur selbst noch nicht hinbekommen :rolleyes: weil ich noch etwas Übung brauche.


Das einzige was dann noch ergänzt werden müsste, da die Datei für jeden neuen Tag noch nicht exisitert:

Code:
 'Datei erstellen   
If fso.Dir(datei) = "" Then 'Datei existiert noch nicht?     
fso.MkDir datei   End If

Kopfzeile wird in dem Fall nicht benötigt, da ja die Zeilen schon selbst betitelt sind.

Super, Danke!
 
Ich bin grad' nicht sicher, doch ich meine, daß auch beim Modus Append unter WinCE die Datei notfalls automatisch erstellt wird, falls sie noch nicht existiert.
Weiters: mit MkDir kann man keine Dateien erstellen sondern nur Ordner (directory). Dateien werden durch öffnen im Schreibmodus (und vermutlich auch im Appendmodus) erstellt.

In csv-Dateien, insbesondere wenn man sie als Archiv benutzt, ist es nicht üblich, in jeder Zeile erneut die Spaltennamen/Variablennamen zu schreiben. Das ist Platzverschwendung und verlangsamt auch das Schreiben und besonders das Einlesen der Datei. Möchte man in einer csv-Datei auch die Spaltennamen/Variablennamen mitteilen, dann macht man das üblicherweise einmalig im Kopfbereich der Datei.

Wenn man wegen eventuellen Kopfzeilen sowieso vor dem Öffnen ermittelt, ob eine Datei schon existiert, dann ist es unerheblich ob Append eine Datei erstellt, weil man bei Nicht-Existenz die Datei am besten im Schreibmodus öffnet und die Kopfzeile(n) schreibt, bevor man die Datenzeile anhängt.

Harald
 
Oh, ok. Dann hatte ich das mit mkdir doch noch nicht richtig verstanden. Werde das dann mit der Kopfzeile auch umsetzten. Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wollt nur kurz sagen, dass alles wunderbar geklappt hat :) Danke.
Hab auch das mit der Kopfzeile eingebaut damit mir nicht nachgetragen werden kann, dass ich faul wäre ;) oder nichts lernen möchte.

und mir ist jetzt auch klar oder klarer geworden wo die Unterschiede in Dir (Verzeichnis), mkdir (Ordner erstellen/Pfad erweitern) und mit createobject(filectl.file/filesystem/filesystemobject) usw. sind.

Was ich noch gerne, wenn evtl auch überflüssig, ergänzen möchte (für die Anfänger von uns :rolleyes: ):

Ist, dann einmal das Skipt geschrieben, kommt dann irgendwann die Frage wie ich dieses denn überhaupt aufrufe. Zum testen hatte ich mir einfach ein Button erstellt, der dieses dann als Ereigniss aufruft. Zum testen ist das soweit ok gewesen nur soll dies ja mal später intern von der SPS angetriggert werden.

...also gesucht und gefunden

In die Eigenschaften der Variable, die von der SPS zum aufrufen des skriptes genommen wird, gehen und hier bei Ereignisse "Wertänderung" auswählen und als Funktion das Skript auswählen :) im Skript selber kann man dann die Variable zum Ende einfach wieder rücksetzten.
 
Zurück
Oben