WinCC VBS Objekt in Bildfenster ändern

S7_Mich

Level-2
Beiträge
214
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe eine Frage zum Ändern eines Objektes während der Laufzeit der WinCC Runtime.

In einem Bildfenster wird ein Bild aufgerufen, in dem ich zur Laufzeit den Text eines Textfeldes ändern möchte. Das Problem ist aber, das die Bilder typisiert sind und ich den Bildern keine neue Versionsnummer geben möchte.

Jetzt war mein Gedanke, über eine Aufgabe in WinCC alle 500ms zu prüfen, ob das Bild1 aufgerufen wurde, falls ja soll die Eigenschaft Text des Objekt Textfeld geändert werden.

Also Bild1-->Bildfenster1-->Bild2-->Textfeld

Code:
Function Action()
'Tip:
' 1. Verwenden Sie die Tastenkombination <CTRL+SPACE> oder <CTRL+I>, um eine Liste aller Objekte und Funktionen zu öffnen
' 2. Schreiben Sie den Code unter Verwendung des HMI Runtime Objekts.
'  Beispiel: HmiRuntime.Screens("Screen_1").
' 3. Verwenden Sie die Tastenkombination <CTRL+J>, um eine Objektreferenz zu erstellen.
'Schreiben Sie den Code ab dieser Position:

HMIRuntime.Trace(HMIRuntime.ActiveScreen.ObjectName)

If HMIRuntime.ActiveScreen.ObjectName="Bild1" Then
    Dim objTextfeld
    Set objTextfeld = ScreenItems("Bildfenster1").Screen.ScreenItems("Textfeld")
    objTextfeld.text="Yes"
End If
End Function

Leider funktioniert das nicht so, wie ich mir das vorstelle.

Code:
============Laufzeitfehler in Microsoft VBScript============

Application    : GlobalScript Runtime

Action        : ScriptAct\Aufgabe_1.bac

Error        : Das Objekt unterstützt diese Eigenschaft oder Methode nicht.: 'HMIRuntime.ScreenItems'

============Laufzeitfehler in Microsoft VBScript============

Hat jemand von euch einen Tipp, wie ich das am besten umsetzen kann?
 
Du wirst auf jeden Fall mit dem Grundscreen anfangen müssen. In etwa so:

Set obj = HMIRuntime.Screens("Screen.fenster1").ScreenItems("textfeld")
obj.text = "xxx"
 
Das Hauptproblem ist der "ActiveScreen" - dieses Object liefert ganz oft nichts zurück - wie immer Siemens dies im Hintergrund beschreibt ...
Die sicherste Variante hier ist immer den Screen namentlich anzusprechen ...
 
Du könntest auch anstatt des Textfeldes ein EA-Feld mit einer Textliste oder eingebetteten Text nehmen, dann brauchst du das skripten gar nicht.

Das funktioniert leider nicht, da ich dann die Typsierung ändern muss. Dann könnte ich gleich den Text manuell ändern. Aber das wollte ich umgehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Hauptproblem ist der "ActiveScreen" - dieses Object liefert ganz oft nichts zurück - wie immer Siemens dies im Hintergrund beschreibt ...
Die sicherste Variante hier ist immer den Screen namentlich anzusprechen ...
Da hast du recht. Mit TIA V17 Upd1 habe ich es gestern in der Simulation noch hinbekommen. In der produktiven Umgebung ist schon TIA V17 Upd6 installiert. Da kommt mit HMIRuntime.Activescreen immer der Startbildschirm zurück. Erst wenn ich mit der Maus auf das geöffnete Bild klicke, enthält HMIRuntime.ActiveScreen den Namen des aktuell geöffneten Bildes.

Wie spreche ich denn das Bild direkt an? Das konnte ich noch nicht ganz nachvollziehen? Die Bilder sind sehr verschachtelt.

Der komplette Pfad bis zum Objekt Textfeld wäre: Startbild --> Bildfenster --> Bild --> Bildfenster --> Bild --> Objekt Textfeld.

Wie lautet denn da der Befehl dazu mit HMIRuntime.Screens ......
 
HMIRuntime.Screens("startbild.bildfenster:bild.bildfenster:bild").ScreenItems("textfeld").text = "xxx"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre Set obj = HMIRuntime.Screens("deinScreenName")
So etwas in der Art wurde dir aber im Beitrag #2 schon mal angeboten ...

Das ist mir schon klar, allerdings funktioniert es so einfach ja nicht, da das zu änderende Objekt verschachtelt über mehrere Bilder bzw. Bildfenstern liegt.
 
Das ist mir schon klar, allerdings funktioniert es so einfach ja nicht, da das zu änderende Objekt verschachtelt über mehrere Bilder bzw. Bildfenstern liegt.
Aber dem Objekt hast du doch einen Namen gegeben oder könntest es zumindestens - ansonsten hat die Visu das für dich getan. Über diesen Namen kannst du es ansprechen ...
 
@S7_Mich, #7 geht nicht??? Eigentlich brauchst Du da nur deine Objektnamen einzufügen.

TIA V17 kenne ich allerding nicht, weiß nicht ob sich VBS da genauso verhält wie in Classic.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab nochmal gegoogelt. So würde der Zugriff auf das Objekt Textfeld funktionieren.

Code:
dim objTextfeld
set objTextfeld=HMIRuntime.Screens("BaseScreen.ScreenWindows1:Screen1.ScreenWindows1:Screen2").ScreenItems("Textfeld_1")
objTextfeld.Text="yes"

Da ich das Skript aber jetzt über die Aufgabenplanung zyklisch ausführe, da ich das Skript nicht bei Bildaufbau hängen kann, wegen der Typisierung des Bildes, wird das Skript natürlich auch ausgeführt, wenn das betroffene Bild nicht geöffnet ist und das führt dann zu einem Fehler in der Diagnose.

Code:
Error        : get_Item:Falscher Parameter.

HMIRuntime.ActiveScreen.ObjectName liefert der produktiven Umgebung leider das Startbild. Erst wenn ich mit einem Mausklick irgendwo im Bild klicke, stimmt die Ausgabe von HMIRuntime.ActiveScreen.ObjectName

Gibt es noch eine Möglichkeit an den gerade angezeigten Bildnamen zu kommen?

Diesen würde ich dann in meinem zyklischen VBS abfragen und dann das Objekt Textfeld nur dann ändern, wenn das Bild auch geöffnet ist.
 
@S7_Mich, #7 geht nicht??? Eigentlich brauchst Du da nur deine Objektnamen einzufügen.

TIA V17 kenne ich allerding nicht, weiß nicht ob sich VBS da genauso verhält wie in Classic.
Doch du hast recht, ist das selbe was ich gerade bei googlen gefunden habe. Jetzt hab ich nur noch das Problem, das ich noch den aktuell aufgerufenen Bildnamen bräuchte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt hab ich nur noch das Problem, das ich noch den aktuell aufgerufenen Bildnamen bräuchte.
Den könntest du dir beim jeweiligen Aufruf des Bildes (egal welches) in eine Variable hineinschreiben - also eine interne Visu-Variable ...
 
Na ja, das ganze ohne Bildänderungen zu machen ist schon schwierig. Das Script soll ja ausgeführt werden sobald das Bild sichtbar wird und nicht erst wenn der Fokus darauf liegt. "ActiveScreen" scheidet hier, glaube ich, aus. BTW geht es hier nur um ein textfeld, oder um mehrere Objekte? Mit den zyklischen Abfragen (gerade bei 500ms) kann kann man sich auch leicht die Visu auf Schneckentempo schalten.
 
Zurück
Oben