WinCC Flex 2007 : Meldearchiv mit VBScript

vmm

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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? :confused: :confused: :confused:

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Ich habe mir mal sowas hier gebaut:
Code:
  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 :ROFLMAO:
 
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 :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Hallo Lazarus.

Dein Skript hat mich interessiert.
Wie bekommst du die Meldetexte in die Variable "EventText"?
Ist EventText ein interner tag ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
... 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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So sieht das zur Zeit aus. Der Script wird über den Aufgabenplaner jede Stunde bei Minute 00 ausgeführt.

Code:
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
 
Zuletzt bearbeitet:
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schau dir mal dieses skript an

Code:
 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.
 
schau dir mal dieses skript an

Code:
 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.
Danke das werde ich mir mal morgen ebenfalls anschauen. Hört sich auch jeden Fall schon mal gut an!

Gruß Hausen
 
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
 
Zurück
Oben