Основные концепции

SDK AggreGate предлагает определенный подход к управлению в системе данными любого типа, как сырыми данными, поступающими из устройств, так и подготовленными данными из различных системных элементов, таких как тревоги или датчики. Этот подход также применяется к любому из решений, например, AggreGate Network Manager, AggreGate SCADA/HMI, AggreGate Access Control и другие.

Архитектура

AggreGate

Технически AggreGate - это набор приложений и компонентов (библиотек). Далее следуют два основных приложения Java, которые создают платформу:

  • AggreGate Server
  • AggreGate Client

Автономные компоненты ПО могут встраиваться во внешнее ПО и бывают:

Любой код, используемый другими частями SDK AggreGate (например, Набор для разработки драйверов, SDK плагина, SDK компонента виджета), запускается или в AggreGate Server JVM, или в AggreGate Client JVM.

Формальное описание AggreGate доступно на странице Спецификация.

Операции с таблицами данных

  • Основной элемент всех данных в системе - Таблица данных. Даже простые скалярные значения (целые числа, строки, логические значения) представлены Таблицами данных с одной ячейкой c целью сохранения однородности. Запись Таблицы данных в java - это класс DataTable. Он включает в себя экземпляры от нуля до нескольких экземпляров DataRecord, которые представляют собой отдельные записи.
  • Формат DataTable представлен классом TableFormat. Он ссылатся на ноль или несколько экземпляров FieldFormat, определяющих формат отдельных полей таблицы.

Работа через контексты

В целом, доступ ко всем данным должен осуществляться через различные контексты сервера. Контексты организованы в виде иерархического дерева контекстов. SDK включает интерфейс Context для обращения с разными операциями контекста. Экземпляры контекстов можно выбрать из ContextManager по их пути (полным именам). У интерфейса Context также есть ряд методов доступа к родительскому или дочернему узлу.

Доступ к переменным, функциям и событиям контекста

  • Каждый контекст предоставляет доступ к его переменным, функциям и событиям. Существует ряд методов для их получения: getVariableDefinition(), getVariableDefinitions(), getFuncitonDefinition(), getFuncitonDefinitions(), getEventDefinition(), getEventDefinitions(). Классы, представляющие определения - это соответственно VariableDefinition, FunctionDefinition и EventDefinition.
  • Интерфейс контекста предоставляет способ для чтения/записи данных переменных: getVariable() и setVariable(). Значение каждой переменной - это экземпляр DataTable.
  • Контекст также предоставляет метод для вызова его функций: callFunction(). Входные и выходные параметры функции - это экземпляры DataTable.
  • События обрабатываются путем добавления и удаления получателей события посредством методов addEventListner() и removeEventListener(). Получатели событий должны расширять интерфейс ContextEventListerner, но настоящие реализации в большинстве случаев расширяют DefaultContextEventListener. Получатели, работающие внутри плагинов и драйверов сервера, должны передать экземпляр UncheckedCallerController конструктору DefaultContextEventListener, чтобы обеспечить должные права доступа.

Метод getVariable() возвращает копию значения переменной DataTable даже в случае исполнения кода на стороне сервера (плагины, драйверы). Чтобы применить новое значение к переменной контекста, сначала создайте копию таблицы и после внесения в нее изменений вызовите setVariable() соответствующего контекста.

Прямые изменения DataTable, возвращенные getVariable(), приведут к неизбежной ошибке.