Обозначение

Описание
Блок OpcUA сервер обеспечивает реализацию сервера по протоколу OpcUA.
Назначение входов и выходов
| Входы | Тип | Описание |
| ip | str | локальный IP адрес |
| prt | i16 | локальный порт |
| sdr | str | сетевой стек (только для QNX):"/", "/sock2" и т.д. |
| st | i32 | статус сервера в соответствии со спецификацией OpcUA (Part5 12.6), особый случай -1 - выключает сервер полностью |
| sl | u8 | дополнительный статус сервера, ServiceLevel в соответсвии со спецификацией OpcUA (Part5 6.6.2.4.2) |
| mb | u32 | максимальный размер буфера, минимальный размер 8192 (если задано меньше, то используется 8192) |
| max | u8 | максимально разрешенное количество соединений |
| cfg | u32 | дополнительная конфигурация |
| Выходы | Тип | Описание |
| st | i32 | текущий статус сервера (см. вход st) |
| cn | u8 | количество активных соединений (сумма cnDbg, cnPA, cnOth) |
| cnDbg | u8 | количество соединений с отладчиком среды разработки |
| cnPA | u8 | количество соединений с клиентами OpcUAClient |
| cnOth | u8 | количество соединений с другими клиентами |
Адресация данных
С точки зрения OPCUA клиента исполняемая программа выглядит как дерево, в котором модуль представлен также как в представлении
Дерево в среде разработки (за исключением страниц, они не отображаются как отдельные объекты). Клиент может прочитать дерево модуля
при помощи стандартных сервисов View Service Set. Узлы представлены двумя типами:
Тип адреса используется числовой (NodeId.IdentifierType = Numeric):
Для организации доступа к данным по строковым идентификаторам необходимо создать внутри блока OpcUAServer дерево разделов. Для этого:

В примере структура подразделов, у которых заданы имена, в раздел добавлен вход с алиасом
Допускается добавлять в разделы как ссылки целые блоки, тогда имя или алиас блока будет служить аналогом имени подраздела.
- NodeClass = Object для модуля, места работы, программы, раздела и функционального блока
- NodeClass = Variable для входов, выходов и их свойств
Тип адреса используется числовой (NodeId.IdentifierType = Numeric):
- i равен индексу блока (или, соответсвенно, модуля, места работы, программы, раздела)
- ns равен:
- 0x8000 для модуля, места работы, программы, раздела, функционального блока
- значение свойства "Порядок" для входа
- значение свойства "Порядок" | 0x8000 (побитовое ИЛИ) для выхода
Для организации доступа к данным по строковым идентификаторам необходимо создать внутри блока OpcUAServer дерево разделов. Для этого:
- Откройте в Полигоне дополнительное представление Дерево и там выберите для отображения библиотеку paOpcUA
- Из раздела "Шаблоны.." скопируйте раздел дерева в блок OpcUAServer
- Этот раздел является корнем дерева для соответсвующего Namespace, значение ns можно поменять, имя раздела должно соответсвовать необходимому ns
- Внутри раздела создайте структуру подразделов, имена разделов составляют начало полного строкового идентификатора данного, к которому добавляется алиас самого входа/выхода
- В разделы добавьте ссылки на входы-выходы из программы (для этого нужно на Странице выделить вход/выход и с нажатым Ctrl перетащить его в раздел)

В примере структура подразделов, у которых заданы имена, в раздел добавлен вход с алиасом
XQ01.
Соответсвующий адрес данного: NS2|String|03ABCCQ001XQ01Допускается добавлять в разделы как ссылки целые блоки, тогда имя или алиас блока будет служить аналогом имени подраздела.
Свойства входов/выходов данных, влияющих на обмен с клиентом
Зона нечувствительности (prop_deadzone) - позволяет задать абсолютную зону нечувствительности на стороне сервера. Если значение
изменилось больше, чем величина prop_deadzone, то оно передается клиенту. Согласно спецификации OPCUA данный параметр должен устанавливаться
на стороне клиента, поэтому возможность установить его на стороне сервера является дополнительной, предусмотрена для особых случаев когда клиент
не поддерживает этот параметр. При соединении с клиентом OpcUAClient, prop_deadzone надо задавать на стороне клиента, заданная на стороне сервера всегда игнорируется.
Интервал принудительной отправки (мс) (prop_reftime) - позволяет организовать принудительную отправку данного в подписке независимо от
изменения значения и настроек зоны нечувствительности. Заданный интервал отсчитывается от момента последней отправки значения. При использовании в качестве клиента
блока OpcUAClient данный параметр можно (и желательно) задавать на стороне клиента, при использовании других клиентов - только на стороне сервера.
ВАЖНО: для того чтобы свойства входов/выходов работали как описано выше, необходимо добавить их в любой раздел внутри модуля и установить свойство модуля
"Трансляция: включить свойства входов/выходов" = "только из разделов".
Дополнительная концигурация обмена
Дополнительные настройки конфигурируются битами входного регистра cfg:
бит 8 - включить поддержку безопасности (см. примечание 1 под таблицей):
бит 8 - включить поддержку безопасности (см. примечание 1 под таблицей):
- SIGN и SIGNANDENCRYPT для схемы Basic256Sha256
- X509IdentityToken
Авторизация
Все блоки OpcUAServer, добавленные в модуль, обеспечивают по-умолчанию доступ ко всем входам-выходам проекта в том случае если клиент
использует для авторизации имя пользователя admin. Этот способ соединения в том числе использует и отладчик среды разработки.
Чтобы ограничить видимость частей проекта для клиента необходимо использовать другие учетные записи.
При подключении к проекту клиентом OPCUA можно использовать 9 вариантов пользователь-пароль:
- Пользователь admin, пароль задан свойством модуля "Пароль admin". Предоставляет доступ ко всему проекту.
- Пользователь useri, пароль задан свойством модуля "Пароль useri", где i от 1 до 7. Предоставляется доступ только к частям проекта, для которых установлено свойство "Разрешить доступ" = "useri". Свойство "Разрешить доступ" можно устанавливать у разделов, программ и мест работы, причем доступ должен быть разрешен ко всем вышестоящим узлам.
- Анонимный доступ по-умолчанию предоставляет доступ только к диагностической информации о версии и дате трансляции модуля. Чтобы разрешить анонимный доступ к частям проекта необходимо установить свойство "Разрешить доступ" как описано выше используя пользователя user0.
Ограничение подключений к серверу
По-умолчанию блок OpcUAServer принимает покдлючения клиентов с любых ip адресов. Ограничить подключения можно стандартными системными настройками firewall.
Однако в самом блоке тоже есть такая возможность - для этого необходимо добавить в блок дополнительные группы входов, по одной на каждый ip адрес.
Кроме ограничения подключений только с определенных ip она позволяет также задать разные приоритеты для них.

