WinCC Gestartetes Script beenden nach bestimmter Zeit? Display hängt sich auf

DennisBerger

Level-2
Beiträge
436
Reaktionspunkte
61
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
wir haben ein Script welches eine csv Datei nach jedem Produktionszyklus auf einen Server kopiert (Aufruf ca alle 2-3 Minuten)

Das Script prüft in der Mitte des Codes ob der Server vorhanden ist. (hab ich so zumindest unten verstanden)

Leider kommt es manchmal vor, dass die Verbindung zum Server unterbrochen ist und das Script hängt sich dann irgendwann auf, das heisst es werden keine Daten mehr erfasst und das Display wird sehr langsam. Es kam z.b. Fehlermeldung "Überlast Script"

Wie kann man das Script erweitern, dass z.b. nach 10 sekunden ohne Verbindung / Vorhandensein Server / der Datei das Script von alleine abbricht?

Idealerweise (optional) mit einer generierten Fehlermeldung "Serververbindung gestört" und ein Bit gesetzt wird (für die SPS)

Code:
'Deklaration 
Dim fs, Quelle, Ziel, Datei, Datum, Zeit 


M_Watchdog_Script = True


Datum = CStr(DatePart("d",Date)) & "." & CStr(DatePart("m",Date)) & "." & CStr(DatePart("yyyy",Date))  
Zeit = Hour(Now) & "h" 
Quelle = "\Storage Card SD\SPS\Daten\"
Ziel = "\\Servername\SPS\Daten\" & Datum & " " & Zeit & "\"




'Fehlerroutine
On Error Resume Next


'Create object - Objekt erstellen
Set fs = CreateObject("FileCtl.FileSystem")


'Überprüfe SD-Speicherkarte
If fs.dir ("\Storage Card SD\") = "" Then
    Call ShowSystemAlarm ("Keine Speicherkarte erkannt")
Else 


'Überprüfe Daten auf SD-Speicherkarte
If fs.dir ("\Storage Card SD\SPS\Daten\*.*") = "" Then
    Call ShowSystemAlarm ("Keine Daten auf Speicherkarte erkannt")
Else 



[B]'Überprüfe Server
If fs.dir ("\\Servername\SPS\Daten\") ="" Then
    Call ShowSystemAlarm ("Kein Server erkannt")
Else [/B]




'Unter-Verzeichnis erstellen
If fs.dir (Ziel) ="" Then
    fs.mkdir (Ziel)
End If


'Überprüfe erstelltes Verzeichnis
If fs.dir (Ziel) ="" Then
    Call ShowSystemAlarm ("Verzeichnis konnte nicht erstellt werden")    
End If


'Daten kopieren
Datei = fs.dir (Quelle & "*.csv")
If Datei <> "" Then
    While Datei <> ""
    fs.filecopy Quelle & Datei, Ziel & Datei
    Datei = fs.dir()
    Wend
End If


'Überprüfe kopierte Daten
If fs.dir (Ziel) ="" Then
    Call ShowSystemAlarm ("Daten konnten nicht kopiert werden")    
Else 
    
End If
End If
End If
End If


Set fs = Nothing


M_Watchdog_Script = False


End Sub

danke euch.
 
Zuletzt bearbeitet:
Du hast da ein Problem, dass du ändern kannst und eines, das du nicht ändern kannst.
Zu ändern geht die While-Wend-Schleife am Ende - da kannst du etwas machen.
Was du nicht ändern kannst ist ein laufender Befehl, der eigentlich in einen Timeout laufen würde/müßte - wie z.B. Copy. Hier bekommst du vom Befehl selbst (erstmal) keinen Fehler.
Was ich hier schon mal gemacht habe ist : ich habe in einem anderen Script das Vorhandensein des Servers abgefragt - also kann ich z.B. auf eine Datei zugreifen. Dieses Script wurde zyklisch ausgeführt. Bekam ich keinen Zugriff auf den Server dann wurde eine entsprechende Variable auf False gesetzt und damit der Aufruf des "großen" Scriptes verhindert. Vielleicht ein Ansatz für dich ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Dir Larry, das mit dem ersten Script hört sich gut an.
Das würde dann aber auch dauernd laufen wenn server nicht vorhanden ist?

und wie meinst du das:
Zu ändern geht die While-Wend-Schleife am Ende - da kannst du etwas machen.

Mit Scripten bin ich leider nicht so vertraut, deshalb bitte um Nachsicht.

Mein Kollege meinte eben, dass er vermutet, dass der Fehler für ihn bzw Ursache des Aufhängens von Display und Script schon am Anfang des Codes ist, bei der Serverabfrage,

oder was meinst du dazu , Du hast da sicherlich mehr Erfahrung als wir.
 
Zuletzt bearbeitet:
du musst diese kleine script nicht zyklisch aufrufen. unmittelbar vor dem großen reicht. oder so

Code:
[B]'Überprüfe Server
If fs.dir ("\\Servername\SPS\Daten\") ="" Then
    Call ShowSystemAlarm ("Kein Server erkannt")
[COLOR=#ff0000]    Exit Sub[/COLOR]    
Else [/B]
 
@Volker:
Trotzdem wird diese Abfrage das Script blockieren (bis zum Timeout von fs.Dir) wenn der Server nicht verfügbar ist ...
Aber trotzdem, so könnte der Ansatz auch aussehen - ich wollte das unabhängig davon machen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also sollen alle 2 bis 3 Minuten Daten auf den Server ausgelagert werden. Was, wenn dieser für längere Zeit ausfällt? Können die Daten ausreichend lange gepuffert werden? Muss ggfs der ProduktionsZyklus gestoppt werden?
Immer, wenn Daten ausgelagert werden sollen, muss der Server abgefragt werden - also "normalerweise" alle 2 bis 3 Minuten. Wenn der Server nicht erreichbar war, haben sich Daten angehäuft. Dann muss er häufiger abgefragt werden, damit die aufgestauten Daten schneller abgesetzt werden können, als wieder neue hinzukommen. Allerdings muss bei (noch) inaktivem Server unbedingt abgewartet werden, bis Ralfs "TimeOut von fs.dir" gekommen ist.

Gruss, Heinileini
 
Was ich mir hier als mögliche Lösung vorstellen könnte (das geht allerdings nicht so einfach mit einem Comfort-Panel) :
Deine Applikation speichert alle ihre Daten im Verzeichnis_1 lokal ab.
Ein anderer Service (also nicht deine Visualisierung) überprüft (z.B. im Stunden-Intervall) ob im Verzeichnis_1 Daten liegen UND ob eine Verbindung zum Server besteht. Wenn ja, dann werden die Daten auf den Server verschoben (also zum Server kopiert und aus Verzeichnis_1 gelöscht). Diese Vorgehensweise würde die Visu dann gar nicht mehr belasten ...

Gruß
Larry
 
@Volker:
Trotzdem wird diese Abfrage das Script blockieren (bis zum Timeout von fs.Dir) wenn der Server nicht verfügbar ist ...
Aber trotzdem, so könnte der Ansatz auch aussehen - ich wollte das unabhängig davon machen ...

Gruß
Larry
Da hast du natürlich recht. Aber hinter dem ersten fs.dir folgen 4 weitere. Die erspart man sich zumindest.
 
Zurück
Oben