Wann liest WinCCflex SmartTags in einem Script ein ??

van

Well-known member
Beiträge
278
Punkte Reaktionen
50
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

ich speichere in einem Script Prozesswerte in eine csv Datei.
Jetzt habe ich manchmal das Problem das die Werte in der csv Datei nicht stimmen.

Das Script wird von einer SPS-Variable getriggert (Zyklisch fortlaufend, und bei Wertänderung wird das Script aufgerufen).
Die SmartTags im Script stehen jetzt auf Zyklisch bei Verwendung.

Wann werden die SmartTags im Script aus der SPS ausgelesen?
- Explizit in dem Augenblick ihrer Verwendung im Script?
- Oder werden die bei ihrer Verwendung nur in einer Art Scheduler eingetragen der dann "irgendwann" mit dem Erfassungszyklus abgearbeitet wird?

Sprich, wie kann ich sicherstellen das beim Durchlauf des Scripts die SmartTags aktuell sind?

Danke
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.083
Punkte Reaktionen
2.717
Hallo,
ganz sicherstellen, dass du volle Konsistenz hast, kannst du nach meiner Erfahrung gar nicht. Es ist mehr so, wie in deiner 2.Annahme ...

Etwas verbessern kannst du es, wenn du die Variablen, die du im Script speicherst "zyklisch fortlaufend" aktualisierst UND wenn dein Trigger von der SPS mit einer gewissen Phasenverschiebung zur Wert-Änderung deiner Script-Variablen kommt - also die Variablen werden von der SPS zum Zeitpunkt t aktualisiert und deinen Trigger setzt du bei t+Aktualisierungszeit deiner Script-Variablen.
Hierbei solltest du aber darauf achten, das es nicht zu viele Variablen sind, die du "zyklisch fortlaufend" aktualisierst und das die Aktualisierungszeit machbar ist. Also lieber 1 s als 250 ms ...

Gruß
Larry
 

Thomas_v2.1

Well-known member
Beiträge
8.128
Punkte Reaktionen
2.456
Zuviel Werbung?
->Hier kostenlos registrieren
Mit der Aktualisierung in Skripten muss man aufpassen wenn man die Variablenaktualisierung auf "zyklisch bei Verwendung" stehen hat.

Wenn du in deinem Skript den Variablennamen als Konstante stehen hast, z.B.
Code:
wert = SmartTags("externeVariable1")
dann erkennt WinCCflexible diese Variable wenn dieses Skript in einem Bild aufgerufen werden könnte als verwendet, und aktualisiert diese in dem eingestellten Zyklus.

Setzt du den Variablennamen hingegen dynamisch zusammen:
Code:
varname = "externeVariable1"
wert = SmartTags(varname)
dann wird das nicht mehr erkannt, und der Variablenwert wird - wenn die Variable an anderer Stelle nie verwendet wird - nie aus der SPS gelesen.
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
14.346
Punkte Reaktionen
4.182
Da würde mich einmal der Aktualisierungszeit interessieren, wäre bei 500ms in dieser Zeit
ist aktualisiert oder in der Zeit kommt es auf die Liste und wird aktualisiert.
 
OP
V

van

Well-known member
Beiträge
278
Punkte Reaktionen
50
Etwas verbessern kannst du es, wenn du die Variablen, die du im Script speicherst "zyklisch fortlaufend" aktualisierst UND wenn dein Trigger von der SPS mit einer gewissen Phasenverschiebung zur Wert-Änderung deiner Script-Variablen kommt - also die Variablen werden von der SPS zum Zeitpunkt t aktualisiert und deinen Trigger setzt du bei t+Aktualisierungszeit deiner Script-Variablen.
Hierbei solltest du aber darauf achten, das es nicht zu viele Variablen sind, die du "zyklisch fortlaufend" aktualisierst und das die Aktualisierungszeit machbar ist. Also lieber 1 s als 250 ms ...

Das währe jetzt meine Notlösung gewesen, so werde ich es dann doch machen müssen.

