Skript Ablauf endet in "20015: Überlast"

daloeff

Level-1
Beiträge
59
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jungs,

habe ein Skript geschrieben, dass je nach Entscheidung der Anlage "IO" oder "NIO" Teil bestimmte Funktionen ausführt. Es werden gewisse Temperaturen und Zeiten mithilfe von Rezepturen aus der CPU geholt und anschließend als csv File exportiert. Nach dem Export wird die File auf einen Netzwerk Server kopiert. Dieses Skript wird automatisch mit Wertänderung gestartet. Nun hat mir der Kunder erzählt, dass beim Betätigen der Übersichtstaste (Beim Klick wird ein Skript ausgeführt, dass je nach Werkzeug die zugehörige Seite aufruft) während eines Zykluses die Meldung 20015: Überlast Skript <Uebersicht> wird verworfen.

Ich muss mir noch genauere Infos holen aber mein erster Verdacht währe, dass genau an diesem Zeitpunkt, wo das Skript für die Prozessverfolgung ausgeführt wird, die Übersichtstaste betätigt wurde. Da das Skript für die Prozessverfolgung aufgrund 3 "delay" (http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW) Funktionen ca. 6 sek dauert, könnte es doch sein, dass aufgrund der verwendeten Loop Funktion die anderen Skripte blockiert werden -> Aber laut Hilfe von Wincc Flex müssten diese Skripte doch in eine Warteschlange gereiht werden und nacheinander abgearbeitet werden.

Laut Leistungsdaten des MP377 müsste es möglich sein bis zu 20 Skripte einzureihen. Hab mir auch schon überlegt die delay funktionen zu entfernen und das Skript fortzusetzen wenn die Rückgabevariablen der Systemfunktionen die korrekten Statuse liefern - weiß aber nicht so recht wie ich das realisieren könnte...

Verwendet wird ein MP377

Evt hat jemand eine Lösung und bedanke mich schon jetzt für Eure Hilfe!

Hab mal einen kleinen Auszug vom Skript mitgeschickt:


Dim status, Pfad, Teil, fso, t_root_path, File, f, fs, t_net_path_PICOS, t_net_path_Server, result, File_ext, seite

If x_skript_fehler Then 'wenn Resum Skript ein ist wird bei einem Fehler das Skript weiter abgearbeitet
On Error Resume Next
End If

GetDataRecordFromPLC "Prozessdatenverfolgung", 1, hmiOverwriteAlways, hmiOff, Null ' Werte von Steuerung holen

x_nWait = 2 ' 2s warten
Delay(x_nWait)

If SmartTags("DB_Allgemein.Aktuell_WKZ_Anwahl") = 1 Then ' Je nach Werkzeug Pfad festlegen
Pfad = "SMART Tuer links\"
seite = "_L_"
ElseIf SmartTags("DB_Allgemein.Aktuell_WKZ_Anwahl") = 2 Then
Pfad = "SMART Tuer rechts\"
seite = "_R_"
End If

If SmartTags("Teil_iO") = True Then ' Teile auswertung
Teil = "IO"
ElseIf SmartTags("Teil_NiO") = True Then
Teil = "NIO"
Else
ShowSystemAlarm "Prozessdatenverfolgung fehlgeschlagen, Teil wurde vom System nicht beurteilt"
End If

File = Teil & seite & SmartTags("DB_Daten_sichern.Daten.Vortlaufende_Nr") & ".csv" ' Dateiname festlegen
File_ext = Teil & seite & SmartTags("DB_Daten_sichern.Daten.Vortlaufende_Nr")

t_root_path = Pfad & Teil & "\" ' Pfad zusammensetzen

t_net_path_PICOS = SmartTags("DB_Ablagepfade.PICOS_Name") & SmartTags("DB_Ablagepfade.Pfad1") ' Netzwerk pfad definieren
t_net_path_Server = SmartTags("DB_Ablagepfade.Server_Name") & SmartTags("DB_Ablagepfade.Pfad2")

Set fs = CreateObject("filectl.filesystem") ' Filesystem anlegen

