# WinCC Flex - Variable initialisieren



## ssound1de (28 Juli 2010)

Hi,

WinCC Flex 2007 PC-RT.
Gibt es irgendein Startereignis oder eine Startroutine, die beim Runtime-Start aufgerufen wird (ähnlich wie OB100-102 bei S7)?

Hintergrund ...
Ich möchte beim Start der RT eine Flexinterne Stringvariable mit einem festen String belegen (also Startwert).
Startwert geht aber leider nur mit nummerischen Variablen.

Danke für Eure Hilfe.
Gruß


----------



## rostiger Nagel (28 Juli 2010)

hallo ssound1de,
mach das doch in einen Script, das du einmalig aufrufst. Ich habe z.b. eine
Initalisierungscript. Ich habe auf den Startbildschirm eine unsichtbare
Schaltfläche, drücke ich diese Schaltfläche verzweige ich in die Bearbeitung
und komme nicht zurück zum Startbildschirm. Gleichzeitig rufe ich beim
Tastendruck das Ini-Script auf wo ich die Voreinstellung für die HMI 
mache. Hier kannst schnell Variabeln einen bestimmten Wert zuweisen,
auch Stringvariabeln.
Das starten des Scriptes lässt sich bestimmt auch auf andere weise, nur
einmal aufrufen.

gruß helmut


----------



## netmaster (28 Juli 2010)

Würde dies auch über ein Script machen, entweder so Helmut_von_der_Reparatur sagt oder über den Aufgabenplaner und bei der Aktion Start Runtime das Script ausführen.


----------



## ssound1de (29 Juli 2010)

netmaster schrieb:


> Würde dies auch über ein Script machen, entweder so Helmut_von_der_Reparatur sagt oder über den Aufgabenplaner und bei der Aktion Start Runtime das Script ausführen.


Wäre genial, wenn es diese Aktion geben würde. Bei mir gibt es aber (u.a.) nur Runtime_Stopp.


----------



## ssound1de (29 Juli 2010)

Sorry, aber irgendwie kann ich dir da nicht folgen.
IniScript ist klar.



Helmut_von_der_Reparatur schrieb:


> Ich habe auf den Startbildschirm eine unsichtbare
> Schaltfläche, drücke ich diese Schaltfläche verzweige ich in die Bearbeitung
> und komme nicht zurück zum Startbildschirm.


 
Wie soll ich eine unsichtbare Schaltfläche drücken? 
Und machst du einen Bildwechsel? -> Du schreibst: 'Komme nicht zurück zum Startbildschirm'



Helmut_von_der_Reparatur schrieb:


> Gleichzeitig rufe ich beim
> Tastendruck das Ini-Script auf wo ich die Voreinstellung für die HMI
> mache.


 
Bei welchem Tastendruck?


----------



## rostiger Nagel (29 Juli 2010)

ssound1de schrieb:


> Sorry, aber irgendwie kann ich dir da nicht folgen.
> IniScript ist klar.
> 
> 
> ...


 
also, auf meine Startseite, das ist die Seite die Flexibel nach dem 
Hochlauf als erstes aufruft, ist nur unser Firmenlogo mit Adresse und
Telefon Nr, so als Werbung. Diese brauche ich dann auch nicht mehr.
Auf diesen Bild Bildschirm habe ich eine Schaltfläche gelegt und deren
Eigenschaften als "Unsichbar" gemacht. Das heißt in der Runtime sehe
ich später das Firmenlogo aber nicht die Schaltfläche. Wenn der Bediener
jetzt auf den Bildschirm diese unsichtbare Schaltfläche drückt, wird das
Ini-Skript aufgerufen und ich verzweige auf meine "Home" seite.
In der Bildnavigation gibt es dann kein zurück mehr, zu diesen Start-
bildschirm.

Mit den Aufgabenplaner das Skript aufrufen mache ich mit Absicht nicht,
wenn jetzt die SPS noch nicht hochgelaufen ist, bei uns oft eine Soft-
SPS, können die Variabeln nicht in der Steuerung Aktualisiert werden.


