Moin nochmal,Hallo Nethiros.
Nicht durcheinander bringen:
Die Systemmeldungen kannst du zu Informations- oder Debug-Zwecken anzeigen lassen.
Der Rückgabewert von "SetRecipeTags" (bei dir mit NULL besetzt) dient zur Synchronisierung mit folgenden Systemfunktionen. Das Vorhandensein dieses Wertes zeigt dir, dass Siemens die Funktion anstösst, aber nicht automatisch auf das Resultat der vollständigen Bearbeitung wartet.
Bezogen auf deinen Fall:
Siemens lässt nur die Abarbeitung EINER Rezept-Systemfunktion GLEICHZEITIG zu. Wenn du -wie du es in Zeile 34 getan hast- "SetRecipeTags" ein zweites Mal aufrufst, dann erhälst du eine Systemmeldung "Eine Rezepturfunktion läuft bereits" (oder so ähnlich), und dieser zweite Aufruf wird NICHT bearbeitet!
Gruß, Fred
Was macht dein Skript, wenn die Funktion SetRecipeTags einmal nicht die "2" zurückliefert?Das Problem konnte durch eine While-Schleife gelöst werden, welche überprüft, wann die Funktion fertig abgearbeitet wurde
Das ist ein guter Punkt den du da ansprichst. Es stürzt wahrscheinlich ab. Vielleicht muss ich mir da noch eine Möglichkeit zum Behandeln von Exceptions ausdenken. Oder ist das gar kein Problem / gibt es eine elegante Lösung?Was macht dein Skript, wenn die Funktion SetRecipeTags einmal nicht die "2" zurückliefert?
Es stürzt nicht ab, es bleibt halt endlos in der Schleife. Andere Skripte können nicht mehr gestartet werden.Es stürzt wahrscheinlich ab.
Ja, habe abstürzen mit einer Endlosschleife gleichgesetzt. Aber du hast recht, es ist kein wirklicher "Absturz". Es kann dann kein anderes Skript mehr aufgerufen werden. Natürlich könnte man da jetzt irgendwas mit Timern machen oder drauf pokern, dass so ein Fall so selten eintritt, dass dies kein Problem ist. Oder gibt es da eine elegante Lösung dieses Problems?Es stürzt nicht ab, es bleibt halt endlos in der Schleife. Andere Skripte können nicht mehr gestartet werden.
oder drauf pokern, dass so ein Fall so selten eintritt
Ich kenne mich nicht sehr gut mit den Rückgabewerten von Funktionen in Skripten aus, aber man könnte doch ansonsten auch statt nur auf "2", auch auf die Zahl "12" abfragen (12 = Systemfunktion wurde nicht ausgeführt, weil ein Fehler aufgetreten ist). Die Frage ist, ob die Funktion selbst auch so Loopen kann, dass die 12 nie zurückgegeben wird. Wirkt für mich aber wie eine Lösung.
(...) Man kann im Skript auf die Fertigmeldung warten (solange werden aber keine anderen Skripte ausgeführt!) oder besser die Wertänderung der Fertigmeldevariable triggern.
Beispiel: alle Variablen einer Rezeptur lesen und auf Fertigmeldung warten:
Code:Dim rdStat ' Variablen aus SPS lesen mit Fertigmeldung GetDataRecordTagsFromPLC "meineRezeptur", SmartTags("Lesestatus") ' in Schleife auf Ende Var-Lesen warten Do rdStat = SmartTags("Lesestatus") Loop While (rdStat And 4) = 0 ' 4=fertig OK / 12=abgebrochen mit Fehler If rdStat = 4 Then ' gerade gelesene Variablen verarbeiten ' ... End If
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?