WinCC Flex 2007 : Meldearchiv mit VBScript

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe es nun soweit hinbekommen das es bei einer Runtime so funktioniert wie ich es mir vorstelle. Da unsere System aber z.B. auch auf einem MP377 laufen soll bzw. kann
habe ich mal versucht den Script dahin gehend zu erweitern. Aber ich bekomme es nicht hin das die Datei eingelesen wird. Es scheint mir als ob ich bei WinCe keinen Zugriff auf
die Kopie des Meldearchivs bekomme. Kann vielleicht jemand mal drüber schauen ob Ihr vielleicht was seht was ich falsch mache. Das ganze teste ich indem ich die Applikation
auf einem MP377 15" übertrage.

Zu den vorherigen Vorschlägen


Was mir an Deinem Skript auffällt:
- wenn Date oder Time mehrfach im Skript verwendet wird, sollte man korrekterweise nur einmal die Systemzeit abfragen und in einer Variable zwischenspeichern
- Interpretation von Datums-/Uhrzeitteilen sollte man unabhängig von den regionalen Anzeigeeinstellungen mit der DatePart-Funktion vornehmen

Dahin gehend werde ich mein Projekt noch abändern. Da ich das in mehreren Scripten mache ist es etwas aufwendiger. Aber Danke für die Tipps, die kannte ich nicht.

- Ich meine, wenn man mit der Systemfunktion CopyLog (KopiereArchiv) ein Archiv kopiert, dann braucht man die Archivierung nicht stoppen - ich bin mir aber nicht sicher, zumindest würde ich mal ausprobieren, was mit Meldeereignissen während dem Kopieren passiert

Das habe ich mal ausprobiert. Wenn man das Archiv vorher nicht stoppt, wird das Archiv nicht kopiert und man bekommt eine Fehlermeldung das das System keine Berechtigung hat auf die Datei zuzugreifen.

Nun mein Script:

Code:
Dim f, fs, i, SourcePath, SourceFileName, DestinPath, DestinFileName, timeStamp, TextFileSource, TextFileDestin, Zeile, Zelle, Pruefung, Status, Datum, Uhrzeit, Meldenummer, Meldetext, Laenge, Meldeklasse, strDir


' Ausführen nur um 23:59Uhr und um 11:59Uhr
If Hour(Now) = 23 Or Hour(Now) = 11 Then


' Quelldatei festlegen
SourceFileName = "CopyErrors_0.csv"


' Ablagepfad festlegen 
DestinPath = SmartTags("PDE\_Archiv_StoragePath")


' FileSystemObject erstellen
If SmartTags("SYS\_System_Runtime") Then 
    'Runtime      
    Set f = CreateObject("WScript.Shell")
    Set fs = CreateObject("Scripting.FileSystemObject")
Else                                      
    'WinCE
    Set f= CreateObject("filectl.file")
    Set fs = CreateObject("FileCtl.FileSystem")
End If


' Fehlerbehandlung  
On Error Resume Next


