TIA Schreibender Zugriff auf Array in Bildbaustein

Stefan592

Level-2
Beiträge
109
Reaktionspunkte
24
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

mein Bildbaustein besteht aus einem PLC-Datentyp mit einem Mehrdimensionalen Array aus Bits.

Die Gestaltung einzelner Elemente über die Bitzustände klappt problemlos. Nun möchte ich eine Schaltfläche einbinden die diese Bits invertiert.
Leider kann ich auf die Bits in der Schnittstelle nicht schreiben. Bei meiner Fehlersuche bin ich darauf gekommen das man aus dem Bildbaustein nicht auf Variablen in Arrays schreiben kann.
Dabei ist auch egal ob das Array aus Bits oder zum Beispiel aus Wörtern besteht.

Auch der Umweg über ein Script funktioniert nicht!
Code:
 "SmartTags("Properties\Teiledaten.R[1].T[2]") = True"

Ist ein schreibender Zugriff auf Array Variablen in einem UDT irgendwie möglich? Ich kann nicht einen Bildbaustein erstellen der 500 Bits in der Schnittstelle hat.
Das Problem tritt bei TIA V14 sowie TIA V15 Upt. 1 auf

Forum_2.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
SmartTags("Properties\Teiledaten.R[1].T[2]") ist kein Zugriff auf ein Array-Element, sondern auf eine HMI-Variable die "Properties\Teiledaten.R[1].T[2]" heißt. Außerdem wäre das kein mehrdimensionales Array sondern zwei verschachtelte Arrays. Auf Elemente eines HMI-Variable-Arrays greift man so zu: SmartTags("Properties\Teiledaten.R[1].T")(index)
Ich weiß allerdings nicht, wie man in VBS auf ein SmartTags-Array in einem Array of Struct zugreift. Und ich bin nicht sicher, ob man in TIA-Bildbausteinen überhaupt auf SmartTags zugreifen kann...

Es ist außerdem keine besonders gute Idee, auf mehrere Elemente eines Arrays schreibend zuzugreifen, weil bei jedem Zugriff das Lesen bzw. Schreiben des gesamten Arrays ausgelöst wird und man dann Kommunikationsüberlastungen erhält.

Harald
 
..Es ist außerdem keine besonders gute Idee, auf mehrere Elemente eines Arrays schreibend zuzugreifen, weil bei jedem Zugriff das Lesen bzw. Schreiben des gesamten Arrays ausgelöst wird und man dann Kommunikationsüberlastungen erhält..
Wie kann man diesem Mythos eigentlich mal auf den Grund gehen? Müssen da bestimmte Umstände zusammen treffen? Bei mir müsste demnach bei jedem Tastendruck das Patchkabel verdampfen.
 
Wie kann man diesem Mythos eigentlich mal auf den Grund gehen? Müssen da bestimmte Umstände zusammen treffen? Bei mir müsste demnach bei jedem Tastendruck das Patchkabel verdampfen.

Wenn du ein Array in deinem HMI (z.B. für ein Comfort Panel) in Gänze anlegst, dann wird immer das komplette Array mit allen Elementen gelesen. Und wenn du auf ein einzelnes Element einen Wert schreibst, dann wird immer das komplette Array geschrieben. Die anderen Array-Indizes erhalten dann als Schreibwert den zuletzt gelesenen Wert.

Darum muss man schon genau aufpassen, wo sich zum Einsparen von Tags Arrays überhaupt sinnvoll verwenden lassen, ohne damit nicht andere Probleme zu bekommen.

Wenn du Variablen aus einem Array als einzelne Variablen im HMI anlegst, dann werden diese wie Einzelvariablen behandelt.

Bei der 1200er und 1500er werden Variablen aber bis zu einer maximalen Anzahl nicht mehr gepollt, sondern bei der SPS zur Änderungsübertragung angemeldet. Ändert sich dann z.B. ein Wert aus dem Array, dann wird das gesamte Array übertragen. Ändert sich im Array aber nichts, dann werden auch keine Werte übertragen, bzw. gibt es dann nur sehr kurze Statustelegramme.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe neulich bei so etwas Stunden zugebracht, bis mir eingefallen war, dass man im DB die entsprechenden Variablen für HMI-Schreibzugriffe explizit freigeben muss. Ist es das?

Die entsprechenden Hacken sind alle gesetzt.

