Каждый ПЛК, программируемый в Полигон, является OPC UA-сервером, так как Отладчик подключается к контроллеру как OPC UA-клиент.
Преднастроенный OPC UA-сервер добавляется автоматически при создании модуля из шаблона Модуль с отладчиком для контроллера в месте работы Фон, программа Debug.
При настройке блока OpcUAServer удобно использовать некоторые свойства модуля. Для этого можно использовать технологию SQL-запросов. Такие запросы автоматически добавляются на входы ip и prt при создании модуля из шаблона Модуль с отладчиком для контроллера. Это позволяет изменять IP-адрес и порт в одном месте, и использовать эти значения в разных частях проекта.
Запрос IP-адреса (prop_ip):
"<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
Запрос номера порта (prop_debug_port):
<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_debug_port"</sql>

Адресация данных
С точки зрения OPC UA-клиента исполняемая программа выглядит как дерево, в котором модуль представлен так же, как в представлении Дерево в среде разработки (за исключением страниц, они не отображаются как отдельные объекты).


Узлы дерева представлены двумя типами:
для модуля, места работы, программы, раздела и функционального блока NodeClass = Object
;для входов, выходов и их свойств NodeClass = Variable.
Отношение между основными узлами (Reference) имеет тип HasComponent. Отношение между входом/выходом и его свойством имеет тип HasProperty.
Тип адреса используется числовой (NodeId.IdentifierType = Numeric) и имеет два параметра:
ns (NamespaceIndex);
i (Identifier).
Для модуля, места работы, программы, раздела и функционального блока i равен индексу – свойство компонента Индекс.
Для модуля, места работы, программы, раздела и функционального блока ns равен 0x8000 (32768 в десятичной системе счисления).


Для входов: i равен свойству Индекс блока, ns равен свойству Порядок.


Для выходов: i равен свойству Индекс блока, ns равен свойству Порядок при побитовом сложении с 0x8000.


Сбор данных для подписок в Фоне и в Таймере
Сбор данных для подписок OPC UA-сервера производится в фоновом потоке. Для того, чтобы собирать данные подписок в таймерном прерывании, необходимо добавить добавить блок OpcUaServerTimer на любую страницу места работы Таймер.
Блок OpcUAServerTimer должен встречаться в проекте только один раз независимо от того, сколько OPC UA-серверов добавлено в проект. После этого можно настраивать параметры сбора данных в подписке с дискретностью таймерного цикла.
В частности, это можно использовать для отладки программы в представлении График. График подключается к OPC UA-серверу контроллера в качестве клиента с добавленными в него данными. Помимо добавления блока OpcUAServerTimer для сбора данных графика в таймере перед его запуском в настройках следует установить флаг Делать отсчеты в таймере.
Надо учитывать, что при инициализации подписки OPC UA-клиентом с дискретизацией, кратной таймерному промежутку, в контроллере выделяется память для хранения очереди накапливаемых значений.

Если сбор данных в таймере используется только для целей отладки, перед вводом ПЛК в работу блок OpcUAServerTimer рекомендуется отключать (вход enb = 0), чтобы не нагружать место работы Таймер.
Авторизация
В Полигон поддерживается два вида авторизации для доступа к OPC UA-серверу: анонимный доступ и доступ по логину и паролю.
Все блоки OpcUAServer, добавленные в модуль, обеспечивают по умолчанию доступ ко всем входам/выходам проекта в том случае, если клиент использует для авторизации имя пользователя admin (свойство модуля Пароль admin). Этот способ соединения также использует и отладчик среды разработки.

Чтобы ограничить видимость частей проекта для клиента, следует использовать другие учетные записи.
Анонимный доступ по умолчанию предоставляет доступ только к диагностической информации: дате трансляции, идентификатору модуля, ПК, с которого транслировалась программа, пользователь ПК, версия проекта.

Помимо пользователя admin в среде есть возможность подключения еще 7 пользователями – user1, …, user7. Пароль для user1, …, user7 устанавливается свойствами модуля Пароль user1, …, Пароль user7. По умолчанию для пользователей user1, …,user7 также доступна только диагностическая информация.

Для того, чтобы разрешить анонимный доступ или доступ пользователями user1, …, user7 к частям проекта, следует добавить узлам проекта свойство Разрешить доступ.
Для разрешения анонимного доступа необходимо установить Разрешить доступ = user0 для пользователей user1, …,user7 – Разрешить доступ = user1, …,user7.
Свойство Разрешить доступ можно добавить для разделов и программ.



Все указанные выше пароли вступают в силу только после трансляции модуля.
Ограничение подключений к серверу
По умолчанию к блоку OpcUAServer возможно подключение клиентами с любыми IP адресами при условии отсутствия ограничения межсетевым экраном.
В блоке OpcUAServer также есть возможность ограничить доступ – для этого необходимо создать у блока дополнительные группы входов m_allowed_clients, по одной на каждый разрешенный IP-адрес.
Входы cip позволяют ограничить подключения только определенными IP-адресами. Входы cpr задают разные приоритеты для адресов.

При использовании cip и cpr OPC UA-сервер не будет принимать подключений ни с каких IP-адресов, кроме заданных.
Свойства входов/выходов данных, влияющих на обмен с клиентом
В среде Полигон для входов/выходов, участвующих в обмене по OPC UA, можно задать свойства, влияющие на обмен с клиентом.
Свойство Зона нечувствительности (prop_deadzone) позволяет задать абсолютную зону нечувствительности на стороне сервера. Если значение изменилось больше, чем величина зоны нечувствительности, то оно передается клиенту.
Если задать Зона нечувствительности = 0, значение будет передаваться при изменении.
Согласно спецификации OPC UA, данный параметр должен устанавливаться на стороне клиента, поэтому возможность установить его на стороне сервера является дополнительной. Она предусмотрена для особых случаев, когда клиент не поддерживает этот параметр.
При соединении с клиентом OpcUAClient свойство Зона нечувствительности следует задавать на стороне клиента. Заданная на стороне сервера зона нечувствительности игнорируется.
Свойство Интервал принудительной отправки (в мс) (prop_reftime) позволяет организовать принудительную отправку данного в подписке независимо от изменения значения и настроек зоны нечувствительности. Заданный интервал отсчитывается от момента последней отправки значения. При использовании в качестве клиента OpcUAClient данный параметр можно (и желательно) задавать на стороне клиента, при использовании других клиентов – только на стороне сервера.