----------



## Larry Laffer (29 Juli 2010)

... und wenn du nicht auf die Schaltfläche drücken möchtest sondern willst, dass es von selber weiter geht, dann könntest du z.B. irgendein Objekt (z.B. ein Rechteck) dort einbauen, dass von einem Blinkmerker der SPS (Takt 0.5 Hz) animiert wird. Diese Variable darf aber dann nur auf diesem Bild verwendet werden - an diese hängst du dann dein Startscript an die Wertänderung und machst dann alles Weitere inklusive des Aufrufs der eigentlichen Haupt-Bildschirmseite.

Gruß
Larry


----------



## Paule (29 Juli 2010)

Larry Laffer schrieb:


> ... und wenn du nicht auf die Schaltfläche drücken möchtest sondern willst, dass es von selber weiter geht, dann könntest du z.B. irgendein Objekt (z.B. ein Rechteck) dort einbauen, dass von einem Blinkmerker der SPS (Takt 0.5 Hz) animiert wird.


Oder ein Bildwechsel durch die SPS ansteuern über den Steuerungsauftrag.
Das Skript wird dann mit dem Ereignis > Bild abbauen ausgeführt.


----------



## netmaster (29 Juli 2010)

ssound1de schrieb:


> Wäre genial, wenn es diese Aktion geben würde. Bei mir gibt es aber (u.a.) nur Runtime_Stopp.


 
Stimmt gibt es echt nicht.
Ich habe es über Startbild->Ereignisse-> Aufgebaut und dann das Script ausführen lassen gelöst.


----------



## Larry Laffer (29 Juli 2010)

netmaster schrieb:


> Ich habe es über Startbild->Ereignisse-> Aufgebaut und dann das Script ausführen lassen gelöst.


 
Hierbei sollte dann nur beachtet werden, dass das Script bei jedem Aufruf des Startbildes aufgerufen wird. Das ist (zumindestens bei mir) nicht gewünscht.
In meinem (und ganz sicher auf im Fall von Helmut) ist es so, dass dieses "Startbild" (also die erste Seite) nur ein einziges Mal - nämlich beim Start der Visu - aufgerufen wird und danach dann nicht wieder (bis zum nächsten Start der Visu).

Gruß
Larry


----------



## PN/DP (29 Juli 2010)

*Scriptausführung verriegeln*



Larry Laffer schrieb:


> Hierbei sollte dann nur beachtet werden, dass das Script bei jedem Aufruf des Startbildes aufgerufen wird. Das ist (zumindestens bei mir) nicht gewünscht.


Das Initialisierungsscript kann sich ja selbst verriegeln und am Ende eine panel-interne Variable "Init_complete" 
auf 1 setzen, deren Startwert 0 ist. Das Script fragt am Anfang ab, ob diese Variable = 0 ist und führt den Code 
nur dann aus. Das Script wird zwar bei jedem Startbild-Aufruf aufgerufen, der Initialisierungscode wird dann aber 
nur einmal ausgeführt.

Gruß
Harald


----------



## Larry Laffer (30 Juli 2010)

@PN/DP:
Im Grundsatz hast du Recht - ich scheue mich aber ein bißchen Scripte unnötig aufzurufen - ist aber hier vielleicht nicht so das Thema ...

Gruß
Larry


----------



## tnt369 (30 Juli 2010)

damit das script nur einmalig ausgeführt wird, habe ich eine interne bit-variable ("gestartet") verwendet, die im script als verriegelung dient:

  if gestartet = 0 then
     gestartet = 1
     ...                   (hier den einmailg auszuführende code eintragen)
  end if

das "gestartet" bleibt eins bis die hmi beendet wird. damit wird das script nur einmalig ausgeführt.

um einen scriptlauf beim hochfahren der hmi zu erreichen hab ich den bereichszeiger "koordinierung" verwendet. darin ist ein bit (.0) das den start der runtime anzeigt. dieses bit hab ich als variable eingefügt und das script an die wertänderung geknüpft. funktioniert tadellos. sobald die hmi (und die sps) hochlaufen wird das script einmalig ausgeführt.


