TIA VBS Screens kann ich nicht als liste verwenden

jok3r

Level-2
Beiträge
370
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich müsste die Anzahl der Bilder herausfinden die mein HMI projekt hat.
Mit HmiRuntim.Screens.count bekomme ich nur 2 zurück, in meinem Bild gibt es aber weit über ca 15 Bilder.
Laut der Doki ist Screens auch ein Listtyp daher müsste doch das auch gehen->
Code:
Dim item
For Each item in HmiRuntime.Screens
 SmartTags("Testvar") = SmartTags("Testvar")+ 1
Next

Leider kommt da aber die Meldung "'=' erwartet in Zeile 5..."

Wie finde ich denn jetzt die Anzahl meiner Bilder heraus?

Gruß
 
Zuletzt bearbeitet:
Warum du die Meldung bekommst kann ich im Augenblich auch nicht sagen - ich vermute aber, dass das For..Each nicht funktioniert.

Aber wenn du die Anzahl der Screens wissen willst - warum fragst du dann nicht die "HmiRuntime.Screens.Count" ab ...?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, die Auflistung HmiRuntime.Screens enthält nicht alle vorhandenen Bilder sondern nur die beiden aktiven Bilder (Permanentbild und Grundbild). Eine Ermittlung der Anzahl vorhandener Bilder ist m.M. nicht möglich.

Ich würde mal den Siemens Support fragen.

Harald
 
Ich glaube, die Auflistung HmiRuntime.Screens enthält nicht alle vorhandenen Bilder sondern nur die beiden aktiven Bilder (Permanentbild und Grundbild). Eine Ermittlung der Anzahl vorhandener Bilder ist m.M. nicht möglich.

Ich würde mal den Siemens Support fragen.

Harald

Jap das scheint wirklich so.
Ich bräuchte eben eine Liste mit allen Bildern bzw deren Namen.

Ich werde berichten
Gruß
 
Ich bekam ein Feedback,
also aktuell gibt es dazu keine Möglichkeit.
Aber der vom Support meinte es wird sich diesbezüglich einiges tun, bisher lag der Focus laut ihm erst bei der implementierung von WinCC ins TIA Portal.
Das Objektmodel wird dann also demnächst angepasst und erweitert. Ziel wird das am Ende aus WinCC immer das selbe File rausfällt egal ob Scada oder bei der normalen. Auch soll irgendwann das normale Comfort Panel die funktionen der Scada lizenz können.
Und was er mir auch veraten hat ist dass die 200 Skript Grenze aufgehoben wird.

Code:
Dim MainMenuItem()
Dim Item 
Set MainMenuItem(0) = HmiRuntime.ActiveScreen.ScreenItems("Topic_A")
Set MainMenuItem(1) = HmiRuntime.ActiveScreen.ScreenItems("Topic_B")
Set MainMenuItem(2) = HmiRuntime.ActiveScreen.ScreenItems("Topic_C")
Set MainMenuItem(3) = HmiRuntime.ActiveScreen.ScreenItems("Topic_D")
Set MainMenuItem(4) = HmiRuntime.ActiveScreen.ScreenItems("Topic_E")
For Each Item In MainMenuItem
 Item.Visible = False
NexT

In dem Codebeispiel gibt es einen Fehler wenn ich die Array länge nicht angebe, das ist doch ein Bug?

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Danke für die Rückmeldung.

Ich glaube, die Fehlermeldung ist kein Bug. Die Größe des Feldes muß vor der Verwendung angegeben werden, notfalls mit einer Redim-Anweisung.

Ich sehe jetzt in Deinem kurzen Codeschnipsel auch keinen wirklichen Sinn, das künstlich über Array zu lösen. Weiters: Im SPS-Umfeld ist es eher unüblich, mit dynamisch die Größe ändernden Arrays zu arbeiten, weil das die bei weitem häufigste Gefahr für Software-Abstürze ist. In SPS arbeitet man zur Sicherheit (für hohe Softwarestabilität) mit vorher maximal groß festgelegten Datenstrukturen und prüft zur Laufzeit, ob die Elementanzahl nicht überschritten wird. Dynamisches Anfordern von Speicher und besonders das ungeprüfte Verwenden von Speicher wird vermieden.

