WinCC Data Logs TP1500 Scripting .cvs-Datei löschen, die sich bereits in einem Ordner aus dem Vorjahr befindet

Cdahan

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
Ich arbeite an einem Skript und wollte die folgende Aufgabe erstellen:
  • Die täglich erstellten Dateien sollen in einem Monatsordner abgelegt werden (z.b.: January, February,...)
  • Gibt es bereits einen Ordner vom Vorjahr, dann soll dieser gelöscht werden
    z.B.: Am 01 Januar 2024 soll der Ordner Januar (mit den Dateien aus 2023) gelöscht werden.
    In dem leeren Januar Ordner werden dann die neuen Dateien aus 2024 abgelegt
das Skript funktioniert schon aber ohne Löschen Aufgabe :
Code:
Sub DataLogging()
 
Dim fileName, folderName, fileLocation
Dim fso, fctl, KillDate, Path
Dim currentPosition, nextPosition
Dim currentDateTime, dataValues
Dim sDispatch, sTrainNo, sBlockTimes, sFreeRunningTimes, sSpeedAtFBR, sLiftCurrent, sTemperature, sWindDirection
Dim sWindSpeedAvg, sWindSpeedMin, sWindSpeedMax, sMaintenanceDispatch

fileName = Year(Now()) & "." & Month(Now()) & "." & Day(Now()) & ".csv"
Path = "Storage Card SD"
folderName = Path & Year(Now()) & "." & Month(Now())
fileLocation = folderName & fileName
'KillDate = DateAdd("yyyy", -1, Date) 
currentDateTime = Year(Now()) & "." & Month(Now()) & "." & Day(Now()) & "/" & Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)


'Check to see if folder structure exists, if not then create it                       
               Set fso = CreateObject("FileCtl.FileSystem")
               
                If (fso.Dir(folderName)) = "" Then
                                fso.MkDir folderName
                End If
                
               
                If Err.Number <> 0 Then
                                ShowSystemAlarm "Error # " & CStr(Err.Number)& " " & Err.Description
                                Err.Clear
                End If
'Check to see if file exists - if not then create it  

                Set fctl = CreateObject("FileCtl.File")


                fctl.Open fileLocation, 8
                 
                If Err.Number <> 0 Then
                                ShowSystemAlarm "Error # " & CStr(Err.Number)& " " & Err.Description
                                Err.Clear
                End If
'set header bit high to print header row

    sDispatch = SmartTags("Dispatch")
    sTrainNo = SmartTags("TrainNo")
    sBlockTimes = SmartTags("BlockTimes")
    sFreeRunningTimes = SmartTags("FreeRunningTimes")
    sSpeedAtFBR = SmartTags("speedAtFBR")
    sLiftCurrent = SmartTags("LiftCurrent")
    sTemperature = SmartTags("Temperature")
    sWindDirection = SmartTags("WindDirection")
    sWindSpeedAvg = SmartTags("WindSpeedAvg")
    sWindSpeedMin = SmartTags("WindSpeedMin")
    sWindSpeedMax = SmartTags("WindSpeedMax")
    sMaintenanceDispatch = SmartTags("MaintenanceDispatch")

currentPosition = fctl.Loc
                nextPosition = fctl.Seek
                 
                If currentPosition = 1 And nextPosition = 1 Then
                                fctl.LinePrint ("Date Time ; Dispatch ; TrainNo  ; BlockTimes  ; FreeRunningTimes  ; speedAtFBR  ; LiftCurrent  ; Temperature  ; WindDirection; WindSpeedAvg; WindSpeedMin; WindSpeedMax")
                End If

                dataValues = (currentDateTime & ";" & sDispatch & ";" & sTrainNo & ";" & sBlockTimes & ";" & sFreeRunningTimes & ";" & sSpeedAtFBR &  ";" & sLiftCurrent & ";" & sLiftCurrent & ";" & sTemperature& ";" & sWindDirection & ";" & sWindSpeedAvg & ";" & sWindSpeedMin & ";" & sWindSpeedMax & ";" & sMaintenanceDispatch)

fctl.LinePrint dataValues
                fctl.Close

End Sub
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ist Deine Frage? Was ist Dein Problem?
Weißt Du nicht wie man Dateien löscht? Oder hast Du was probiert und es funktioniert nicht? Oder weißt Du nicht wie man den Zeitstempel (FileDateTime) einer Datei feststellt?

Zum Problem, wann mußt Du Dateien löschen: wenn in dem Zielordner Dateien enthalten sind, die älter als ein Monat sind. Oder wo das Datei-Jahr ungleich dem aktuellen Jahr ist.

