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

Ergebnis 1 bis 2 von 2

Thema: Mit VBA WinCC-Seiten bearbeiten (öffnen, Objekte prüfen, Dynamiken herausfinden)

  1. #1
    Registriert seit
    23.06.2014
    Beiträge
    12
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Forum,

    ich wollte euch mal was zurückgeben: Ich habe ein Programm erstellt (WinCC 7.2 Update 11), welches automatisiert WinCC-Dateien (PDL-Dateien) öffnet, Objekte darauf prüft und ggf. abändert.

    Daraus könnte man ableiten:
    - Wie öffne ich PDL-Dateien?
    - Wie prüfe ich (alle) Objekte auf einer Seite (ggf. in speziellen Layern)?
    - Wie prüfe ich, ob ein Objekt eine Dynamik aufweist (in meinem Fall: eine Dynamik für die Hintergrundfarbe des Objekts)
    - Wie prüfe ich, ob ein Objekt eine boolsche Dynamik hat?
    - Wie ändere ich speziell diese Farben, welche in einer Dynamik definiert sind?

    Es ist wahrlich nicht der beste und performanteste Code, aber mal ein Anhaltspunkt.
    Habt ihr Verbesserungsvorschläge? Her damit: Ich will ja auch was lernen.

    Ich habe mir eine kleine Visu zusammengeklickt, auf der ein Button definiert ist. Wenn man darauf klickt, passiert folgendes:



    Code:
    
    
    Option Explicit
    
    
    '|==============================|
    '|  Button: Find ALL Dynammics  |
    '|==============================|
    Private Sub btnFindALLDynamics_Click()
        Dim file As file                                    ' one file
        Dim allFiles As Files                               ' a set of files (e.g. GraCS)
        Dim aFolder As Folder
        Dim FSO_Log As New FileSystemObject                 ' Object for Logging
        Dim FSO As New FileSystemObject                     ' Object for file-open
        Dim thisApp As grafexe.Application
        Dim myObject As hmiObject
        Dim allObjects As HMIObjects
        Dim nObjects, i, anzGrpMember, changeObjCounter, fileCounter As Integer
    
        Dim strFilename, myTimestamp As String
        Dim logStream As TextStream
        Dim didIChangeSth As Boolean
            
        Set thisApp = Application
        Set aFolder = FSO.GetFolder(thisApp.ApplicationDataPath)
        Set allFiles = aFolder.Files
        
        fileCounter = 0                                                                             ' Amount of files checked
        changeObjCounter = 0                                                                        ' Amount of changed objects
        
        lbResults.Clear
                        
        'Logging
        myTimestamp = Format(DateTime.Now, "yyyy-MM-dd_hh-mm-ss")
        strFilename = "C:\_Test\" & myTimestamp & "_blablubb.txt"                                      ' File to be created
        Set logStream = FSO_Log.CreateTextFile(strFilename, True, True)
                                      
        logStream.Write ("//+============================================================+") & vbCrLf
        logStream.Write ("//|  Created on " & myTimestamp & " by <<insertYourNameHere>> |") & vbCrLf
        logStream.Write ("//+============================================================+") & vbCrLf
        logStream.Write ("//+  File" & vbTab & "Object-Name") & vbCrLf
        logStream.Write ("//+============================================================+") & vbCrLf
                                 
        ' (1) Check all files (in this folder)
        For Each file In allFiles
        
            fileCounter = fileCounter + 1
            
            ' (2) It's a "PDL Document" ?
            If file.Type = "PDL Document" Then
            
                ' (3) Open the file
                thisApp.Documents.Open file.Name
                didIChangeSth = False                                                               ' [remember: I changed nothing yet]
                Set allObjects = ActiveDocument.HMIObjects
                           
                ' (4) Check all objects...
                For Each myObject In allObjects
                    
                    ' (5) Don't respect Layer 1 - objects
                    If Not (myObject.Layer.value = 1) Then
                        
                        'lbResults.AddItem " (normales)   Objekt: " & myObject.ObjectName.value & " wird angeschaut"
                        
                        '... ein Dynamik (für die Hintergrundfarbe) vorliegt...
                        If Not myObject.BackColor.Dynamic Is Nothing Then
                            
                            '... eine spezielle Dynamik: Bool
                            If (myObject.BackColor.Dynamic.ResultType = hmiResultTypeBool) Then
                                ' Hat das Object das falsche Rot? Dann ändern!
                                If myObject.BackColor.Dynamic.BinaryResultInfo.NegativeValue = 1900760 Then
                                    myObject.BackColor.Dynamic.BinaryResultInfo.NegativeValue = vbRed
                                    logStream.Write ("  " & file.Name & vbTab & "Object: " & myObject.ObjectName.value & vbTab & " is now RED.") & vbCrLf
                                    changeObjCounter = changeObjCounter + 1
                                    didIChangeSth = True
                                End If
                                
                                ' Hat das Object das falsche Grün? Dann ändern!
                                If myObject.BackColor.Dynamic.BinaryResultInfo.PositiveValue = 2792512 Then
                                    myObject.BackColor.Dynamic.BinaryResultInfo.PositiveValue = vbGreen
                                    logStream.Write ("  " & file.Name & vbTab & "Object: " & myObject.ObjectName.value & vbTab & " is now GREEN.") & vbCrLf
                                    changeObjCounter = changeObjCounter + 1
                                    didIChangeSth = True
                                End If
                            End If
                         Else
                            ' No dynamic: static
                            'lbResults.AddItem "File: " & file.Name & vbTab & "Obj: " & myObject.ObjectName.value & vbTab & "ist NICHT Dynamisch! also egal"
                            'logStream.Write "File: " & file.Name & vbTab & "Obj: " & myObject.ObjectName.value & vbTab & "ist NICHT Dynamisch!"
                         End If                                                                 
    
                    End If                                                                          ' (5) not layer 1
                Next myObject                                                                       ' (4)
                
                If didIChangeSth Then                
                    Application.Documents.SaveAll                                                   ' Save the PDL-file
                End If
                Application.Documents.Close (Application.ApplicationDataPath & file.Name)           ' (3) Close the PDL-file
            End If                                                                                  ' (2) It' not a  *.PDL - File
        Next file                                                                                   ' (1) Check all files...
        Set FSO = Nothing
         
        logStream.Write ("//+============================================================+") & vbCrLf
        logStream.Write ("//|  Statistics                                                |") & vbCrLf
        logStream.Write ("//+============================================================+") & vbCrLf
        logStream.Write ("//|  I checked " & fileCounter & " files!") & vbCrLf
        logStream.Write ("//|  I changed: " & changeObjCounter & " times the colors of an object!") & vbCrLf    
        logStream.Write ("//+============================================================+") & vbCrLf
        
        lbResults.Clear
    End Sub
    
    '|==================|
    '|  Button: Exit    |
    '|==================|
    Private Sub btn_Exit_Click()
        Unload Me
    End Sub
    A fool with a tool is still a fool
    Zitieren Zitieren Mit VBA WinCC-Seiten bearbeiten (öffnen, Objekte prüfen, Dynamiken herausfinden)  

  2. #2
    Registriert seit
    18.07.2016
    Beiträge
    1
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    zunächst einmal vielen Dank für das Skript, damit hast du mir heute einige Stunden 'rumprobieren' erspart.

    Hier noch ein paar Anmerkungen über die ich gestolpert bin:
    • Bei WinCC 7.0 ist der Filetyp "WinCC.Graphics.Document" anstelle von "PDL Document"

    (Zumindest bei WinCC 7.0 SP3 Upd 6 auf Win 7 x64)


    • Damit das Skript ablaufen kann, muss man über "Tools"-> "References" einen Verweis auf die "Microsoft Skript Runtime Libary" hinzufügen, sonst scheitert es schon beim Zugriff auf die Dateien.

  3. Folgender Benutzer sagt Danke zu LeoO für den nützlichen Beitrag:

    sps_newbie (09.08.2016)

Ähnliche Themen

  1. TIA Programme aus TIA V13 mit V12 öffnen/bearbeiten
    Von cmm1808 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 28.08.2015, 12:05
  2. Antworten: 6
    Letzter Beitrag: 18.08.2013, 19:29
  3. Ordner durchsuchen VBA mit WinCC
    Von MB. im Forum HMI
    Antworten: 1
    Letzter Beitrag: 20.09.2011, 12:29
  4. Arbeitsblatt indirekt bearbeiten mit VBA in Excel 2007
    Von godi im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 16.04.2008, 09:58
  5. WinCC 5.0 Projekt mit V5.1 bearbeiten
    Von rxjaeger im Forum HMI
    Antworten: 3
    Letzter Beitrag: 16.01.2006, 18:27

Stichworte

Lesezeichen

Berechtigungen

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