libuniset2 — библиотека для создания АСУ. Лучше один раз увидеть…Часть 6 (Заключительная)

в 22:10, , рубрики: c++, linux, open source, scada, автоматизация, асу тп, Промышленное программирование

В предыдущих частях (часть 1, часть 2, часть 3, часть 4, часть 5) были рассмотрены принципы и механизмы libuniset2, на примере сферической задачки по управлению. Осталось показать, что не вошло в поле нашего зрения… Тех, кто ещё не устал, прошу…

Итог

Целью предыдущих частей, было показать как просто и быстро можно написать (или даже развернуть) систему управления с использованием libuniset2. Если обобщить, то всё сводится к нескольким простым шагам:

  • Заложить проект и наполнить его датчиками, входящими в систему (заполнение configure.xml). Кстати этот процесс можно и автоматизировать, генерируя список датчиков (или настроек) из каких-нибудь других более удобных форматов (источников)
  • Реализовать свои алгоритмы управления, предварительно описав каждый в специальном xml-файле, рассматривая свой процесс как чёрный ящик со входами и выходами
  • Отладить локально, при этом воспользовавшись различными утилитами, входящими в состав libuniset2-utils
  • Написать тесты, используя тестовый фрэймворк — uniset2-testsuite

И всё…
Но многие компоненты входящие в состав libuniset2 так и не были рассмотрены, поэтому я просто кратко опишу что, ещё входит в libuniset2 (может наберусь сил когда-нибудь и их описать с примерами использования)

Компоненты, не вошедшие в обзор

  • SharedMemory — Основной элемент системы, через который осуществляется вся работа. На самом деле, помимо собственно хранения текущих значений, SM умеет:
    • Формирование уведомлений об изменении заказанных датчиков
    • Формирование пороговых датчиков (по аналоговым)
    • Реализует механизм зависимости между датчиками
    • Реализует механизм отслеживания «сердцебиения» для процессов
    • Формирование аварийного следа, по событию (сохранение по срабатыванию датчика («детонатора»), значений указанной группы датчиков за последние N точек)
    • Восстановление данных из резервных SM
  • DBServer — Ведение БД. Сохранение истории изменения по каждому датчику. Работа с MySQL, PostgreeSQL, SQLite, RRD
  • Modbus TCP/RTU (Master,Slave) — Реализация готовых процессов обмена по протоколу Modbus TCP/RTU в режимах Master и Slave. Опрос по нескольким каналам, переключение каналов в случае недоступности slave-узлов и т.п.
  • IOControl — Работа с картами ввода/вывода. Работа реализована на основе использования libcomedi. В рамках этого были разработаны драйвера для поддержки карт ввода/вывода Российского производителя фирмы Fastwel
  • Механизмы обработки входных датчиков — задержка на срабатывание и отпускание, работа по переднему и заднему фронтам сигнала, антидребезг, простые цифровые фильтры для аналоговых сигналов, калибровка (линейная и по калибровочным диаграммам) и другие преобразования
  • UNET — протокол собственной разработки, на основе broadcast UDP. Обеспечивает синхронизацию состояния датчиков между узлами распределённой системы. Готовый компонент, только настроить и запустить. В самой первой статье была представлена структурная схема системы с использованием UNET.
  • LogicProcessor — Реализация простого движка для поддержки «простых» логических схем. Создаётся описание логической схемы в виде xml-файла. Для использования доступны элементы «AND», «OR», «Delay», «NOT»
  • MQTTPublisher — Возможность публиковать данные с датчиков в системе по протоколу MQTT. Реализация основана на использовании проекта mosquitto.
  • uniset-timemachine — Это отдельный, очень интересный, проект (на python). Суть его заключается в проигрывании исторических, данных сохранённых в БД. Данные вынимаются из БД и сохраняются в SM в реальном времени. Например, если подключить при этом графический интерфейс или имитаторы панелей управления, то можно визуально наблюдать, какие кнопки нажимал оператор в тот или иной момент, какие лампочки при этом зажигались, что было на экране графического интерфейса и т.п. Т.е. действительно «машина времени» (Правда этот проект ещё ждёт своего часа, там требуется оптимизация при больших объёмах БД, и пока поддерживается только MySQL. Но это всё дело времени…)

В целом вот тут есть, какая-никакая, но документация.

Немного о реальном применении

Конечно, как известно, любая программа содержит ошибки. Думаю и в libuniset2 не всё идеально, но всё-таки она работает. Работает в реальных проектах. На сегодняшний день, самая «большая система» (просто пока не было проектов побольше) это система управления, где:

  • Около двенадцати тысяч датчиков
  • Около восьмидесяти опрашиваемых ModbusSlave устройств
  • При этом сама система состоит всего из 5 контроллеров и 2 графических панелей
  • Синхронизация состояния всех датчиков между узлами — 150 мсек (UNET)

Были проекты с примерно тремя тысячами датчиков, но зато контроллеров (узлов) было около 18-ти. Эти цифры не призваны «впечатлить», просто хочется показать, что это работает. И переваривает большие объёмы, без специальной оптимизации, хотя механизмы для этого в libuniset2 тоже есть (опрос не на каждом цикле для низко приоритетных или редко меняющихся датчиков и т.п.). В целом уже около тридцати или сорока проектов.

Так что попробуйте libuniset2, это легко :)

Ссылки на проект:

Автор: PavelVainerman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js