# WinCC Flex - Variablen für Script aktualisieren



## ssound1de (16 Juli 2009)

Hi,

habe an einer S7-315-2DP über Profibus einen PC mit WinCCFlex2007 RT hängen.
Ich muss immer wieder Protokolldaten aus einem DB in eine Datei auf dem PC speichern bzw. anhängen (jeweils ein Block mit 384 Bytes).
Die Variablen sind verschiedenen Typs (Word, Real, Byte ...), und kommen in *keinem* Bild vor.

Ich dachte mir VB-Script wäre das Beste hierfür.
Habe für den Script-Aufruf eine Variable (Steuerbyte) angelegt und auf Erfassungszyklus 'zyklisch fortlaufend' gestellt.

Script-Aufruf und das Script an sich funktioniert soweit, aber wie bekomme ich die Variablen aktualisiert?
80 x AktualisiereVariable vor dem Script-Aufruf? :lol: Nee, oder?

Bitte um Eure Hilfe.
Danke im Voraus.

Gruß.


----------



## bastimeister (16 Juli 2009)

Aktualisiere die Variable doch über einen Taktmerker (von der SPS, musste in der HW-Config der CPU einstellen), sodas das Skript immer "bei Änderung" des Taktmerkers ausgeführt wird... -> in dem Skript liest du dann deine Daten aus dem DB in der SPS und schreibst sie in deine Datei


----------



## ssound1de (16 Juli 2009)

bastimeister schrieb:


> Aktualisiere die Variable doch über einen Taktmerker (von der SPS, musste in der HW-Config der CPU einstellen), sodas das Skript immer "bei Änderung" des Taktmerkers ausgeführt wird... -> in dem Skript liest du dann deine Daten aus dem DB in der SPS und schreibst sie in deine Datei


Danke für Deine Antwort, aber leider ist das so nicht durchführbar.
Zum einen muss ich nicht nur eine Variable sondern ingesamt 384 Bytes aktualisieren (Bus-Belastung usw.). Zum anderen handelt es sich um Protokolldaten. D.h., wenn eine Mischung fertig ist sollen die Werte gespeichert werden (Soll/Istwerte der Mischung). Wird 1 Std. nix gemischt braucht auch nix gespeichert zu werden. Wird in 1 Min. 5x gemischt muss 5x gespeichert werden. 

EDIT: Mal ne andere Frage ...
Wenn ich in einem Bild eine Variable Anzeige, wird sie ja gemäß Einstellungen aktualisiert (z.B. bei Bildaufruf oder zyklisch bei Verwendung)
Wie ist das denn in einem Script? Wenn ich im Script auf eine Variable zugreife, wird sie dann ebenfalls automatisch aktualisiert?


----------



## Waelder (16 Juli 2009)

Also ich hab die selbe Funktion wie Du implementiert,
Bei z.B Produktionsbeginn wird ein File geschrieben (CSV), und während der Produktion machte ein Blinker (z.B. 1s) den Takt für die Speicherung (via scipt) der Daten im File. Das geht ohne Probleme.
Wenn Du eine Variable im script aufruftst dann wird sie natürlich lt. :  zyklisch bei Verwendung aktualisiert.
Lediglich das Blinkerbit musst du aufständig lesen setzen.

Gruss Wälder


----------



## Larry Laffer (16 Juli 2009)

@ssound:
Die Variablen werden durch das Script nicht aktualisiert. Du mußt schon das Attribut "zyklisch fortlaufend" nehmen.
Wenn du möchtest, dass die Variablen konsistent sind - also alle Inhalte mit dem aktuellen Zustand in der Steuerung übereinstimmen - so kannst du das nur erreichen wenn dein Triggerbit unbestimmt sehr lange nach der Wert-Änderung der letzten Variablen in der Steuerung kommt.

