Entaxy ION + OPC UA: два способа получить данные с промышленного оборудования

от автора

На одном из проектов по интеграции промышленного оборудования с корпоративными системами встал вопрос: как читать данные с датчиков в реальном времени и при этом сохранить совместимость с REST API внешних потребителей? Решение нашлось в связке Entaxy ION + OPC UA — два разных подхода к одной задаче, которые отлично дополняют друг друга.

В этой статье покажем оба сценария на работающем примере: подключаемся к программному симулятору датчика и передаём данные — через подписку на изменения и через REST-сервис по запросу.

Предварительные требования

Перед началом работы потребуются:

  • Entaxy ION — версия 1.10.0 и выше

  • JDK 11 — компонент Camel Milo требует Java 9+

  • Prosys OPC UA Simulation Server — бесплатный симулятор промышленного оборудования (Community Edition)

  • Postman или любой REST-клиент — для тестирования второго сценария

Что такое OPC UA и зачем он нужен

OPC UA (OPC Unified Architecture) — современный открытый стандарт передачи данных в промышленных сетях. Он обеспечивает защищённую и надёжную коммуникацию между устройствами, являясь аппаратно и платформенно независимым: один и тот же протокол одинаково работает на Windows, Linux, встраиваемых системах и промышленных контроллерах.

Ключевое понятие в OPC UA — Node ID (идентификатор узла): уникальный адрес переменной, метода или объекта в адресном пространстве сервера. Node ID состоит из пространства имён (namespace) и идентификатора. Поддерживаются четыре формата: строковый (s=), числовой (i=), GUID (g=) и байтовый (b=). Пример строкового Node ID:

nsu=urn:prosys:SimulationServer;s=Sawtooth.

Архитектура решения

Схема двух сценариев интеграции Entaxy ION с OPC UA

Схема двух сценариев интеграции Entaxy ION с OPC UA

В демонстрации участвуют три компонента:

Компонент

Роль

OPC UA Simulation Server (Prosys)

Виртуальный датчик; генерирует сигналы: пилообразный, синусоида, случайный

Entaxy ION

Интеграционная шина; читает данные и передаёт во внешние системы

Postman

REST-клиент для проверки второго сценария

Entaxy ION — российская low-code платформа для создания интеграционных маршрутов. Под капотом — Apache Camel для маршрутизации и Apache Karaf как OSGi-контейнер. Поддержка OPC UA реализована через компонент Camel Milo (Eclipse Milo™ implementation).

Шаг 1. Проверка бандлов Camel Milo в Entaxy ION

Перед созданием маршрутов убедитесь, что необходимые бандлы для работы с OPC UA установлены и находятся в статусе Active.

Интерфейс Entaxy ION — проверка статуса бандлов Camel Milo

Интерфейс Entaxy ION — проверка статуса бандлов Camel Milo

В веб-интерфейсе Entaxy ION перейдите в раздел Deployer → Bundles и найдите бандлы с именем camel-milo. Все они должны иметь статус Active.

Если бандлы camel-milo отсутствуют, установите фичу через консоль Karaf:

feature:install camel-milo

Фича camel-milo обеспечивает поддержку OPC UA для Apache Camel через реализацию Eclipse Milo™ и требует Java 9+ или Java 11+.

Шаг 2. Настройка OPC UA симулятора

OPC UA симулятор — дерево узлов и атрибуты переменной Sawtooth

OPC UA симулятор — дерево узлов и атрибуты переменной Sawtooth

Скачайте и запустите Prosys OPC UA Simulation Server. После запуска:

  1. На главной вкладке Connection найдите адрес OPC UA сервера вида opc.tcp://hostname:53530/OPCUA/SimulationServer — он понадобится для подключения клиента.

  2. Перейдите на вкладку Objects → Simulation.

  3. Выберите переменную Sawtooth (пилообразный сигнал).

  4. На вкладке Attributes скопируйте значение NodeId.

Типичный NodeId переменной Sawtooth выглядит так:

ns=3;s=Sawtooth

Для использования в URI Camel Milo он записывается с указанием namespace URI:

nsu=urn:prosys:OPCUA:SimulationServer;s=Sawtooth

Сценарий 1: Подписка на изменения (Push-модель)

Этот способ подходит для систем мониторинга в реальном времени: данные поступают автоматически при каждом изменении значения узла OPC UA.

Создание профиля и входного коннектора

В Entaxy ION перейдите в раздел Профили, нажмите Add Profile и создайте профиль системы, назвав его, например, opcua-source.

Нажмите Add Connector, установите направление (IN) и тип CUSTOM. В настройках коннектора заполните поле Input route следующим маршрутом Apache Camel:

<route>  <from uri="milo-client:opc.tcp://localhost:53530/OPCUA/SimulationServer             ?node=RAW(nsu=urn:prosys:OPCUA:SimulationServer;s=Sawtooth)             &publishingInterval=1000"/>  <log message="OPC UA [Sawtooth] value: ${body}"/></route> 

