TIA Laden von Langzeitarchiv schlägt fehl

Alde_Oma

Level-2
Beiträge
103
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe mehrere Variablen welche in einer Kurvenanzeige darstelle. Über einen Trigger aus der SPS werden diese Echtzeitdaten dann auch in eine Archiv gespeichert bzw von den Archiven wieder in der Kurvenanzeige dargestellt.
Ich habe auf der HMI einen EA-Feld, in welchem in einen Eintrag auswähle, worauf ein bestimmtes Archiv geladen werden soll. Gibt es dieses Archiv nicht, wird ein Leerarchiv geladen.
Also eine Erweiterung des Siemensbeispiel.

Das Speichern klappt auch ohne Probleme. Mein Problem ist das Laden von gespeicherten Archiven.

Ich hab mir mal beispielhaft 5 Archive gespeichert.
Ein Archiv mit 1kB welches Leer ist, um die Kurvenanzeige leer darzustellen.
Je zwei Archive mit 10kB und mit 34kB.

Das leere Archiv lässt sich immer laden. Egal welches Archiv zuvor geladen wurde.
Die anderen Archive lassen sich nur laden, wenn zuvor ein gleich großes oder ein größeres geladen wurde.
Ansonsten erscheint die Systemmeldung 80053 Fehler beim Lesezugriff auf geschlossenes Archiv.

An den Archiven selbst liegt es nicht, da auch beim Tausch der Dateinamen das selbe Phänomen auftritt.

Hier der VBS-Code zum Laden der Archive.

Code:
Sub VBS_Restore_archive()
    'Tip:
    ' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
    ' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
    '  Beispiel: HmiRuntime.Screens("Screen_1").
    ' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
    'Schreiben Sie den Code ab dieser Position:
    
    Dim fso, f
    Dim restore_entry, restore_fields, date_time, Dateiname
    Set fso = CreateObject("Scripting.FileSystemObject")
    'archive_path = SmartTags("File_" & fileChosen)
    
    '[Archiv]_[Datum]_[Uhrzeit]_[HMI-Name] z.B.: Qualitaet0_20190721_201509_Benutzer
    Dateiname = "Qualitaet0_" & SmartTags("OEE.HMI.Archivierung.Datei_Datum") & "_" & SmartTags("OEE.HMI.Archivierung.Datei_Uhrzeit") & "_" & SmartTags("OEE.HMI.Archivierung.HMI_Name") & ".csv"
    archive_path = SmartTags("OEE.HMI.Archivierung.Pfad_Echtzeit") & "\" & Dateiname 'SmartTags("File_" & fileChosen)
    current_path= SmartTags("OEE.HMI.Archivierung.Pfad_Echtzeit") & "\Qualitaet_Archiv0.csv" '"C:\Storage Card SD\Archiv_Qualitaet.csv"
    
    If Not fso.FileExists(archive_path) Then 'Datei existiert nicht
        'Leere Datei laden
        Dateiname = "Qualitaet0_Leer.csv"
        archive_path = SmartTags("OEE.HMI.Archivierung.Pfad_Echtzeit") & "\" & Dateiname
        ShowSystemAlarm "Leere Datei geladen."
        
    End If
        
    fso.CopyFile archive_path, current_path, 1 'Datei kopieren

    Set f = fso.GetFile(current_path) 'Datei laden
    f.Attributes = 0 'Schreibschutz entfernen

    Set f = fso.OpenTextFile(current_path, 1) 'Datei öffnen

    '-----------------------------------------------------
    Do While Not f.AtEndOfStream
        restore_entry = f.ReadLine 'Zeile lesen
        restore_fields = Split(restore_entry, ";") 'Spalten trennen (Trennzeichen ggf. anpassen)
        ShowSystemAlarm "A: " & restore_fields(0)
        
        If Not restore_fields(0) = """$RT_COUNT$""" Then 'Nicht die letzte Zeile
            date_time = Mid(restore_fields(1), 2, Len(restore_fields(1))-2) 'Datum und Uhrzeit holen -> "23.07.2019  14:17:57" => Ab Zeichen 2 bis zum vorletzten Zeichen
            ShowSystemAlarm "B: " & date_time
            
        Else 'Nix machen => ELSE entfernen
            ShowSystemAlarm "C: " & date_time
            'Exit Do

        End If
        
    Loop

    '------------------------------------------------------
    Set fso = Nothing
    Set f = Nothing

    OpenAllLogs

    If IsDate(date_time) = True Then
        restore_time = DateAdd("s", trendview_offset, CDate(date_time))
    
    Else
        ShowSystemAlarm "Can't set trend view time to <" & date_time & ">."
        
    End If
    
    ShowSystemAlarm "Restored archive <" & archive_path & "> to <" & current_path &"> at " & restore_time & "."
        
