Archivierung per skript

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

erst einmal Danke für Deine Antworten.

1. Ich habe das Projekt neu aufgespielt. Damit sollte die PDATA.FWX "frisch" drauf sein.
2. Wenn ich die Fehlerauswertung reinschreibe würde das HMI nicht abschmieren, das wäre ja schon mal ein Schritt weiter.
3. Ich zeige Systemfehler in einem Meldefenster an, dass in der globalen Vorlage liegt.
Weiter gibt es eine Seite zur Anzeige des Meldearchivs. Dort werden auch die Systemfehler mitgeschrieben.
Ich hatte die Vermutung, einen Fehler würde man ggf. nicht sehen, wenn das HMI abstürzt.
Aber auch im Archiv findet sich kein Eintrag.
4. Das skript zum Kopieren habe ich weitestgehend von einem Siemens-Beispiel übernommen. Entweder ist das durch meine Änderung etwas unkonventionell geworden oder die Vorlage war auch schon so.
Aber nicht zu vergessen hat das schon lange so geklappt. Eine leere Datei ist definitiv kein Problem. Es gibt weitere subskripts, die u.a. die Datei neu anlegen, wenn sie im nicht im Zielverzeichnis liegt.
Ich habe den IT-Kollegen gebeten die Datei zu löschen. Sie wird auch wieder neu angelegt. Diese Prozedur ist zumindest bei der Inbetriebnahme vor 4 Jahren auch mehrmals durchgespielt worden.
Das Problem ist damit aber nicht behoben.
5. "fileContent = Left(fileContent,(Laenge-2))" soll eine Leerzeile löschen. Siehe Beitrag #19 in diesem thread

Letztendlich werde ich jetzt zunächst folgendes machen:
Bei der Inbetriebnahme hatte ich damals auf meinem Arbeitsrechner ein Verzeichnis zum Probieren angelegt und dorthin archiviert.
Der IT-Kollege wird das jetzt so nachstellen und sich direkt an der Maschine verbinden. So ist das Firmennetzwerk mit Routern etc. sowie die Freigabe im Netz erst einmal ausgeschlossen.

Ich werde weiter berichten.
 
Noch mal was, was aber nicht direkt mit deinem Problem zu tun hat.
Ich halte es Grundsätzlich für problematisch direkt in Netzwerkdateien zu schreiben.
Was das für Probleme macht siehst du ja gerade. Datenverlust.

Ich halte es so, dass ich immer auf eine Storage-Card archiviere und anschließend die Dateien kopiere/verschiebe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Volker,

danke für den Hinweis.

Die Archivierung wird auch so gemacht. Erst auf einen USB-Stick schreiben und dann auf den server kopieren.
Die Daten sind auch nicht weg, aber halt auch nicht für den Kunden verfügbar, solange sie auf dem stick liegen.

Gruß

Christian
 
Hallo Harald,

der Fehler ist jetzt aufgedeckt. Du hattest den richtigen Riecher, vielen Dank noch einmal.

Für mein Gefühl erstellst Du unnötigerweise zu viele File-/Filesystem-Objekte. Im Schritt 100 benutzt Du eine bereits benutzte Objektverweis-Variable (f) für die Erstellung eines neuen File-Objektes ohne das vorhandene File-Objekt freizugeben - dadurch geht der Verweis zum vorherigen Objekt verloren. Möglicherweise geht durch die zu vielen Objekte und die Runtime-Errors der Arbeitsspeicher zur Neige und die WinCC Runtime stürzt deshalb ab?
Ich würde vorschlagen, Du erstellst am Anfang des Skriptes je ein File-Objekt und FileSystem-Objekt und benutzt dann nur noch diese beiden Objekte.


