TIA Array-SmartTag mit Index in VBS zusammensetzen

Alde_Oma

Level-2
Beiträge
103
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgende Ausgangslage:
In einem VB-Skript greife ich auf SmartTags (Array) über einen Index zu.
Hier ein Beispiel:
Code:
SmartTags("DB0600_Parameter_Ausgewaehlt.a_Keyence_CVX[" & Index &"].Fuellstand[0].r_Leer") = ...

Nun habe ich aber das Problem, dass wenn ich den SmartTag zuvor nicht mit dem vollständigen Namen aufrufe, eine Fehlermeldung erhalte, dass der Tag nicht gefunden wurde.
D.h. ich muss irgendwo in der Runtime auf die SmartTags mit vollständigem Namen zugreifen, bzw. der Compiler muss dieses SmartTag kennen.
Code:
SmartTags("DB0600_Parameter_Ausgewaehlt.a_Keyence_CVX[1].Fuellstand[0].r_Leer")
SmartTags("DB0600_Parameter_Ausgewaehlt.a_Keyence_CVX[2].Fuellstand[0].r_Leer")
SmartTags("DB0600_Parameter_Ausgewaehlt.a_Keyence_CVX[3].Fuellstand[0].r_Leer")
Egal ob in einem Skript, einem EA-Feld oder sonstiges.
Normalesweise ist dies auch der Fall, was wenn aber einmal doch nicht?
Gibt es eine Möglichkeit dieses Verhalten zu umgehen, ohne das ich gezielt auf jeden SmartTag zugreife?
 
Nun habe ich aber das Problem, dass wenn ich den SmartTag zuvor nicht mit dem vollständigen Namen aufrufe, eine Fehlermeldung erhalte, dass der Tag nicht gefunden wurde.
Das klingt als ob Du was falsch verstehst oder hier falsch darstellst. Wie lautet die Fehlermeldung (und Fehlernummer) genau?

SmartTags-Variablen, deren Namen erst zur Laufzeit zusammengebastelt werden, muß der Compiler nicht kennen. Bei SmartTags wird erst zur Laufzeit geprüft ob es eine Variable mit dem zusammengebastelten oder direkt angegebenen Name gibt. Da ist kein Unterschied ob man den korrekt zusammengebastelten Name oder irgendwo auch den direkt angegebenem Name verwendet. Wenn der Name nicht gefunden wird, dann wird der Name wahrscheinlich nicht korrekt zusammengebastelt. Irgendwo mit vollständigem/direkt angegebenem Name auf den SmartTag zugreifen ändert daran nichts.

In einem VB-Skript greife ich auf SmartTags (Array) über einen Index zu.
Hier ein Beispiel:
Code:
SmartTags("DB0600_Parameter_Ausgewaehlt.a_Keyence_CVX[" & Index &"].Fuellstand[0].r_Leer") = ...
Damit greifst Du nicht auf ein Array zu, sondern auf viele verschiedene SmartTags, die in der Liste der HMI-Variablen alle einzeln projektiert sein müssen.

Das korrekte Zusammenbasteln des SmartTags-Name wird aber nicht Dein größtes Problem sein, sondern: HMI-Variablen, von deren Verwendung die WinCC Runtime nichts weiß, weil der Name erst zusammengebastelt wird, werden erst nach der Verwendung aktualisiert und ein Lesezugriff liefert nicht den aktuellen Wert der HMI-Variable, sondern den Wert von der letzten Aktualisierung, die schon lange her sein kann oder noch nie stattgefunden hat.
Zu diesem schon sehr häufig hier behandelten Problem benutze mal die Forumssuche mit dem Suchbegriff GetDataRecordTagsFromPLC

Warum willst Du den Variablenname zusammenbasteln? Was willst Du eigentlich tun?
Mit welcher WinCC Runtime auf welchem Gerät arbeitest Du? Welche TIA Version?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir nutzen TIA V16 mit WinCC Advanced.
Wir haben Daten welche wir auf einem PC in einer XML-Datei speichern und wieder lesen.
Beim Aufruf des Bildes wird ein Skript aufgerufen, welches die Daten aus der XML-Datei liest und in die entsprechenden SmartTags schreibt.
Die gelesenen Daten sollen in eine UDT-Variable geschrieben werden. Hiervon gibt es aber unter Umständen mehrere, daher sind diese als Array of UDT_... angelegt.
Auf der HMI werden alle diese SmartTags normalerweise auch in einem EA-Feld dargestellt. Das funktioniert auch wunderbar, keinerlei Probleme mit Lesen oder den von dir genannten.
Nun hat ein Kollege vergessen ein paar dieser Daten auf dem HMI in einem EA-Feld darzustellen, wodurch die Fehler aufgekommen sind.

Fehler_Skript.jpg

Der Fehler Error #13 Typkonflikt kam beim Speichern der Variable in die XML.
Der Fehler 'no Tag...' kam beim Lesen der Variablen.

Wenn ich dann den SmartTag einfach nur in ein Skript schreibe, ohne dass ich das Skript aufrufe funktioniert es. Was mich darauf schließen lässt, dass die SmartTags dem Compiler bekannt sein müssen.

Wie oben zu sehen ist, kam zuerst der Fehler beim Lesen in Zeile 70, danach wird das Skript abgebrochen. Dann hab ich nur diesen einen SmartTag in das Skript eingefügt und das ganze nochmal getestet. Dann kam der Fehler in Zeile 77, also eine Variable später als zuvor.
 
Hallo Oma,