----------



## ssound1de (30 Juli 2010)

Hab jetzt auch noch ne Idee.

Mein Startbild ist bei mir auch mein Grundbild (es wird also über die 'Home' Schaltfläche immer wieder aufgerufen).

Ich erstelle also eine flexinterne BoolVar mit Namen z.B. 'Init'.
Mit dem Ereignis Grundbild 'Aufgebau' setze ich 'Init' auf True.
Mit Wertänderung von 'Init' rufe ich mein Initialisierungsscript auf.

'Init' ändert sich also nur beim allerersten Grundbild-Aufruf nach Runtime-Start. Das Initialisierungsscript wird also nur 1x aufgerufen.

Sollte eigentlich funzen, oder?


----------



## PN/DP (31 Juli 2010)

ssound1de schrieb:


> Mit dem Ereignis Grundbild 'Aufgebau' setze ich 'Init' auf True.
> Mit Wertänderung von 'Init' rufe ich mein Initialisierungsscript auf.
> [...]
> Sollte eigentlich funzen, oder?


Probiere es doch einfach aus...

Ich meine aber, das wird NICHT funktionieren, da bei einer Panel-internen Zuweisung eines 
Wertes an eine Variable das Ereignis "Wertänderung" nicht ausgelöst wird (loop breaker).

Gruß
Harald


----------



## Larry Laffer (1 August 2010)

PN/DP schrieb:


> Ich meine aber, das wird NICHT funktionieren, da bei einer Panel-internen Zuweisung eines
> Wertes an eine Variable das Ereignis "Wertänderung" nicht ausgelöst wird (loop breaker).



deine Vermutung ist korrekt ...
Bei internen Variablen werden keine Ereignisse ausgewertet.


----------



## PN/DP (2 August 2010)

Larry Laffer schrieb:


> Bei internen Variablen werden keine Ereignisse ausgewertet.


Das stimmt so allerdings nicht.

Ob das Ereignis "Wertänderung" ausgelöst wird oder nicht hat mit der Art und Weise der Wertänderung zu tun 
und nicht damit, ob es eine interne oder eine SPS-Variable ist.

Wird der Wert der *internen Variable oder SPS-Variable* durch eine Eingabe in einem E/A-Feld verändert 
(oder ändert sich der Wert einer SPS-Variable in der SPS), dann wird das Ereignis "Wertänderung" ausgelöst. 
Ganz sicher: *auch wenn es eine Panel-interne Variable ist,* die per E/A-Feld verändert wird.

Wird der Wert der Variable durch eine Panel-interne *Zuweisung* geändert (in einem Script oder durch eine 
Funktion in der Funktionsliste), dann wird das Ereignis "Wertänderung" *nicht ausgelöst*.

Dieses Verhalten hat Siemens als sogenannter *loop breaker* in WinCC flexible eingebaut, damit die dummen 
Programmierer keine geschlossenen Wertänderungs-Ereignis-Kreise erzeugen können (so wie die verbotenen 
Zirkelbezüge in Excel).
Z.B. Variable A ändert sich -> Ereignis: ändere Variable B -> Ereignis: ändere Variable A -> Ereignis: ...

Über externe SPS-Variablen können aber unter Mithilfe der SPS solche Ereigniskreise erzeugt werden.
Das kann man z.B. nutzen um die Kommunikationsgeschwindigkeit Panel-SPS zu messen.

Gruß
Harald


----------



## ssound1de (2 August 2010)

PN/DP schrieb:


> Das stimmt so allerdings nicht.
> 
> Ob das Ereignis "Wertänderung" ausgelöst wird oder nicht hat mit der Art und Weise der Wertänderung zu tun
> und nicht damit, ob es eine interne oder eine SPS-Variable ist.
> ...


Tatsache.
Wird die interne Var über E/A-Feld geändert, wird 'Wertänderung' ausgelöst.
Wird die interne Var über Script geändert, wird 'Wertänderung' nicht ausgelöst. Könnte (wie du beschrieben hast) je nach Verwendung zum Stack Overflow führen.


