Der Simulant
Level-2
- Beiträge
- 24
- Reaktionspunkte
- 1
-> 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:
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