# WinCC Flex 2007 : Meldearchiv mit VBScript



## vmm (5 Oktober 2007)

Hi Leute,
ich beschäftige mich seit kurzem mit WinCC flex und multi panel 277. 
Weiß jemand, wie man ein Meldearchiv (csv) scripten kann? wie man die Variablen in Script einbindet ist mir klar. Die Frage ist, wie man die system und benutzerdefinierte Meldungen im Script aufrufen kann. ist das überhaupt möglich?    

Danke.


----------



## Lazarus™ (6 Oktober 2007)

Hi,
mal blöd frag, warum willst du denn ein Meldearchiv selber bauen, wenn es Meldearchive gibt ???


----------



## vmm (8 Oktober 2007)

weil ich immer eine Meldung pro CSV-Archiv haben will, damit die Daten möglichst zeitnah in eine Datenbank übernohmen werden können. und ich wollte weiniger abhängig von Flexible Archivierungsverfahren sein.


----------



## Lazarus™ (8 Oktober 2007)

Ich habe mir mal sowas hier gebaut:

```
Const ForReading = 1, ForWriting = 2, ForAppending = 8
  Dim hFSO, hFile, FileName, FilePath, Tag, Monat, UserName, UserGruppe
  Tag = Day(Date)
  If (Tag < 10) Then
 Tag = "0" & Tag 
  End If
  Monat = Month(Date)
  If (Monat < 10) Then
 Monat = "0" & Monat  
  End If
  If EventText = "" Then
  EventText = "Wertänderung"
  End If  
  FilePath = "C:\Maschinendaten\Log-Dateien\"
  FileName = "Audit " & Tag & Monat & Year(Date) & ".csv"
  Set hFSO = CreateObject("Scripting.FileSystemObject")
  If Not hFSO.FolderExists(FilePath) Then
 hFSO.CreateFolder(FilePath)
  End If 
  If Not hFSO.FileExists(FilePath & FileName) Then
    Set hFile = hFSO.OpenTextFile(FilePath & FileName, ForWriting, True)
    hFile.WriteLine("Datum, Uhrzeit, Benutzername, Benutzergruppe, Benutzeraktion, Variablenname, Variablenwert")
    hFile.Close   
  End If
  If SmartTags("Intern\UserName") = "" Then
    UserName = "System"
    UserGruppe = "System"
  Else
 UserName = SmartTags("Intern\UserName")
 UserGruppe = SmartTags("Intern\UserGruppe")
  End If        
  Set hFile = hFSO.OpenTextFile(FilePath & FileName, ForAppending, True)
  If EventText = "Runtime gestartet" Then
    If Not SmartTags("Intern\StartMessageDone") Then
      hFile.WriteLine(Date & "," & Time & "," & UserName & "," & UserGruppe & "," & EventText & "," & VarName & "," & VarValue)
    SmartTags("Intern\StartMessageDone") = True 
    End If
  Else   
    hFile.WriteLine(Date & "," & Time & "," & UserName & "," & UserGruppe & "," & EventText & "," & VarName & "," & VarValue)
  End If
  hFile.Close
```
Damit habe ich bei Meldungen,Störungen,Wertänderungen etc. alles in eine logdatei gemalt. Ich denke es ist aber nicht das was du meintest oder ???
Und lach nicht, es gibt ein paar kranke konstruktionen, aber damals wusste ich es nicht besser


----------



## vmm (9 Oktober 2007)

vielen Dank für die Hilfe  

ich habe auch drum rum probiert und habe das Ding so verstanden:
um den Zugriff zu einzelnen Meldungen zu bekommen, muss man zuerst entsprechende Einträge in Meldearchive -> Meldeklassen -> Analog/Bitmeldungen anlegen. dann kann man ein Spript schreiben, wo HMIRuntime gestartet wird, Archive geschlossen, auf LogFile zugegrieffen und am Ende Archive Wieder geöffnet... 

dann kommt man wiederum zu einem gewöhnlichen Meldearchiv, nur halt gescriptet  ... das bringt leider nicht viel.
also ich würde sagen, da kann man nichts machen.

bezüglich Pannels unterhalb 270er Serie (ich habe über die Geräte hier im Forum nicht gefragt aber Falls jemanden das interresiert):
ich habe eine Mail vom Support bekommen. da steht: An die Meldungen kommt man leider auch nicht mit einem MP-SDK heran. Hierzu müsste eine Schnittstelle systemnah entwickelt werden.

und noch mal vielen Dank


----------



## Ralle (9 Oktober 2007)

Wenn du eine Datenbank hast, kannst du ja auf deren PC ein Programm mit libnodave die Daten aus der SPS holen lassen und dann die Datenbank bedienen. Allerdings mußt du dann die Meldungstexte in der Datenbank oder in deinem PC-Programm vorhalten, da es wohl nur sinnvoll ist, das Fehlerbit aus der SPS zu holen.


----------



