Архитектура платформы
Общая архитектура обеспечивает возможность технической реализации и достижения ключевых идей платформы.
Основные идеи
Базовые идеи, заложенные в платформу
Удобство пользователя
- Интуитивно понятный современный UI
- Адаптация под нужды пользователя
- Простота перехода с других платформ
Быстрая разработка
- Понятная логика проекта
- Удобство управления данными
- Интероперабельность
Эффективность ресурсов
- Выжать максимум из железа
- Линейное масштабирование
- Платите за софт, экономите на железе
Основные принципы архитектуры
Такие принципы определяют технические возможности системы
Ядро реального времени
Ядро реального времени отвечает за все критические относительно времени компоненты системы и их взаимодействие. Ядро РВ обеспечивает отказоустойчивость, надёжность и доступность. Обеспечивает ключевой критический функционал.
Модельная архитектура
Абстрактные модели представляют собой сложные вложенные структуры данных, описывающие объект предметной области. Такие модели позволяют создавать множество экземпляров объектов, с которыми происходит взаимодействие.
Реактивная архитектура
Под реактивностью понимается событийно управляемая архитектура. Каждому объекту присваивается легковесный поток, отвечающий за реактивность. Принципы реактивной архитектуры определены в манифесте реактивных систем.
Кластерная архитектура
Критические функции собираются в сервисные монолиты и объединяются в кластер. Кластер в режиме Symmetric Active-Active обслуживает множество подключаемых (микро)сервисов — например, драйверы протоколов и вычислительные модули.
Сервисная архитектура
Компоненты системы взаимодействуют по сервисной модели. Сервисные монолиты и микросервисы взаимодействуют согласно единым принципам. Такой подход позволяет эффективно взаимодействовать с разнообразными источниками данных.
Вычислительная модель
Многоуровневая вычислительная модель позволяет детализировать проектную логику. Ближе к ядру доступны простые сценарии калькулятора — для расчёта динамических уставок и простых логических операций. Для сложных сценариев — полноценный язык.
Особенности архитектуры
Техническая реализация заложенных принципов обеспечивает следующие возможности
Конфигурация «на лету»
Изменение конфигурации системы и данных без перерывов и остановок рабочих процессов или со сведением их к минимуму. Возможность коллаборативной разработки.
Резервирование
Возможность активной многоузловой конфигурации. Именно эта опция обеспечивает минимальное время простоя даже при отказах (0-RTO). При необходимости вывести узел из эксплуатации всегда останутся доступные.
Большие объёмы данных
Работа со значительными объёмами данных, в том числе в условиях высоких нагрузок. Миллионы объектов, десятки миллионов переменных, миллиарды значений.
Управляемая деградация
Если нагрузка превышает допустимые ресурсы, система теряет наименее значимые данные. В некоторых случаях данные не теряются, а остаются в очередях — для последующей обработки при снижении нагрузки.
Линейное масштабирование
Для масштабирования системы могут быть добавлены дополнительные узлы. Все сервисы, не близкие к ядру, могут быть децентрализованы. Сервисы, близкие к ядру, работают в режиме SAA (пока 2 узла, планируем больше).
Мультитенантность
Возможность изоляции пространства (объекты, сервисы) для разных подсистем и пользователей. В основе лежит развитая система разграничения доступа на базе ролевой модели.
Структура платформы
Структурно платформа состоит из трёх сред: среда ядра, в которой сконцентрированы все ключевые функции и API, среда исполнения и среда разработки.
Ядро платформы
- Содержит основной (core) функционал
- Отвечает за работу с данных
- Механика взаимодействия сервисов
- Реализует реактивную архитектуру
- Имплементирует систему безопасности
Среда выполнения
- Основные инструменты оператора
- Мнемосхемы и виджеты
- Тренды
- События, тревоги и квитирование
- Удобный UI/UX
Среда разработки
- Основные инструменты разработчика
- Развитая среда разработки
- Поддержка векторных редакторов
- Синхронизация изменений
- Сценарии
Ядро платформы
Обеспечивает ключевой критический функционал.
Оперативные данные
- Динамичные теги (переменные)
- Обслуживаются в оперативной памяти
- Оперативный архив (кеш)
- Управление нагрузкой и всплесками
- До 10 000 000 тегов на узел
Метаданные
- Некритичные по времени данные
- Слабо динамичны
- Конфигурации, структуры, иерархии
- Изолированы от оперативных
- Хранение в реляционных СУБД
Архив данных
- Долгосрочное хранение данных
- Формат временных рядов (TSDB)
- Хранение в колоночных СУБД
- Сжатие, разрежение, циклические записи
- Доступ медленнее, чем к оперативным
Структура данных ядра
Типы данных
- Дискретные — boolean
- Целочисленные — integer
- Аналоговые — float
- Строковые — string
Модели
- Абстрактные структуры
- Сложная вложенная иерархия
- Модели состоят из моделей
- Базовые принципы ООП
Объекты
- Основаны на моделях
- Множество экземпляров
- Структурно зависит от модели
- Поддерживают каскадные изменения
Модельная архитектура
Данные описываются через модели и объекты: модель — абстракция, объект — её экземпляр. Каждый объект работает как самостоятельная реактивная сущность.
Как устроены модели и объекты
- Модель — абстрактная сущность из переменных простых типов и вложенных моделей.
- Вложенность любой глубины.
- Объект создаётся строго на основе модели и полностью повторяет её структуру.
- Изменить структуру объекта без изменения модели нельзя.
Переменные → модель → составная модель.
Объекты повторяют структуру модели.
Реактивная архитектура
- Каждый объект обслуживается собственным легковесным потоком
- Такие потоки — основа реактивности (N потоков, M ядер CPU)
- Объекты реагируют на изменения независимо и параллельно
- Такие потоки имеют минимальные накладные расходы
- Масштабируется до миллионов объектов на узел
- Контроль каскадных изменений и защита от зацикливания
Реактивная архитектура
Событийно-ориентированная архитектура (EDA)
События
- События — динамические объекты платформы
- Создаются как реакция на изменение значений переменных
- Событие активно, пока выполняются условия его создания
- Условия определяются калькулятором
- Наступают при изменении состояния дискретного объекта
- Например, объект отслеживает температуру
- При превышении уставки меняет состояние
- Наступает событие заданного типа
Тревоги и квитирование
- Тревога — класс события в верхней части шкалы приоритетов (наиболее критичные события)
- Можно определить несколько классов тревог разной критичности
- Тревоги могут вызывать аудиовизуальные эффекты для привлечения внимания операторов
- Квитированием оператор подтверждает получение информации о событии
- Платформа фиксирует, кто именно квитировал
Приоритизация событий
- Приоритет — числовое значение, например (от 1 до 10)
- Задаётся для класса событий и определяет его важность и критичность
- Чем выше значение, тем критичнее событие
- Тревогам назначают наибольшие приоритеты
Приоритет влияет на порядок событий. Классы можно сортировать по приоритету, возможности квитирования и звуку.
Звук воспроизводится у события с наивысшим приоритетом — последовательно, с заданным интервалом.
Сигнал повторяется, пока не придёт событие с более высоким приоритетом или текущее не будет квитировано.
Сервисная модель
Сервис-ориентированная архитектура (SOA)
Ядро позволяет обслуживать сервисы трёх классов
Сервисы ядра (core)
- Обработка данных близко к ядру
- Оперируют данными кеша
- Базовые сервисы
Драйверы сопряжения (edge)
- Сбор и предобработка данных
- Постобработка и подготовка
- Передача данных и команд управления
Интерфейсы (API)
- Полный доступ к API
- Протокол REST
- WebSocket для реактивности и РВ
Протоколы АСУ ТП
- Поддержка открытых протоколов
- Поддержка проприетарных протоколов
- Поддержка специальных протоколов
Сопряжение с ИТ-системами
- Сопряжение с открытыми API
- Сопряжение с проприетарными API
- Сопряжение по шине
Полный список драйверов и открытых протоколов — на главной.
Вычислительная модель
Платформа включает несколько вычислительных инструментов
Калькулятор
- Работает в реактивной логике
- При изменении связанного объекта
- Ограниченный функционал
- Работает на уровне ядра
Сценарии кластера
- Сложные алгоритмические вычисления
- Вычисления на основе переменных
- Расширяемый функционал
- Возможность работы с данными вне ядра
Имитатор сигналов
- Генерация сигналов
- По заданному закону
- Опорный сигнал для вычислений
- Для тестирования и диагностики
Калькулятор
Где применяется калькулятор
- Отслеживание изменений переменных
- Арифметика, сравнения, интегрирование, условные операции
- Логические вычисления
- Расчёт плавающих уставок
Как вызывается калькулятор
- Калькулятор вызывается из логической переменной, где задаётся целевая формула
- Как только заданное условие выполняется, переменная переключается в нужное состояние
- Состояние задаёт целевое событие (в том числе тревогу)
Операции калькулятора
Плавающая уставка
Сценарии кластера
Для сложных задач, которые не покрываются калькулятором.
Сложная логика
- Произвольная управляющая логика
- Современный язык Lua
- Компиляция в байт-код
- Большой объём кода
- Любая сложность
Библиотеки алгоритмов
- Возможность создавать библиотеки
- Переиспользование кода
- Управление из сценариев
- Функционально-групповое управление
- Сопряжение с РСУ
Доступность API
- Доступ ко всему API платформы
- Доступность внешних API
- Децентрализация
- Интероперабельность
- Безопасность
Почему Lua
Lua — легковесный и быстрый язык, синтаксически очень близкий к ST (Structured Text), знакомому инженерам АСУ ТП.
PROGRAM Control_Pump_ProgVAR // Инициализация переменных (аналог 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Сравнение показано на примере управления насосом: курсор синхронно пробегает по обоим блокам, подсвечивая соответствующие строки. Наведите курсор на строку, чтобы сопоставить вручную.
Сигналы имитатора
Имитатор генерирует значения переменных по заданному закону.
- Задаются амплитуда и частота
- Для аналоговых и дискретных переменных
- Может быть использован как опорный сигнал для вычислений
- Применяется для диагностики
Кластерная модель
Отказоустойчивый кластер высокой доступности
Кластерный узел
- Symmetric Active-Active кластер
- Горячее резервирование
- Когерентный in-memory кеш
- Выделенный интерконнект
- Балансировщик нагрузки
- До 10 000 000 тегов на узел
Интерконнект
- Двусторонний обмен между узлами
- Резервирование каналов
- Защищённый протокол обмена
- Высокая пропускная способность
- Низкая задержка и джиттер
- Управляемая деградация
Клиент кластера
- Active-Passive режим
- Активное резервированное соединение
- Автоматическое переключение (failover)
- Для шлюзов, включая API-gateway
- Для обслуживания драйверов (RRW)
- Для обслуживания WebSocket (WS)
Схема интерконнекта кластерной модели ядра
Кликните по ядру, чтобы смоделировать его отказ
Кибербезопасность
Платформа включает мощную систему разграничения доступа.
Разграничение доступа
- Ролевая модель разграничения доступа (RBAC)
- Токены ограниченного действия (TBAC)
- Поддержка систем управления доступом IAM (LDAP, Keycloak)
- Мультитенантность на уровне объектов
Объекты разграничения доступа
- Модели и объекты
- Драйверы и сервисы
- Сценарии
- Компоненты и мнемосхемы
Идентификация и доступ
Собственный механизм аутентификации и ролевая модель доступа без внешних зависимостей. Временные токены.
Интеграция с корпоративными каталогами для единого управления учётными записями
Внешний провайдер идентификации с поддержкой единого входа и федерации
Импорт, экспорт и резервное копирование
Позволяет эффективно обмениваться проектными данными в разных форматах
Экспорт данных
- Модели и объекты
- События и тревоги
- Сценарии
- Драйверы и сервисы
- Компоненты и мнемосхемы
- Привязки переменных
- Роли и пользователи
Импорт данных
- Упрощает создание проектов
- Требует согласованного формата
- Например табличный (xlsx, csv), или xml
- Можно импортировать из чужого API
- Полный или частичный импорт
- Учитывает версионность
- Требует некоторой аккуратности
Резервное копирование
- Осуществляется по запросу
- Можно реактивно или по таймеру
- Может вызываться сценарием
- Сразу отчуждаемо
- Способ восстановления при сбоях
- Которых, в целом, не должно быть
- Поддержка сторонних систем бэкапа