Noch ein Tipp: verfalle nicht in den Stil, in der Visu alles durch "faule" Skripte erschlagen zu wollen, besonders das dynamische Zuweisen von Eigenschaften - das wird zur Laufzeit häufig schief gehen, weil es erstens nur für gerade angezeigte Bilder funktioniert und zweitens auch nur bis zum nächsten Bildaufbau hält und drittens findet man häufig auch keine geeigneten Ereignisse, um die Skripte aufzurufen oder man bekommt vor lauter Ereignissen mit Skriptanbindung einen Überlauf der Skript-Warteschlange.

Harald
 
Hallo,

es gibt schon eine Möglichkeit die Anzahl der Bilder zu ermitteln. Sie ist etwas extravagant und Zeitintensiv.

Code:
Sub BilderAnzahl()
On Error Resume Next    

Dim scr_name1, scr_name2  
Dim i, j, k
SmartTags("CntScreen") = 0        ' Anzahl Bilder im Projekt
scr_name1 = "" 
scr_name2 = ""

For i = 0 To 999 ' Maximale Bildnummer - Wert anpassen
    ' Öffne Bild mit Nummer (i) und speichere den Namen
    ActivateScreenByNumber i, 0
    scr_name1 = HmiRuntime.ActiveScreen.ObjectName

    ' Warten (könnte auch schöner gelöst werden)
    For j = 0 To 1000000
        k = 0
    Next
    
    ' Unterscheidet sich der Bildname vom letzten -> sprich hat ein Bildwechsel stattgefunden?
    If scr_name1 <> scr_name2 Then
        ' JA -> Zähler hochsetzen
        SmartTags("CntScreen") = SmartTags("CntScreen") + 1
    End If        
        
    scr_name2 = scr_name1     
Next

End Sub

Gruß
 
Hallo,

Danke für die Rückmeldung.

Ich glaube, die Fehlermeldung ist kein Bug. Die Größe des Feldes muß vor der Verwendung angegeben werden, notfalls mit einer Redim-Anweisung.

Ich sehe jetzt in Deinem kurzen Codeschnipsel auch keinen wirklichen Sinn, das künstlich über Array zu lösen. Weiters: Im SPS-Umfeld ist es eher unüblich, mit dynamisch die Größe ändernden Arrays zu arbeiten, weil das die bei weitem häufigste Gefahr für Software-Abstürze ist. In SPS arbeitet man zur Sicherheit (für hohe Softwarestabilität) mit vorher maximal groß festgelegten Datenstrukturen und prüft zur Laufzeit, ob die Elementanzahl nicht überschritten wird. Dynamisches Anfordern von Speicher und besonders das ungeprüfte Verwenden von Speicher wird vermieden.

Noch ein Tipp: verfalle nicht in den Stil, in der Visu alles durch "faule" Skripte erschlagen zu wollen, besonders das dynamische Zuweisen von Eigenschaften - das wird zur Laufzeit häufig schief gehen, weil es erstens nur für gerade angezeigte Bilder funktioniert und zweitens auch nur bis zum nächsten Bildaufbau hält und drittens findet man häufig auch keine geeigneten Ereignisse, um die Skripte aufzurufen oder man bekommt vor lauter Ereignissen mit Skriptanbindung einen Überlauf der Skript-Warteschlange.

Harald

Das kann schon sein dass es sehr unüblich ist, und es geht wenn man dabei nur an Siemens denkt gar nicht.

Hallo,

es gibt schon eine Möglichkeit die Anzahl der Bilder zu ermitteln. Sie ist etwas extravagant und Zeitintensiv.

