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?