# WinCC flexible 2008 SP2: Skriptausführung Problem



## Grimsey (9 Mai 2011)

Hallo zusammen,

ich habe ein Phänomen bei der Ausführung eines Skriptes und komme nun absolut nicht mehr weiter.
Über das Skript kopiere ich mir externe Variablen auf interne Variablen um. Das Skript funktioniert prima, es sind auch nur 8 einfache Anweisungen.
Nun möchte ich das Skript ausführen lassen, wenn die Auswahl eines symbolischen E/A-Feldes (drop-down) geändert wurde. Ich habe die Ausführung daher an das Ereignis "Ändern" angebunden. Zur Laufzeit tritt das Phänomen auf, dass die ausgelesenen Variablen nicht beim 1. Ändern, sondern erst beim 2.Ändern aktualisiert werden. Ändere ich die Auswahl des E/A-Feldes und führe das Skript anschließend über eine separate Taste, funktioniert es auch prima.

Hat jemand eine Idee, was ich da noch falsch mache???

Danke für Eure Hilfe!


----------



## rostiger Nagel (9 Mai 2011)

Das ganze ist nicht ganz umproblematisch, wie
hast du die Aktualisierung und leseart der Variabel
eingestellt. 
Vlt. ist es besser das du die Variabeln oder die 
Adressen Multiplext. Ich glaube es geht dir um das
PT sparen, da musst du deinen Variabel Haushalt 
schon geschickt anlegen.


----------



## Larry Laffer (9 Mai 2011)

Hallo,
ich könnte mir das, was du schreibst auch problematisch vorstellen.
Warum machst du es denn nicht über die Wertänderung der an das EA_Feld angebundenen Variablen ? Das geht dann natürlich nur, wenn es eine Steuerungs-Variable ist - aber das wäre m.E. ein geringer Preis für die Funktion.
((( so mache ich das und da funktioniert das dann auch )))

Gruß
Larry


----------



## Grimsey (9 Mai 2011)

Hallo zusammen,

danke für Eure Hinweise.
Es ist schon richtig das ich diese Funktion zum Einsparen von PT nutze. Die Variablen, die ich auf interne Variablen umkopiere, sind bereits Multiplexvariablen. Ich benötige diese aber aus anderen Gründen als interne Variablen. Das tut im Grunde ja auch nichts zur Sache. Das Problem ist ja, dass das Skript scheinbar nicht zu den von mir festgelegten Zeitpunkten ausgeführt wird. (Auswahl im E/A-Feld ändern und Skript über Button ausführen => prima, hänge ich das Skript gleich ans Ereignis "Ändern" des E/A-Feldes geht es nicht).

@Larry: genau das habe ich auch schon probiert. Leider bleibt da das Phänomen bestehen...ich wähle einen anderen Eintrag aus dem E/A-Feld, die Variable ändert sich, das Skript wird ausgeführt und ich hab aber die Werte vom vorangegangenen Eintrag in der Anzeige und nicht die des aktuellen.
Betätige ich anschließend meinen Button zum händischen Ausführen des Skriptes werden mir die korrekten Werte angezeigt.

Anmerkung: hab gerade in Deinem Beitrag gelesen das es eine Steuerungsvariable sein muss...das ist bei mir "noch" nicht der Fall...werde es gleich mal testen. Danke!

P.S.: warum geht das nicht mit einer internen Variablen?


----------



## Larry Laffer (9 Mai 2011)

Grimsey schrieb:


> warum geht das nicht mit einer internen Variablen?


... weil Siemens das so festgelegt hat um dadurch zu verhindern, das man sich durch Unachtsamkeit ein Zirkel-Aufrufen von Scripten zusammenbaut aus dem man dann nicht mehr herauskommt (der Fachausdruck wäre dann hier "Loop-Breaker").

Mit einer Steuerungs-Variablen sollte es dann funktionieren ...

Gruß
Larry


----------



## rostiger Nagel (9 Mai 2011)

Die haben das mit den internen Variabeln gesperrt, weil
du dadurch ein Scriptfeuerwerk auslösen könntest
was nie endet. Durch die externen hast du da immer
nich den aktualiesierungstakt von 100ms drin.


----------



## Grimsey (9 Mai 2011)

Ah ok danke! Werds mir mal merken für die Zukunft


----------



## Grimsey (9 Mai 2011)

kleiner Nachtrag:
nach dem ich die Variable von intern auf Steuerungsvariable umgestellt habe, hat es leider Gottes immer noch nicht funktioniert. Zur Kontrolle habe ich mir im Skript noch ein Bit gesetzt, welches eine Schaltfläche animiert. Das hat soweit funktioniert. Nach Änderung der Auswahl im symbolischen E/A-Feld wurde die Schaltfläche korrekt animiert, ergo wurde das Skript korrekt ausgeführt.

Meine eigentlichen Variablen wurden jedoch nach wie vor nicht korrekt aktualisiert. Auch ein experimentieren mit den Aktualisierungsmethoden der Variablen brachte keinen Erfolg.

Ich habe dann nach etwas überlegen noch folgendes ausprobiert:
im Skript habe ich mir ganz zu Beginn eine Do...While-Schleife gebaut die bis 100.000 hochzählt. Erst danach kopiere ich die externen Variablen auf die internen um. Ausprobiert und siehe da: es funktioniert!

Dann bin ich jetzt noch einen Schritt weiter gegangen und habe die Steuerungsvariable, die an die symbolische E/A-Liste gebunden war, wieder auf die interne Variable umgestellt...und auch das funktioniert! Das Skript wird bei Wertänderung der internen Variable auch korrekt ausgeführt. Schlussendlich habe ich die Ausführung des Skriptes nun noch wieder an das Ereignis "Änderung" des symbolischen E/A-Feldes gebunden und auch hier zeigt sich nun ein korrektes Verhalten.

