И иметь доступ ко многим устройствам.

Обмен данными всегда был проблемой для отрасли, с различными вариантами от устройств (HMI, PLC) до протоколов (Profibus, Modbus). Если вы хотите подключить разные машины, вам придется либо использовать одного производителя (следовательно, тот же протокол), либо потратить много времени на реализацию всех различных протоколов самостоятельно.

В 1990-х годах была сделана первая попытка создать стандарт, и родился OPC (OLE для управления процессами). Известный сегодня как OPC Classic, он состоит из трех основных характеристик:

  • OPC DA (доступ к данным): определяет интерфейс между клиентом и сервером для обмена данными.
  • OPC AE (Alarms & Events): определяет мониторинг переменных, уведомляя клиентов о сигналах тревоги и событиях.
  • OPC HDA (доступ к историческим данным): определяет, как сервер хранит данные в виде базы данных и как клиент может получить к ней доступ.

Хотя протокол был принят и реализован многими производителями, он был ограничен только системами Windows.

В 2008 году была создана OPC UA (Единая архитектура). Он объединяет все сервисы OPC Classic с дополнительными функциями:

  • Обнаружение сервера: проверьте доступность серверов OPC в локальной сети.
  • Подписки: отслеживайте данные и сообщайте об изменении стоимости.
  • Методы: клиенты могут выполнять функции / программы на основе методов, определенных на сервере.
  • Независимость от платформы: он может работать на любом оборудовании и любой операционной системе.
  • Безопасность: это дружественный к брандмауэру, обеспечивающий элементы управления безопасностью, такие как шифрование сеанса, аутентификация, подпись и управление пользователями.

Вы можете реализовать клиент или сервер, используя разные языки программирования, и Go ничем не отличается.

Давайте посмотрим, как использовать клиент Go для подключения к серверу OPC.

Примечание: в этом руководстве использовалась версия Go v1.15.3.

Требования

Мы собираемся использовать пакет opcua. Вы можете установить его с помощью команды:

go get -u github.com/gopcua/opcua

Примечание: вам понадобится сервер OPC-UA, чтобы иметь возможность выполнять все тесты и коды, показанные здесь. Вы можете проверить публичные онлайн-серверы здесь.

Список конечных точек

В OPC-UA конечная точка - это точка доступа с определенным набором возможностей, которые пользователь должен знать, чтобы иметь возможность подключиться. Сервер может предоставлять несколько конечных точек, каждая из которых содержит информацию о:

  • URL (протокол и адрес)
  • Политика безопасности y (алгоритм и длина ключа)
  • Security Mode (уровень безопасности)
  • Тип токена пользователя (аутентификация поддерживается сервером)

Чтобы вывести список всех доступных конечных точек с данного сервера, нам просто нужно использовать функцию opcua.GetEndpoints, которая вернет срез со всеми доступными конечными точками.

Просматривать

Еще одна функция OPC - это возможность просмотреть все доступные переменные и получить некоторую информацию о них (например, тип, масштаб, минимум, максимум и т. Д.).

Вы можете использовать комбинацию ReferencedNodes и Attributes, чтобы получить информацию о самом узле и его дочерних элементах (если они есть).

Читать

Чтобы прочитать значение и атрибуты из тега, мы используем функцию ua.ReadRequest. Вы можете читать один или несколько узлов по одному запросу.

Эта функция получает структуру с тремя параметрами:

  • MaxAge: максимальный возраст считываемого значения в миллисекундах.
  • TimestampsToReturn: какие отметки времени возвращать в каждом запросе.
  • NodesToRead: список узлов и их атрибутов для чтения. Возвращается код состояния, и вы должны проверить его, чтобы узнать, был ли запрос успешным.

Контролируемый элемент

Если вам нужно читать непрерывно, вам нужно будет запрашивать чтение каждый период времени (также известный как опрос).

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

Клиент может подписаться на три разных типа изменений: при изменении атрибута (например, значения), при возникновении события или на агрегированных значениях в течение определенного интервала времени.

Чтобы отслеживать какой-либо элемент, вы должны создать monitor.NodeMonitor, информирующий о временном интервале, в котором вы хотите получать уведомления, о вызываемой функции обратного вызова и о том, какие узлы вы хотите отслеживать.

Сервер будет уведомлять клиента через определенный интервал времени (в этом примере каждую секунду). Все изменения, произошедшие за этот интервал, будут отправлены клиенту.

Напишите

Некоторые переменные позволяют внешним клиентам записывать значения непосредственно в них. В этом случае вы можете использовать функцию ua.WriteRequest, передав срез, содержащий все узлы, которые вы хотите записать, с их соответствующими значениями.

Примечание: вы можете проверить, доступна ли переменная для записи, прочитав атрибут ua.AttributeIDAccessLevel.

Если узел недоступен для записи, будет возвращена ошибка StatusBadNotWritable.

Заключение

Протокол OPC-UA - это попытка сделать промышленные компоненты доступными из любой точки сети. Это полный протокол с различными функциями, которые вы можете использовать в своем приложении.

Поскольку это общий протокол, у него есть библиотеки почти на всех языках программирования, и он не отличается от Go.

Мы увидели, как использовать некоторые основные команды и функции сервера OPC UA. Если вы хотите узнать больше или вам нужно больше кейсов, отметьте здесь.