If SmartTags("SYS\_System_Runtime") Then 
'Runtime    


    ' Quellpfad festlegen 
    SourcePath = "E:\Linie\AlarmFiles\"


    If Not fs.FolderExists (DestinPath) Then 'Ablagepfad nicht vorhanden?
        ' -> erzeugen.
        SYS_Create_StoragePath(DestinPath)
    End If
    
    If Not fs.FolderExists (DestinPath) Then 'Ablagepfad nicht vorhanden?
         ShowSystemAlarm ("Meldearchiv: Speicherpfad nicht vorhanden / message archive: storage directory not available")
        Exit Sub
    Else
        
        ' Meldearchiv stoppen / stop message archive
        ShowSystemAlarm "Meldearchiv stoppen / stop message archive"
        StopLogging hmiAlarmLog, "Errors_"


        ' Warten / wait    
        SYS_Delay 2
    
        ' Meldearchiv kopieren / copy message archive
        ShowSystemAlarm "Meldearchiv kopieren / copy message archive"
        CopyLog hmiAlarmLog, "CopyErrors_", "Errors_", hmiOverwrite, hmiYes
    
        ' Warten / wait
        SYS_Delay 2
        
        ' Meldearchiv starten / start message archive
            ShowSystemAlarm "Meldearchiv starten / start message archive"    
        StartLogging hmiAlarmLog, "Errors_"
        
        ' Warten / wait
        SYS_Delay 2
        
        ' Meldearchiv umformatieren und speichern / format and save message archive
        ShowSystemAlarm "Meldearchiv umformatieren und speichern / format and save message archive"
    
        Set TextFileSource = fs.OpenTextFile(SourcePath & SourceFileName, 1)
                        
        i=0
        Do While TextFileSource.AtEndOfStream <> True
            Zeile = TextFileSource.ReadLine
            Zelle = Split(Zeile,";")
            i = i + 1
            If i > 1 Then
                Pruefung = ""
                Pruefung = Int(Left(Zeile,10))
                If Pruefung <> "" Then
    
                        'Datum / date
                        If Len(Zelle(13)) = 21 Then ' Jahr 4-stellig / year 4 digits
                            Datum = Mid(Zelle(13),2,10)
                            Uhrzeit = Mid(Zelle(13),13,8)
                        End If
                        If Len(Zelle(13)) = 19 Then ' Jahr 2-stellig / year 2 digits
                            Datum = Mid(Zelle(13),2,8)
                                Uhrzeit = Mid(Zelle(13),11,8)
                        End If
    
                        ' Status / status
                        If Zelle(2) = "1" Then Status = "K"
                        If Zelle(2) = "0" Then Status = "KG"
                        If Zelle(2) = "6" Then Status = "KGQ"
                        If Zelle(2) = "3" Then Status = "KQ"
                        If Zelle(2) = "2" Then Status = "KQG"
                        
                        ' Meldeklasse / status
                        If Zelle(3) = "1" Then Meldeklasse = "A" ' Fehler
                        If Zelle(3) = "2" Then Meldeklasse = "W" ' Warnung
                        If Zelle(3) = "3" Then Meldeklasse = "S" ' System
                        If Zelle(3) = "4" Then Meldeklasse = "D" ' Diagnosemeldung
                                            
                        ' Meldenummer / message number
                        Meldenummer=Zelle(4)
                        
                        ' Meldetext / message text
                        Laenge = Len(Zelle(14))
                        Meldetext = Mid(Zelle(14),2,Laenge-2)
                        
                        ' Zeitstempel festlegen (0:00 bis 11:59Uhr = AM / 12:00 bis 23:59Uhr PM)
                        If Left(Uhrzeit,2) >= 0 And Left(Uhrzeit,2) < 12 Then
                            timeStamp = "AM"
                        Else
                            timeStamp = "PM"
                        End If            
                        
                        ' Dateiname zusammensetzen -> Alarme_YYYY.MM.DD_xx.csv  (xx = AM/PM)
                        If Mid(Datum,3,1) = "/" Then
                            ' Datum/Uhrzeit im Englischen Format    
                            DestinFileName = "Alarme_" & Right(Datum,4) & "." & Left(Datum,2) & "." & Mid(Datum,4,2) & "_" & Right(Uhrzeit,2) & ".csv"    
                        Else
                            ' Datum/Uhrzeit im Europäischem Format
                            DestinFileName = "Alarme_" & Right(Datum,4) & "." & Mid(Datum,4,2) & "." & Left(Datum,2) & "_" & timeStamp & ".csv"
                        End If
                        
                        ' Datei schon vorhanden / check if file exist
                        If fs.FileExists (DestinPath & DestinFileName) <> True Then
                            Set TextFileDestin = fs.CreateTextFile(DestinPath & DestinFileName, True)
                            TextFileDestin.WriteLine "Datum/date;Zeit/time;Status/status;Meldeklasse/message class;Meldenummer/message number;Meldetext/alarm message"
                        Else
                            Set TextFileDestin = fs.OpenTextFile(DestinPath & DestinFileName, 8)
                        End If
                        
                        ' Daten schreiben / write data
                        TextFileDestin.WriteLine Datum & ";" & Uhrzeit & ";" & Status & ";" & Meldeklasse & ";" & Meldenummer & ";" & Meldetext
                        TextFileDestin.Close    
                Else
                    Exit Sub        
                End If
            End If
        Loop
    End If    