Code:
 Sub BilderAnzahl()
 On Error Resume Next    

 Dim scr_name1, scr_name2  
 Dim i, j, k
 SmartTags("CntScreen") = 0        ' Anzahl Bilder im Projekt
 scr_name1 = "" 
 scr_name2 = ""

 For i = 0 To 999 ' Maximale Bildnummer - Wert anpassen
     ' Öffne Bild mit Nummer (i) und speichere den Namen
     ActivateScreenByNumber i, 0
     scr_name1 = HmiRuntime.ActiveScreen.ObjectName

     ' Warten (könnte auch schöner gelöst werden)
     For j = 0 To 1000000
         k = 0
     Next
     
     ' Unterscheidet sich der Bildname vom letzten -> sprich hat ein Bildwechsel stattgefunden?
     If scr_name1 <> scr_name2 Then
         ' JA -> Zähler hochsetzen
         SmartTags("CntScreen") = SmartTags("CntScreen") + 1
     End If        
         
     scr_name2 = scr_name1     
 Next

 End Sub

Gruß

Darauf wäre ich auch schon gekommen, aber das macht doch keiner oder ? :D

Und ich ha schon wieder was neues gefunden, kann es sein das man mit HMI Variablen bei Wertänderung kein Skript aufrufen kann?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Und ich hab schon wieder was neues gefunden, kann es sein das man mit HMI Variablen bei Wertänderung kein Skript aufrufen kann?

Ja ...!
Das ist so ... Das ist aber kein Bug sondern eine Vorkehrung von Siemens um zu verhindern, dass durch sich ändernde interne Variablen eine Art Zirkelbezug entsteht - also ein Script (oder eine Scriptkette) die immer weiter aufgerufen wird. Das nennt sich dann "Loop-Breaker"

Gruß
Larry
 
Bei dem Beispiel von P.Sojka muss man beachten, dass solange dieses eine Script läuft (und das kann ja schon "eine Weile" dauern) keine weiteren Scripte aktiv werden können ...

Gruß
Larry
 
Langsam wird das Thema Wincc und ich echt anstregend... es ist ja schön dass Siemens sich um die Dummis kümmert, aber letztendlich sollte der Programmierer immer noch selber dafür verantwortlich sein.
Wobei ich aber jetzt nicht den Unterschied dazu erkenne, weil ich das mit einer PLC variable auch machen kann. Die würde sich aber dann nur sekündlich änder.

Dann zum nächsten Punkt :) und letzten Punkt, wie bekomme ich den HMI Stil in einen Bildbaustein hinein ich verweifle schon zwei Tage daran.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Langsam wird das Thema Wincc und ich echt anstregend... es ist ja schön dass Siemens sich um die Dummis kümmert, aber letztendlich sollte der Programmierer immer noch selber dafür verantwortlich sein.
Naja ... so ganz ohne Grund wird das schon nicht entstanden sein ... ich muss aber auch sagen, dass das für mich bislang noch nicht wirklich ein Hindernis war ...

Wobei ich aber jetzt nicht den Unterschied dazu erkenne, weil ich das mit einer PLC variable auch machen kann. Die würde sich aber dann nur sekündlich änder..
Das hast du dir damit schon selbst beantwortet ... (es ändert sich nicht so schnell ...)

Dann zum nächsten Punkt :) und letzten Punkt, wie bekomme ich den HMI Stil in einen Bildbaustein hinein ich verweifle schon zwei Tage daran.
Sorry ... das mußt du mir erklären ... was meinst du damit (HMI Stil) ?

Gruß
Larry
 
Hallo,

Bei dem Beispiel von P.Sojka muss man beachten, dass solange dieses eine Script läuft (und das kann ja schon "eine Weile" dauern) keine weiteren Scripte aktiv werden können ...

in der Simualtion auf meinem Rechner hat es ca. 15-20 s für 1000 Interationen gedauert. Ich würde das auch nie in einen System machen, da es wie Du schon geschrieben hast, alles andere blockiert. Wenn, wie die Vorposter geschrieben haben, aber der Siemens "Support sagt: "es ist unmöglich", dann nehme ich die Herausforderung an :cool:.

Gruß und ein schönes Wochenende
 
Zurück
Oben