На главную

Архитектура платформы

Общая архитектура обеспечивает возможность технической реализации и достижения ключевых идей платформы.

Основные идеи

Базовые идеи, заложенные в платформу

Удобство пользователя

  • Интуитивно понятный современный UI
  • Адаптация под нужды пользователя
  • Простота перехода с других платформ

Быстрая разработка

  • Понятная логика проекта
  • Удобство управления данными
  • Интероперабельность

Эффективность ресурсов

  • Выжать максимум из железа
  • Линейное масштабирование
  • Платите за софт, экономите на железе

Основные принципы архитектуры

Такие принципы определяют технические возможности системы

Ядро реального времени

Ядро реального времени отвечает за все критические относительно времени компоненты системы и их взаимодействие. Ядро РВ обеспечивает отказоустойчивость, надёжность и доступность. Обеспечивает ключевой критический функционал.

Подробнее

Модельная архитектура

Абстрактные модели представляют собой сложные вложенные структуры данных, описывающие объект предметной области. Такие модели позволяют создавать множество экземпляров объектов, с которыми происходит взаимодействие.

Подробнее

Реактивная архитектура

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

Подробнее

Кластерная архитектура

Критические функции собираются в сервисные монолиты и объединяются в кластер. Кластер в режиме Symmetric Active-Active обслуживает множество подключаемых (микро)сервисов — например, драйверы протоколов и вычислительные модули.

Подробнее

Сервисная архитектура

Компоненты системы взаимодействуют по сервисной модели. Сервисные монолиты и микросервисы взаимодействуют согласно единым принципам. Такой подход позволяет эффективно взаимодействовать с разнообразными источниками данных.

Подробнее

Вычислительная модель

Многоуровневая вычислительная модель позволяет детализировать проектную логику. Ближе к ядру доступны простые сценарии калькулятора — для расчёта динамических уставок и простых логических операций. Для сложных сценариев — полноценный язык.

Подробнее

Особенности архитектуры

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

Конфигурация «на лету»

Изменение конфигурации системы и данных без перерывов и остановок рабочих процессов или со сведением их к минимуму. Возможность коллаборативной разработки.

Резервирование

Возможность активной многоузловой конфигурации. Именно эта опция обеспечивает минимальное время простоя даже при отказах (0-RTO). При необходимости вывести узел из эксплуатации всегда останутся доступные.

Большие объёмы данных

Работа со значительными объёмами данных, в том числе в условиях высоких нагрузок. Миллионы объектов, десятки миллионов переменных, миллиарды значений.

Управляемая деградация

Если нагрузка превышает допустимые ресурсы, система теряет наименее значимые данные. В некоторых случаях данные не теряются, а остаются в очередях — для последующей обработки при снижении нагрузки.

Линейное масштабирование

Для масштабирования системы могут быть добавлены дополнительные узлы. Все сервисы, не близкие к ядру, могут быть децентрализованы. Сервисы, близкие к ядру, работают в режиме SAA (пока 2 узла, планируем больше).

Мультитенантность

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

Структура платформы

Структурно платформа состоит из трёх сред: среда ядра, в которой сконцентрированы все ключевые функции и API, среда исполнения и среда разработки.

Ядро платформы

  • Содержит основной (core) функционал
  • Отвечает за работу с данных
  • Механика взаимодействия сервисов
  • Реализует реактивную архитектуру
  • Имплементирует систему безопасности

Среда выполнения

  • Основные инструменты оператора
  • Мнемосхемы и виджеты
  • Тренды
  • События, тревоги и квитирование
  • Удобный UI/UX

Среда разработки

  • Основные инструменты разработчика
  • Развитая среда разработки
  • Поддержка векторных редакторов
  • Синхронизация изменений
  • Сценарии

Ядро платформы

Обеспечивает ключевой критический функционал.

Оперативные данные

  • Динамичные теги (переменные)
  • Обслуживаются в оперативной памяти
  • Оперативный архив (кеш)
  • Управление нагрузкой и всплесками
  • До 10 000 000 тегов на узел