Beim Überfliegen Deines Codes festgestellt:
Wozu brauchst Du Seek und Loc?? csv-Dateien sind Textdateien, da werden eh' immer nur am Ende der Datei Zeilen zugefügt, insbesondere wenn wie bei Dir die Datei im Append-Mode geöffnet wird. Diese Position muß man nicht suchen und ansteuern, das passiert beim Schreiben (LinePrint) automatisch. Die "Header"-Zeile wird auch nur einmal geschrieben, wenn die Datei neu angelegt wird und daher noch leer ist. Das Datei-Ende = Datei-Anfang muß in dem Fall auch nicht gesucht werden.

Hilfen zu den VBS-Dateifunktionen findest Du in der TIA Hilfe "VBScript für Windows CE" und
im FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script, den Anhang VBScript_WinCE.pdf am Beitrag #1

Harald
 
Was ist Deine Frage? Was ist Dein Problem?
Weißt Du nicht wie man Dateien löscht? Oder hast Du was probiert und es funktioniert nicht? Oder weißt Du nicht wie man den Zeitstempel (FileDateTime) einer Datei feststellt?

Zum Problem, wann mußt Du Dateien löschen: wenn in dem Zielordner Dateien enthalten sind, die älter als ein Monat sind. Oder wo das Datei-Jahr ungleich dem aktuellen Jahr ist.

Beim Überfliegen Deines Codes festgestellt:
Wozu brauchst Du Seek und Loc?? csv-Dateien sind Textdateien, da werden eh' immer nur am Ende der Datei Zeilen zugefügt, insbesondere wenn wie bei Dir die Datei im Append-Mode geöffnet wird. Diese Position muß man nicht suchen und ansteuern, das passiert beim Schreiben (LinePrint) automatisch. Die "Header"-Zeile wird auch nur einmal geschrieben, wenn die Datei neu angelegt wird und daher noch leer ist. Das Datei-Ende = Datei-Anfang muß in dem Fall auch nicht gesucht werden.

Hilfen zu den VBS-Dateifunktionen findest Du in der TIA Hilfe "VBScript für Windows CE" und
im FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script, den Anhang VBScript_WinCE.pdf am Beitrag #1

Harald
Hallo Harald,
danke für Deine Anmerkungen.
Mit diesem Skript wird zuerst ein Zielordner erstellt (z.B. (02.2023) Ordner) und darin eine .csv Datei erstellt (14.02.2023).csv.1677482263052.png
Mein Problem: Ich suche nach einer Lösung, wie ich die Zielordner aus früheren Jahren löschen kann, z.B. wenn auf der SD-Karte ein Zielordner mit dem Namen (02.2022) existiert, sollte dieser gelöscht und ein neuer Zielordner (02.2023) erstellt werden.
 
Zuerst mit Kill *.* alle Dateien aus dem Ordner löschen, dann mir RmDir den Ordner selber löschen. Neuen Ordner erstellen mit MkDir

Tip: Bei Dateien und Ordner, die ein Datum enthalten, das Datum nach Jahr-Monat-Tag benennen, dann werden die Dateien in chronologischer Reihenfolge angezeigt, wenn die Dateien alphabetisch sortiert angezeigt werden. Und Datumstrennzeichen sind unnötig. Also nicht "14.2.2023.csv" sondern "20230214.csv"

Aus der Systemzeit einen String für Dateinamen erzeugen:
Now liefert die Systemzeit, und wenn man dreimal nacheinander Now verwendet, dann kann es passieren daß man nicht jedesmal dieselbe Systemzeit erhält und dann ein falscher Dateiname zusammengebastelt wird.
Die vielen Unterstriche im Dateiname würde ich weglassen, weil die verlängern nur den Dateiname ohne mehr Information.
Datum_Uhrzeit für den Dateiname würde ich immer unabhängig von den Regional Settings formatieren.
Die Zeitbestandteile Stunde, Minute, Sekunde, Tag und Monat würde ich immer genau 2 Ziffern lang machen (notfalls eine Vornull einfügen), damit die Dateien in einer Auflistung (z.B. Windows Explorer) zeitrichtig sortiert werden.
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)
oder geht auch so
Code:
' aus der Systemzeit einen String in der Form "20991231_015959" erzeugen
Dim t, s
t = Now ' Systemzeit
s = Year(t) & Right("0" & Month(t), 2) & Right("0" & Day(t), 2) & "_" _
  & Right("0" & Hour(t), 2) & Right("0" & Minute(t), 2) & Right("0" & Second(t), 2)

Harald
 
Zurück
Oben