## JesperMP (9 Oktober 2007)

Hallo Lazarus.

Dein Skript hat mich interessiert. 
Wie bekommst du die Meldetexte in die Variable "EventText"?
Ist EventText ein interner tag ?


----------



## Lazarus™ (9 Oktober 2007)

Nein, Jesper, EventText wird bei Skriptaufruf ausgefüllt...


----------



## Hausen (14 Oktober 2015)

Hallo Lazarus,

ich hole den Beitrag mal wieder hervor 

Wo rufst Du den Script denn auf und füllst den EventText mit Informationen?
Würde das funktionieren wenn ich den Script bei jeder Bitmeldung => Ereinis => Kommen aufrufe? Oder überlaste ich damit meine Runtime?

Gruß Hausen


----------



## Larry Laffer (14 Oktober 2015)

... da hast du aber einen richtig alten Thread wieder hervorgekramt ... 8)

Wenn nicht zu viele deiner Bitmeldungen gleichzeitig kommen dann würdest du damit die Visu selbst nicht überlasten.
Du müßtest allerdings jede Bitmeldung als einzelnes Bit noch einmal projektieren und hier dann auf Wertänderung überprüfen - ist es das, was du willst ?
Oder möchtest du vielleicht einfach mal beschreiben, was du genau machen möchtest und was dir da wichtig ist ?

Gruß
Larry


----------



## Hausen (14 Oktober 2015)

Hallo Larry,

ja ich war mal artig und habe schön die Suchfunktion benutzt...

Zur Erläuterung. Ich erzeuge mir in meiner Runtime über Scripte eigene CSV-Archive mit Ist und Sollwerten. Es werden je Tag zwei Archive erzeugt.
Archiv 01 (Archiv_YYYY.MM.DD_AM.csv) von 00:00 - 11:59Uhr und Archive 02 (Archiv_YYYY.MM.DD_PM.csv) von 12:00 - 23:59Uhr.

Jetzt habe ich die Aufgabe zu diesen Variablenarchiven ebenfalls die Meldearchive zu speichern.

Jetzt wollte ich mal prüfen wie ich das am besten umsetzten könnte.

 Hast Du da vielleicht einen Tipp für mich?

Gruß Hausen


----------



## Larry Laffer (14 Oktober 2015)

Keinen anderen als den, den Harald (PN/DP) *hier* gegeben hat - aber den hattest du ja auch schon gesehen.

Ich würde an deiner Stelle den Aufbau dieser Dateien mal analysieren und sie dann über einen Uhrzeit-Trigger einlesen, überarbeiten/konvertieren (wie schon von Harald geschrieben) und dann das Resultat dessen abspeichern.
Wie das dann im Detail aussieht ist ein bißchen davon abhängig, was du genau brauchst ...

Gruß
Larry


----------



## PN/DP (14 Oktober 2015)

Hausen schrieb:


> Jetzt habe ich die Aufgabe zu diesen Variablenarchiven ebenfalls die Meldearchive zu speichern.
> 
> Jetzt wollte ich mal prüfen wie ich das am besten umsetzten könnte.


Ein Meldearchiv speichern ist erstmal kein Akt, das wird einfach projektiert (siehe WinCC flex Hilfe "Meldearchiv"), dafür braucht man keine Skripte und keine Funktionsaufrufe. Nur wenn einem das von WinCC flex erstellte Archiv nicht gefällt oder man ein abweichendes Handling braucht, dann wird es aufwendig. Vielleicht schaust Du Dir zuerst mal an, ob das Standard-Meldearchiv Deine Aufgabe erfüllt.

Harald


----------



## Hausen (14 Oktober 2015)

Hallo Harald,