Метаданные

  • Некритичные по времени данные
  • Слабо динамичны
  • Конфигурации, структуры, иерархии
  • Изолированы от оперативных
  • Хранение в реляционных СУБД

Архив данных

  • Долгосрочное хранение данных
  • Формат временных рядов (TSDB)
  • Хранение в колоночных СУБД
  • Сжатие, разрежение, циклические записи
  • Доступ медленнее, чем к оперативным

Структура данных ядра

Типы данных

  • Дискретные — boolean
  • Целочисленные — integer
  • Аналоговые — float
  • Строковые — string

Модели

  • Абстрактные структуры
  • Сложная вложенная иерархия
  • Модели состоят из моделей
  • Базовые принципы ООП

Объекты

  • Основаны на моделях
  • Множество экземпляров
  • Структурно зависит от модели
  • Поддерживают каскадные изменения
Изменение модели вызывает каскадное изменение всех созданных на её основе объектов. Удаление переменных, используемых в логике системы, может привести к непредсказуемым последствиям — такие изменения нужно тщательно планировать и предварительно сохранять конфигурацию резервным копированием или экспортом.

Модельная архитектура

Данные описываются через модели и объекты: модель — абстракция, объект — её экземпляр. Каждый объект работает как самостоятельная реактивная сущность.

Как устроены модели и объекты

  • Модель — абстрактная сущность из переменных простых типов и вложенных моделей.
  • Вложенность любой глубины.
  • Объект создаётся строго на основе модели и полностью повторяет её структуру.
  • Изменить структуру объекта без изменения модели нельзя.
Композиция структуры
Составная модель «Агрегат»
Модель «Насос»
Состояние · boolСкорость · floatДавление · float
+
Модель «Клапан»
Открыт · boolПозиция · float

Переменные → модель → составная модель.

Деривация объектов
Наследование объектов
Модель «Насос»
абстрактная сущность
Насос №1
экземпляр
Насос №2
экземпляр
Насос №3
экземпляр

Объекты повторяют структуру модели.

Каскадное изменение: изменение модели автоматически применяется ко всем созданным на её основе объектам.

Реактивная архитектура

  • Каждый объект обслуживается собственным легковесным потоком
  • Такие потоки — основа реактивности (N потоков, M ядер CPU)
  • Объекты реагируют на изменения независимо и параллельно
  • Такие потоки имеют минимальные накладные расходы
  • Масштабируется до миллионов объектов на узел
  • Контроль каскадных изменений и защита от зацикливания
Объект
обслуживается лёгким потоком
Миллионы объектов
параллельно на узел
Go · горутины
лёгкие потоки, минимум накладных расходов

Реактивная архитектура

Событийно-ориентированная архитектура (EDA)

События

  • События — динамические объекты платформы
  • Создаются как реакция на изменение значений переменных
  • Событие активно, пока выполняются условия его создания
  • Условия определяются калькулятором
  • Наступают при изменении состояния дискретного объекта
  • Например, объект отслеживает температуру
  • При превышении уставки меняет состояние
  • Наступает событие заданного типа
Совокупность атрибутов:
объектклассвремя созданиятекст сообщенияприоритет классафлаг активностифлаг квитированиякем квитировано

Тревоги и квитирование

  • Тревога — класс события в верхней части шкалы приоритетов (наиболее критичные события)
  • Можно определить несколько классов тревог разной критичности
  • Тревоги могут вызывать аудиовизуальные эффекты для привлечения внимания операторов
  • Квитированием оператор подтверждает получение информации о событии
  • Платформа фиксирует, кто именно квитировал

Приоритизация событий

  • Приоритет — числовое значение, например (от 1 до 10)
  • Задаётся для класса событий и определяет его важность и критичность
  • Чем выше значение, тем критичнее событие
  • Тревогам назначают наибольшие приоритеты
Ранжирование и сортировка

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

Звуковое оповещение

Звук воспроизводится у события с наивысшим приоритетом — последовательно, с заданным интервалом.

До квитирования

Сигнал повторяется, пока не придёт событие с более высоким приоритетом или текущее не будет квитировано.

Приоритеты
низкий
1234567
сообщения
8910
тревоги
высокий

Сервисная модель

Сервис-ориентированная архитектура (SOA)

Ядро позволяет обслуживать сервисы трёх классов

Интерфейсы (API)ЯдроДрайверы сопряженияСервисы ядра

Сервисы ядра (core)

  • Обработка данных близко к ядру
  • Оперируют данными кеша
  • Базовые сервисы
событиявычисленияархивация

Драйверы сопряжения (edge)

  • Сбор и предобработка данных
  • Постобработка и подготовка
  • Передача данных и команд управления
EdgeETL/ELT

Интерфейсы (API)

  • Полный доступ к API
  • Протокол REST
  • WebSocket для реактивности и РВ
APIRESTWebSocket

Протоколы АСУ ТП

  • Поддержка открытых протоколов
  • Поддержка проприетарных протоколов
  • Поддержка специальных протоколов
NTPSNMPOPC UAModbusProfinet
BACnetMQTTIEC-60870IEC-61850

Сопряжение с ИТ-системами

  • Сопряжение с открытыми API
  • Сопряжение с проприетарными API
  • Сопряжение по шине
ZabbixTrassirPercoFindFace
AsteriskOrionProSyslog

Полный список драйверов и открытых протоколов — на главной.

Вычислительная модель

Платформа включает несколько вычислительных инструментов

Калькулятор

  • Работает в реактивной логике
  • При изменении связанного объекта
  • Ограниченный функционал
  • Работает на уровне ядра

Сценарии кластера

  • Сложные алгоритмические вычисления
  • Вычисления на основе переменных
  • Расширяемый функционал
  • Возможность работы с данными вне ядра

Имитатор сигналов

  • Генерация сигналов
  • По заданному закону
  • Опорный сигнал для вычислений
  • Для тестирования и диагностики

Калькулятор

Где применяется калькулятор

  • Отслеживание изменений переменных
  • Арифметика, сравнения, интегрирование, условные операции
  • Логические вычисления
  • Расчёт плавающих уставок

Как вызывается калькулятор

  • Калькулятор вызывается из логической переменной, где задаётся целевая формула
  • Как только заданное условие выполняется, переменная переключается в нужное состояние
  • Состояние задаёт целевое событие (в том числе тревогу)

Операции калькулятора

+×÷
><=
НЕЕСЛИЕСЛИМН

Плавающая уставка

t →
ПроцессУставки (верхняя / нижняя)

Сценарии кластера

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

Сложная логика

  • Произвольная управляющая логика
  • Современный язык Lua
  • Компиляция в байт-код
  • Большой объём кода
  • Любая сложность

Библиотеки алгоритмов

  • Возможность создавать библиотеки
  • Переиспользование кода
  • Управление из сценариев
  • Функционально-групповое управление
  • Сопряжение с РСУ

Доступность API

  • Доступ ко всему API платформы
  • Доступность внешних API
  • Децентрализация
  • Интероперабельность
  • Безопасность

Почему Lua

Lua — легковесный и быстрый язык, синтаксически очень близкий к ST (Structured Text), знакомому инженерам АСУ ТП.

