WinCC Flex - Variablen für Script aktualisieren

ssound1de

Level-2
Beiträge
351
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß.
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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. :cool:

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?
 
Zuletzt bearbeitet:
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
 
@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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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. :rolleyes:
Könnte doch funktionieren, oder?
 
geht auch ohne den steuerungsauftrag.
im scripts die rezeptur laden. in eine endlosschleife gehen und dort den rückgabewert von rezeptur laden auswerten.

Code:
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.
 
@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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Vielen Dank für Eure Antworten.

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?
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :ROFLMAO:

Grenzwertüberschreitung war auch nochmal ein guter Hinweis. :cool:

Vielen Dank nochmal für Eure Hilfe.
 
Zurück
Oben