WinCCFlex2008- Variablenarchivierung per Script (zum X.Mal...)

StGo

Level-1
Beiträge
84
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich verwende folgendes Script um an einem TP277 SPS-Prozesswerte auf einen USB-Stick zu sichern:

Code:
                            'ACHTUNG: WinCE!!!
'-----------------------------------------------------------------------------------------------------

'-----------------------------------------------------------------------------------------------------
'Globale Deklarationen/ Initialisierung
Dim DateiSystemObjekt
Dim DateiObjekt

Set DateiSystemObjekt = CreateObject("filectl.filesystem")
Set DateiObjekt = CreateObject("filectl.file")

'-----------------------------------------------------------------------------------------------------
'Abfrage Archivlaufwerk (USB-Stick) vorhanden?
Dim Archivlaufwerk
Archivlaufwerk = "STORAGE CARD USB"

If DateiSystemObjekt.dir(Archivlaufwerk) <> "" Then

    'ShowSystemAlarm "USB steckt"
    SmartTags("USBArchiv\USBStickOk") = True

Else
    'ShowSystemAlarm "USB nicht da"
    SmartTags("USBArchiv\USBStickOk") = False
    SmartTags("USBArchiv\USBErgebnis") = 2
    SmartTags("USBArchiv\USBTrigger") = 0
    Exit Sub

End If

'-----------------------------------------------------------------------------------------------------
'Dateiname des Tagesarchives aufbauen
Dim Dateiname
Dim ZeitSPS
ZeitSPS =CStr(SmartTags("Standardvariablen\DatumUhrzeit")) 'Rückgabeformat TT.MM.JJ HH:MM:SS

Dateiname = Mid(ZeitSPS,7,2) & "_" & Mid(ZeitSPS,4,2) & "_" & Left(ZeitSPS,2) & ".csv"

'Zeitstempel für Werteeintrag aufbauen
Dim Zeitstempel

Zeitstempel = Right(ZeitSPS,8)

'-----------------------------------------------------------------------------------------------------
'Tagesarchiv erstellen (falls nicht vorhanden) + beschreiben 
Dim PfadDatei
PfadDatei = Archivlaufwerk & "\" & Dateiname

Dim NamePW_1    'Name Prozesswert...
Dim PW_1        'Prozesswert...
Dim NamePW_2    'Name Prozesswert...
Dim PW_2        'Prozesswert...
Dim NamePW_3    'Name Prozesswert...
Dim PW_3        'Prozesswert...
Dim NamePW_4    'Name Prozesswert...
Dim PW_4        'Prozesswert...
Dim NamePW_5    'Name Prozesswert...
Dim PW_5        'Prozesswert...
Dim NamePW_6    'Name Prozesswert...
Dim PW_6        'Prozesswert...
Dim NamePW_7    'Name Prozesswert...
Dim PW_7        'Prozesswert...
Dim NamePW_8    'Name Prozesswert...
Dim PW_8        'Prozesswert...
Dim NamePW_9    'Name Prozesswert...
Dim PW_9        'Prozesswert...
Dim NamePW_10    'Name Prozesswert...
Dim PW_10        'Prozesswert...
Dim NamePW_11    'Name Prozesswert...
Dim PW_11        'Prozesswert...
Dim NamePW_12    'Name Prozesswert...
Dim PW_12        'Prozesswert...
Dim NamePW_13    'Name Prozesswert...
Dim PW_13        'Prozesswert...
Dim NamePW_14    'Name Prozesswert...
Dim PW_14        'Prozesswert...
Dim NamePW_15    'Name Prozesswert...
Dim PW_15        'Prozesswert...
Dim NamePW_16    'Name Prozesswert...
Dim PW_16        'Prozesswert...
Dim NamePW_17    'Name Prozesswert...
Dim PW_17        'Prozesswert...
Dim NamePW_18    'Name Prozesswert...
Dim PW_18        'Prozesswert...
Dim NamePW_19    'Name Prozesswert...
Dim PW_19        'Prozesswert...
Dim NamePW_20    'Name Prozesswert...
Dim PW_20        'Prozesswert...
Dim NamePW_21    'Name Prozesswert...
Dim PW_21        'Prozesswert...
Dim NamePW_22    'Name Prozesswert...
Dim PW_22        'Prozesswert...
Dim NamePW_23    'Name Prozesswert...
Dim PW_23        'Prozesswert...
Dim NamePW_24    'Name Prozesswert...
Dim PW_24        'Prozesswert...