Ich dachte nur es gibt auch eine "bessere" Lösung
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.083
Punkte Reaktionen
2.717
Zuviel Werbung?
->Hier kostenlos registrieren
@RN:
so wie ich es festgestellt habe ist es in etwa so, wie von van schon dargestellt : Die Variable kommt auf eine Liste und der "Item-Server" versucht in der vorgegebenen Zeit eine Aktualisierung zu ermöglichen. Es wird aber in keinem mir bekannten Fall abgewartet bis tatsächlich eine Aktualisierung erfolgt ist. Hierbei ist das Spielen mit der Aktualisierungszeit ein zweischneidiges Schwert. Ist die Zeit zu klein gewählt so kann es sein, dass (weil zu viele Variablen auf der Liste stehen - es werden ja immer auch die Variablen des aktuellen Bildes gepollt) die Variable erst beim 2. Zyklus dran kommt - das gilt bei einer zu groß gewählten in gleicher Weise.
Wie ich schon dargestellt habe ist aber auch das Jonglieren mit dem Trigger kein 100%iger Garant für den Erfolg - es verbessert das Ganze nur. Am Besten wäre es wenn es einen syncronen Dienst gäbe, der bei Fertigstellung (also wenn alle angefragten Variablen nach dem Trigger-Zeitpunkt aktualisiert worden sind) ein "Done"-Event auslösen würde - das gibt es bei Flex aber nicht.

Gruß
Larry
 

Funky

Well-known member
Beiträge
154
Punkte Reaktionen
60
Hallo Van,

ich habe mit den aktualisieren von Variablen folgende Erfahrung gemacht.
Weist man die Variablen nur zu, werden diese nicht automatisch aktualisiert.

z.B.

Code:
Dataset = SmartTags("laufendeNr") & ";"_
  & SmartTags("Isthoehe_Teil_108")& ";"_
  & SmartTags("Isthoehe_Teil_109")& ";"_
              & SmartTags("Isthoehe_Teil_113")
ts.WriteLine Dataset

Hingegen rechnet man zuerst mit den Variablen werden diese vor der Rechenoperation von Skript aktualisiert.
Deshalb rechne ich erst mit den Variabeln.
z.B.

Code:
[Dummy = SmartTags("laufendeNr") + SmartTags("Isthoehe_Teil_108")
Dummy = SmartTags("Isthoehe_Teil_109")+ SmartTags("Isthoehe_Teil_113")/CODE]

Mit diesem Skript schreibe ich manchmal bis zu 50 Variablen in eine csv-Datei bzw. in eine Datenbank. Die Variabel habe die Eigenschaft "Zyklisch bei Verwendung".
 
Mfg Harald
 

Thomas_v2.1

Well-known member
Beiträge
8.128
Punkte Reaktionen
2.456
Zuviel Werbung?
->Hier kostenlos registrieren
@Funky
Wie hast du das von dir festgestellte Verhalten denn überprüft?

Ich schaue mir den Datenaustausch auf dem Netzwerk an, und da sehe ich eindeutig dass die Variable zyklisch aktualisiert wird, auch wenn in dem Skript nur schreibend darauf zugegriffen wird.
Und ich stelle auch fest dass die Variablen nicht vor der Rechenoperation aktualisiert werden, sondern immer in dem eingestellten Aktualisierungsintervall. Wenn man z.B. alle 10s aktualisieren lässt, und in Sekunde 9 das Skript aufgerufen wird , dann wird der Variablenwert von vor 9s verwendet.
Achso, WinCCflex 2008 Sp2 Upd3.
 

Funky

Well-known member
Beiträge
154
Punkte Reaktionen
60
Hallo Thomas,

auf dem "Netzwerkkabel" habe ich die Daten noch nicht verglichen.
Ich übertrage immer eine „laufende Nummer“ und einen „Zeitstempel“ der SPS mit. Selbst beim schnellen Aufruf des Skriptes, 2-mal pro Sekunde, durch die SPS sind alle Werte korrekt. Ich Schlussfolgere daraus das die Variablen bei der Einstellung „Zyklisch bei Verwendung“ und eine angewandter Rechenoperation im Skript in „Echtzeit“ eingelesen werden. Wenn es Probleme beim Einlesen gebe müsste es in der Variable „laufende Nummer“ Sprünge oder doppelte Zahlen geben.

Getestet mit WinCCflex RT 2008 SP2 UP3

Harald
 

Thomas_v2.1

Well-known member
Beiträge
8.128
Punkte Reaktionen
2.456
Komisch, was hast du denn für eine Aktualisierungsrate? Wenn das stimmt müsste das ja auch funktionieren wenn man die Aktualisierungsrate auf 1 Minute stellt.
 