----------



## Larry Laffer (2 August 2010)

Hallo Harald,
ergehen wir uns jetzt in Spitzfindigkeiten ?

deine Aussage war :


PN/DP schrieb:


> ... Ich meine aber, das wird NICHT funktionieren, da bei einer Panel-internen Zuweisung eines
> Wertes an eine Variable das Ereignis "Wertänderung" nicht ausgelöst wird (loop breaker).


 
darauf hin schrieb ich (um deine Aussage zu bestätigen) :


Larry Laffer schrieb:


> deine Vermutung ist korrekt ...
> Bei internen Variablen werden keine Ereignisse ausgewertet.


 
Dumm war natürlich, dass ich da etwas ungenau war bezüglich des Ereignisses - allerdings war das mit der Tastatureingabe hier nicht gefragt gewesen und auch nicht Bestandteil des bisherigen Kontextes.
Die Begründung des warum es geht bei einer Tastatur-Eingabe und warum nicht bei einer Wert-Änderung über Script halte ich aber für etwas dürftig. Professionelle Programme (so wie z.B. Visual-Studio) können so einen "Zirkel-Bezug" auch sofort erkennen. Abgesehen davon würde es ja nur zu einem Script-Überlauf führen, der sich ja auch mit einem "Loop-until-forever"-Script machen liesse und das wird auch nicht abgefangen ...


@SSound:
Auf diese Weise solltest du keinen Stack-Overflow bekommen.
Hattest du diese Meldung auf der visu schon mal ?

Gruß
Larry


----------



## ssound1de (2 August 2010)

Larry Laffer schrieb:


> Auf diese Weise solltest du keinen Stack-Overflow bekommen.
> Hattest du diese Meldung auf der visu schon mal ?


Nö. Ich kenn das eher von VB bei rekursiven Funktionsaufrufen, die (wenn nicht entsprechend abgesichert) zu einem Stack-Overflow führen können.


----------



## MrMarc (2 August 2010)

Hallo!
  Sehr interessant was Ihr zu diesem Thema schreibt! Ich bin auch schon mit dieser Gegebenheit konfrontiert worden.
  Den Gedanken mit einer internen Variable ist meiner Meinung nach ein guter.

  Mehrfach angewendet und ohne Probleme funktionier auch folgendes.

  Ihr legt eine Interne INT-Variable an mit dem definierten Startwert 0.
  In den Eigenschaften des Startbilds unter Bild Aufgebaut diese Variable auf den Wert 1 schreiben. Dies passiert also nur beim ersten Aufbau des Startbilds.

  Des weiteren in den Eigenschaften der INT-Variable die Obergrenze fest auf 0 definieren und bei der Überschreitung der Obergrenze  keine Meldung generieren lassen (Haken entfernen)

  Bei dem Ereignis Obergrenze überschritten ist es dann möglich Scripte oder sonstiges zu Starten oder auszulösen. Die Ereignisse werden dann auch nur beim Runtime-Start ausgeführt.

  Alle Skripte die ich aus der SPS heraus auslösen will starte ich mit dem Ereignis Obergrenze überschritten. Das ist einfach sicherer als eine Wertänderung. Wenn das Skript durch ist schreibe ich diese Variable wieder zurück auf 0. So ist man sicher dass es geklappt hat und bekommt ohne eine zweite Variable in der SPS mit ob das Skript durch ist.

  Vielleicht hat jemand Lust und Zeit beides mal zu testen.
  mfg


----------



## PN/DP (2 August 2010)

Larry Laffer schrieb:


> Hallo Harald,
> ergehen wir uns jetzt in Spitzfindigkeiten ?


Hallo Larry,
klar hast Du meine Aussage bestätigt, daß die Idee von ssound1de nicht funktionieren 
wird. Wir wissen beide, was geht und was nicht.

Allerdings interpretiere ich und womöglich andere Leser diese Deine Aussage


Larry Laffer schrieb:


> Bei internen Variablen werden keine Ereignisse ausgewertet.


