2017-02-21 15 views
1

У меня есть две службы windows, одна служба (service1) подключается к двум серверам OPC-UA, это прекрасно работает. Другая служба Windows (service2) подключается к тем же двум серверам OPC-UA с идентичным кодом подключения из базового стека в базе данных OPC-UA.OPC-UA BadSecureChannel Закрыто

Service1 может подключаться к серверам OPC-UA и успешно проверяет данные. Во время развертывания Service2 Service2 может также подключать и считывать значения с обоих серверов OPC-UA. В этот момент все было хорошо.

Однако, через некоторое время, без каких-либо изменений какого-либо кода. Service2 больше не может подключаться к одному из серверов OPC-UA, при выполнении Session.Create он просто отвечает ServiceResultException BadSecureChannelClosed (2156265472).

Запуск устранения неполадок. На нашем клиентском сайте у нас также есть тестовый сервер, который выполняет идентичную настройку установки в производственной среде, что означает, что Service1 и Service2 также работают на тестовом сервере и сообщаются одинаково с этими двумя OPC-UA.

Я заметил, что при отключении служб на тестовом сервере ошибка BadSecureChannelClosed Service2 исчезает (однако Service2 все еще может взаимодействовать с другим сервером OPC-UA). Все работает на рабочем сервере.

Это заставляет меня задаться вопросом, какие ограничения сеансов и соединений существуют на сервере OPC-UA. Серверы OPC-UA имеют тип SINUMERIK 840d. Я спросил у Siemens, возможно ли активировать объект ServerDiagnostics для устранения количества сеансов и т. Д., Но они ответили, что это невозможно. Я думал, что этот объект был обязательным для включения?

Может ли кто-нибудь дать мне подсказки о том, что может вызвать это, и о каких ограничениях и о чем я должен думать при создании соединения, например. что должно быть уникальным? Имя приложения? Имя_сеанс? и т. д. Что может вызвать эту, казалось бы, «случайную» ошибку BadSecureChannelClosed. Обратите внимание, что я использую updateBeforeConnect = true в вызове Create Session. И я использую UserIdentity с жестко заданными именами пользователей и паролем.

Еще странно симптомом является то, что для этого сервера OPC-UA, отвечающему с BadSecureChannelClosed, он дает ошибку обнаружения при подключении к нему с UaExpert (ошибки, которые не были представлены несколько недель назад):

16: 58: 41,806 | Автоматическое обновление | Ошибка получения текущей информации о версии: Host updates.unified-automation.com не найден

16: 58: 35.404 | DiscoveryWidget | Открытие GetEndpoints на opc.tcp: //192.168.0.200: 4840 не удалось (BadCommunicationError)

16: 58: 35.401 | DiscoveryWidget | Discovery FindServers на opc.tcp: //192.168.0.200: 4840 не удалось (BadCommunicationError)

ответ

2

Текущий сервер OPC UA Sinumerik неисправен и не обеспечивает правильно закодированные ExtensionObjects. Вам нужно будет запросить обновление на сервере от Siemens, как только оно будет доступно.

Обратите внимание, что вы можете получить к нему доступ без проблем с UaExpert, который может декодировать сильно закодированные ExtesionObjects. Это только позволило им выпустить такую ​​багги-версию в первую очередь.

EDIT: Замечание о ExtensionObjects: ServerStatus передается как ExtensionObject, если вы попытаетесь прочитать его как полную структуру. Также PublishResponse (используемый для предоставления данных подписки) включает изменения данных, закодированные как ExtensionObjects. Таким образом, если вы контролируете статус только через ServerState, он, вероятно, работает.Во всяком случае, подписки не будут работать.

+0

Благодарим вас за ответ. О ExtensionObjects, хотя я могу прочитать объект ServerDiagnostics, я не могу включить его, чтобы видеть данные. Вы знаете, нужна ли мне другая конфигурация для включения ServerDiagnostics? Если нет, как я могу узнать, сколько сеансов и т. Д. Я подключил. Когда я пытаюсь написать true для enabledFlag, он просто говорит, что он не записывается, см. Изображение: https://cdn.pbrd.co/images/BlFt52NrP.png –

+2

Серверы не обязаны поддерживать включительную диагностику. –

+0

Я добавил примечание об ExtensionObjects, которое объясняет проблему немного больше. –