Разберём параметры URI:

Параметр

Значение

Описание

opc.tcp://host:port/path

адрес сервера

Транспортный адрес OPC UA сервера

node=RAW(…)

Node ID узла

Обёртка RAW() защищает спецсимволы от URI-экранирования

publishingInterval

1000

Интервал публикации данных сервером, мс (по умолчанию 1000.0)

Важно о RAW(…): значение параметра node содержит символы = и ;, которые имеют специальное значение в URI. Обёртка RAW(…) указывает Camel не экранировать содержимое, что обязательно для корректной работы.

Проверка в логах Karaf

После сохранения и запуска маршрута (кнопка Start в карточке профиля) откройте раздел Monitoring → Logs в Entaxy ION. При успешном подключении вы увидите поток значений:

INFO  route1 - OPC UA [Sawtooth] value: DataValue{  value=Variant{value=42.857, dataType=Double},  statusCode=StatusCode{name='Good'},  serverTime=DateTime{...}}INFO  route1 - OPC UA [Sawtooth] value: DataValue{  value=Variant{value=43.214, dataType=Double},  statusCode=StatusCode{name='Good'},  ...}

Поле statusCode=Good подтверждает успешное считывание данных. Сообщения появляются с интервалом publishingInterval — раз в секунду.

Сценарий 2: Получение данных по REST-запросу (Pull-модель)

Второй сценарий — получение актуального значения по запросу. REST-сервис в Entaxy ION обращается к OPC UA через выходной коннектор и возвращает данные в формате JSON.

Создание профиля с выходным коннектором

Создайте профиль opcua-rest-provider. Нажмите Add Connector, установите направление (OUT) и тип CUSTOM. В настройках коннектора заполните поле Output route следующим маршрутом:

<route>  <from uri="direct:getOpcValue"/>  <to uri="milo-client:opc.tcp://localhost:53530/OPCUA/SimulationServer           ?node=RAW(nsu=urn:prosys:OPCUA:SimulationServer;s=Sawtooth)"/>  <log message="OPC UA response: ${body}"/>  <setBody>    <groovy>      def dv = request.body      def val = dv?.value?.value      def status = dv?.statusCode?.name ?: 'Unknown'      return groovy.json.JsonOutput.toJson([        nodeId   : 'ns=3;s=Sawtooth',        value    : val,        statusCode: status      ])    </groovy>  </setBody>  <setHeader name="Content-Type">    stant>application/json</constant>  </setHeader></route>  

Здесь используется direct:getOpcValue — внутренняя точка вызова, которую будет дёргать REST-сервис. Блок с Groovy-скриптом преобразует объект DataValue, возвращаемый Camel Milo, в JSON без необходимости создавать отдельный Java-класс процессора.

Создание REST-сервиса

В разделе Сервисы → REST нажмите Add Service и создайте публичный GET-эндпоинт. В настройках укажите путь, например /opcua/value, и привяжите его к маршруту direct:getOpcValue через параметры входного потока.

Тестирование через Postman

Postman — GET-запрос к REST-сервису и JSON-ответ с данными OPC UA

Postman — GET-запрос к REST-сервису и JSON-ответ с данными OPC UA

Выполните GET-запрос:

GET http://<host>/opcua/value

Ответ сервиса:

{  "nodeId": "ns=3;s=Sawtooth",  "value": 42.857,  "statusCode": "Good"}

REST-сервис вызывает маршрут выходного коннектора, тот обращается к OPC UA серверу, считывает актуальное значение и возвращает его JSON-ответом клиенту.

Сравнение двух подходов

Сценарий 1: Подписка

Сценарий 2: REST-запрос

Модель

Push (данные поступают автоматически)

Pull (данные запрашиваются вручную)

Применение

Мониторинг, алерты, SCADA

Внешние системы, дашборды, API

Поле коннектора

Input route (IN)

Output route (OUT)

Camel URI

milo-client как consumer ()

milo-client как producer ()

Ключевой параметр

publishingInterval

Задержка

Равна publishingInterval

Время RT-запроса к серверу

Нагрузка на OPC UA сервер

Постоянное подписочное соединение

Соединение по требованию

Итог

Оба подхода взаимодополняют друг друга: подписка обеспечивает непрерывный поток для онлайн-мониторинга, а REST-сервис — удобный API для внешних систем, которым данные нужны по запросу. Вместе они позволяют Entaxy ION работать как с промышленным мониторингом, так и с корпоративными ИС — без написания кастомного кода на уровне протокола.

Компонент camel-milo поддерживает все форматы Node ID (строковый, числовой, GUID, opaque), настройку политик безопасности (TLS, аутентификацию) и работу в режиме клиента и сервера OPC UA — это делает Entaxy ION полноценным инструментом для IIoT-интеграции.

ссылка на оригинал статьи https://habr.com/ru/articles/1039756/