WinCC, VBS, 500ms Trigger, Abarbeitung nur einmal, auch wenn Trigger 2-3 Mal kommt

Krumnix

Level-3
Beiträge
1.454
Reaktionspunkte
190
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Hab ein VB-Script, das alle 500ms in einem Ordner auf der Festplatte nach
einer Datei sucht. Ist diese vorhanden, soll sie ausgelesen werden und
dann gelöscht werden.

Das Problem ist, das in den 500ms das ganze noch nicht erledigt ist, und
der Trigger wieder startet.
So wird die Datei 2mal ausgelesen, bis sie gelöscht wurde.

Wie kann ich es erreichen, das Laufzeittechnisch das ganze so möglich ist,
dass das Script das im Trigger-Script aufgerufen wird, nur einmal startet,
bis die Datei gelöscht wurde und erst dann wieder frei gibt.

Einen "Merker", der beim Aufruf des Trigger-Scripts gesetzt wird, wenn die
Datei gefunden wurde und erst rückgesetzt wird, wenn das 2. Script zum
Auslesen und löschen fertig ist, funktioniert leider nicht.
Irgendwie wird die Datei doch 2mal gelesen.

Irgendwer eine Idee?
Danke
 
Ist der Merker statisch (also mit Gedächtnis) bzw. global oder nur innerhalb einer Funktion?
Wie wird auf den Merker reagiert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
VBS ist nicht geeignet zyklische Aufgaben in schnellen takt zu bearbeiten.
Es gibt ein Puffer von 20 Skripte. Wenn diese Puffer überlauft ist es schluss.

Du konntest eventuell die Verknüpfung das es schon gestartet ist, in eine weitere Skript steuern. Dann rufts du von diese Skript das Skript mit lesen und löschen.

Besser wäre wenn du z.b. von der SPS steuert das das Skript nur einmal gerufen wird, und das Skript meldet zurück das es fertig ist. Erst dann kann es wieder gestartet werden. Dann kannst du auch eine Zeitüberwachung programmieren, und evtl. ein Störmeldung ausgeben wenn etwas nicht klappt mit den Skript.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese Funktionalität sollte möglich sein.
Einen "Merker", der beim Aufruf des Trigger-Scripts gesetzt wird, wenn die Datei gefunden wurde und erst rückgesetzt wird, wenn das 2. Script zum Auslesen und löschen fertig ist, funktioniert leider nicht.
Irgendwie wird die Datei doch 2mal gelesen.
Zeig uns dein Code.
 
Der "Merker" ist in der Variablen-Liste im WinCC erstellt worden.
Jedes Script hat also Zugriff drauf.

Das Startscript ist mit einem Trigger von 500ms versehn.
In diesem wird einfach nur überrpüft, ob eine Datei vorhanden ist.

PHP:
If Neue_Datei then
--> Versuchsweise ohne Erfolg: If Not Am_Lesen then
Datei_Auslesen()
--> End If
End If

Das 2. Script, das dann aufgerufen wird, liest die Datei ein und löscht sie dann.
Beim Start des Script steht in der ersten Reihe
Am_Lesen = true

Am Ende des Scripts steht
Am_Lesen = false

Das wars schon.
Trotzdem wird die Datei 2mal ausgelesen und der Inhalt 2mal verarbeitet.
Ist zwar der Gleiche, aber stört im Prozess schon.
 
@Krumnix:
Was ist denn genau der Trigger für dein Script ?
Bool-Variable und die "bei Wert-Änderung" ?
Hast du berücksichtigt, dass eine Wertändrung die Ändereung der Variablen von 0 - > 1 und genauso auch das Rückfallen von 1 -> 0 ist ?
Wenn nicht dann schreib doch in den Kopf des Scriptes einfach mal mit rein, dass es nur bearbeitet werden soll wenn der Trigger = true ist ... also vielleicht so :
Code:
if myTrigger then
 
 ... hier dein Code
 
 
end if
... ganz sauber werden wirst du so aber auch nicht. Der Vorschlag von Jesper ist hier schon den zuverlässigste Weg ... (es geht halt nichts über einen Handshake)

Gruß
Larry
 
Trigger für das Script sind 500ms. Also ein Zeitwert.
Keine Variable, keine Änderung. Wird einfach alle 500ms aufgerufen.

Variable ist eine Interne Variable.
 
Obwohl es nicht eine Antwort auf das Problem ist, glaube ich das Problem liegt vielleicht bei die 500 ms.
VBS mit zugriff auf Dateien geht nicht bei so schnellen Takt.

Warum muss es jede 500 ms aktualisiert werden ? Ist die Prozess so schnell ?
Was passiert wenn du das Skript jeden 5 sekunden triggert ?
 
Also ich würde es so machen:

Im 500ms-getriggerten Startscript wird zuerst ausgewertet, ob "Am_Lesen" gesetzt ist.

Ist dies der Fall -> Startscript verlassen, ohne noch irgendetwas anderes abzufragen oder so.

Wenn "Am_Lesen" nicht gesetzt ist, wird "Am_Lesen" gesetzt.

Danach erfolgt die Abfrage, ob die Datei vorhanden ist.

Wenn Nein -> "Am_Lesen" zurücksetzen und Script verlassen.

Wenn Ja -> 2.Script zum Auslesen aufrufen, Datei auslesen, löschen und dann "Am_Lesen" zurücksetzen.

So müsste es klappen.

Gruß
Koslovski
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wunsch: Eine Datei erkennen, die alle 2sec in einen Ordner neu erstellt wird von einem externen Programm (Script Nummer 1 mit Trigger 500ms).
Datei auslesen und Inhalt im WinCC verarbeiten (Script Nr.2 ohne Trigger, angestartet vom 1. Script).
Nach auslesen Datei löschen (im 2. Script beinhaltet), damit nur eine Datei max in dem Ordner ist.
Script soll Datei nur einmal auslesen und dann löschen.

Realität: Datei wird erkannt. Script 1 startet, Script 2 startet. Inhalt wird gelesen.
Datei wird wieder erkannt, wieder ausgelesen. Auch mit Variable.
Problem ist sicher, das Windoof die Datei noch auf dem Filesystem als Vorhanden meldet, obwohl das Script schon einmal durchgelaufen ist.
Die Datei wird zwar gelöscht, oder ist irgendwo in Windoof wohl noch soweit vorhanden, dass das Script die Datei ein 2. Mal auslesen kann.
Es ist aber immer genau 2 Mal.
Nicht 1 Mal und dann 3 Mal und dann 2 Mal und dann 4 Mal, sondern genau 2 Mal.
 
Wie wäre es, wenn du dir im Script 1 ein Re-Entrance-Bit setzt ?
Also vielleicht so :
Code:
if Script_1_aktiv then exit sub
Script_1_aktiv = true 
 
// führe deine Aktionen aus
 
Script_1_aktiv = false
... wobei mich hier dieses "genau 2 Mal" skeptisch macht. Hat dein Timer-Trigger vielleicht doch 2 Flanken ?

Gruß
Larry
 
Irgendwie gibt es ein Timing-Problem. Und unser Verdacht ist das es liegt daran das das Windows Filesystem langsahmer aktualisert als die gewünschte 500 ms. Oder VBS. Oder beide.

Nur als Versuch, kannst du probieren die 500 ms auf 1500 ms zu erhöhen ?
Es ist schneller als die 2 s Schreibzyklus, somit das keine Werte verlohren gehen sollten.
 
Zurück
Oben