End Sub

Mein Gedanke war auch ob es vielleicht an der Dateigröße selbst liegt. Das die Datei noch nicht fertig geladen ist und die Software dieses aber schon öffnet. Kann ich mir bei 34kB aber nicht vorstellen...
Wie im Anhang zu sehen ist, werden die Daten auch alle so geladen wie sie sollen. Die Ausgabe der Meldungen (A, B, C) ist auch in der Reihenfolge, wie es sein soll.

Habt ihr hierzu vielleicht eine Idee, was dieses Problem hervorruft?
 

Anhänge

  • Meldungen.jpg
    Meldungen.jpg
    83,8 KB · Aufrufe: 19
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich habe immernoch bzw. wieder ein Problem mit dem Laden von Variablenarchiven.
Gespeichert ist ein Archiv mit 3 Varaiblen.
Beim Laden werden mehrere Scripte nacheinander aufgerufen um das Archiv zu laden.

Ablauf:
die SPS setzt die Variable "Trigger_Archiv_Laden".
Bei Wertänderung wird das Script "VBS_Aufruf_Laden" aufgerufen:

Code:
Sub VBS_Aufruf_Laden()
    If SmartTags("Trigger_Archiv_Laden") = True Then
'        ShowSystemAlarm "Trigger_Archiv_Laden wurde gesetzt"
'        
'        SmartTags("Trigger_Archiv_Laden") = False
'        ShowSystemAlarm "Trigger_Archiv_Laden wurde rückgesetzt"
'        
'        ModusLaden = True 'Mode auf Archiv laden setzen
'        ShowSystemAlarm "ModusLaden wurde gesetzt"
'        
        'StopLogging hmiDataLog, "Qualitaet" 'Archivierung stoppen (Muss vor SchließeAlleArchive gemacht werden)
        'StopLogging hmiDataLog, "Qualitaet_Archiv" 'Archivierung stoppen (Muss vor SchließeAlleArchive gemacht werden)
        'ShowSystemAlarm "VBS_Aufruf_Laden - Stoppe Logging"
        
        CloseAllLogs 'Alle Archive schließen => Erzeugt Systemmeldung 80019 => Systemmeldung ruft VBS_Weiche auf
        ShowSystemAlarm "VBS_Aufruf_Laden - Schließe Archive"
        
    End If
End Sub

Dieses schließt die Archive und ruft dadurch Systemmeldung 80019 auf, welche wiederum das Script "VBS_Weiche" aufruft:
Code:
Sub VBS_Weiche()
    ShowSystemAlarm "VBS_Weiche - Aufruf Weiche"
    
'    'Speichern
'    If ModusSpeichern Then
'        ShowSystemAlarm "ModusSpeichern wurde rückgesetzt"
'        ModusSpeichern = False
'            
'        ShowSystemAlarm "Aufruf Speichern"
'        VBS_Speichern_Archiv
'        
'    End If
    
    'Laden
    If SmartTags("Trigger_Archiv_Laden") = True Then
        ShowSystemAlarm "VBS_Weiche - Trigger_Archiv_Laden wurde rückgesetzt"
        SmartTags("Trigger_Archiv_Laden") = False
        
        ShowSystemAlarm "VBS_Weiche - Aufruf VBS_Laden_Archiv"
        VBS_Laden_Archiv
        
    End If    
End Sub

