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



## Krumnix (24 Januar 2011)

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


----------



## Rainer Hönle (24 Januar 2011)

Ist der Merker statisch (also mit Gedächtnis) bzw. global oder nur innerhalb einer Funktion?
Wie wird auf den Merker reagiert?


----------



## JesperMP (24 Januar 2011)

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.


----------



## Krumnix (24 Januar 2011)

Wie immer bei sowas, darf ich nur die Visu anfassen. Von der SPS habe ich
kein Projekt zur Verfügung.


----------



## marlob (24 Januar 2011)

Krumnix schrieb:


> Wie immer bei sowas, darf ich nur die Visu anfassen. Von der SPS habe ich
> kein Projekt zur Verfügung.


Was ist mit Rainers Frage?


Rainer Hönle schrieb:


> Ist der Merker statisch (also mit Gedächtnis) bzw. global oder nur innerhalb einer Funktion?
> Wie wird auf den Merker reagiert?


----------



## JesperMP (24 Januar 2011)

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.


----------



## Krumnix (24 Januar 2011)

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.


```
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.


----------



## Larry Laffer (24 Januar 2011)

@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 :
	
	



```
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


----------



## Larry Laffer (24 Januar 2011)

Zusatz :
Wie speicherst du dir denn das "Am_Lesen" und wo weisst du es zu ?


----------



## Krumnix (24 Januar 2011)

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

Variable ist eine Interne Variable.


----------



## JesperMP (24 Januar 2011)

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 ?


----------



## JesperMP (24 Januar 2011)

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


 


> Trotzdem wird die Datei 2mal ausgelesen und der Inhalt 2mal verarbeitet.


 
Wird das Skript zu oft getriggert (wie in dein Kommentar) oder zu selten (wie in dein Überschrift) ?


----------



## Rainer Hönle (24 Januar 2011)

JesperMP schrieb:


> Wird das Skript zu oft getriggert (wie in dein Kommentar) oder zu selten (wie in dein Überschrift) ?



Ich sehe das so: die Überschrift ist Wunsch, der Kommentar ist Realität.


----------



## Koslovski (24 Januar 2011)

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


----------



## Krumnix (25 Januar 2011)

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.


----------



## Larry Laffer (25 Januar 2011)

Wie wäre es, wenn du dir im Script 1 ein Re-Entrance-Bit setzt ?
Also vielleicht so :

```
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


----------



## JesperMP (25 Januar 2011)

Kann diese "externen Programm" eventuell SQL ?

edit:
Oder noch besser, kann es OPC ?


----------



## Krumnix (25 Januar 2011)

Es kann OPC in der Zukunft. Es wird umprogrammiert.
Aber solange muss ich halt eine andere Lösung finden.
Leider ;(


----------



## JesperMP (25 Januar 2011)

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.


----------