Für mich stellt sich die Ursache dieses "Phänomen" nun so dar, dass zwar die Adressen meiner Multiplexvariablen geändert wurden, dies wohl aber nicht so schnell ablief wie das Ausführen des Skriptes, welches genau diese Variablen auf interne Variablen umkopiert. Ergo wurden mir immer die falschen alten Werte angezeigt und nicht die aktuellen. Durch die Einbindung der Do...While-Schleife vergeht bis zum Umkopieren mehr Zeit und die Variablen können dann korrekt ausgelesen werden.


----------



## rostiger Nagel (9 Mai 2011)

Es kann gut sein (was ich aber nicht belegen kann) das die Variabeln, bei
Einen relativ kurzen oder schnellen Script nicht zur Steuerung aktuallisiert
werden und außerhalb des schipptes eine andere Instanz, die im Script
geänderten Werten mit Steuerungswerten wieder platt macht. 

Ich mache es zb so das ich im Script einen multiplexzeiger Stelle, dann eine 
Zeit warte (bis die Werte aktualisiert werden) und dann den Zeiger auf den
nächsten wert Stelle, wieder warte usw. 

Für die Zeit Funktion würde ich die systemzeit nutzen, so hast du eine defenierte
Zeit und musst nicht mit den schleifen schätzen. 


```
'Timer 100 endspricht 1sec.
Dim StartTime, StopTime, i
StartTime = Now
StopTime = StartTime + DelayTime / 24 / 360000
Do
Loop Until Now >= StopTime
```


----------



## Grimsey (9 Mai 2011)

Ja das ist gut möglich. Danke für den Tipp mit dem Timer. Werde es die Tage mal ausprobieren.

Ich hab auch noch ein anderes Problem beim Ausführen eines Skriptes. Damit kopiere ich Array-Variablen hin und her...und da kommt beinahe regelmäßig vor, das ein Teil sauber und schnell abgearbeitet wird, der andere aber nur sehr sehr langsam. Das kann ich mir auch nicht so wirklich erklären.
	
	



```
Dim i,j
i=0
j=0
If SmartTags("FMC\intern\trigger") = True Then
'Stationswahl-Variablen umkopieren
For i = 0 To 11 Step 1
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 1")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 1")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 2")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 2")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 3")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 3")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 4")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 4")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 5")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 5")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 6")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 6")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 7")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 7")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 8")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 8")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 9")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 9")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 10")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 10")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 11")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 11")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 12")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 12")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 13")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 13")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 14")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 14")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 15")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 15")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 16")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 16")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 17")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 17")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 18")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 18")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 19")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 19")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 20")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 20")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 21")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 21")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 22")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 22")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 23")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 23")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 24")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 24")(i)
SmartTags("FMC\extern\Rezepte\multi Array Stationswahl Schritt 25")(i)=SmartTags("FMC\intern\Rezepte\multi Array Stationswahl Schritt 25")(i)
Next

'Freigabe umkopieren
For j=0 To 46 Step 1
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 1")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 1")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 2")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 2")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 3")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 3")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 4")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 4")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 5")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 5")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 6")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 6")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 7")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 7")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 8")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 8")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 9")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 9")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 10")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 10")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 11")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 11")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 12")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 12")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 13")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 13")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 14")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 14")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 15")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 15")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 16")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 16")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 17")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 17")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 18")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 18")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 19")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 19")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 20")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 20")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 21")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 21")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 22")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 22")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 23")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 23")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 24")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 24")(j)
SmartTags("FMC\extern\Rezepte\multi Array Freigaben Schritt 25")(j)=SmartTags("FMC\intern\Rezepte\multi Array Freigaben Schritt 25")(j)
Next

SmartTags("FMC\intern\trigger") = False
End If
```


----------



## Larry Laffer (9 Mai 2011)

... das könnte eventuell daran liegen, dass die Variablen zum Zeitpunkt der Abfrage im Script noch nicht wieder aktualisiert sind und die Scriptausführung darauf wartet.

Sind deine beiden Array's ggf. gleich groß und gleichen Typ's ?
Wenn ja, dann sollte es ggf. besser funktionieren wenn du schreibst myArray1 = myArray2 (Smarttags nicht vergessen ... )

Gruß
Larry


----------



## Grimsey (10 Mai 2011)

Hallo Larry,

ja die Arrays sind exakt identisch. Ich hatte es zunächst mit einer simplen Zuweisung probiert (SmartTags extern Array1  = SmarTags intern Array1) aber da wurden die Variablen überhaupt nicht kopiert. Dann bin ich hier im Forum auf ein Beispiel gestoßen, in dem jedes Element für sich umkopiert wurde. Daher habe ich diese Variante ausprobiert.

Muss man das "my" den Variablen voranstellen oder dient dies lediglich der Veranschaulichung??

Danke jedenfalls für den Tipp!


----------



## Larry Laffer (10 Mai 2011)

Hallo,
das "my" dient nur der Veranschaulichung.
Auf das direkte Zuweisen (wie bei SCL : Array1 := Array2 ; ) wird in der Flex-Hilfe sogar irgendwo hingewiesen - es muß nur richtig gemacht werden. Wenn ich es gleich finden sollte poste ich dir den Verweis - eigentlich sollte es aber bei richtiger Schreibweise seine Arbeit tun.

Gruß
Larry


----------

