2016-02-01 7 views
3

Я попытался подключиться к серверу 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 с использованием клиента, представленного в статье, я получаю это сообщение:Клиент Siemens OPC UA и .NET C# не может подключиться к серверу?

Не удалось открыть UA-канал запроса 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 

Я получил ответ от официальной поддержки Siemens:

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

ответ

2

Этот Siemens UaClient использует библиотеку «ClientAPI», которая расширяет OpcUa.Core и Opc.Ua.Client Foundation OPC Foundation. В ClientAPI есть много хороших вспомогательных функций, которые упрощают подключение и подписку. Тем не менее, я вижу в коде для Connect (string 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); 

Edit 2/4:

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

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

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

+0

Мы проверили ваше предложение. Я добавил результаты в исходное сообщение выше. Как мы понимаем содержимое tracelog.txt, OPC UA на HMI отклоняет сертификат клиента? –

+0

У меня такая же проблема. Siemens расследует это. Я бы порекомендовал начать запрос службы на своем сайте и добавить сюда все эти данные. – CJD

0

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

имя xxx.xxx.xxx.xxx хозяина

+0

В этом ответе отсутствуют объяснения – Clijsters