Fanta-Er

Well-known member
Beiträge
198
Punkte Reaktionen
16
Zuviel Werbung?
->Hier kostenlos registrieren
scripte finde ich immer wieder lustig mit siemens.
eigene Erfahrung:
ich nutze sie immer zyklisch vorlaufend und warte (wenn 250ms eingestellt sind) 500ms bis ich das script aufrufe.
bei einem 477er oder 677er läuft der opc sehr schnell und es ist weniger nötig.
es kann sein, dass in den werten vom script einfach immer 0.0 steht. einfache alle tmp löschen und das projekt als neu kompilieren (schon 2x mit sp3 gehabt) und, oh wunder, es läuft.
scripte immer mit rückmeldung verarbeiten. da flex nur eins abarbeiten kann und alle anderen erst nach ablauf des vorangegangenen dran sind. gibt lustige effekte wenn ein script nen fehler/nicht ausgeführt werden kann und der rest erst zeitversetzt ausgeführt wird.
das flex sich die variablen bei "zyklisch bei verwendung" immer frisch holt, schein nach meinem gefühl (subjektiv) jeh nach sp und update mal gut, mal weniger sauber zu funktionieren. jedefalls bei scripten oder bildwechsel.
sehr interessant finde ich es es wenn man in den grenzbereich geht. z.b. Mp377 mit über 500 variablen. da kann mir keiner erklären nach welcher priorität die variablen aktualisiert werden. dort kommt es bei gleich parametrierten variablen vor, das eine schneller als die andere aktualisiert wird.
mein tipp: sicherheit einbauen (rückmeldugen) und scripte frühzeig ins projekt einbauen und ausprobieren.

MEINE MEINUNG :)
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.083
Punkte Reaktionen
2.717
Hallo,
das Problem hier ist m.E. vielschichtiger als es aussieht.
Es hat sicher etwas mit der Anzahl der zu pollenden Variablen zu tun und auch mit dem Aufruf-Intervall - klar.
Es hat in erster Linie etwas mit dem Verstreuungsgrad der Variablen zu tun. Habe ich z.B. 500 Variablen in einem DB schön hintereinander so ist es für die Visu weniger problematisch, das zu Aktualisieren als wenn es 50 Variablen in vielen verschiedenen DB's sind.
Das sollte immer beachtet werden.
Unter diesen Gesichtspunkten kann die Aussage von Funky schon stimmen ... :cool:

Gruß
Larry
 

ducati

Well-known member
Beiträge
6.003
Punkte Reaktionen
1.162
Hallo,
in dem Zusammenhang würde mich einmal interessieren, zu welchem Zeitpunkt des SPS-Zyklus, der Wert von der Visu aus dem DB geholt wird. Passiert das immer im Zykluskontrollpunkt der SPS, oder kann es auch vorkommen, dass während der Abarbeitung eines FB auch "gleichzeitig" ein DB von der Visu gelesen wird?

Gruß.
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
14.346
Punkte Reaktionen
4.182
Zuviel Werbung?
->Hier kostenlos registrieren
Irgendwie ist das ja wieder so ein leidiges Siemens Problemm, warum können
die da nicht eine funktion einbauen, wo Ereignisgesteuert für ein Bereich eine
Datenkosistenz möglicht ist, in der Art einer Struktur, die mit einen Bit angesteuert
wird und mit einen anderen Bit Quittiert wird (mal abgesehen von einer Rezeptur)
So etwas hätte zumindest bestantteil eines Pflichtenheftes für das TIA Portal sein
müssen.

Kollege setzt mittlerweile kein Flex mehr ein, sondern schreibt seine HMI mit Hochsprache
und bindet Sie über OPC an, er kennt die ganzen Probleme nicht die uns so beschäftigen.
 

ducati

Well-known member
Beiträge
6.003
Punkte Reaktionen
1.162
Kollege setzt mittlerweile kein Flex mehr ein, sondern schreibt seine HMI mit Hochsprache
und bindet Sie über OPC an, er kennt die ganzen Probleme nicht die uns so beschäftigen.

