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

Der Simulant

Level-1
Beiträge
22
Reaktionspunkte
0
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
 
Hallo,

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

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.
 
Zurück
Oben