SmartTags("Properties\Teiledaten.R[1].T[2]") ist kein Zugriff auf ein Array-Element, sondern auf eine HMI-Variable die "Properties\Teiledaten.R[1].T[2]" heißt. Außerdem wäre das kein mehrdimensionales Array sondern zwei verschachtelte Arrays. Auf Elemente eines HMI-Variable-Arrays greift man so zu: SmartTags("Properties\Teiledaten.R[1].T")(index)
Ich weiß allerdings nicht, wie man in VBS auf ein SmartTags-Array in einem Array of Struct zugreift. Und ich bin nicht sicher, ob man in TIA-Bildbausteinen überhaupt auf SmartTags zugreifen kann...

Es ist außerdem keine besonders gute Idee, auf mehrere Elemente eines Arrays schreibend zuzugreifen, weil bei jedem Zugriff das Lesen bzw. Schreiben des gesamten Arrays ausgelöst wird und man dann Kommunikationsüberlastungen erhält.

Harald

Ja OK es sind 2 verschaltete Arrays.
Den Befehl "[FONT=&quot]SmartTags("Properties\Teiledaten.R[1].T[2]")[/FONT]" erhalte ich wenn ich im Bildbaustein, im Scripteditor die Variable per Dropdownmenü auswähle. Den Zugriff über "[FONT=&quot]SmartTags("Properties\Teiledaten.R[1].T")(index)[/FONT]" werde ich prüfen.

Selbst wenn immer das gesamte Array übertragen wird. Es sind 16 Bits in einem Array aus 36 Elementen. Selbst wenn für jedes Bit ein Byte übertragen werden müsste, wären es in Summe nur 576 Bytes. Diese 576 Byte entsprechen gerade einmal 0,004608 Megabit. Dies bei einer 100MBit/s Übertragung über Ethernet.


Stefan
 
Hallo Zusammen,

ich möchte gern in einem Bildbaustein auf Array-Elemente dynamisch zugreifen:

Code:
 Dim Offset
 Offset = 1
 SmartTags("Properties\PosX.Position[0]") = SmartTags("X0")                  'Geht ist aber ein statischer Zugriff
 SmartTags("Properties\PosX.Position")(0) = SmartTags("X1")                  'Geht nicht: findet Properties\PosX.Position nicht
 SmartTags("Properties\PosX.Position[Offset]") = SmartTags("X0")           'Geht nicht: Fehlende Anführungsstriche von "Offset" mit geht auch nicht

Ich benutze TIA V15.1

Kann mir dabei jemand helfen? Oder weiß jemand wo das steht wie ich das machen kann?

Vielen Dank im voraus.

Michael
 
ich möchte gern in einem Bildbaustein auf Array-Elemente dynamisch zugreifen:

Code:
 Dim Offset
 Offset = 1
 [COLOR="#FF0000"]SmartTags("Properties\PosX.Position[0]")[/COLOR] = SmartTags("X0")                  'Geht ist aber ein statischer Zugriff
 [COLOR="#0000FF"]SmartTags("Properties\PosX.Position")(0)[/COLOR] = SmartTags("X1")                  'Geht nicht: findet Properties\PosX.Position nicht
 [COLOR="#FF0000"]SmartTags("Properties\PosX.Position[Offset]")[/COLOR] = SmartTags("X0")           'Geht nicht: Fehlende Anführungsstriche von "Offset" mit geht auch nicht
Wie schon in Beitrag #3 erklärt, ist nur die zweite Syntax ein Zugriff auf ein Array.
Kann es sein, daß Du die HMI-Variable "Properties\PosX.Position" gar nicht als Array deklariert hast?

Es könnte allerdings auch sein, daß in einem Skript in einem Bildbaustein gar nicht auf ein Array zugegriffen werden kann?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für Deine Antwort PN/DP

Es ist schon ein UDT mit einem Array als IO Deklariert. Siehe Bildchen:

Mit etwas Recherche im Internet habe ich dazu jedoch eine Lösung gefunden:

Code:
Dim Offset
Offset = 0
SmartTags("Properties\PosX.Position["&Offset&"]") = SmartTags("X0")

Ich weiß halt nur noch nicht ob das so funktioniert. Aktuell bereite ich noch die Software vor.

Unbenannt.png
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    24,7 KB · Aufrufe: 10
Zurück
Oben