Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: ScreenItems indiziert durchlaufen

  1. #1
    Registriert seit
    09.01.2012
    Beiträge
    55
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vorab: WinCC 7.3, Server/Client Projekt, Clients sind PCs

    Hallo liebe Helfer,

    ich schreibe gerade ein Faceplate, bei dem ich in einem VBScript durch alle Bild-Objekte des Faceplates iterieren muss.
    Hintergrund ist, dass die normalen Windows-Radio-Boxen zu klein sind, und auch nicht mehrspaltig so darstellbar sind, dass nachher immer nur ein Item selektiert sein kann. Ich möchte das Verhalten daher mit Buttons nachbauen, die entweder keinen Text haben, oder ein "X". Jeder Button ist über seinen Namen eindeutig identifiziert: BLM001, BLM002, ... ...

    Wird nun ein Button gedrückt, wird die Zahl im Namen (Right(Item.ObjectName, 3)) in eine Faceplate-Variable geschrieben (32 Bit Ganzzahl). Das klappt auch, ich lasse mir den Wert probehalbar in einem E/A-Feld anzeigen. Bei Änderung dieses Wertes möchte ich nun durch alle Objekte gehen, schauen ob der Name mit "BLM" anfängt, und wenn ja abhängig von dem Wert meiner Variablen ein "X" oder ein Leerzeichen als Text setzen.

    Obwohl ich bei meiner bisherigen Recherche immer wieder was davon gelesen habe, dass man ScreenItems() in einem Faceplate gar nicht nutzen kann, und schon gar nicht Properties setzen, klappt folgendes jedoch wunderbar:
    Code:
    Sub OutputValue_OnPropertyChanged(Byval Item, Byval value) 
        ScreenItems("BLM001").Text = "H"
    End Sub
    Der Code wird bei Änderung des Ausgabewertes in dem E/A-Feld ausgeführt, welches die Nummer meines zuletzt gedrücken Buttons beinhaltet. BLM001 hat tatsächlich zur Runtime dann den Text "H", während er im Editor noch den Text "X" hat. Also scheint man ScreenItems wohl DOCH in einem Faceplate nutzen zu können, und Properties schreiben geht dann scheinbar auch.

    Die Siemens VBS Referenz suggeriert, dass man ScreenItems() nicht nur mit Namen, sondern auch mit einem numerischen Index nutzen können soll. Aber genau da hapert es jetzt:
    Code:
    Sub OutputValue_OnPropertyChanged(Byval Item, Byval value)        
        Dim obj
        Dim i
        For i = 1 To ScreenItems.Count
            obj = ScreenItems(i)
            If Left(obj.ObjectName, 3) = "BLM" Then
                If Right(obj.ObjectName, 3) = SmartTags("SelectedLM").Value Then
                    obj.Text = "X"
                Else
                    obj.Text = " "
                End If
            End If
        Next
    End Sub
    Code, den ich vor die Schleife setze, wird noch ausgeführt. Danach leider nichts mehr, und ich bekomme auch keine Fehlermeldungen irgendwelcher Art. Es passiert einfach nix. (Es werden auch keine Leerzeichen gesetzt, die Buttons haben alle vorab ein "-" als Text um das zu prüfen.)

    Wie muss ich das richtig machen?
    Danke euch schon mal!

    EDIT: ScreenItems.Count ist 0! Lustigerweise habe ich das so ermittelt:
    Code:
    	ScreenItems("Testfeld").Text = ScreenItems.Count
    "Testfeld" ist ein Statischer Text der auf dem Faceplate liegt. Wenn ich also per Name dran komme, scheint in der Liste "ScreenItems" ja durchaus etwas drin zu sein. Warum ist dann aber Count 0?? Da komme ich jetzt nicht mehr mit.
    Geändert von Medium (05.07.2016 um 19:14 Uhr)
    Zitieren Zitieren ScreenItems indiziert durchlaufen  

  2. #2
    Registriert seit
    29.03.2004
    Beiträge
    5.366
    Danke
    134
    Erhielt 1.585 Danke für 1.157 Beiträge

    Standard

    Warum muss es denn überhaupt mit einem Skript sein? Animiere doch die Textobjekte in Abhängigkeit von der 32-Bit Variablen.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  3. #3
    Medium ist offline Benutzer
    Themenstarter
    Registriert seit
    09.01.2012
    Beiträge
    55
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Dann müsste ich mich für jeden Button durch die Klickorgiendialoge quälen. Nein, das tut man sonst schon genug. Ich wollte eigentlich eine elegante Lösung, bei der man Buttons zufügen kann, indem man einfach einen bestehenden kopiert und dessen Namen ändert. Und es sollen nachher auch noch andere Sachen passieren an dieser Stelle, die definitiv Scripting erfordern. (Strings aus der SPS lesen, konkatenieren und an das Parent-Fenster zurück liefern etc.)

    Bitte auch mein Edit im 1. Beitrag beachten. Seltsame Dinge.

  4. #4
    Registriert seit
    29.03.2004
    Beiträge
    5.366
    Danke
    134
    Erhielt 1.585 Danke für 1.157 Beiträge

    Standard

    Da würde ich mir eher eine Konstante hinterlegen, wie viele Elemente vorhanden sind, und Elemente dann passend benennen (BLM001...BLM099). Oder du hinterlegst die Konstante als Wert in einem unsichtbaren EA-Feld. Zyklisch alle Elemente durchzugehen ist sicher auch nicht die schnellste Lösung.

    Warum das mit dem Durchgehen der Elemente nicht funktioniert, weiß ich allerdings auch nicht aus dem stehgreif. Manche Funktionen sind auch nicht für die Runtime gedacht, sondern nur für Konfiguration (CS).
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  5. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Medium (05.07.2016)

  6. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.366
    Danke
    134
    Erhielt 1.585 Danke für 1.157 Beiträge

    Standard

    Probier mal so in der Art:
    Code:
    Dim obj
    Dim objScreen
    Dim i
    Dim name
    
    Set objScreen = HMIRuntime.Screens("DeinBildname")
    
    For i = 1 To objScreen.ScreenItems.Count
       name = objScreen.ScreenItems.Item(i).ObjectName
       HMIRuntime.Trace "ObjectName[" & i & "] = " & name & vbNewLine
    Next
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  7. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Medium (05.07.2016)

  8. #6
    Medium ist offline Benutzer
    Themenstarter
    Registriert seit
    09.01.2012
    Beiträge
    55
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Gut, das könnte ich machen. Es gibt zwar Lücken in der Nummerierung (die Zahlen korrespondieren direkt mit Tanknummern), aber das sollte dennoch flott genug sein. Dann bastel ich mir die Objektnamen zur Indizierung eben als Strings zusammen. (Da rollen sich mir, als eigentlich Software-Engineer zwar die Fußnägel auf, aber wenn Siemens drauf steht erwartet vermutlich eh niemand viel Eleganz oder Performanz )

    Danke für die Anregung! Das sollte, nach aktuellem Kenntnisstand, eigentlich klappen.

    Edit: Den Umweg über das "Elternbild" probiere ich auch! Allerdings erst morgen. Spät genug geworden für heute. Danke nochmals!
    Geändert von Medium (05.07.2016 um 19:48 Uhr)

  9. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.366
    Danke
    134
    Erhielt 1.585 Danke für 1.157 Beiträge

    Standard

    Wenn das dynamisch sein soll, würde ich vielleicht anstelle von selbstgestalteten Radiobuttons ein Listenfeld verwenden. Das lässt sich dann auch elegant per Skript füllen und abfragen, bekommt Scollbalken wenn es nicht mehr in dein Bild hineinpasst usw.
    Die Genialität einer Konstruktion liegt in ihrer Einfachheit – Kompliziert bauen kann jeder.

    (Sergei Pawlowitsch Koroljow, sowjetischer Konstrukteur von Raketen und Weltraumpionier)

  10. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Medium (05.07.2016)

  11. #8
    Medium ist offline Benutzer
    Themenstarter
    Registriert seit
    09.01.2012
    Beiträge
    55
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Wenn das dynamisch sein soll, würde ich vielleicht anstelle von selbstgestalteten Radiobuttons ein Listenfeld verwenden. Das lässt sich dann auch elegant per Skript füllen und abfragen, bekommt Scollbalken wenn es nicht mehr in dein Bild hineinpasst usw.
    Das hatte ich auch anfangs überlegt. Leider kann ich dort den einzelnen Einträgen keine "non-visuellen Daten" mit anhängen, sodass ich unsere internen Tanknummern (die für die Bediener keine Bedeutung haben) mit in den Text aufnehmen müsste. (Leider ist es nicht Tank 1-x, sondern 3, 4, 5, 8, 11, usw, so dass ich den Selektierten Index nicht durch eine generelle Formel in die zugehörige Tanknummer überführen kann.) Die interne Tanknummer brauche ich aber, da die Schnittstelle zu unserem Dosier-Baustein diese benötigt. Und das ganze hier wird meine Quell-Auswahl.

  12. #9
    Medium ist offline Benutzer
    Themenstarter
    Registriert seit
    09.01.2012
    Beiträge
    55
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Na geil. So geht es nicht, weil man es wohl für eine tolle Idee gehalten hat statt einfach Null zurückzugeben, das Script einfach wortlos abzubrechen wenn es kein Objekt mit Namen "Foo" gibt, und man Set obj = ScreenItems("Foo") aufruft. Dadurch kann ich dann nicht mehr mit meinem "Text-Index" über alle Buttons von x bis y iterieren, weil es Lücken darin gibt, wo einfach keine Buttons zu der Nummer existieren. Hab den Kaffee schon wieder auf für heute mit diesem ganz tollen Scripting, das Siemens da eingebaut hat...
    Lasst mich raten: WinCC VBS kennt auch keine try...except Konstrukte hm?

    Edit: Sorry, zu früh gemotzt. Siemens kann ja nichts für das seltsame Error-Handling in VBS. Mit einem "On Error Resume Next" und Abfrage der gobalen "Err" Variablen kann ich was zaubern. Scusi!
    Geändert von Medium (06.07.2016 um 13:07 Uhr)

  13. #10
    Registriert seit
    16.04.2014
    Ort
    Hamburg
    Beiträge
    46
    Danke
    2
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    HI,

    ich kenne deinen Schmerz

    Du kannst folgendes Versuchen:

    Code:
    'Starting error routine - Starten der Fehlerroutine
    On Error Resume Next
    
    'do your stuff
    
    
    'Check if any errors happend 
    If Err.Number <> 0 Then
    	ShowSystemAlarm "Error #" & CStr(Err.Number) & " " & Err.Description
    	Err.Clear
    	Exit Sub
    End If
    Gruß Thomas

  14. Folgender Benutzer sagt Danke zu IckeSI für den nützlichen Beitrag:

    Medium (06.07.2016)

Ähnliche Themen

  1. TIA Datenbaustein mittels Schleife durchlaufen
    Von fabianfischer im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 16.07.2015, 08:44
  2. Adressen durchlaufen
    Von djp im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 02.09.2011, 11:36
  3. Auf Array indiziert zugreifen
    Von leon79 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 17.10.2008, 16:16
  4. Prioritätsfehler (OB85 wurde durchlaufen)
    Von Beren im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 18.07.2008, 16:03
  5. Schrittkette mehrmals durchlaufen lassen
    Von anfänger2006 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 15.04.2006, 08:51

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •