UniSet 2.32.1
Краткое описание библиотеки libuniset

Общее описание libuniset

Основной целью библиотеки libuniset является предоставление готовых "кубиков", для построения АСУ. Графически её можно представить так:

В основу положена технология CORBA (omniORB - реализация AT&T). Но основе вызовов CORBA построено всё взаимодействие. При этом API библиотеки, "маскирует" взаимодействие через CORBA и при необходимости взаимодействие может быть переписано на основе других механизмов.

В библиотеке реализованы наиболее распространённые интерфейсы обмена, это ModbusTCP и ModbusRTU. Помимо этого имеется собственный интерфейс UNet, реализующий обмен по протоколу UDP.

Для взаимодействия с базами данных, реализован базовый DBInterface, на основе которого можно писать интерфейсы для подключения uniset к различным СУБД. В самой libuniset реализовано взаимодействие с MySQL.

Помимо собственно единого интерфейса, в библиотеке реализованы "готовые компоненты" для построения АСУ. К ним относятся:

  • SharedMemory - хранение "переменных"
  • IOControl - работа с картами ввода/вывода
  • Modbus TCP/RTU slave и master режимы
  • UNetExchange - взаимодействие по протоколу UDP
  • LogicProcessor - компонент, позволяющий описывать алгоритмы на основе, логических схем (записываемых в xml-файле).

Готовые компоненты - представляют из себя уже законченные программы (процессы), которые "умеют" взаимодействовать с SharedMemory и позволяют легко "развёртывать" распределённые системы.

Всё взаимодействие в libuniset построено на понятии "датчик". Это некоторая "информационная единица", позволяющая процессам взаимодействовать между собой. При этом создаётся "прозрачная сеть" и каждый процесс использующий тот или иной датчик в своих целях, "не знает" где физически он находиться и одинаково взаимодействует с локальными и удалёнными датчиками.

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

Взаимодействие процессов на узле

На рисунке представлено типичное взаимодействие процессов на узле.

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

Все процессы условно можно разделить на два типа "активные" и "пассивные".

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

Активные процессы - это процессы которые постоянно выполняют какую-то работу. К таким процессам относятся:

  • процессы обмена по сети (в данном случае CAN)
  • процессы работы с картами ввода/вывода (IOControl)
  • процессы обмена с какими-то внешними устройствами (RS485 или ModbusTCP)

Т.к. активные процессы тесно взаимодействуют с SharedMemory, то для оптимизации работы (исключения удалённых вызовов процедур через CORBA), все активные процессы запускаются в одном адресном пространстве с SharedMemory (каждый процесс в отдельном потоке), и работают с SM напрямую, через указатель. Этот "объединённый" процесс обычно называется SharedMemory2.

Отдельно можно выделить группу "вспомогательных" процессов. На данном рисунке, к таким относится DBServer, обычно запускаемый на графических станция, где ведётся БД. Его задача, получать уведомления от SM по изменении любого датчика и сохранять эти события в БД. По умолчанию в libuniset реализована работа с MySQL, но при необходимости можно реализовать взаимодействие с любой СУБД.

См. также
Реализация разделяемой между процессами памяти (SharedMemory)
(IOControl) Реализация процесса ввода/вывода

Распределённое взаимодействие (сетевое)

Для обеспечения "прозрачности сети" всё взаимодействие построено на использовании SharedMemory (SM), хранящей состояние датчиков во ВСЕЙ системе. При этом на каждом узле запускаться своя копия SM. "прозрачность" при этом обеспечивают процессы обмена между узлами по соответствующему протоколу (на рисунке это CAN и UNET). Узлы постоянно обмениваются между собой датчиками обеспечивая "одинаковость" хранимой в SM информации. Каждый процесс обмена получает от других узлов информацию о находящихся у них датчиков, и в свою очередь посылает другим узлам информацию о датчиках находящихся у него на узле.

Так же через SM функционирует и процесс ввода/вывода (IOControl). Всё, что считывается с каналов ввода сохраняется в SM, а состояние "выходов" читается из SM и выводится в каналы вывода.

Утилиты входящие в состав libuniset

...