If SmartTags("DB_Ablagepfade.Ablage_PICOS_aktiv") Then
If fs.dir(t_net_path_PICOS & Pfad) = "" Then fs.mkdir(t_net_path_PICOS & Pfad) ' Prüfen ob Ordner vorhanden ist ansonsten anlegen
If fs.dir(t_net_path_PICOS & Pfad & Teil & "\") = "" Then fs.mkdir(t_net_path_PICOS & Pfad & Teil & "\")
End If

If SmartTags("DB_Ablagepfade.Ablage_Server_aktiv") Then
If fs.dir(t_net_path_Server & Pfad) = "" Then fs.mkdir(t_net_path_Server & Pfad) ' Prüfen ob Ordner vorhanden ist ansonsten anlegen
If fs.dir(t_net_path_Server & Pfad & Teil & "\") = "" Then fs.mkdir(t_net_path_Server & Pfad & Teil & "\")
End If

ExportDataRecords "Prozessdatenverfolgung", 1, "\Storage Card MMC\" & t_root_path & File, hmiOverwriteAlways , hmiOff, SmartTags("x_ProzessdatenExport") ' Werte in Datei exportieren

x_nWait = 2
Delay(x_nWait)

If SmartTags("DB_Ablagepfade.Ablage_PICOS_aktiv") Then
If fs.dir(t_net_path_PICOS & t_root_path & File) = "" Then ' Prüfen ob die File schon vorhanden ist
fs.filecopy "\Storage Card MMC\" & t_root_path & File, t_net_path_PICOS & t_root_path & File
ShowSystemAlarm "Prozessdaten erfolgreich auf den Server (PICOS) kopiert"
Else
fs.kill(t_net_path_PICOS & t_root_path & File) ' Wenn ja dann die alte löschen
fs.filecopy "\Storage Card MMC\" & t_root_path & File, t_net_path_PICOS & t_root_path & File
ShowSystemAlarm "Prozessdaten auf dem Server (PICOS) schon vorhanden, Daten werden überschrieben"
End If
End If

If SmartTags("DB_Ablagepfade.Ablage_Server_aktiv") Then
If fs.dir(t_net_path_Server & t_root_path & File) = "" Then ' Prüfen ob die File schon vorhanden ist
fs.filecopy "\Storage Card MMC\" & t_root_path & File, t_net_path_Server & t_root_path & File
ShowSystemAlarm "Prozessdaten erfolgreich auf den Server (Boshoku) kopiert"
Else
fs.kill(t_net_path_Server & t_root_path & File) ' Wenn ja dann die alte löschen
fs.filecopy "\Storage Card MMC\" & t_root_path & File, t_net_path_Server & t_root_path & File
ShowSystemAlarm "Prozessdaten auf dem Server (Boshoku) schon vorhanden, Daten werden überschrieben"
End If
End If

If SmartTags("Teil_NiO") = True Then ' Wenn Teil NIO ist

StopLogging hmiAlarmLog,"Teilefehler" ' Meldearchiv exportieren
CloseAllLogs
ArchiveLogFile hmiAlarmLog, "Teilefehler","\Storage Card MMC\AlarmLog\Teilefehler\", hmiCopy
OpenAllLogs
StartLogging hmiAlarmLog, "Teilefehler"

x_nWait = 2
Delay(x_nWait)

result = fs.Dir("\Storage Card MMC\AlarmLog\Teilefehler\*.csv") ' Archiv suchen

fs.SetAttr "\Storage Card MMC\AlarmLog\Teilefehler\" & result ,0 ' Attribute auf 0 setzen

If SmartTags("DB_Ablagepfade.Ablage_PICOS_aktiv") Then
If fs.dir(t_net_path_PICOS & t_root_path & File_ext & "_Meldung.csv") = "" Then ' Ist das Archiv schon vorhanden
fs.filecopy "\Storage Card MMC\AlarmLog\Teilefehler\" & result, t_net_path_PICOS & t_root_path & File_ext & "_Meldung.csv"
Else
fs.kill(t_net_path_PICOS & t_root_path & File_ext & "_Meldung.csv") ' dann löschen
fs.filecopy "\Storage Card MMC\AlarmLog\Teilefehler\" & result, t_net_path_PICOS & t_root_path & File_ext & "_Meldung.csv"
End If
End If

If SmartTags("DB_Ablagepfade.Ablage_Server_aktiv") Then
If fs.dir(t_net_path_Server & t_root_path & File_ext & "_Meldung.csv") = "" Then ' Ist das Archiv schon vorhanden
fs.filecopy "\Storage Card MMC\AlarmLog\Teilefehler\" & result, t_net_path_Server & t_root_path & File_ext & "_Meldung.csv"
Else
fs.kill(t_net_path_Server & t_root_path & File_ext & "_Meldung.csv") ' dann löschen
fs.filecopy "\Storage Card MMC\AlarmLog\Teilefehler\" & result, t_net_path_Server & t_root_path & File_ext & "_Meldung.csv"
End If
End If

fs.kill "\Storage Card MMC\AlarmLog\Teilefehler\*.csv" ' Archiv auf MMC Karte löschen

End If

Set fs = Nothing ' Filesystem zurücksetzen

x_nWait = 2
Delay(x_nWait)

SmartTags("DB_Daten_sichern.Befehle_an_HMI.Sichere_Div") = 0 ' Steuerungsvariabel zurücksetzen
 
jetzt mal ohne genauer zu schauen, aber du hast da sehr viele Wartezeiten drin
beim überschlagen 8 sekunden, vielleicht steigt deshalb dein Script aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie gesagt habe diese eingebaut um die Funktionen zuvor abzuschließen. Ist keine elegante Lösung, wäre aber für jeden Verbesserungsvorschlag dankbar.
Hat bis jetzt auch geklappt, der Fehler war bei uns noch nicht bekannt.

Aber nur um es zu verstehen:
Ist es möglich, dass die Meldung Überlast vom Panel aufgrund der delay Funktion ausgelößt wird, da sie sich gerade in einer Schleife befindet?
Könnte die Zeit auch auf 1 sek verringern...
 
Das Skript wird 1x pro Zyklus ausgeführt und wird mit den Verzögerungen etwa auf die von dir erwähnten 8 sek kommen. Also die csv File wird lediglich auf den Server kopiert, wobei die File nicht größer als 8KB ist. Aber ohne die delay Funktion läuft es nicht, da die Systemfunktionen einiges an Zeit benötigt bis sie fertig ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
die Überlast-Meldung kommt, weil deine Script-Abarbeitung kein weiteres Script mehr aufnehmen kann (also die 20 laufenden Scripte schon drin sind im Puffer).
Wenn du in einem Script ein Delay in genannter Weise erzeugst dann blockierst du dein System (und damit alle anderen Scripte) zusätzlich. Es kann immer nur ein Script auf einmal laufen. Das System ist also nicht mehr reaktionsfähig.
Kopieren auf den Server ist dann eine weitere "tolle" Sache. Es kann sein, dass dein Server-Zugriff "sau-schlecht" ist und dein Kopiervorgang sehr viel länger dauert, wie er lokal dauern würde.
Du siehst, du hast da alle Möglichkeiten eingebaut, die man sich so einhandeln kann. Ich würde tatsächlich hingehen und das Konzept überdenken.
Wofür z.B. das Delay ? Das läßt sich ganz sicher auch "schön" lösen.
Wofür das Kopieren in dem Script auf den Server ? Ich kenne jetzt nicht die Möglichkeiten des MP's ... aber kann du das Kopieren nicht als Aufgabe an das Betriebssystem übergeben ?

Gruß
Larry
 
Danke erstmal für die Antworten!

Leider kann ich mir hier beim besten Willen nicht vorstellen wieso der Puffer voll sein könnte, da sonst keine Skripte ausgeführt werden.

Ich würde gerne die delay Funktion rausnehmen, da sie mir selbst nicht gefällt.
Am Anfag lese ich die Rezpturwerte der Steuerung aus, da diese Funktion etwas Zeit benötigt habe ich eine delay Funktion hinzugefügt bevor ich mit dem Skript fortfahre. Gibt es hier die Möglichkeit mit dem Rückgabewert der Funktion GetDataRecordFromPLC etwas zu machen damit erst bei erfolgreichem einlesen fortgefahren wird?

Wie meinst du das Larry, die Aufgabe an das Betriebssystem übergeben? z.B.: eine Batchdatei schreiben die den Kopiervorgang im WinCE übernimmt und diese einfach nach der Generierung der csv File starten?!
 
GetDataRecordfromPLC ist doch eine Rezepturfunktion und hat folgende Parameter

Code:
GetDataRecordfromPLC [COLOR="#008000"]Rezepturnummer/-name[/COLOR] , [COLOR="#008000"]Datensatznummer/-name[/COLOR] , [COLOR="#008000"]überschreiben[/COLOR] , [COLOR="#008000"]Statusmeldung ausgeben[/COLOR] , [COLOR="#008000"]Bearbeitungsstatus (Ausgabe optional)[/COLOR]

Bearbeitungsstatus kannst du auswerten
2 = aktiv
4 = erfolgreich beendet
12 = Fehler
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Könnte man hier gleich wie bei der delay Funktion eine Loop Schleife verwenden und anstatt mit der Systemzeit eine Wartefunktion mit dem Bearbeitungsstatus der Rezepturfunktion basteln?

Vlt so:
Dim i

GetDataRecordFromPLC "Prozessdatenverfolgung", 1, hmiOverwriteAlways, hmiOff, Rezeptstatus

Do
If i = 0 Then
i = i + 1
End If

Loop Until Rezeptstatus => 4
 
hier mal vom PN/DP geklaut

Code:
Dim wrStat, rdStat

' Variable in SPS schreiben mit Fertigmeldung
SetDataRecordTagsToPLC "WriteVar", SmartTags("Protokoll\Schreibstatus")
' in Schleife auf Ende Var-Schreiben warten
Do
    wrStat = SmartTags("Protokoll\Schreibstatus")
Loop While (wrStat And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

' wenn Schreiben ohne Fehler, dann Antwort (Protokoll-Datensatz) aus SPS lesen
If wrStat = 4 Then
    ' Variablen aus SPS lesen mit Fertigmeldung
    GetDataRecordTagsFromPLC "Schichtprotokoll", SmartTags("Protokoll\Lesestatus")
    ' in Schleife auf Ende Var-Lesen warten
    Do
        rdStat = SmartTags("Protokoll\Lesestatus")
    Loop While (rdStat And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler

    If rdStat = 4 Then
        ' gerade gelesene Variablen verarbeiten
        ' ...
    End If
End If

If wrStat <> 4 Or rdStat <> 4 Then
    ShowSystemAlarm "Fehler beim Lesen der Protokollwerte!"
End If
 
Genau auf das wollt ich raus, Danke! und auch an PN/DP!

Das Kopieren der File auf den Server ist noch offen, wäre es möglich dies mit, sagen wir mal einer Batch Datei zu realisieren die via Skript im Hintergrund ausgeführt wird? Oder gebe es eine bessere Lösung?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Kopieren der File auf den Server ist noch offen, wäre es möglich dies mit, sagen wir mal einer Batch Datei zu realisieren die via Skript im Hintergrund ausgeführt wird?

So hatte ich das gedacht ... ;) Immer vorausgesetzt das MP kann das ... da bin ich im Moment "ein wenig" aussen vor - ich könnte es mir aber vorstellen.
Ansonsten müßte der Kopiervorgang auch nicht jedes Mal stattfinden sondern vielleicht nur alle 30 Minuten. Das könntest du dann (wenn das andere nicht geht) mit dem Flex-eigenen Aufgabenplaner machen.

Du hast vielleicht nicht 20 verschiedene Scripte - du kannst aber auch den Aufruf eines Scriptes 20 Mal drin stehen haben.
Ich denke mal, dass kommt schon hin ... (mit so etwas habe ich mich auch schon herum geärgert ... 8))

Gruß
Larry
 
Meiner Meinung nach ist so ein MP nicht das richtige Gerät für die Anwendung,
ich finde so etwas gehört auf ein PC. Dann könnte man auch Sachen aus der
Runtime auslagern.
 
Hier muss ich dir recht geben rostiger Nagel, das MP wurde nicht für solch einen Einsatzzweck ausgelegt. Jedoch kann ich jetzt keine Komponenten mehr tauschen und muss das beste daraus machen.

Das Script wird bei mir nach Überschreiten des Grenzwertes eines Integer Wertes gestartet. Ich setze einen Wert auf 99, im HMI habe ich diese Variable mit einem Grenzwert von 50 angegeben. Im Script wird die Variabel in der letzten Zeile wieder auf 0 zurückgesetzt -> Kann es sein, dass ich die Variabel in der ersten Zeile des Scripts zurücksetzen muss, da ansonsten das Script die ganze Zeit aufgerufen wird?
Wenn ich das Script mit Wertänderung der Variabel aufrufe, wird es doch ein 2tes mal beim 0 setzen der Variabel aufgerufen oder bin jetzt aufm Holzweg?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Setze vielleicht Sicherheitshalber vor dem Aufruf und außerhalb des Scriptes die Variable
auf '0'. Das kannst du ja einfach mit einer Systemfunktionen ausführen. Es ist ja möglich
Reihenfolgen bei den Funktionsaufrufen festzulegen.

Bei Wertänderung einer Variablen und die gleiche im Script noch einmal zu bearbeiten wird
die von dir angedachten Schwierigkeiten machen.
 
Zurück
Oben