EXCEL-Beispiel
Auf dieser Seite werden einige Beispiele für den COM-Manager und den zuvor beschriebenen Methoden aufgezeigt.
Die Beispiele wurden mit einem Makro mit dem Programm Excel durchgeführt (VBA als Programmiersprache), um einen Zugriff auf Daten in WinCC OA über die COM-Schnittstelle zu veranschaulichen. Um die Beispiele nachzuvollziehen, führen Sie zuvor folgende Schritte aus:
- Starten Sie WinCC OA mit dem Projekt WinCC OA DemoApplication (Sie können natürlich auch ein beliebiges anderes Projekt für den Test heranziehen, nur müssen dann auch die im Projekt definierten Datenpunkte im Code verwendet werden).
-
Starten Sie MS Excel.
-
Öffnen Sie eine neue Mappe (beim Starten des Programms wird automatisch eine neue Mappe angelegt - Mappe1 steht in der Titelleiste).
-
Öffnen Sie in Excel den Microsoft Visual Basic-Editor über den Menüpunkt Extras > Makro > Visual Basic-Editor. Es öffnet sich eine neues Fenster mit der Visual Basic Applikation.
-
Verweisen Sie im Projekt auf die WCCOACom 1.0 Type Library. Auswählen des Menüpunktes Extras > Verweise... und aktivieren der Library im aufscheinenden Dialogfenster.
-
Beispiel
Legen Sie im VS-Projekt ein neues Modul für die Mappe1 an. Bennen Sie das Modul auf ComMan um und fügen Sie dort den folgenden Code ein:
'Testumgebung für den COM-Manager Option Explicit Const CMDLINE = "-num 2 -proj DemoApplication_3.13" 'Beachten sie, dass Sie den richtigen Projektpfad angeben. 'Hier (DemoApplication_3.13) Private moComMan As ComManager 'Controls the test progress Public Sub test() Dim iAnswer As Integer Dim ws As Worksheet On Error GoTo test_error iAnswer = MsgBox("Start test?", vbQuestion + vbYesNo, "COM Test") If iAnswer <> vbYes Then Exit Sub Set ws = ThisWorkbook.Worksheets(1) ws.Range("A:K").Value = "" Call Init(ws) Call dpGet(ws) Call dpSet Call dpGetAsynch(ws) Call dpQuery(ws) Call dpTypes(ws) Call dpNames(ws) Call dpElementType(ws) ws.Range("A1:K1").EntireColumn.AutoFit Exit Sub test_error: Call MsgBox(Err.Description, vbCritical + vbOKOnly, Err.Number) End Sub ' Initializes (starts) the COM manager - example init() Private Sub Init(ws As Worksheet) Dim sConfigFile As String sConfigFile = Environ("PVSS_II") If moComMan Is Nothing Then Set moComMan = New ComManager Call moComMan.Init(CMDLINE) End If End Sub 'Example dpGet() Private Sub dpGet(ws As Worksheet) Dim asDpName(2) As String Dim avValue As Variant Dim rg As Range Dim n As Long asDpName(0) = "ExampleDP_Arg1.:_online.._value" asDpName(1) = "ExampleDP_Arg2.:_online.._value" asDpName(2) = "ExampleDP_Result.:_online.._value" Call moComMan.dpGet(asDpName, avValue) Set rg = ws.Range("A1") rg.Value = "Beispiel dpGet()" For n = 0 To UBound(avValue) rg.Offset(n + 1, 0).Value = asDpName(n) rg.Offset(n + 1, 1).Value = avValue(n) Next n End Sub 'Example dpSet() Private Sub dpSet() Dim sDpName As String Dim vValue As Variant sDpName = "ExampleDP_AlertHdl1.:_original.._value" vValue = 1 Call moComMan.dpSet(sDpName, vValue) sDpName = "ExampleDP_AlertHdl2.:_original.._value" vValue = 1 Call moComMan.dpSet(sDpName, vValue) End Sub 'Example dpGetAsynch() Private Sub dpGetAsynch(ws As Worksheet) Dim dtVon As Date Dim asDpName() As String Dim avValue As Variant Dim avTime As Variant Dim avType As Variant Dim rg As Range Dim n As Long Dim m As Long ReDim asDpName(0) asDpName(0) = "ApplicationProperties.demoDataStart:_online.._value" Call moComMan.dpGet(asDpName, avValue) dtVon = DateSerial(Year(avValue(0)), Month(avValue(0)), Day(avValue(0)) + 2) ReDim asDpName(1) asDpName(0) = "Reservoir_1_level.C3.AVG_WT0:_offline.._value" asDpName(1) = "Reservoir_2_level.C3.AVG_WT0:_offline.._value" Call moComMan.dpGetAsynch(dtVon, asDpName, avValue) Set rg = ws.Range("A6") rg.Value = "Beispiel dpGetAsynch()" For n = 0 To UBound(avValue) rg.Offset(n + 1, 0).Value = Left(asDpName(n), 17) rg.Offset(n + 1, 1).Value = avValue(n) Next n End Sub 'Example dpQuery() Private Sub dpQuery(ws As Worksheet) Dim sSQL As String Dim avValue As Variant Dim rg As Range Dim n As Long Dim m As Long sSQL = "SELECT ALERT '_alert_hdl.._value','_alert_hdl.._text' FROM 'Reservoir_*.value'" Call moComMan.dpQuery(sSQL, avValue) Set rg = ws.Range("G1") rg.Offset(0, 1).Value = "Beispiel dpQuery()" For n = 0 To UBound(avValue) For m = 0 To UBound(avValue(n)) If n > 0 And m = 2 Then rg.Offset(n + 1, m + 1).Value = CDbl(avValue(n)(m)) Else rg.Offset(n + 1, m + 1).Value = avValue(n)(m) End If Next m Next n End Sub 'Example dpTypes() Private Sub dpTypes(ws As Worksheet) Dim sPattern As String Dim asDpType() As String Dim rg As Range Dim n As Long sPattern = "*" Call moComMan.dpTypes(sPattern, asDpType) Set rg = ws.Range("A14") rg.Value = "Beispiel dpTypes()" For n = 1 To UBound(asDpType) If Left(asDpType(n), 1) <> "_" Then Set rg = rg.Offset(1, 0) rg.Value = asDpType(n) End If Next n End Sub 'Example dpNames() Private Sub dpNames(ws As Worksheet) Dim sDpPattern As String Dim sDpType As String Dim asDpName() As String Dim n As Long Dim rg As Range sDpPattern = "*" sDpType = "ANALOG1" Call moComMan.dpNames(sDpPattern, sDpType, asDpName) Set rg = ws.Range("B14") rg.Value = "Beispiel dpNames()" For n = 1 To UBound(asDpName) Set rg = rg.Offset(1, 0) rg.Value = asDpName(n) Next n End Sub 'Example dpElementType() Private Sub dpElementType(ws As Worksheet) Dim sDpPattern As String Dim sDpType As String Dim asDpName() As String Dim n As Long Dim rg As Range sDpPattern = "Reservoir_1_level.**" sDpType = "ANALOG1" Call moComMan.dpNames(sDpPattern, sDpType, asDpName) Set rg = ws.Range("C14") rg.Value = "Beispiel dpElementType()" For n = 1 To UBound(asDpName) If moComMan.dpElementType(asDpName(n)) = DPE_FLOAT Then Set rg = rg.Offset(1, 0) rg.Value = asDpName(n) End If Next n End Sub
-
Damit nach dem Öffnen des Dokuments das Makro mit den Beispielen für den COM-Manager auch ausgeführt wird, müssen Sie noch folgende Zeilen in der Arbeitsmappe (Excel Objekt "DieseArbeitsmappe") im Workbook Teil einfügen:
Private Sub Workbook_Open() Call ComMan.test 'ComMan ist der Name des Moduls; teste die Testfunktion End Sub
-
Speichern und schließen Sie die bearbeitete Arbeitsmappe und öffnen Sie diese erneut. Wählen Sie Makros aktivieren beim Start der Datei. Das Makro wird ausgeführt und befüllt über die COM-Schnittstelle die Arbeitsmappe mit Werten aus dem WinCC OA Projekt.