В таком случае сервер не будет принимать подключений ни с каких ip адресов, кроме заданных. Выход csti показывает количество соединений с соответсвующего ip.

В таком случае сервер не будет принимать подключений ни с каких ip адресов, кроме заданных. Выход csti показывает количество соединений с соответсвующего ip.
Использование свойств модуля для установки констант на входах блока
При настройке блока OpcUAServer удобно использовать некоторые свойства модуля. Для этого можно использовать технологию SQL запросов.
Такие запросы автоматически добавляются на входы ip и prt при создании модуля из шаблона "Модуль с отладчиком для контроллера". Это позволяет
изменять ip адрес и порт в одном месте, и использовать эти значения в разных частях проекта. Примеры SQL запросов:
- "
SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip" " - получает значение свойства "IP адрес" (prop_ip) из свойств текущего модуля, обычно задается на входе ip SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_debug_port" - получает значение свойства "Порт отладчика" (prop_debug_port) из свойств текущего модуля, обычно задается на входе prt
Поддержка сервисов по спецификации OPCUA
| Service Set | есть | Комментарии | |
| Service | |||
| SecureChannel Service Set | |||
| OpenSecureChannel | да | Поддерживаются:
|
|
| CloseSecureChannel | да | ||
| Discovery Service Set | |||
| FindServers | да | ||
| GetEndpoints | да | ||
| Session Service Set | |||
| CreateSession | да | ||
| ActivateSession | да | В качестве UserIdentityToken поддерживаются:
|
|
| CloseSession | да | ||
| Cancel | нет | ||
| NodeManagement Service Set | нет | ||
| View Service Set | |||
| Browse | да | В качестве displayName используется свойство:
|
|
| BrowseNext | да | ||
| TranslateBrowsePathsToNodeIds | да | Внутри RelativePath игнорируются поля referenceTypeId, isInverse и includeSubtypes.
В качестве targetName используется свойство:
|
|
| RegisterNodes | да | ничего не делает | |
| UnregisterNodes | да | ничего не делает | |
| Query Service Set | нет | ||
| Attribute Service Set | |||
| Read | да | Параметр maxAge игнорируется, сервер всегда возвращает текущее значение. | |
| HistoryRead | нет | ||
| Write | да | Поддерживается запись только значений (атрибут Value). Запись отдельных элементов массива не поддерживается. | |
| HistoryUpdate | нет | ||
| Method Service Set | |||
| Call | да | ||
| MonitoredItem Service Set | |||
| CreateMonitoredItems | да | Из фильтров поддерживается только DataChangeFilter, и только с абсолютной зоной нечувствительности. | |
| ModifyMonitoredItems | да | ||
| SetMonitoringMode | да | ||
| SetTriggering | нет | ||
| DeleteMonitoredItems | да | ||
| Subscription Service Set | |||
| CreateSubscription | да | ||
| ModifySubscription | да | ||
| SetPublishingMode | да | ||
| Publish | да | ||
| Republish | да | Размер очереди равен 10. | |
| TransferSubscriptions | да | ||
| DeleteSubscriptions | да | ||
Примечание 1: настройка безопасности
Поддержка SIGN и SIGNANDENCRYPT для схемы Basic256Sha256 и авторизации при помощи X509IdentityToken включается,
если установлен бит 8 на входе cfg (например, cfg = 0x0100).
Для работы Basic256Sha256 необходимы файлы сертификата и закрытого ключа, они должны находится на диске контроллера в той же папке что и исполняемый модуль, и называться:
Для работы Basic256Sha256 необходимы файлы сертификата и закрытого ключа, они должны находится на диске контроллера в той же папке что и исполняемый модуль, и называться:
- opcua-server.cer - сертификат сервера в формате DER
- opcua-server-key.pem - закрытый ключ
- На диске контроллера в той же папке, что и исполняемый модуль, должен находится файл сертификата удостоверяющего центра. Файл должен иметь имя совпадающее с CA (Common Name) из поля Issuer Name сертификата X509IdentityToken и расширение cer или der.
- Имя пользователя должно быть задано в CA поля Subject Name сертификата X509IdentityToken