Der Schritt 90 ist nicht gut gelöst - wozu eine komplette Datei in den Arbeitsspeicher einlesen?
Wie groß ist die Datei "\Storage Card USB\PAL_ID.csv"? - eventuell zu groß oder leer?
Kann es vorkommen, daß die Datei leer ist? Ich weiß nicht, was VBS macht, wenn man "fileContent = Left(fileContent,(Laenge-2))" mit einer resultierenden negativen Länge aufruft.
Wozu ungeprüft generell die letzten 2 Zeichen aus der Datei entfernen? Wo kommt die leere Zeile her?

Ich würde anstatt Schritt 90 im Schritt 100 die Datei vom Panel zeilenweise in die Datei auf dem Server kopieren (beide Dateien öffnen, in einer Schleife bis EOF von Quelldatei eine Zeile einlesen, wenn Länge > 0 dann die Zeile in die Zieldatei schreiben)

Der server war mehrere Tage nicht erreichbar und es hatten sich über 5000 Datensätze auf dem stick gesammelt.
Ich hatte den code erstmal so verändert:

Code:
'90: Datei suchen und öffnen
'-----------------------------

If SmartTags("Archivierung\Status_kopieren") = 90 Then
    
    Set fso = CreateObject("FileCtl.FileSystem")
    
    SmartTags("Archivierung\Name") = "PAL_ID.csv" ' fso.Dir("\Storage Card USB\*.csv")        'Suchen nach ersten Dateiname auf Stick
    f.open("\Storage Card USB\" & SmartTags("Archivierung\Name")),1,1
    If Err.Number <> 0 Then
        ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
        Err.Clear
        Exit Sub
    Else
        SmartTags("Archivierung\Status_kopieren") = 91
    End If
End If

'91: Datei auslesen
'-----------------------------    
If SmartTags("Archivierung\Status_kopieren") = 91 Then
    Do
        If f.EOF = True Then Exit Do
        fileContent = fileContent & f.LineInputString & vbCrLf
    Loop
    
    'Leerzeile am Ende löschen
    Laenge = Len (fileContent)
    If Laenge > 2 Then
        fileContent = Left(fileContent,(Laenge-2))
        SmartTags("Archivierung\Status_kopieren") = 100                'Text: Quelldaten übertragen
    Else
        SmartTags("Archivierung\Status_kopieren") = 99            'Text: Fehler Datenlänge
    End If
    
    ' Datei wieder schließen
     f.Close     
End If 


'100: Zieldatei öffnen
'-------------------------------------

If SmartTags("Archivierung\Status_kopieren") = 100 Then
    
    ' FileObject erstellen
    Set f = CreateObject("FileCtl.File")
 
    ' Datei öffnen im Append-Modus
    f.open "\\DETET1AS0007\transfer$\NVE.csv", 8 
    'f.open  "\\DETET1CN1380\Logs\NVE.csv", 8 
    'f.open "\\LAPTOP_CHRIS_WO\Logs\NVE.csv", 8
    If Err.Number <> 0 Then
        ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
        Err.Clear
        Exit Sub
    Else
        SmartTags("Archivierung\Status_kopieren") = 101
    End If
End If

'101: Einträge im Appendmodus anhängen
'-------------------------------------
If SmartTags("Archivierung\Status_kopieren") = 101 Then

    ' Einträge anhängen
    f.lineprint fileContent
    If Err.Number <> 0 Then
        ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
        Err.Clear
        f.Close
        Exit Sub
    Else
        ' Datei wieder schließen
        f.Close 
        SmartTags("Archivierung\Status_kopieren") = 110            'Text: Quelldatei löschen
      End If    
End If

Das skript war dann recht lang im Schritt 91 und in Schritt 101 ist das Panel wieder abgestürzt.
Nachdem die Datei auf dem stick dann umbenannt war, wurde eine neue (leere) Datei angelegt.
Das hat dann wieder funktioniert. Also war der Arbeitsspeicher ausgeschöpft.

Ich werde Deine Vorschläge umsetzen, sobald ich das nächste Mal bei dem Kunden bin.
Hast Du einen Codeschnipsel für mich, um das zeilenweise kopieren durchzuführen wie Du es vorgeschlagen hast?

Gruß

Christian
 
Zurück
Oben