so, daß bei internen Variablen grundsätzlich keine Ereignisse "Wertänderung" 
ausgelöst werden würden. Doch das ist ja nicht so.
Kommt die Wertänderung von außen, dann wird bei allen Variablen das Ereignis 
"Wertänderung" ausgelöst, kommt die Wertänderung Panel-intern, dann wird das 
Ereignis nicht ausgelöst. Bei internen Variablen ist eine Wertänderung von außen 
allerdings nur über ein Eingabefeld möglich (eventuell auch über einen Schalter?).

Daß Deine Aussage nur ungenau formuliert war, habe ich nicht herauslesen.
Sonst sind Deine Aussagen ja fast immer sehr korrekt formuliert.
Meine penible Interpretation von Aussagen kommt einfach vom jahrelangen Umgang mit 
Kunden, die in der Regel nicht genau beschreiben können, was sie eigentlich wollen.
Übrigens: Mein Wort für "Spitzfindigkeiten" ist "Goldwaage", meint aber das selbe.



Larry Laffer schrieb:


> Die Begründung des warum es geht bei einer Tastatur-Eingabe und warum nicht bei einer Wert-Änderung über Script halte ich aber für etwas dürftig. Professionelle Programme (so wie z.B. Visual-Studio) können so einen "Zirkel-Bezug" auch sofort erkennen.


Ich kann nichts dafür, daß Siemens sich in WinCCflex nicht die Mühe macht,
Zirkelbezüge zu erkennen, sondern schon die theoretische Möglichkeit dafür mit dem 
loop breaker einfach grundsätzlich unterbindet.
Vielleicht sollte man WinCCflex nicht mit professionellen Programmen vergleichen 

Ich meine aber, daß ssound1de aus meiner Erklärung verstanden hat, warum seine 
eigentlich gute Idee praktisch nicht funktionieren wird.

Gruß
Harald


----------



## PN/DP (2 August 2010)

MrMarc schrieb:


> Mehrfach angewendet und ohne Probleme funktionier auch folgendes.
> 
> Ihr legt eine Interne INT-Variable an mit dem definierten Startwert 0.
> In den Eigenschaften des Startbilds unter Bild Aufgebaut diese Variable auf den Wert 1 schreiben. Dies passiert also nur beim ersten Aufbau des Startbilds.
> ...


Hallo MrMarc,

es wäre interessant, wenn Du mal schreibst, unter welcher WinCCflex-Version
Dein mehrfach angewendetes Vorgehen tatsächlich funktioniert.

WinCCflex 2008 SP2 Upd1 meldet zwar die versuchte Grenzwertüberschreitung,
löst aber das Ereignis "Obergrenze überschritten" erwartungsgemäß *nicht* aus.

Gruß
Harald


----------



## ssound1de (3 August 2010)

MrMarc schrieb:


> Des weiteren in den Eigenschaften der INT-Variable die Obergrenze fest auf 0 definieren und bei der Überschreitung der Obergrenze keine Meldung generieren lassen (Haken entfernen)
> 
> Bei dem Ereignis Obergrenze überschritten ist es dann möglich Scripte oder sonstiges zu Starten oder auszulösen. Die Ereignisse werden dann auch nur beim Runtime-Start ausgeführt.


Klingt interessant, geht aber nicht. Wenn ich mit dem Ereignis 'Bild aufgebaut' die Init-Var über den Grenzwert setzen möchte, wird der Wert automatisch auf das Maximum (Grenzwert) begrenzt. Es findet keine Grenzwert-Überschreitung statt, also auch kein Script-Aufruf.


----------



## MrMarc (3 August 2010)

Hallo Harald!

  Ich habe mir nun das SP2 Update 1 installiert und muss dir leider zustimmen. 
  Es funktioniert nicht mehr so wie ich das beschrieben habe.

  Es funktioniert noch wenn die Grenzwertüberschreitung durch einen Wert aus der SPS entsteht.

  Aber das hat ja nichts mit dem Ereignis RT-Start zu tun.

  Gruß,
  Marc


----------