könntest du vielleicht einen Screenshot der zugehörigen HMI-Variablentabelle posten?

Wenn es nämlich so sein sollte, dass die betroffenen Variablen auf einem HMI- oder PLC-DATENTYP basieren, dann ist es genauso wie du beschrieben hast (und ich an anderer Stelle hier im Forum auch schon einmal gepostet hatte):
Solche Variablen bzw. deren Elemente aus dem Datentyp müssen mindestens einmal im Projekt mit dem vollständigen Namen angesprochen/verwendet werden.
Das kann zum einen die direkte Anbindung an ein Control (z.B. E/A-Feld) oder die Verwendung in einem (Boot-)Script sein.


Gruß, Fred
 
Hier noch der Link zu meinem damaligen Post:
 
Hallo Oma,

danke für die schnelle Rückmeldung, die ja (leider) meine Befürchtung bzw. das von dir und mir beschriebene Verhalten bestätigt.

Wie du vielleicht gelesen hast, wenn du meinem Link gefolgt bist:
Ich umgehe diese Problematik mittlerweile mit Hilfe eines (großen!!!) Scriptes, wo ich alle Variablen dieser Art mit wirklich allen Einzelelementen einmalig mit vollständigem Namen verwende und welches ich beim Starten des HMIs als allererstes aufrufe.

Ich zwar eine (glücklicherweise einmalige) Scheißarbeit, aber seitdem habe ich Ruhe.


Gruß, Fred
 
Ja, habe ich gelesen. Bei uns leider nicht einmalig, da sich der gesamte UDT_Produktparameter mit jedem Projekt ändert.
Wie gesagt, normalerweise wird jede Variable auch aufgerufen. Meine Überlegung war nur die, was ist wenn ich doch mal welche habe, die nicht aufgerufen werden oder wie der Kollege jetzt einen Aufruf vergisst.
Wenn man dieses Problem schon von vernherein umgehen könnte wäre das gut.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das korrekte Zusammenbasteln des SmartTags-Name wird aber nicht Dein größtes Problem sein, sondern: HMI-Variablen, von deren Verwendung die WinCC Runtime nichts weiß, weil der Name erst zusammengebastelt wird, werden erst nach der Verwendung aktualisiert und ein Lesezugriff liefert nicht den aktuellen Wert der HMI-Variable, sondern den Wert von der letzten Aktualisierung, die schon lange her sein kann oder noch nie stattgefunden hat.
Zu diesem schon sehr häufig hier behandelten Problem benutze mal die Forumssuche mit dem Suchbegriff GetDataRecordTagsFromPLC
Hallo Harald,

habe es zur Sicherheit gerade noch einmal getestet (WinCC Advanced V17):
Ich kann keine Variable vom Typ Struct oder UDT in ein Rezept projektieren ("Der eingegebene Wert ist ungültig."). Das würde bedeuten, dass das bekannte und von dir genannte Verfahren nur mit Basis-Datentypvariablen funktionieren und ebenfalls eine umständliche Auffächerung aller Strukturelemente erfordern würde.

Heißt: eine sichere Aktualisierung von Struktur-/UDT-Variablen ist im Zweifel nur mit einem Heidenaufwand zu bewerkstelligen... :o(


Gruß, Fred
 
Hallo Oma,

mir ist leider kein Weg bekannt.
Habe bis jetzt aber auch darauf verzichtet, den Siemens-Support hinzuzuziehen...
 
Danke für eure Mühen, habe hier das gleiche Problem mit zusammengesetzten Variablennamen TIA 17, WinCC, ich kanns ja kaum glauben, dass das nicht dynamisch gehen soll. Aber irgendwann kommt der Zeitpunkt, da schreibt man eben den Code und gut - oder hat sich da ne neue Lösung aufgetan?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für eure Mühen, habe hier das gleiche Problem mit zusammengesetzten Variablennamen TIA 17, WinCC, ich kanns ja kaum glauben, dass das nicht dynamisch gehen soll. Aber irgendwann kommt der Zeitpunkt, da schreibt man eben den Code und gut - oder hat sich da ne neue Lösung aufgetan?
Man kann schon den Name von HMI-Variablen zusammenbasteln, man muss halt nur die Systembedingungen beim Zugriff auf die HMI-Variablen beachten. Da wird sich eher nichts geändert haben. Was genau ist denn dein Problem? Vermutlich ist es weiter oben schon beantwortet.
 
Meine Überlegung war nur die, was ist wenn ich doch mal welche habe, die nicht aufgerufen werden oder wie der Kollege jetzt einen Aufruf vergisst.
Wenn man dieses Problem schon von vernherein umgehen könnte wäre das gut.
Wie ich oben weiter schon geschrieben habe : bei der Aktualisierung der Variablen auf "zyklisch fortlaufend" umstellen - dann wird die Variable IMMER aktualisiert - auch dann wenn sie gerade nirgendwo verwendet wird. Das sollte man allerdings nur bei einer begrenzten Anzahl von Variablen so machen ...

Was ist jetzt mit deinem zusammengestzten Variablennamen ?
 
Alde_Oma war vor 2 Jahren. Jetzt hat andreas1900 den Thread aufgegriffen - zum Frust ablassen?

Problem beim TIA WinCC ist, dass das keine HMI-Variablen auf strukturierte PLC-Variablen kann und Arrays nur sehr beschränkt. Ausweg: 1000 einzelne HMI-Variablen anlegen. Doch dazu haben die Namens-Bastler dann keine Lust...
 
Zurück
Oben