Клиент Siemens OPC UA и .NET C # не может подключиться к серверу?

Я попытался подключиться к серверу OPC UA с помощью клиента, представленного на этой странице: https://support.industry.siemens.com/cs/document/42014088/programming-an-opc-ua-net-client-with-c%23-for-the-simatic-net-opc-ua-server?dti=0&lc=en-US. Подключение к серверу OPC UA с помощью Siemens OPC Scount v10 работает нормально. При подключении к серверу OPC UA с помощью клиента, указанного в статье, я получаю следующее сообщение:

Не удалось открыть канал запроса TCP UA.

Трассировка стека исключения следующая:

    Server stack trace: 
   at Opc.Ua.Bindings.UaTcpRequestChannel.OnEndOpen(IAsyncResult result)
   at Opc.Ua.Bindings.UaTcpRequestChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
   at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at Opc.Ua.ISessionChannel.CreateSession(CreateSessionMessage request)
   at Opc.Ua.SessionChannel.CreateSession(CreateSessionMessage request)
   at Opc.Ua.SessionClient.CreateSession(RequestHeader requestHeader, ApplicationDescription clientDescription, String serverUri, String endpointUrl, String sessionName, Byte[] clientNonce, Byte[] clientCertificate, Double requestedSessionTimeout, UInt32 maxResponseMessageSize, NodeId& sessionId, NodeId& authenticationToken, Double& revisedSessionTimeout, Byte[]& serverNonce, Byte[]& serverCertificate, EndpointDescriptionCollection& serverEndpoints, SignedSoftwareCertificateCollection& serverSoftwareCertificates, SignatureData& serverSignature, UInt32& maxRequestMessageSize)
   at Opc.Ua.Client.Session.Open(String sessionName, UInt32 sessionTimeout, IUserIdentity identity, IList`1 preferredLocales)
   at Opc.Ua.Client.Session.Open(String sessionName, IUserIdentity identity)

Любая помощь будет оценена по достоинству. Сервер OPC UA работает на Siemens Simatic HMI TP700 Comfort. Конфигурация на сервере OPC UA - по умолчанию.

После подсказки andrewcullen мы получаем журнал ниже в файле tracelog.txt и ошибку при обнаружении исключения, которое говорит

При подключении к серверу произошла непредвиденная ошибка.

    PID:4196 ************************* Logging started at 02/03/2016 07:41:34 *************************
4196 - 07:41:38.742 GetEndpoints Called. RequestHandle=1, PendingRequestCount=1
4196 - 07:41:38.992 SECURE CHANNEL CREATED [TcpClientChannel UA-TCP 1.00.238.1] [ID=12752] Connected To: opc.tcp://xxx.xxx.xxx.xxx:4870/
4196 - 07:41:39.008 TCPCLIENTCHANNEL SOCKET CONNECTED: 00000698, ChannelId=12752
4196 - 07:41:39.008 SECURE CHANNEL CREATED [Opc.Ua.ChannelBase WCF Client 1.00.238.1] [ID=] Connected To: opc.tcp://xxx.xxx.xxx.xxx:4870/
4196 - 07:41:39.101 GetEndpoints Completed. RequestHandle=1, PendingRequestCount=0
4196 - 07:41:39.132 TCPCLIENTCHANNEL SOCKET CLOSED: 00000698, ChannelId=12752
4196 - 07:41:44.230 Writing rejected certificate to directory: 
4196 - 07:41:59.694 CreateSession Called. RequestHandle=1, PendingRequestCount=1
4196 - 07:42:13.672 TCPCLIENTCHANNEL SOCKET CLOSED: 000007C0, ChannelId=0
4196 - 07:42:13.750 CreateSession Completed. RequestHandle=1, PendingRequestCount=0

Получил ответ от официальной службы поддержки Сименс:

Приложение не тестировалось с Comfort Panel. Код, например, содержит блочное чтение и блочную запись, которые не поддерживаются сервером Panel. Так что это приложение работать не будет.


person Gašper Sladič    schedule 01.02.2016    source источник


Ответы (2)


Этот Siemens UaClient использует библиотеку ClientAPI, которая расширяет Opc.Ua.Core и Opc.Ua.Client от OPC Foundation. ClientAPI имеет множество полезных вспомогательных функций для упрощения подключения и подписки. Однако я вижу в коде для Connect (строковый URL), что он использует исходный канал в стиле WCF. И ваша трассировка стека показывает, что типы WCF генерируют исключение, которое трудно диагностировать. Я бы изменил две вещи:

Сначала настройте трассировку для записи в файл. В ClientAPI найдите Helpers.CreateClientConfiguration () и добавьте

// add trace config before calling validate
configuration.TraceConfiguration = new TraceConfiguration {
OutputFilePath="tracelog.txt", 
DeleteOnLoad = true, 
TraceMasks = Utils.TraceMasks.All };
configuration.Validate(ApplicationType.Client);    

Во-вторых, обновите тип канала, используемый для подключения. В ClientAPI найдите Server.Connect (строковый URL-адрес) и измените середину, как показано:

// Initialize the channel which will be created with the server.
// SessionChannel channel = SessionChannel.Create(
//    configuration,
//    endpointDescription,
//    endpointConfiguration,
//    bindingFactory,
//    clientCertificate,
//    null);
ITransportChannel channel = WcfChannelBase.CreateUaBinaryChannel(
    configuration,
    endpointDescription,
   endpointConfiguration,
   clientCertificate,
   configuration.CreateMessageContext());

// Wrap the channel with the session object.
// This call will fail if the server does not trust the client certificate.
// m_Session = new Session(channel, configuration, endpoint);
 m_Session = new Session(channel, configuration, endpoint, clientCertificate);

Изменить 2/4:

В журнале трассировки вы можете найти ошибки сертификата. При создании нового сеанса клиент и сервер предоставляют и проверяют сертификаты друг друга. По умолчанию UaClient получает сертификат из магазина Windows LocalMachine \ My (также известного как Personal). API генерирует этот сертификат во время своего первого запуска (для которого требуется первый запуск от имени администратора) (чтобы увидеть этот сертификат, запустите certlm.msc).

На сервере сервер будет проверять сертификат клиента, проверяя, соответствует ли он сертификатам в его «TrustedPeerList». Серверы обычно используют каталог для хранения доверенных сертификатов. Если сертификат клиента не является доверенным, сервер скопирует сертификат клиента в каталог RejectedCertificates. Вам необходимо скопировать сертификат, который вы найдете в RejectedCertificates, в каталог доверенных сертификатов.

Вернувшись на клиентский компьютер, клиент проверит сертификат сервера. Этот клиент использует магазин Windows для проверки LocalMachine \ My (также известного как Personal). Вместо использования каталога «Отклонено» клиент регистрирует обработчик событий, который открывает окно сообщения, спрашивая, хотите ли вы принять сертификат сервера. Если вы решите принять, клиент устанавливает eventArg e.Accept = true; Чтобы подавить окно сообщения, сертификат сервера должен быть импортирован в клиентский «LocalMachine \ My» (также известный как Personal) с помощью инструмента «certlm.msc».

person Andrew Cullen    schedule 02.02.2016
comment
Мы проверили ваше предложение. Я добавил результаты в исходный пост выше. Как мы понимаем содержимое tracelog.txt, OPC UA на HMI отклоняет сертификат клиента? - person Gašper Sladič; 03.02.2016
comment
У меня такая же проблема. Сименс расследует это. Я бы порекомендовал создать заявку на обслуживание на их сайте и добавить в него все эти данные. - person ; 07.02.2016

Попробуйте пропинговать сервер с DNS-именем. Если сервер недоступен, необходимо отредактировать файл Hosts в C: \ Windows \ System32 \ drivers \ etc ... Откройте блокнот от имени администратора, затем откройте файл Hosts и введите сопоставление IP-адреса с именем хоста следующим образом:

xxx.xxx.xxx.xxx имя хоста

person tassosbo    schedule 26.04.2017
comment
Этому ответу не хватает объяснений - person Clijsters; 26.04.2017