Ein ähnliches Problem habe ich auch schon so dann und wann.
Ich habe das umgangen, in dem ich die Daten alle in das gleiche Format gepackt habe und der Visu als "bitgetriggerte Kurve" untergeschoben habe. Die Kurve wird (nach Möglichkeit und wenn nicht zu groß) immer vollständig übertragen. Die erste und die letzte Variable meiner Kurve (des Daten-Array's) ist eine Zählvariable. Diese müssen beiden gleichen Wert haben und mit dem erwarteten übereinstimmen - dann wird gespeichert.
Ist ein etwas umständliches Verfahren ...

Gruß
LL


----------



## ssound1de (16 Juli 2009)

Larry Laffer schrieb:


> @ssound:
> Die Variablen werden durch das Script nicht aktualisiert.


Hatte sowas noch von Protool in Erinnerung.

Gäbe es nicht eine Möglichkeit über Steuerungsauftrag?
Mal angenommen ich würde eine Rezeptur passend zu dem Protokolldaten-DB anlegen.
Wenn die Daten dann gespeichert werden müssen löse ich den Auftrag 69 aus (Datensatz aus Steuerung lesen) oder die Funktion 'LeseDatensatzvariablenAusSteuerung' oder so ähnlich.
Und wenn der Auftrag erledigt ist, fahre ich mein Speicher-Script durch. 
Könnte doch funktionieren, oder?


----------



## volker (16 Juli 2009)

geht auch ohne den steuerungsauftrag.
im scripts die rezeptur laden. in eine endlosschleife gehen und dort den rückgabewert  von rezeptur laden auswerten. 


```
2 = Systemfunktion wird gerade ausgeführt.
4 = Systemfunktion wurde erfolgreich beendet.
12 = Systemfunktion wurde nicht ausgeführt, weil ein Fehler aufgetreten ist.
```
 
evtl kannst du aber auch die rezeptur laden und dann einfach exportieren falls du die daten nicht noch aufbereiten willst.


----------



## Larry Laffer (16 Juli 2009)

@SSouind:
das mit der Rezeptur funktioniert genauso - auch diese Daten werden im Zusammenhang geladen/aktualisiert. Für meine Sache konnte ich das allerdings nicht gebrauchen, da die Hintergrund-Speicherung der rezeptur zu lange dauert. Deswegen die Kurve ...

@Volker:
zu der Sache mit der Endlos-Schleife im Script kann ich nicht unbedingt raten. Denk bitte dran : es wird immer nur ein Script ausgeführt - das kann dann schnell Stress geben ...

Gruß
LL


----------



## volker (16 Juli 2009)

Larry Laffer schrieb:


> zu der Sache mit der Endlos-Schleife im Script kann ich nicht unbedingt raten. Denk bitte dran : es wird immer nur ein Script ausgeführt - das kann dann schnell Stress geben ...


weiss ich. alternativ kann man den rückgabewert in eine var schreiben und dann bei wertänderung das folgescript auslösen.


----------



## ssound1de (17 Juli 2009)

Vielen Dank für Eure Antworten.



volker schrieb:


> alternativ kann man den rückgabewert in eine var schreiben und dann bei wertänderung das folgescript auslösen.


 
Das würde dann also in etwa so aussehen ...

GetDataRecordTagsFromPLC "Rezeptname" , "Rückgabe-Var"
Bei Wertänderung von Rückgabe-Var und Rückgabe-Var=4 mit Script den Datensatz auf Platte schreiben.

Und das Script wird dann trotzdem beendet, während der Datensatz im Hintergrund geladen wird?

EDIT: Nochwas nebenbei ...
Ich habe GetDataRecordTagsFromPLC nicht in der VBS-Hilfe gefunden. Gibt es zu den VBS-Funktionen unter WCCF irgendwo eine Hilfe?


----------



## volker (17 Juli 2009)

ob das script beendet wird bin ich nicht sicher.
im zweifelsfall kannst du aber die funktion datensatz lesen an eine variable binden und bei grenzwert überschritten auslösen.

nicht vergessen die vars aus ständig lesen zu stellen


----------



## ssound1de (17 Juli 2009)

volker schrieb:


> ob das script beendet wird bin ich nicht sicher.
> im zweifelsfall kannst du aber die funktion datensatz lesen an eine variable binden und bei grenzwert überschritten auslösen.
> 
> nicht vergessen die vars aus ständig lesen zu stellen


Yepp - das wars 

Grenzwertüberschreitung war auch nochmal ein guter Hinweis. 

Vielen Dank nochmal für Eure Hilfe.


----------