leider Erfüllt das meinen Zweck nicht. Ich möchte ja gerne das Meldearchiv passend zu meinen Variablenarchiven nach der oben genannten Syntax (siehe Beitrag #11)
abspeichern. Im Prinzip habe ich auch schon eine fast funktionierende Version die ich zur Zeit aber noch optimiere bzw. teste.

Dazu hätte ich noch eine Frage die Ihr mir vielleicht beantworten könnt?!

Gibt es eine Möglichkeit eine existierende Datei durch einen Kopierbefehl zu erweitern?

Das heißt, das ich eine Datei mit Inhalt kopiere und diese in eine existierende Datei hinein schreibe ohne den Inhalt zu überschreiben?

Gruß Hausen


----------



## Hausen (14 Oktober 2015)

So sieht das zur Zeit aus. Der Script wird über den Aufgabenplaner jede Stunde bei Minute 00 ausgeführt.


```
Dim f, fs, i, SourcePath, DestinPath, FileName, timeStamp


' Ausführen nur um 00Uhr und um 12Uhr
If Hour(Now) = 0 Or Hour(Now) = 12 Then


' 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


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


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


' Zeitstempel festlegen (0:00 bis 11:59Uhr = AM / 12:00 bis 23:59Uhr PM)
If Hour(Now) = 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(Date,3,1) = "/" Then
    ' Datum/Uhrzeit im Englischen Format    
    FileName = "Alarme_" & Right(Date,4) & "." & Left(Date,2) & "." & Mid(Date,4,2) & "_" & Right(Time,2) & ".csv"    
Else
    ' Datum/Uhrzeit im Europäischem Format
    FileName = "Alarme_" & Right(Date,4) & "." & Mid(Date,4,2) & "." & Left(Date,2) & "_" & timeStamp & ".csv"
End If
    
    ShowSystemAlarm "Meldearchiv stoppen / stop message archive"
    StopLogging hmiAlarmLog, "Errors_"
    
    SYS_Delay 2
    
    ShowSystemAlarm "Meldearchiv kopieren / copy message archive"
    CopyLog hmiAlarmLog, "CopyErrors_", "Errors_", hmiOverwrite, hmiYes
    
    SYS_Delay 2
    
    ShowSystemAlarm "Meldearchiv starten / start message archive"    
    StartLogging hmiAlarmLog, "Errors_"
    
    SYS_Delay 2
    
    ShowSystemAlarm "Meldearchiv umbenennen und speichern / rename and save message archive"
    If SmartTags("SYS\_System_Runtime") Then 
    'Runtime    
        fs.CopyFile(SourcePath & "CopyErrors_0.csv"), (DestinPath & FileName),1
    Else                                      
    'WinCE
        fs.FileCopy(SourcePath & "CopyErrors_0.csv"), (DestinPath & FileName)
    End If
    
' 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
```


----------



## PN/DP (14 Oktober 2015)

Hausen schrieb:


> Gibt es eine Möglichkeit eine existierende Datei durch einen Kopierbefehl zu erweitern?
> 
> Das heißt, das ich eine Datei mit Inhalt kopiere und diese in eine existierende Datei hinein schreibe ohne den Inhalt zu überschreiben?


Dazu müsste man "zu Fuß" die Zieldatei im Append-Modus öffnen und in einer Schleife aus der Quelldatei zeilenweise den Inhalt in die Zieldatei kopieren (f.ReadLine/f.LineInputString aus Quelldatei, f.WriteLine/f.LinePrint in die Zieldatei)


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
- 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

Harald


----------



## Hausen (14 Oktober 2015)

Das mit dem Lesen und Schreiben der jeweiligen Datei habe ich auch schon probiert, jedoch sind dann bei mir die Zeilenumbrüche weg. 

Deine weiteren Anregungen werde ich mir morgen mal anschauen. 


Gruß Hausen


----------



## volker (14 Oktober 2015)

schau dir mal dieses skript an


```
Das VBScript
Meldearchiv_to_csv extrahiert aus einen
Protool/WinCCflex/TIA-Archiv Datum, Uhrzeit,
Status, Meldenummer, Meldetext.  Die Quelldatei
kann dem Skript als Parameter übergeben werden.
Die erzeugte Datei erhält als Zusatz im Namen
_M2C.csv. Also aus der Störung0.csv wird
Störung0_M2C.csv erzeugt
```
http://lischis-home.selfhost.eu/php...l_WinCCflex_TIA/&datei=meldearchiv_to_csv.zip

wenn du dieses über dein normales meldearchiv laufen lässt und dann noch datum/uhrzeit für das schreiben der neuen datei auswertest sollte das eine grundlage sein.

zum auswerten von datum/urzeit schau dir mal die DateDiff-Funktion von vbscript an.


----------



## Hausen (14 Oktober 2015)

volker schrieb:


> schau dir mal dieses skript an
> 
> 
> ```
> ...


Danke das werde ich mir mal morgen ebenfalls anschauen. Hört sich auch jeden Fall schon mal gut an! 

Gruß Hausen


----------



## Hausen (15 Oktober 2015)

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.


```
pruf = int(left(zeile,10))
```

Gruß Hausen


----------



## Hausen (19 Oktober 2015)

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




PN/DP schrieb:


> 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.



PN/DP schrieb:


> - 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:


```
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


----------



## volker (19 Oktober 2015)

Hausen schrieb:


> 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.
> 
> ...


damit wird geprüft ob die zeile mit einer zahl beginnt um z.b. solche zeilen zu ignorieren
"$RT_COUNT$";405;;;;;;;;;;;;;;;


----------



## PN/DP (19 Oktober 2015)

Hausen schrieb:


> PN/DP schrieb:
> 
> 
> > Was mir an Deinem Skript auffällt:
> ...


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:


Hausen schrieb:


> ```
> ' 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
> ...


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:


PN/DP schrieb:


> Zeit-Strings immer unabhängig von den regionalen Settings mit der DatePart-Funktion:
> 
> Datum_Uhrzeit-String für Dateinamen erzeugen:
> 
> ...



Harald


----------



## Hausen (19 Oktober 2015)

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


----------



## magus111 (29 Januar 2016)

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.


----------

