TIA SmartTag auslesen funktioniert nicht

Alde_Oma

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

ich bastle gerade an einem Bildbaustein rum.

Dort habe ich unter anderem ein symbolisches EA-Feld mit Textliste hintendran welche von außen an den BB parametriert wird.
Als weitere Eigenschaft des BB wird ein UDT übergeben. Dieser beinhaltet ein Array 0-4 of DInt.

Nun möchte ich anhand des ausgewählten Eintrags des EA-Feld den Wert des passenden Arrayeintrags in einem weiteren EA-Feld anzeigen.

Bisher habe ich es wie folgt programmiert:

Code:
'Zum testen OK, für den Einsatz nicht geeignet, da eine feste Anzahl angegeben und Prorammiert werden muss
If SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 0 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[0]")

ElseIf SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 1 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[1]")
    
ElseIf SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 2 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[2]")
    
ElseIf SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 3 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[3]")
    
ElseIf SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 4 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[4]")
        
End If

So muss ich aber alle Indizes manuell eingeben...
Also möche ich das ganze dynamisch halten und den SmartTag zusammensetzen.
Z.B. so:

Code:
Dim test
test = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex")
'diPosition ist eine Variable im BB (DInt), welche auf das Ausgabe-EA-Feld gelegt wird.
diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[" & test & "]")

Dies funktioniert aber nicht und ich habe keine Ahnung weshalb.

Theoretisch kann ich es ja wie in Version 1 machen, da wenn sich die Größe des Arrays im UDT ändert, ich auch den BB aktualisieren muss.
Aber mich interessiert wieso dies nicht funktioniert.
 
Der Tagname kann (leider) nicht erst im Script zusammengebaut werden, weil dann WinCC nicht auf diese Variable zugreifen kann (wie Du ja selbst festgestellt hast).
Der Tag muss schon beim Übersetzen feststehen.

Dieses Multiplexen sollte ja noch im HMI mit einer internen Variable funktionieren.
Oder halt wieder in der SPS.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Außerhalb des BB hab ich aber z.B. den folgenden Code der funktioniert:

Code:
    Dim x

    'Alle Sichtbarkeitsebenen durchlaufen
    For x = 1 To 20
        
        'Aktive Sichtbarkeitsebene erkannt
        If SmartTags("DB_IBN_Sichtbarkeiten_uiSichtbarkeit") = x Then
            'Sichtbarkeit setzen
            SmartTags("DB_IBN_Sichtbarkeiten_Sichtbarkeit_Ebene_" & x) = True
                
        Else 'Inaktive Sichtbarkeitsebene
            'Sichtbarkeit rücksetzen
            SmartTags("DB_IBN_Sichtbarkeiten_Sichtbarkeit_Ebene_" & x) = False
            
        End If
    Next

Ist es hier was anderes, da die Variablen DB_IBN_Sichtbarkeiten_Sichtbarkeit_Ebene_1 bis ...20 schon fest existieren?
 
Das Zusammensetzen selber klappt ja scheinbar (zumindest meckert TIA nicht), nur das Auslesen der Variable eben nicht. Auch nicht, wenn die Variable auf zyklisch aktualisieren gesetzt wird.
Warum das so ist - keine Ahnung.
Gibt's aber schon einige Threads zu. Stand selbst auch vor dem Problem, allerdings bis dato nur außerhalb von BBs.
Harald (PN/DP) hatte da schon mal einige Hintergründe näher erläutert. Ist mir aber momentan wieder entfallen.

Und das Schreiben funktioniert so wirklich?



PS:
IMHO ist das aber grausamer Code. IF-THEN-ELSE nur für TRUE/FALSE.

Warum nicht eine einfache Zuweisung:
Code:
    Dim x

    'Alle Sichtbarkeitsebenen durchlaufen
    For x = 1 To 20
        
        'Aktive Sichtbarkeitsebene erkennen
        SmartTags("DB_IBN_Sichtbarkeiten_Sichtbarkeit_Ebene_" & x) = SmartTags("DB_IBN_Sichtbarkeiten_uiSichtbarkeit") = x
            
    Next
 
Zuletzt bearbeitet:
Ja das funktioniert so wie oben beschrieben.
Klar, da hast du recht. Eine einfache Zuweisung würde auch gehen, wobei ich von dieser Schreibweise mit mehreren = in einer Zeile kein Fan bin.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit VBS-Skripten in Bildbausteinen in TIA habe ich gar keine Erfahrung, ich habe aber trotzdem einige Fragen/Hinweise.

ich bastle gerade an einem Bildbaustein rum.

Dort habe ich unter anderem ein symbolisches EA-Feld mit Textliste hintendran welche von außen an den BB parametriert wird.
Wie ist das gemeint? Hast Du vielleich ein Bild davon?

Nun möchte ich anhand des ausgewählten Eintrags des EA-Feld den Wert des passenden Arrayeintrags in einem weiteren EA-Feld anzeigen.

Bisher habe ich es wie folgt programmiert:

Code:
If SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex") = 0 Then
    diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position[0]")

ElseIf [...]
Funktioniert das denn so wie erwartet?

In WinCC flexible muß man im VBS-Skript auf Array-Elemente von SmartTags so zugreifen: SmartTags("Arrayvariable")(Index)
Ob das in TIA anders ist weiß ich nicht.
In Skripten soll man nicht mehrmals auf Array-Elemente zugreifen, weil das für jeden Zugriff ein lesen/schreiben des gesamten Arrays auslöst. In Skripten soll man zunächst das Array auf ein Skript-internes Array umkopieren und kann dann auf jedes Element einzeln zugreifen.

Funktioniert es vielleicht so:
Code:
Dim index
index = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex")

'diPosition ist eine Variable im BB (DInt), welche auf das Ausgabe-EA-Feld gelegt wird.
diPosition = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position")(index)
oder so:
Code:
Dim index, array()
index = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionsindex")
array = SmartTags("Properties\UDT_Aktor.Motor_gesteuert.Positionen.Positionen.Position")

'diPosition ist eine Variable im BB (DInt), welche auf das Ausgabe-EA-Feld gelegt wird.
diPosition = array(index)

Deine Zugriffe auf die SmartTags sehen für mich so aus, als ob Du in jeder Bildbaustein-Instanz auf die selben globalen HMI-Variablen zugreifen willst - ist das richtig so?

Harald
 
BB.PNG
Auf dem Bild ist wie beschrieben ein EA-Feld vorhanden. Je nach Index der Auswahl soll aus dem Array ein Wert gelesen und als Soll-Position angegeben werden.
Meine Variante mit dem If-ElseIf funktioniert, ist jedoch unschön, da sehr unflexibel und viel schreibarbeit.
Die von dir vorgeschlagenen Varianten funktionieren leider nicht. Die Array-Variable ist nicht bekannt, wenn ich es mit () schreibe.

Ich übergebe an den BB einen UDT_Aktor. Dieser enthält für jeden BB unterschiedliche Daten (aus einem Array of UDT...).
Eigenschaften.PNG
Nur z.B. die Sichtbarkeit liegt unter Umständen auf mehreren Instanzen.
 
Zurück
Oben