ЛегковесныйБыстрыйПохож на STЗнаком инженерам АСУ ТП
Один и тот же алгоритм управления насосом:
ST (Structured Text)
PROGRAM Control_Pump_Prog
VAR
// Инициализация переменных (аналог local в Lua)
waterLevel : REAL := 5.5; // Текущий уровень воды
tankMax : REAL := 10.0; // Максимальный уровень
tankMin : REAL := 2.0; // Минимальный уровень
pump : BOOL := FALSE; // Состояние насоса
alarm : BOOL := FALSE; // Состояние аварии
END_VAR
// Функция управления насосом
IF waterLevel > tankMax THEN
pump := FALSE; // Отключаем насос
alarm := TRUE; // Включаем аварийный сигнал
ELSIF waterLevel < tankMin THEN
pump := TRUE; // Включаем насос
alarm := FALSE; // Сбрасываем аварию
END_IF;
END_PROGRAM
-- Инициализация переменных (аналог блока VAR)
local waterLevel = 5.5 -- Текущий уровень воды
local tankMax = 10.0 -- Максимальный уровень
local tankMin = 2.0 -- Минимальный уровень
local pump = false -- Состояние насоса
local alarm = false -- Состояние аварии
-- Функция управления насосом
local function controlPump()
if waterLevel > tankMax then
pump = false -- Отключаем насос
alarm = true -- Включаем аварийный сигнал
elseif waterLevel < tankMin then
pump = true -- Включаем насос
alarm = false -- Сбрасываем аварию
end
end

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

При правильно подготовленном окружении на Lua можно писать почти в синтаксисе ST. В целом на Lua легко переносятся и ST современными специальными средствами.

Сигналы имитатора

Имитатор генерирует значения переменных по заданному закону.

  • Задаются амплитуда и частота
  • Для аналоговых и дискретных переменных
  • Может быть использован как опорный сигнал для вычислений
  • Применяется для диагностики
Аналоговый
Постоянное
Синусоидальный
Треугольный
Пилообразный
Прямоугольный
Случайное
Дискретный
Смена состояния
Постоянное

Кластерная модель

Отказоустойчивый кластер высокой доступности

Кластерный узел

  • Symmetric Active-Active кластер
  • Горячее резервирование
  • Когерентный in-memory кеш
  • Выделенный интерконнект
  • Балансировщик нагрузки
  • До 10 000 000 тегов на узел

Интерконнект

  • Двусторонний обмен между узлами
  • Резервирование каналов
  • Защищённый протокол обмена
  • Высокая пропускная способность
  • Низкая задержка и джиттер
  • Управляемая деградация

Клиент кластера

  • Active-Passive режим
  • Активное резервированное соединение
  • Автоматическое переключение (failover)
  • Для шлюзов, включая API-gateway
  • Для обслуживания драйверов (RRW)
  • Для обслуживания WebSocket (WS)

Схема интерконнекта кластерной модели ядра

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

Кибербезопасность

Платформа включает мощную систему разграничения доступа.

Разграничение доступа

  • Ролевая модель разграничения доступа (RBAC)
  • Токены ограниченного действия (TBAC)
  • Поддержка систем управления доступом IAM (LDAP, Keycloak)
  • Мультитенантность на уровне объектов

Объекты разграничения доступа

  • Модели и объекты
  • Драйверы и сервисы
  • Сценарии
  • Компоненты и мнемосхемы

Идентификация и доступ

Встроенная

Собственный механизм аутентификации и ролевая модель доступа без внешних зависимостей. Временные токены.

RBACTBAC
LDAP

Интеграция с корпоративными каталогами для единого управления учётными записями

LDAPActive Directory
Keycloak

Внешний провайдер идентификации с поддержкой единого входа и федерации

SSOOAuth 2.0OpenIDФедерации

Импорт, экспорт и резервное копирование

Позволяет эффективно обмениваться проектными данными в разных форматах

Экспорт данных

  • Модели и объекты
  • События и тревоги
  • Сценарии
  • Драйверы и сервисы
  • Компоненты и мнемосхемы
  • Привязки переменных
  • Роли и пользователи

Импорт данных

  • Упрощает создание проектов
  • Требует согласованного формата
  • Например табличный (xlsx, csv), или xml
  • Можно импортировать из чужого API
  • Полный или частичный импорт
  • Учитывает версионность
  • Требует некоторой аккуратности

Резервное копирование

  • Осуществляется по запросу
  • Можно реактивно или по таймеру
  • Может вызываться сценарием
  • Сразу отчуждаемо
  • Способ восстановления при сбоях
  • Которых, в целом, не должно быть
  • Поддержка сторонних систем бэкапа