Найти тему

OPC UA .NET клиент. Базовый

Оглавление
OPC Unified Architecture (англ. Унифицированная архитектура OPC) — спецификация, определяющая передачу данных в промышленных сетях и взаимодействие устройств в них. Разработана промышленным консорциумом OPC Foundation и значительно отличается от его предшествующих спецификаций. Первая версия Унифицированной архитектуры OPC была выпущена после 3 лет работ над спецификацией и еще 1 года прототипирования.

Так нам говорит Википедия. С точки зрения АСУТП это весьма удобный протокол для обмена данными между ПЛК и чем-нибудь на верхнем уровне(да здравствует SCADA).

Однако, не всегда на проект охота заводить целую SCADA или пользоваться типовыми решениями от производителя, особенно когда требуется подружить целый зоопарк или проект делался из того, что есть под рукой, всякие бывают ситуации. И вот если у нас есть контролер, который умеет поднимать сам на себе OPC UA сервер, то нам даровано счастье.

Проблемы OPC UA библиотек.

Для одного проекта мне пришлось простую визуализацию. Руководил всей системой Siemens 1500 серии. Вариант с покупкой HMI панели был не возможен, так как я не нашел 19'', а покупать отдельно весь пак лицензий для визуализации не позволял бюджет. Но мы могли спокойно взять себе лицензию для OPC UA сервера, чтобы его поднять и уже имея его на борту начать писать свой проект.

С чем мне пришлось столкнутся, так это с фактом того, что все библиотеки, которые позволяют максимально просто и быстро работать с OPC являются платными и дают вам время на ознакомление. Так сказать пробную сессию от 30 минут до часа, после чего соединение обрубается, а вы получаете исключение.

Но у нас есть стандартная библиотека, предоставленная OPC Foundation, однако документация на нее такая, что мы будем очень долго в ней разбираться. Так что самым верным вариантом было разобраться в стандартных примерах и без изысков сделать рабочий продукт.

Библиотека для .NET

Разработку всего этого будем вести на Visual Studio. Первым дело нам потребуется сама библиотека. Ее можно найти в менеджере пакетов NuGet

Сама библиотека.
Сама библиотека.

Она подтянет все что нужно из зависимостей. Так что об этом мы не думаем. После того как мы установили можем приступать к медитативному процессу.

OPC UA клиент

Стоит заметить, что данная библиотека умеет в async/await, но вот я него не умею. Так что будет работать не на всю мощность.

Создание экземпляра приложения

Первым делом прописываем настройки экземпляра приложения.

Создание экземпляра.
Создание экземпляра.

Простите, что приходится картинками, листинг всего будет в конце. Тут все в целом просто. Прописываем имя приложения, указываем, что это у нас клиента. Дальше подгружаем все настройки, которые бережно хранятся в XML файле. Производим проверку нашего сертификата, который не пройдет ее, что скорее всего. И дальше подписываем обработчик на событие CertificateValidation

А вот и сам обработчик.
А вот и сам обработчик.

Запуск клиента

В первую очередь нам надо сконфигурировать конечную точку(endpoint) это и есть наш сервер.

функция настройки подключения  к серверу
функция настройки подключения к серверу

m_serverUrl - это адрес нашего сервера в формате string

_mapconfig - application.ApplicationConfiguration

Затем создаем сессию, т.е. непосредственно подключаемся.

Функция подключения к серверу.
Функция подключения к серверу.

Функция принимает ряд параметров, конфигурация приложения, конфигурация конечной точки, флаг проверки перед соединением, флаг проверки домена, имя приложения, тот пример с умножением - продолжительность сессии. у меня она стоит 10 часов, затем формируем новый идентификатор пользователя. У меня он без логинов и паролей.

Далее все операции будут работать только с объектом session. Можете его хоть ссылками передавать, хоть хранить где-то( я его храню отдельно)

Чтение значений

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

Чтения значения переменной с плавающей точкой.
Чтения значения переменной с плавающей точкой.

Вот так читаются значения. Объявляем объект типа DataValue, присваиваем ему значение, считывая его из адреса, и далее приводим строковую переменную в переменную с плавающей точкой. И так мы будем приводить любые значения.

Дискретный сигнал
Дискретный сигнал
Целочисленное значение.
Целочисленное значение.

Запись значений в ПЛК

С записью, практически, все с точностью да наоборот.

Запись значения с плавающей точкой.
Запись значения с плавающей точкой.

Тут мы, сперва, создаем целую коллекцию для записи. И да, для чтения тоже можно было бы создать целую коллекцию, но я не захотел.

Дальше мы объявляем первый элемент для записи, указываем ему его адрес, задает атрибут "значение" и записываем это самое значения. И потом скармливаем все функции session.Write

И я не нашел как записывать по одному значению, возможно просто плохо искал.

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

Ссылка на весь проект(Чтение, запись, плюс работа с БД)

Если есть вопросы, то добро пожаловать в комментарии, или чат или можно мне лично сообщение написать.

Всем спасибо за внимание)