Else             
'WinCE


    ' Quellpfad festlegen 
    SourcePath = "\Storage Card MMC\AlarmFiles\"


    strDir = fs.dir (DestinPath)    


    If strDir = "" Then 'Ablagepfad nicht vorhanden?
        ' -> erzeugen.
        SYS_Create_StoragePath(DestinPath)
    End If
    
    ' Prüfen ob der Speicherpfad vorhanden ist
    strDir = fs.dir (DestinPath)        
    If strDir = "" Then 'Ablagepfad immer noch nicht vorhanden?
        ShowSystemAlarm ("Meldearchiv: Speicherpfad nicht vorhanden / message archive: storage directory not available")
        Exit Sub                            
    Else    
        
        ' Meldearchiv stoppen / stop message archive
        ShowSystemAlarm "Meldearchiv stoppen / stop message archive"
        StopLogging hmiAlarmLog, "Errors_"


        ' Warten / wait    
        SYS_Delay 2
    
        ' Meldearchiv kopieren / copy message archive
        ShowSystemAlarm "Meldearchiv kopieren / copy message archive"
        CopyLog hmiAlarmLog, "CopyErrors_", "Errors_", hmiOverwrite, hmiYes


        ' Warten / wait
        SYS_Delay 2
        
        ' Meldearchiv starten / start message archive
        ShowSystemAlarm "Meldearchiv starten / start message archive"    
        StartLogging hmiAlarmLog, "Errors_"
        
        ' Warten / wait
        SYS_Delay 2
        
        ' Meldearchiv umformatieren und speichern / format and save message archive
        ShowSystemAlarm "Meldearchiv umformatieren und speichern / format and save message archive"
                                                 
        ' Datei öffnen bzw. erstellen, wenn sie noch nicht existiert
        ' Dateimodus 1 = lesen / 2 = schreiben / 8 = anhängen
        Set TextFileSource = f.open(SourcePath & SourceFileName, 1)
        
        i=0
        Do While TextFileSource.EOF <> True
            Zeile = TextFileSource.LineInputString
            Zelle = Split(Zeile,";")
            i = i + 1
            If i > 1 Then
                Pruefung = ""
                Pruefung = Int(Left(Zeile,10))
                If Pruefung <> "" Then
    
                        'Datum / date
                        If Len(Zelle(13)) = 21 Then ' Jahr 4-stellig / year 4 digits
                            Datum = Mid(Zelle(13),2,10)
                            Uhrzeit = Mid(Zelle(13),13,8)
                        End If
                        If Len(Zelle(13)) = 19 Then ' Jahr 2-stellig / year 2 digits
                            Datum = Mid(Zelle(13),2,8)
                            Uhrzeit = Mid(Zelle(13),11,8)
                        End If
    
                        ' Status / status
                        If Zelle(2) = "1" Then Status = "K"
                        If Zelle(2) = "0" Then Status = "KG"
                        If Zelle(2) = "6" Then Status = "KGQ"
                        If Zelle(2) = "3" Then Status = "KQ"
                        If Zelle(2) = "2" Then Status = "KQG"
                        
                        ' Meldeklasse / status
                        If Zelle(3) = "1" Then Meldeklasse = "A" ' Fehler
                        If Zelle(3) = "2" Then Meldeklasse = "W" ' Warnung
                        If Zelle(3) = "3" Then Meldeklasse = "S" ' System
                        If Zelle(3) = "4" Then Meldeklasse = "D" ' Diagnosemeldung
                                            
                        ' Meldenummer / message number
                        Meldenummer=Zelle(4)
                        
                        ' Meldetext / message text
                        Laenge = Len(Zelle(14))
                        Meldetext = Mid(Zelle(14),2,Laenge-2)
                        
                        ' Zeitstempel festlegen (0:00 bis 11:59Uhr = AM / 12:00 bis 23:59Uhr PM)
                        If Left(Uhrzeit,2) >= 0 And Left(Uhrzeit,2) < 12 Then
                            timeStamp = "AM"
                        Else
                            timeStamp = "PM"
                        End If            
                        
                        ' Dateiname zusammensetzen -> Alarme_YYYY.MM.DD_xx.csv  (xx = AM/PM)
                        If Mid(Datum,3,1) = "/" Then
                            ' Datum/Uhrzeit im Englischen Format    
                            DestinFileName = "Alarme_" & Right(Datum,4) & "." & Left(Datum,2) & "." & Mid(Datum,4,2) & "_" & Right(Uhrzeit,2) & ".csv"    
                        Else
                            ' Datum/Uhrzeit im Europäischem Format
                            DestinFileName = "Alarme_" & Right(Datum,4) & "." & Mid(Datum,4,2) & "." & Left(Datum,2) & "_" & timeStamp & ".csv"
                        End If
                        
                        ' Datei schon vorhanden / check if file exist
                        If f.FileExists (DestinPath & DestinFileName) <> True Then
                            Set TextFileDestin = f.open(DestinPath & DestinFileName, 2)
                            TextFileDestin.linePrint "Datum/date;Zeit/time;Status/status;Meldeklasse/message class;Meldenummer/message number;Meldetext/alarm message"
                        Else
                            Set TextFileDestin = f.open(DestinPath & DestinFileName, 8)
                        End If
                
                        ' Daten schreiben / write data
                        TextFileDestin.LinePrint Datum & ";" & Uhrzeit & ";" & Status & ";" & Meldeklasse & ";" & Meldenummer & ";" & Meldetext
                        TextFileDestin.Close    
                Else
                    Exit Sub        
                End If
            End If
        Loop
    End If
End If


' 
TextFileSource.Close
    
' Fehlerbehandlung
If Err.Number <> 0 Then
    ' Kopierauftrag mit Fehlern beendet/abgebrochen
    ShowSystemAlarm "Fehler/fault: " & Err.Description
    Err.Clear
    Exit Sub