NamePW_1 = "p_K_K_E"
PW_1 = SmartTags("Istwerte\p_K_K_E")
NamePW_2 = "p_K_K_A"
PW_2 = SmartTags("Istwerte\p_K_K_A")
NamePW_3 = "p_K_S"
PW_3 = SmartTags("Istwerte\p_K_S")
NamePW_4 = "p_K_SDW"
PW_4 = SmartTags("Istwerte\p_K_SDW")
NamePW_5 = "p_Oe_OeS"
PW_5 = SmartTags("Istwerte\p_Oe_OeS")
NamePW_6 = "p_Oe_K1"
PW_6 = SmartTags("Istwerte\p_Oe_K1")
NamePW_7 = "p_Oe_K2"
PW_7 = SmartTags("Istwerte\p_Oe_K2")
NamePW_8 = "p_Oe_K3"
PW_8 = SmartTags("Istwerte\p_Oe_K3")
NamePW_9 = "p_Oe_K4"
PW_9 = SmartTags("Istwerte\p_Oe_K4")
NamePW_10 = "t_K_K_E"
PW_10 = SmartTags("Istwerte\t_K_K_E")
NamePW_11 = "t_K_K_E"
PW_11 = SmartTags("Istwerte\t_K_K_E")
NamePW_12 = "t_K_K_A"
PW_12 = SmartTags("Istwerte\t_K_K_A")
NamePW_13 = "t_K_S"
PW_13 = SmartTags("Istwerte\t_K_S")
NamePW_14 = "t_K_V_A"
PW_14 = SmartTags("Istwerte\t_K_V_A")
NamePW_15 = "t_K_GK_A"
PW_15 = SmartTags("Istwerte\t_K_GK_A")
NamePW_16 = "Ist_HRV"
PW_16 = SmartTags("Istwerte\Ist_HRV")
NamePW_17 = "Soll_HRV"
PW_17 = SmartTags("Stellwerte\Soll_HRV")
NamePW_18 = "Ist_EV1"
PW_18 = SmartTags("Istwerte\Ist_EV1")
NamePW_19 = "Soll_EV1"
PW_19 = SmartTags("Stellwerte\Soll_EV1")
NamePW_20 = "Ist_EV2"
PW_20 = SmartTags("Istwerte\Ist_EV2")
NamePW_21 = "Soll_EV2"
PW_21 = SmartTags("Stellwerte\Soll_EV2")
NamePW_22 = "t_S_GK_E"
PW_22 = SmartTags("Istwerte\t_S_GK_E")
NamePW_23 = "t_S_GK_A"
PW_23 = SmartTags("Istwerte\t_S_GK_A")
NamePW_24 = "t_S_V_E"
PW_24 = SmartTags("Istwerte\t_S_V_A")

If DateiSystemObjekt.dir(PfadDatei) = "" Then 
'Datei nicht vorhanden --> Datei erstellen und Header schreiben
    DateiObjekt.open(PfadDatei), 2
    DateiObjekt.LinePrint "Uhrzeit" & ";" & _
                                NamePW_1 & ";" & _
                                NamePW_2 & ";" & _
                                NamePW_3 & ";" & _
                                NamePW_4 & ";" & _
                                NamePW_5 & ";" & _
                                NamePW_6 & ";" & _
                                NamePW_7 & ";" & _
                                NamePW_8 & ";" & _
                                NamePW_9 & ";" & _
                                NamePW_10 & ";" & _
                                NamePW_11 & ";" & _
                                NamePW_12 & ";" & _
                                NamePW_13 & ";" & _
                                NamePW_14 & ";" & _
                                NamePW_15 & ";" & _
                                NamePW_16 & ";" & _
                                NamePW_17 & ";" & _
                                NamePW_18 & ";" & _
                                NamePW_19 & ";" & _
                                NamePW_20 & ";" & _
                                NamePW_21 & ";" & _
                                NamePW_22 & ";" & _
                                NamePW_23 & ";" & _
                                NamePW_24
    DateiObjekt.Close
End If
'Datei erneut öffnen und Prozesswerte schreiben
    DateiObjekt.open(PfadDatei), 8
    DateiObjekt.LinePrint Zeitstempel & ";" & _
                                PW_1 & ";" & _
                                PW_2 & ";" & _
                                PW_3 & ";" & _
                                PW_4 & ";" & _
                                PW_5 & ";" & _
                                PW_6 & ";" & _
                                PW_7 & ";" & _
                                PW_8 & ";" & _
                                PW_9 & ";" & _
                                PW_10 & ";" & _
                                PW_11 & ";" & _
                                PW_12 & ";" & _
                                PW_13 & ";" & _
                                PW_14 & ";" & _
                                PW_15 & ";" & _
                                PW_16 & ";" & _
                                PW_17 & ";" & _
                                PW_18 & ";" & _
                                PW_19 & ";" & _
                                PW_20 & ";" & _
                                PW_21 & ";" & _
                                PW_22 & ";" & _
                                PW_23 & ";" & _
                                PW_24
    
    SmartTags("USBArchiv\USBErgebnis") = 1
    SmartTags("USBArchiv\USBTrigger") = 0
    
    DateiObjekt.Close

Ich teste das Script gerade heftig, d.h. 1 Sekunde nach der Antwort des Scriptes ("USBArchiv\Trigger" = 0) setze ich den Trigger per SPS wieder und starte damit das Script (Ereignis "Obergrenze überschritten"). Für die Triggervariable habe ich sogar ein sichtbares Ausgabefeld projektiert. Das Script läuft max. 5000 Zyklen, dann reagiert die Visu nicht mehr auf den Anstoß- Trigger bleibt high.

