我有两个Windows服务,一个服务(service1)连接到两个OPC-UA服务器,这很好用。其他Windows服务(service2)使用来自OPC-UA foundation的.NET参考堆栈的相同连接代码连接到相同的两个OPC-UA服务器。
Service1可以连接到两个OPC-UA服务器,并成功轮询数据。在部署Service2期间,Service2还可以连接和读取来自两个OPC-UA服务器的值。此时一切都很好。
然而,现在过了一段时间,没有对任何代码做任何更改。在执行Session时,Service2无法再连接到其中一个OPC-UA服务器。创建它只是回复ServiceResultException BadSecureChannelClosed(2156265472)。
开始故障排除:在我们的客户现场,我们还有一个测试服务器,它在生产环境中运行相同的设置设置,这意味着Service1和Service2也在测试服务器上运行,并以与这两个OPC相同的方式进行通信-UA服务器。
我注意到当我关闭测试服务器上的服务时,Service2的BadSecureChannelClosed错误消失(但是Service2仍然可以与两个OPC-UA服务器中的另一个通信)。使所有内容在生产服务器上按预期工作。
这让我想知道OPC-UA服务器上会话和连接的限制。 OPC-UA服务器型号为SINUMERIK 840d。我问西门子是否有可能激活ServerDiagnostics对象来解决会话数量等问题,但是他们回答说这是不可能的。我认为这个对象是必须启用的吗?
任何人都可以给我一些可能导致这种情况的提示,以及在建立连接时我应该考虑的限制和事项,例如:什么需要独特?应用名称? SESSIONNAME?什么可能导致这种 - 看似 - "随机" BadSecureChannelClosed错误。请注意,我在Create Session调用中使用updateBeforeConnect = true。我将UserIdentity与硬编码的用户名和密码一起使用。
另一个奇怪的症状是,对于使用BadSecureChannelClosed回复的OPC-UA服务器,当使用UaExpert连接到它时会出现Discovery错误(几周前不存在的错误):
16:58:41.806 |自动更新|检索当前版本信息时出错:主机updates.unified-automation.com未找到
16:58:35.404 | DiscoveryWidget | opc.tcp://192.168.0.200:4840上的Discovery GetEndpoints失败(BadCommunicationError)
16:58:35.401 | DiscoveryWidget | opc.tcp://192.168.0.200:4840上的Discovery FindServers失败(BadCommunicationError)
答案 0 :(得分:2)
当前的Sinumerik OPC UA服务器存在问题,并且未提供正确编码的ExtensionObjects。一旦可用,您将需要向西门子请求更新服务器。
请注意,您可以毫无问题地访问它,UaExpert可以解码编码错误的ExtesionObjects。这只是让他们首先发布了这样的错误版本。
编辑:关于ExtensionObjects的注意事项:如果您尝试将其作为完整结构读取,则将ServerStatus作为ExtensionObject传输。 PublishResponse(用于提供订阅数据)还包括编码为ExtensionObjects的数据更改。因此,如果您仅通过ServerState监视状态,它可能会起作用。但无论如何,订阅都不会起作用。