Else
    ' Kopierauftrag ohne Fehler durchgeführt
    ShowSystemAlarm "Meldearchiv kopieren abgeschlossen / copying message archive completed"    
End If


' Verwendeten Speicher wieder freigeben
Set fs = Nothing
Set f  = Nothing


End If

Würde mich freuen wenn Ihr mir da einen Tipp geben könntet

Gruß Hausen
 
Zuletzt bearbeitet:
Hallo Volker,

was macht in dem Script die folgende Zeile? Also was da gemacht wird weiß ich, jedoch welchen Sinn die Abfrage hat verstehe ich nicht ganz.

Code:
pruf = int(left(zeile,10))

Gruß Hausen
damit wird geprüft ob die zeile mit einer zahl beginnt um z.b. solche zeilen zu ignorieren
"$RT_COUNT$";405;;;;;;;;;;;;;;;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was mir an Deinem Skript auffällt:
- wenn Date oder Time mehrfach im Skript verwendet wird, sollte man korrekterweise nur einmal die Systemzeit abfragen und in einer Variable zwischenspeichern
- Interpretation von Datums-/Uhrzeitteilen sollte man unabhängig von den regionalen Anzeigeeinstellungen mit der DatePart-Funktion vornehmen
Würde mich freuen wenn Ihr mir da einen Tipp geben könntet
Meine Kritik bezog sich darauf, daß Du bei jeder Verwendung der Uhrzeit erneut die Systemuhr abfragst, was dazu führen kann, daß spätere Abfragen eine andere Uhrzeit ermitteln als die erste Abfrage:
Code:
' Zeitstempel festlegen (0:00 bis 11:59Uhr = AM / 12:00 bis 23:59Uhr PM)
If Hour([COLOR="#FF0000"]Now[/COLOR]) = 12 Then
    'Um 12Uhr werden die Meldungen von 0:00 bis 11:59Uhr = AM gespeichert
    timeStamp = "AM"
Else
    'Um 00Uhr werden die Meldungen von 12:00 bis 23:59Uhr = PM gespeichert
    timeStamp = "PM"
End If


' Dateiname zusammensetzen -> Archiv_YYYY.MM.DD_xx.csv  (xx = AM/PM)
If Mid([COLOR="#FF0000"]Date[/COLOR],3,1) = "/" Then
    ' Datum/Uhrzeit im Englischen Format    
    FileName = "Alarme_" & Right([COLOR="#FF0000"]Date[/COLOR],4) & "." & Left([COLOR="#FF0000"]Date[/COLOR],2) & "." & Mid([COLOR="#FF0000"]Date[/COLOR],4,2) & "_" & Right([COLOR="#FF0000"]Time[/COLOR],2) & ".csv"    
Else
    ' Datum/Uhrzeit im Europäischem Format
    FileName = "Alarme_" & Right([COLOR="#FF0000"]Date[/COLOR],4) & "." & Mid([COLOR="#FF0000"]Date[/COLOR],4,2) & "." & Left([COLOR="#FF0000"]Date[/COLOR],2) & "_" & timeStamp & ".csv"
End If
Alle rot markierten Stellen fragen die Systemuhr ab. Besser ist es, zuerst die Uhrzeit von der Systemuhr in eine lokale Variable zu lesen und danach nur diese Variable zu verwenden.

Wie man direkt aus einer Datum/Uhrzeit-Angabe die Datums-/Uhrzeitteile ermittelt (statt einen regional unterschiedlich formatierten String auszuwerten) --> klicke den Link --> der geht zu zwei Programmbeispielen mit der DatePart-Funktion, wo nur einmal die Systemuhr abgefragt wird und dann die lokale Variable ausgewertet wird. Falls der Link bei Dir nicht funktioniert, hier nochmal das Beispiel:
Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:

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
 
Hallo Harald,

sorry, habe gerade erst gesehen das da in meinem Post ein Fehler drin war. Das mit der Systemzeit hatte ich schon verstanden und werde ich auch noch abändern.
Aber nachdem ich den Script generell laufen habe. Denn diese Abfrage habe ich öfters in meinen Scripten verwendet und dann werde ich das an allen Stellen gleich abändern.
Aber trotzdem Danke für Deine erneute Erläuterung.

Das mit dem Tipp geben bezieht sich auf mein Problem das mein Script unter WinCe nicht funktioniert. Kannst Du da vielleicht nochmal drüber schauen?

Gruß Hausen
 
Hallo

Sorry das ich so einen "Alten" Post nochmal hochhole aber ich habe eine ähnliche Problematik und wollte mal Wissen sie das zum Schluss "Ausgegangen" ist.
 
Zurück
Oben