понедельник, 15 августа 2022 г.

Как я делал OPC DA клиент для считывания всех тегов OPC сервера

Думаю эта статья мало кому будет полезна (помимо меня), потому что те кто шарит в программировании что-то новое вряд ли узнают, а те кто не шарит, то возможно ищут такую программу которая могла бы сделать список всех доступных тегов с определенного OPC сервера. И если вы из последних, то можете просто скачать готовый результат https://github.com/boolkin/OPC-TagsList (нужно выбирать ссылку релиз из правой части), а если вам все же интересно как это устроено, то можете почитать дальше.

Но начну из далека. Я уже как-то работал с OPC DA и делал своего клиента, который может формировать JSON строку из запрашиваемых тегов и отдавать ее через 80 http порт. Я назвал ее OPC2WEB - программа для обзора OPC тегов из веб браузера. Как позднее выяснилось она может так же отдавать теги и в Эксель. Чтобы сконфигурировать ту программу, требуется создать список из запрашиваемых тегов у конкретного сервера (причем с локального, с удаленными серверами не работает), и чтобы это сделать нужно сначала каким-либо клиентом узнать как называются эти теги, и только потом скопировать их в специальный текстовый файл. Но проблема готовых GUI клиентов (именно бесплатных, которые я испробовал) в том, что они не имеют такого функционала чтобы все теги экспортировать в один список: в них если нужно узнать просто названия тегов, то придется разворачивать все вложенные папки и подпапки - часто структура может быть очень сложная, а количество тегов очень и очень большим. Если тегов не так много то это не проблема, но мне же понадобилось узнать имена из 100 тегов, поэтому и захотелось найти программу, которая могла бы создать список из всех тегов конкретного OPC сервера. Так как поиск такой проги занял бы больше времени чем ее сделать самому, то я решил сделать ее сам)

Пошел я уже по проторенной дороге, и использовал ту же библиотеку что и в прошлый раз, причем тупо сделал Reference на dll файл. Кстати, библиотека была написана в 2004 году и до сих пор, как выясняется, работает замечательно, а разобраться с ней даже мне оказалось под силу. Когда я делал opc2web клиент, из примера идущего с библиотекой, я заметил что запросив значение тега, я вижу то что хотел увидеть и тогда, я мог это значение записать в строку JSON и отдать ее на запрос веб клиенту. Именно так и работает OPC2WEB client. А сейчас для работы с OPC сервером я не видел примеров, и пришлось самому разбираться. Оказалось что все довольно просто, если открыть обозреватель объектов, то у библиотеки открываются все доступные методы, и среди них, я заметил метод, позволяющий вывести список всех доступных серверов:


Без понимания всех нюансов программирования и методом научного тыка, а также благодаря тому, чтоVisualStudio очень классно подсказывает что нужно делать, удалось заполучить список всех серверов, используя метод OpcServerList.ListAllData20(OPC.Common.OpcServers[]) VS указал мне что данный метод требует создание объекта типа OpcServerList () что я сделал в первой строке, а так же указал что нужно использовать модификатор out, чтобы отправить список в массив с типом OpcServers. Самое главное, что пройдясь по массиву можно очень легко вывести список доступных OPC серверов.

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

Комментариев нет:

Отправить комментарий