Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 49913

Excel oder Access: OPC-UA-Client unter VBA

$
0
0
Guten Tag liebe Mitleser,

ich möchte von Access aus auf einen OPC-UA-Server zugreifen. Leider bekomme ich ein Connection failed. Vermutlich liegt das an SignAndEncrypt, was das Excel-Beispiel von Siemens nicht beherrscht.
Hier im Forum habe ich nichts dazu gefunden.
Vielleicht hat jemand das bereits gelöst und kann helfen?

Hier meine Vorgehensweise:
Beispiel von Siemens 109748892_OPC_UA_ClientLibrary_CODE_V10 geladen.
Darin enthaltene OPC_UA_ClientLibrary nach Anleitung über regasm dem System bekannt gemacht.
Excel Beispiel geöffnet und Verbindungsdaten eingegeben: opc.tcp://192.168.126.3 auch Benutzername und Kennwort.
Das Excel-Beispiel ist wohl etwas älter. Denn es hat nur 7 Fächer für die Ergebnisse von GetEndpoints vorgesehen. Mein Server bringt 11 Ergebnisse. Also habe ich die User und PSW-Felder verschoben.
Folgende 11 Einträge bringt der Sinumerik-OPC-UA:
Wie man sieht gibt es identische Einträge. Mir war Anfangs nicht klar warum, also habe ich alle durchprobiert aber schon in Excel keine Connection bekommen.
In Access habe ich folgendes versucht:
Ein Klassenmodul K_OPCUA erstellt.
Code:

Option Compare Database

Option Explicit

Private k_OpcUaClient As OpcUaClient
Private k_endpoint As OpcUaEndpoint
Private k_Connect_String As String

Private Sub Class_Initialize()
    Dim i, iUbound, iLbound As Integer
    Dim LResult As Integer
    Dim Tempstring As String
    Dim endpoints() As OpcUaEndpoint
    Dim strSelectedEndpoint As String

    k_Connect_String = "opc.tcp://192.168.126.3:4840"
    Set k_OpcUaClient = New OpcUaClient
    On Error Resume Next
    endpoints = k_OpcUaClient.GetEndpoints(k_Connect_String)
 
    'error handling for GetEndpoints
    If Err.Number <> 0 Then
        MsgBox Err.Description
        Exit Sub
    End If
    iUbound = UBound(endpoints)
    iLbound = LBound(endpoints)
    strSelectedEndpoint = "http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15"
    For i = iLbound To iUbound
        Debug.Print endpoints(i).SecurityPolicyUri
        Tempstring = CStr(endpoints(i).SecurityPolicyUri)
        LResult = StrComp(strSelectedEndpoint, Tempstring, vbTextCompare)
        If LResult = 0 Then
            'selected endpoint found
            k_endpoint = endpoints(i)
            Exit Sub
        End If
    Next i
End Sub

Public Sub Do_Connect()

    'connect with user authentification
    On Error Resume Next
    k_OpcUaClient.Connect k_endpoint, True, "USER1", "KENNWORT1"
   
    'error handling for Connect
    If Err.Number <> 0 Then
        MsgBox Err.Description
        Err.Number = 0
        'MsgBox "try again. not connected "
        Exit Sub
    End If
   
    MsgBox "connected"
End Sub

Private Sub Class_Terminate()
    k_OpcUaClient.Disconnect
    Set k_OpcUaClient = Nothing
End Sub


Aufruf im Programm:

Code:

Dim m_Messmaschine As K_OPCUA
Set m_Messmaschine = New K_OPCUA
m_Messmaschine.Do_Connect

So hätte ich es erstmal hübsch gefunden. Tut aber nicht.
Erstes Problem: die Zeile k_Endpoint = endpoints(i) übergibt keinen Wert. k_Endpoint ist danach nothing. Deswegen habe ich in der DoConnect direkt den Endpoint angegeben:
Code:

    On Error Resume Next
    endpoints = k_OpcUaClient.GetEndpoints(k_Connect_String)
   
    'error handling for GetEndpoints
    If Err.Number <> 0 Then
        MsgBox Err.Description
        Exit Sub
    End If
    'connect with user authentification
    On Error Resume Next
    k_OpcUaClient.Connect endpoints(11), True, "USER1", "PASSWORT1"
   
    'error handling for Connect
    If Err.Number <> 0 Then
        MsgBox Err.Description
        Err.Number = 0
        'MsgBox "try again. not connected "
        Exit Sub
    End If
   
    MsgBox "connected to "
    Exit Sub

Damit habe ich alle 11 durchprobiert. Ohne Erfolg.
Der Benutzer und das Kennwort stimmen, diese Kompination benutze ich auch in UAExpert, wo es funktioniert. Im UAExpert muss ich allerdings auch noch Sign&Encrypt auswählen.
Nach einigem Suchen fand ich:
Code:

        Debug.Print endpoints(i).SecurityPolicyUri
        Debug.Print endpoints(i).EndpointDescription
        Debug.Print endpoints(i).SecurityLevel
        Debug.Print endpoints(i).SecurityMode

Damit sieht man, dass sie identischen Einträge sich in der Security unterscheiden:
Code:

http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15
55
Sign
http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15
105
SignAndEncrypt
http://opcfoundation.org/UA/SecurityPolicy#Basic256
60
Sign
http://opcfoundation.org/UA/SecurityPolicy#Basic256
110
SignAndEncrypt
http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
65
Sign
http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256
115
SignAndEncrypt
http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15
55
Sign
http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15
105
SignAndEncrypt
und so weiter

Der Eintrag mit dem Index 1 (zählung ab 0) ist für mich der richtige. Aber es meldet immer Connection Error (oder failed, kann es gerade nicht testen).
Eigentlich hätte ich an der Connect Stelle wie bei allen anderen Clients auch den Hinweis erwartet, dass es sich um ein Self-Signed Certificate handelt.
Kann das Excel-Beispiel das mit den Zertifikaten vielleicht gar nicht?
Gibt es Befehle/Erweiterungen, mit denen ich das bewerkstelligen kann?

Viewing all articles
Browse latest Browse all 49913


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>