1. Fehlen mir ein paar Ideen um dei Fehler näher einzugrenzen.
2. Ist es eigentlich unnötig, die Datei nach jedem Schreiben zu schließen.
Könnte ich die Systembelastung dadurch verringern, dass ich die Geschichte in 3 Scripte aufteile?
Script 1- Prüfen ob die Datei vorhanden ist und öffnen bzw. erstellen und Headerzeile schreiben (einmalig, Datei bleibt offen!)
Script 2- Werte in die geöffnete Datei schreiben (wie sieht der Code dafür aus?)
Script 3- Datei schließen (einmalig z.B.beim Beenden der Runtime)

Danke für Eure Unterstützung
StGo
 
Nachdem ich nun einen Sack voll ON ERROR verteilt habe und dabei nichts sehe,
habe ich jetzt in die erste Skriptzeile eine SPS-Variable gelegt, die ich hochzähle, um zu überwachen ob das Script überhaupt startet, wenn es dann nicht funktioniert --> Skript wird nicht gestartet, WinCCflex verschläft das Ereignis- warum?
Trigger "Obergrenze überschritten" an einer mit 100ms zyklisch fortlaufend aktualisierten Variablen, die ich auch extra noch sichtbar in ein Bild gezogen habe.
Auch eine Verlängerung der Pausenzeit nach erfolgreicher Abarbeitung des Skripts bis zum erneuten Start auf 2s bringt keine Verbesserung...

Verwirrt
StGo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke JesperMP, so habe ich es ja auch gemacht. Aber ich kriege keinen Fehler, weil das Skript einfach nur nicht startet --> Aktuell läuft es seit 2 Stunden, das hatte ich schon lange nicht mehr (Bild mit der Triggervarablen angewählt).

StGo
 
Ein Test konnte sein das Du den Skript mit ein Button startet.
Nachdem das den Skript nicht mehr per Wertänderung über den Variabel ausgeführt wird, und du den Button betätigst, kommt es dann ein Systemmeldung wenn das Skript nicht ausgeführt wird ?
 
Das ist ziemlich mühselig, aktuell ist das Skript nach 10.840 Zyklen stehen geblieben. Ich archiviere momentan alle Meldungen, inkl. Systemmeldungen --> Kein Eintrag. Für mich sieht es wirklich so aus, als ob das Panel das Ereignis verschläft.

StGo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hatte jetzt nun endlich wieder Zeit, mich der Scriptproblematik zu widmen...
Habe zusätzlich eine einfache "Fangschaltung" programmiert, um zu überwachen ob mein Script aussteigt oder das Panel das Triggerereignis verschläft.
Fangschaltung:
2. (konventionelle) Aktion an der Triggervariable: "ErhoeheWert".
Ergebnis: TP277 sieht das Triggerereignis nicht --> Projektiert sind 132 Variablen, alle (bis auf die im und am Script) zyklisch bei Verwendung, Zeitraster 100ms für ca. die Hälfte der Variablen, sonst größer.
Nach erfolgreicher Verarbeitung des Scripts (Trigger Reset) warte ich in der SPS 1s, bis ich erneut triggere.

Kann es sein, das die quasi "interne" Änderung meines Triggers auf 0 im Script manchmal nicht bemerkt wird??? Ich stelle die Triggerei wohl mal um...

Gruß StGo
 
... ich könnte mir bei einem TP vorstellen, dass 132 Variablen in 1 Sekunde wegschreiben ganz schön knapp werden könnte ...
Zeitraster 100ms für die Variablen belastet das TP dann noch zusätzlich ganz schön ... Vielleicht schau du dir das noch mal an ...

Gruß
Larry
 
Nein, ich schreibe nur 24 Reals und in echt werde ich dann auch das Zeitraster vergrößern- die 132 Variablen sind der gesamte Variablenhaushalt, den ich mal angegeben habe, damit ihr eine Vorstellung zur Systembelastung habt.
Heute Nacht ist das System nach folgender Änderung durchgelaufen (gesamt 36.000 Einträge in 2 Archiven):
Als Rückmeldung "Skript beendet" erhöhe ich jetzt am Skriptende eine Variable. Das sehe ich in der SPS, nehme mein Triggerereignis zurück, warte 1s und triggere erneut. Vorher hatte ich das Triggerereignis im Skript zurückgesetzt, daraufhin hat das Panel hin- und wieder den neuen Trigger verschlafen.

Gruß
StGo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich könnte mir bei einem TP vorstellen, dass 132 Variablen in 1 Sekunde wegschreiben ganz schön knapp werden könnte ...
Zeitraster 100ms für die Variablen belastet das TP dann noch zusätzlich ganz schön ... Vielleicht schau du dir das noch mal an ...

Das ist - meiner Erfahrung nach - auch so.
Bei einer ähnlichen Anwendung hab ich mit den WinCC flex. Variablenarchiven gearbeitet.
Bei einem Umlaufarchiv kannst du per Script zum nächsten File schalten. Das vorherige wird dann per Script weggeschrieben.

Gruß
Dieter
 
Zurück
Oben