Hier wird die zu Beginn gesetzte Variable "Trigger_Archiv_Laden" wieder rückgesetzt und das Script "VBS_Laden_Archiv" aufgerufen:
Code:
Sub VBS_Laden_Archiv()
    Dim fso, f
    Dim restore_entry, restore_fields, date_time, Dateiname, Archiv_Pfad, Echtzeit_Pfad
    Archiv_Pfad = ""
    Echtzeit_Pfad = ""
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    'Archiv_Pfad = SmartTags("File_" & fileChosen)
    
    '[Archiv]_[Datum]_[Uhrzeit]_[HMI-Name] z.B.: Qualitaet0_20190721_201509_ESSERT310 <=== Alt
    '[Archiv]_[Tag]_[Schicht] z.B.: Qualitaet0_Di_Frueh
    Dateiname = "Qualitaet0_" & SmartTags("Datenbaustein_2_OEE.HMI.Archivierung.Datei_Laden_Tag") & "_" & SmartTags("Datenbaustein_2_OEE.HMI.Archivierung.Datei_Laden_Schicht") & ".csv"
    Archiv_Pfad = SmartTags("Datenbaustein_2_OEE.HMI.Archivierung.Pfad_Langzeit") & "\" & Dateiname 'SmartTags("File_" & fileChosen)
    Echtzeit_Pfad = SmartTags("Datenbaustein_2_OEE.HMI.Archivierung.Pfad_Echtzeit") & "\Qualitaet_Archiv0.csv" '"C:\Storage Card SD\Archiv_Qualitaet.csv"
    
    If Not fso.FileExists(Archiv_Pfad) Then 'Datei existiert nicht
        'Leere Datei laden
        Dateiname = "Qualitaet0_Leer.csv"
        Archiv_Pfad = SmartTags("Datenbaustein_2_OEE.HMI.Archivierung.Pfad_Echtzeit") & "\" & Dateiname
        ShowSystemAlarm "VBS_Laden_Archiv - Leere Datei laden."
        
    End If
    
    fso.CopyFile Archiv_Pfad, Echtzeit_Pfad, 1 'Datei kopieren
    
    Set f = fso.GetFile(Echtzeit_Pfad) 'Datei laden
    f.Attributes = 0 'Schreibschutz entfernen
    
    Set f = fso.OpenTextFile(Echtzeit_Pfad, 1) 'Datei öffnen
    
    Do While Not f.AtEndOfStream
        
        restore_entry = f.ReadLine 'Zeile lesen
        restore_fields = Split(restore_entry, ";") 'Spalten trennen (Trennzeichen ggf. anpassen)
        ShowSystemAlarm "VBS_Laden_Archiv - Spalte: " & restore_fields(0)
        
        If Not restore_fields(0) = """$RT_COUNT$""" Then 'Nicht die letzte Zeile
            date_time = Mid(restore_fields(1), 2, Len(restore_fields(1))-2) 'Datum und Uhrzeit holen
            ShowSystemAlarm "VBS_Laden_Archiv - DateTime: " & date_time
            
        Else 'Nix machen => ELSE entfernen
            ShowSystemAlarm "VBS_Laden_Archiv - Letzte: " & date_time
            
        End If
    Loop
    
    OpenAllLogs 'Alle Archive öffnen
    ShowSystemAlarm "VBS_Laden_Archiv - Logs geöffnet"
    
    If IsDate(date_time) = True Then
        Archivierungszeit = CDate(date_time) 'DateAdd("s", 0, CDate(date_time))
        
    Else
        ShowSystemAlarm "VBS_Laden_Archiv - Zeit konnte nicht gesetzt werden <" & date_time & ">"-
                
    End If

    ShowSystemAlarm "VBS_Laden_Archiv - Archiv von <" & Archiv_Pfad & "> nach <" & Echtzeit_Pfad &"> kopiert " & Archivierungszeit & "."
    
    Set fso = Nothing
    Set f = Nothing
    
    
End Sub
Dieses erhält von der SPS Pfad und Dateiname des Archivs, kopiert dieses in den Archiv-Ordner, lädt aus der kopierten Datei das Datum des letzten Eintrags und setzt in der Zeitachse der Kurvenanzeige die Externe Zeit auf diesen Wert.
Durch die Zeile
Code:
Archivierungszeit = CDate(date_time) 'DateAdd("s", 0, CDate(date_time))
erhalte ich aber die Fehlermeldung "Fehler bei Lesezugriff auf geschlossenes Archiv Qualitaet_Archiv".
Kommentiere ich die Zeile aus, erhalte ich keine Fehlermeldung. Ich verstehe da den Zusammenhang zwischen der externen Zeit und dem lesen der Archive nicht.

Außerdem werden keine Linien und Balken in der Kurve angezeigt, in der Tabelle sind die Varaiblen aber vorhanden.
Ich habe eigentlich alles so gemacht, wie es in der Anleitung von Siemens beschrieben ist.

Wo liegt hier das Problem, dass ich keine Kurven angezeigt bekomme bzw. dass die Zeit nicht übernommen wird?

Ich seh den Wald vor lauter Bäumen nicht mehr...

MfG Oma
 

Anhänge

  • 4.png
    4.png
    21,7 KB · Aufrufe: 8
  • 3.jpg
    3.jpg
    50,9 KB · Aufrufe: 7
  • 2.jpg
    2.jpg
    46,3 KB · Aufrufe: 7
  • 1.jpg
    1.jpg
    18,9 KB · Aufrufe: 6
Hi Alde_Oma,
Ich versuche auch die Werte aus einem Archiv in einer Diagramm zu zeigen.
Finde die Methode von Siemens undurchschaubar (
Bist du damit fertig geworden?
 
Das kann ich dir nach über 3 Jahren nicht mehr sagen. Da hat sich bei uns so viel geändert, und die Funktionen werden nicht mehr benötigt.
 
Zurück
Oben