Interessant wäre aber, ob er in Summe für das Programmieren seiner "eigenen" Visusoftware weniger Zeit benötigt (hat) als wir für die Problemlösung bei WinCC(flex)...
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
14.346
Punkte Reaktionen
4.182
Mittlerweile hat er das gut im Griff, wenn
ich so schaue, was ich für eine Zeit in
Flex. Projekte stecke, bin ich überzeugt
das er mit der Hochsprache schneller
am Ziel ist.
 

Thomas_v2.1

Well-known member
Beiträge
8.128
Punkte Reaktionen
2.456
Zuviel Werbung?
->Hier kostenlos registrieren
Es hat in erster Linie etwas mit dem Verstreuungsgrad der Variablen zu tun. Habe ich z.B. 500 Variablen in einem DB schön hintereinander so ist es für die Visu weniger problematisch, das zu Aktualisieren als wenn es 50 Variablen in vielen verschiedenen DB's sind.

Wie kommst du zu dieser Feststellung? Bei WinCCflexible ist es gehopst wie gesprungen ob die Daten aus einem oder 500 verschiedenen DBs kommen, denn das Programm packt überhaupt nichts. Es wird jede der 500 Variablen einzeln angefragt. Die einzige Möglichkeit die Daten zu packen besteht darin, diese als Array anzulegen.
Bei richtigen Leitsystemen mit ordentlichen Anbindungstreibern sieht das anders aus. Oder du hast einen Tuningsatz (abgesägter Krümmer, Kolbenfenster) bei WinCCflex eingebaut.
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
17.559
Punkte Reaktionen
5.165
Hingegen rechnet man zuerst mit den Variablen werden diese vor der Rechenoperation von Skript aktualisiert.
Das ist leider nicht ganz richtig und funktioniert wohl nur zufällig.

Ein Script wartet nicht auf das Lesen der Smarttag-Variablen, egal wie kurz der Erfassungszyklus eingestellt ist. Ein Script arbeitet mit dem Variablenwert des letzten vorherigen Lesens oder dem Startwert, wenn die Variable noch nie gelesen wurde. Befindet sich in einem Bild ein Scriptaufruf, dann wird von der flexible RT beim Bildaufbau das Lesen der erkennbar im Script verwendeten Variablen angestoßen.

Sicheres/konsistentes Lesen von SPS-Variablen mit Statusanzeige bzw. Done-Event geht mit der Systemfunktion GetDataRecordTagsFromPLC
Wenn ein Script auf das Schreiben oder Lesen von Variablen warten soll und/oder man kein zyklisch fortlaufendes Lesen vieler Variablen verwenden will, dann kann man das z.B. so lösen: Codebeispiel

@van
schau Dir mal diesen Thread zu Deinem Problem an, besonders ab Beitrag #12, wo ein sicherer Export von Speicherbereichen aus der CPU in eine CSV-Datei beschrieben ist (ereignisgesteuert, kein Warten im Script).

@RN
Daß man "bei Siemens" für das konsistente Lesen eine Rezeptur braucht, will ich Siemens nicht als negativ ankreiden. Irgendwie muß man der RT ja besonders mitteilen können, daß man im Gegensatz zu normalen Variablenzugriffen eine Quittierung der aktuellen Lesung wünscht. Ich übersetze einfach das Wort "Rezeptur" in das allgemeinere Wort "Datensatz".
Zu Deinem Kollegen: er wird aus Geschwindigkeitsgründen ebenfalls bei jedem OPC-Zugriff entscheiden müssen, ob er auf das tatsächliche Lesen der Variablen warten will oder ob der Wert der letzten Lesung ausreicht. Dieses Problem ist nicht Siemens-spezifisch.

@Thomas_v2.1
Wird eigentlich das Lesen einer Rezeptur von WinCC flexible irgendwie gepackt? Oder die Nutzung von GetDataRecordTagsFromPLC?

Harald
 

Thomas_v2.1

Well-known member
Beiträge
8.128
Punkte Reaktionen
2.456
Wird eigentlich das Lesen einer Rezeptur von WinCC flexible irgendwie gepackt? Oder die Nutzung von GetDataRecordTagsFromPLC?

Nach meinen Erkenntnissen nicht, auch nicht wenn die Variablen direkt hintereinander liegen.
Diese Logik scheint bei WinCCflexible überhaupt nicht zu existieren. Wenn man z.B. 8 Bits aus einem Byte einzeln adressiert (meinetwegen M0.0 bis M0.7) wird dafür 8 mal das MB0 eingelesen.
 
Oben