OpenSCADAWiki: Doc/VCA/part6 ...

Home | Index | Changes | Comments | Users | Registration | Login  Password:  
 
This is an old revision of Doc/VCA/part6 from 2008-07-29 14:08:00..

Реализация

Реализацию будем производить поэтапно, в направлении от функций в концепции к её представлению на библиотеке QT, и так до последнего компонента. Такой подход позволит получать результат между этапами, анализировать его и учитывать особенности на следующих этапах. Для пошаговой реализации разобьем всю задачу на логические части и выстроим их в зависимости одна от другой, в реализации.

Виджеты и их библиотеки -- Выполнено


Целями данного этапа является:


В результате проделанной работы созданы модули модели данных (UI.VCAEngine) и представления (UI.Vision). На данном этапе, модулями реализуются механизмы формирования элементов пользовательского интерфейса. На следующий этапе данные элементы будут использованы для формирования цельных интерфейсов визуализации и управления.


Рассмотрим по пунктам результаты реализации данного этапа:

Реализация основы архитектуры "Модель данных"-"Представление"

В соответствии со статической диаграммой классов (рис.6) и общими требованиями, были реализованы модули "UI.VCAEngine" и "UI.Vision", для системы OpenSCADA. Модуль "UI.VCAEngine" реализует модель данных СВУ и является источником для последующего представления этих данных различными механизмами визуализации. Модуль "UI.Vision" реализует способ представления данных, основанный на библиотеке QT версии 4, фирмы Trolltech.


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

Реализация базовых функций модели данных СВУ, в модуле UI.VCAEngine

Модуль модели данных(движка) СВУ содержит контейнер библиотек виджетов/кадров. Модулем предоставляется предопределённая библиотека базовых виджетов(примитивов) с первичной реализацией собственных свойств и логики обработки этих свойств.


Хранение данных виджетов и библиотек виджетов реализовано в БД доступных системе OpenSCADA. БД организована по принадлежности данных к библиотеке. Т.е. отдельная библиотека хранится в отдельной группе таблиц одной или разных БД. Перечень библиотек виджетов хранится в индексной таблице библиотек с именем "VCALibs" и структурой "Libs", раздела БД?. Экземпляр этой таблицы создаётся в каждой БД, где хранятся данные этого модуля, с перечнем библиотек содержащихся в конкретно взятой БД. В состав таблиц, принадлежащий библиотеке виджетов входят следующие:


Для управления библиотеками виджетов и отдельными виджетами были написаны сценарии конфигурации на языке интерфейса управления ~OpenSCADA. На данный момент эти сценарии призваны выполнять только функции централизованной конфигурации элементов движка СВУ, однако в последствии их планируется расширить и наделить функциями обработки запросов к модели данных от модулей представления, с целью организации "слабых связей" между "Моделью данных" и "Представлением".


Основой практически всех элементов движка стал объект абстрактного элемента визуализации (VCA::Widget). На своём, абстрактном, уровне объект наделён следующими свойствами:


Для представления библиотеки виджетов реализован класс (VCA::WdgLib). Основными его функциями является содержание библиотечных виджетов, хранение и загрузка их с БД, предоставление доступа к ресурсам (Mime-данные), а также разделение доступа.


Специально для включения в библиотеку виджетов был создан класс библиотечного виджета (VCA::LWidget), который основан на классе абстрактного виджета (VCA::Widget) и предоставляет дополнительные функции: хранения данных виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с mime-данными библиотеки и хранение вложенного контейнерного виджета (VCA::CWidget).


В свою очередь класс контейнерного виджета (VCA::CWidget) предоставляет функции: хранения данных контейнерного виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с mime-данными библиотеки, а также принудительный режим простой ссылки для всех контейнерных виджетов.


На основе класса библиотечного виджета (VCA::LWidget) был сформирован абстрактный класс терминального виджета (VCA::PrWidget). А уже на его основе сформированы реализации примитивов базовых виджетов, которые и сформировали библиотеку базовых виджетов, создаваемую модулем при инициализации. Значения свойств базовых виджетов, также, могут сохраняться в БД (таблицы библиотеки виджетов), формируя нужные шаблоны. Кроме того, базовая библиотека примитивов может доопределяться расширенными примитивами из модулей интерфейсов представления, которым базовых недостаточно. Но в этом случае нужно учитывать, что подобные действие - путь к несовместимости между модулями интерфейсов представления!

Реализация базовых функций среды разработки пользовательского интерфейса в модуле представления UI.Vision

Интерфейс разработки пользовательских интерфейсов, модуля, основан на MDI(Multi Document Interface) интерфейсе. Данный подход позволяет одновременно редактировать несколько кадров различных размеров. Использованы следующие механизмы управления разработкой: панели инструментов, пункты меню и контекстное меню. Большинство действий дублируются в разных механизмах, что позволяет быстро найти инструмент предпочитаемым способом. Навигационные интерфейсы реализованы присоединяемыми окнами. Конфигурация панелей инструментов и присоединяемых окон сохраняется при выходе и восстанавливается при старте, что позволяет настраивать интерфейс под себя.


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


Для удобного управления свойствами виджетов/кадров реализован инспектор атрибутов(свойств) виджетов. Инспектор атрибутов реализован как присоединяемое окно, которое активируется при выборе кадра или виджета. Окно инспектора атрибутов можно удобно расположить на виду, пришвартовав к одной из сторон рабочего окна. Инспектором атрибутов реализована поддержка групповой конфигурации нескольких виджетов, а также группирование однотипных свойств.


Для визуального редактирования кадров реализована первичная поддержка редактирования виджетов и кадров. Уже сейчас редактор позволяет редактировать кадры, основанные на примитиве "Box" и полноценно отображать примитив текстового поля "Text". В редакторе кадров реализованы функции:


Вид окна разработки приведён на рис. 8. На рисунке можно видеть: панели инструментов, навигатор виджетов, инспектор атрибутов, окно редактирования кадра и строка статуса.


file:vision_win.png
Рис.8 Окно разработки модуля UI.Vision

Для настройки объектов виджетов и их библиотек разработаны два диалога, диалог настройки виджета (рис.9) и диалог настройки библиотеки виджетов (рис.10). Диалог настройки библиотеки позволяет установить основные свойства и поместить mime-данные в БД, для последующего использования в виджетах библиотеки. Диалог настройки виджета позволяет установить: основные свойства виджета, индивидуально установить значения атрибутов и сконфигурировать внутреннюю процедуру вычислений виджета с дополнительными (пользовательскими) свойствами.


file:vision_lwdg_dlg.png
Рис.9 Диалог настройки библиотеки виджетов.

file:vision_wdg_dlg.png
Рис.10 Диалог настройки виджета.

Проекты интерфейсов визуализации -- Выполнено


Целями данного этапа является:


На данном этапе был добавлен механизм формирования проектов СВУ посредством построения страниц визуализации в иерархическом виде, который соответствует логическим связям в конечном интерфейсе СВУ. В процессе реализации данного этапа были начаты работы по адаптации модуля визуализации Vision к использованию интерфейса управления OpenSCADA, вместо прямых-сильных связей. Эти работы позволили достичь значительной унификации различных диалогов, структур управления и пользовательского интерфейса в целом.


На данном этапе реализовано:

Сессии исполнения проектов -- Выполнено


Целями данного этапа является:


На данном этапе был добавлен механизм исполнения проекта в сеансах модели данных модуля VCAEngine, а также визуализация сеанса проекта, режим "RunTime", в модуле визуализации на библиотеке QT Vision, с элементами обновления данных и интерактивного взаимодействия с пользователем.

Формирование иерархического дерева виджетов конечной визуализации на основе проекта для которого открывается сеанс.

В соответствии с рис.6 и рис.7 объекты сессии проекта наследуются от абстрактного объекта Widget и используют соответствующие объекты проекта. Так, сессия (Session) использует проект (Project) и формирует развёрнутое дерево на основе него. Страница проекта Page прямо используется страницей сессии SessPage. Остальные объекты (SessWdg) разворачиваются в соответствии с иерархией элементов страницы (рис.7).


В дополнении к стандартным свойствам абстрактного виджета (Widget) элементы страницы, и сами страницы, сессии получают свойства: хранения кадра значений вычислительной процедуры, обсчёта процедур и механизм обработки событий. Страницы сессии, в дополнение ко всему, содержат контейнер следующих по иерархии страниц. Сессия в целом обсчитывается с указанной периодичностью и в последовательности:

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


В сессии реализована поддержка специальных свойств страниц:

Container - страница является контейнером для нижележащих страниц;
Template - страница является шаблоном для нижележащих страниц;
Empty - пустая, не активная страница, это свойство используется совместно со свойством Container для организации логических контейнеров.

На основе этих свойств реализованы следующие типы страниц:

Standard -- Стандартная страница (не установлено ни одно из свойств). Является полноценной конечной страницей.
Container -- Полноценная страница со свойством контейнера (Container).
Logical container -- Логический контейнер, фактически не являющийся страницей (Container|Empty). Выполняет свойство промежуточного и группирующего элемента в дереве страниц.
Template -- Страница шаблон (Template). Чистая шаблонная страница используется для описания общих свойств и доопределения их в частном порядке во вложенных страницах.
Container and template -- Страница шаблон и контейнер (Template|Container). Совмещает функции шаблона и контейнера.

Формирование кадров значений для процедур обсчёта виджетов конечной визуализации.

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


Вычисление, и обработка виджета в целом, выполняется в следующей последовательности:

Обработка ссылок на параметры источников данных OpenSCADA.

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


Заложена поддержка следующих типов ссылок:


На данный момент реализованы первые два типа ссылок. Последняя будет реализована вместе с реализацией базового виджета "Link".

Формирование окна исполнения проекта (RunTime).

На стороне визуализации (модуль Vision), для визуализации процесса исполнения проекта, реализован объект VisRun. При запуске он шлёт запрас на создание и инициализацию сессии. Далее выполняется запрос на перечень открытых страниц. Исходя из информации об открытых страницах VisRun и их связности формируется результирующий интерфейс. На рис. 11 приведён пример классического SCADA интерфейса с объектами сигнализации, где главное окно содержит страницу внутри, которая замещается по нажатию на кнопки объектов сигнализации и листания.


file:vision_run.png
Рис.11 Окно визуализации исполнения проекта. Режим "RunTime".

Визуализация кадров проекта в режиме "RunTime", с периодическим обновлением содержимого.

Реализовано обновление содержимого открытых страниц интерфейса визуализации с периодичностью исполнения сессии проекта. В процессе обновления выполняется:
- запрос списка открытых страниц у модели и проверка соответствия реально открытых страниц этому списку;
- запрос изменённых данных по каждой странице и её виджету;
- обновление содержимого страниц и их виджетов в соответствии с полученными измененными данными.


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


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

Реализация передачи и обработки событий.

Визуализатор сессии ("RunTime"), в виду своего непосредственного контакта с пользователем, собирает различные события. Часть событий обрабатывается образами базовых виджетов (Text, Box, Document и т.д.), в результате чего могут формироваться другие события. Другая часть прямо передаётся в модель данных, где они и обрабатываются.


В модель данных события передаются сразу после получения, где они собираются в атрибуте виджета "event" до момента следующей итерации исполнения сессии. Далее, в процессе обсчёта сессии, события извлекаются из атрибута "event" и обрабатываются в процедуре виджета или в соответствии со сценарием в атрибуте "evProc". Не обработанные событие поднимаются к вышестоящему виджету модели.

Реализация механизма переключения/открытия/замещения/навигации по страницам проекта с учётом сценариев обработки.

Переключение, открытие, замещение и навигация по страницам реализовано на основе обработки событий по сценарию, в атрибуте активного виджета "evProc". Сценирий этого атрибута записывается в виде списка команд с синтаксисом: <event>:<srcWdg>:<com>:<prm>
где:

event -- ожидаемое событие;
srcWdg -- дочерний виджет - источник события
com -- команда сессии;
prm -- параметр команды;

Реализованы следующие команды:

open -- Открытие страницы. Открываемая страница указывается в параметре prm как на прямую, так и в виде шаблона (например: /pg_so/1/*/*).
next -- Открытие следующей страницы. Открываемая страница указывается в параметре prm как на прямую, так и в виде шаблона (например: /pg_so/*/*/$).
prev -- Открытие предыдущей страницы. Открываемая страница указывается в параметре prm как на прямую, так и в виде шаблона (например: /pg_so/*/*/$).

Специальные символы шаблона расшифровываются следующим образом:

pg_so -- Прямое имя требуемой страницы, с префиксом. Требует обязательного соответствия и используется для идентификации предыдущей открытой страницы.
1 -- Имя новой страницы в общем пути, без префикса. Имя предыдущей страницы игнорируется.
* -- Страница берётся с имени предыдущей открытой страницы или подставляется первая доступная страница, если предыдущая открытая страница отсутствует.
$ -- Указывает на место открытой страницы относительно которой необходимо искать следующую или предыдущую.

Для понимания работы механизма шаблонов приведём несколько реальных примеров:

Переключение объекта сигнализации:
Команда: open:/pg_so/2/*/*
Было: /pg_so/pg_1/pg_mn/pg_1
Стало: /pg_so/pg_2/pg_mn/pg_1

Переключение вида:

Команда: open:/pg_so/*/gkadr/*
Было: /pg_so/pg_1/pg_mn/pg_1
Стало: /pg_so/pg_1/pg_gkadr/pg_1

Следующая/предыдущая страница вида:

Команда: next:/pg_so/*/*/$
Было: /pg_so/pg_1/pg_mn/pg_1
Стало: /pg_so/pg_1/pg_mn/pg_2

В связке с выше описанным механизмом, на стороне визуализации (RunTime), построена логика, регулирующая каким образом открывать страницы. Логика построена на следующих атрибутах базового элемента "Box":

pgOpen -- Признак "Страница открыта".
pgNoOpenProc -- Признак "Исполнять страницу даже если она не открыта".
pgOpenSrc -- Содержит адрес виджета или страницы, открывшей текущую. В случае вложенного контейнерного виджета здесь содержится адрес включаемой страницы.
pgGrp -- Группа страниц. Используется для связки контейнеров страниц со страницами в одной группе.

Логика определения способа открытия страниц работает следующим образом:


Совокупность всех этих механизмов уже сейчас позволяет строить сложные, многоуровневые и многооконные интерфейсы пользователя.

Проектирование и реализация примитивов отображения -- Реализация


На данном этапе планируется реализация моделей данных и образов визуализатора Vision для всех базовых элементов: "ElFigure", "FormEl", "Text", "Media", "Diagram", "Protocol", "Document", "Function", "Box", "Link".

Примитив элементарная фигура (ElFigure)

Реализована поддержка элементарных фигур: линии, эллиптической дуги и кривой Безье, обладающих свойствами?. Для элементарных фигур реализованы следующие операции:

Общая концепция создания и управления элементарными фигурами.

Фигуры лежащие в основе данного виджета содержат точки(начальная и конечная), которые могут стыковаться с соответственными точками других фигур, и точки, с помощью которых изменяется геометрия фигуры.


Добавить фигуру можно с помощью мыши:

  1. Выбрать желаемую фигуру из контекстного меню.
  2. Задать с помощью левой кнопки мыши начальную и конечную точки (для линии при удерживании клавиши SHIFT происходит ортогональная её отрисовка).

Удалить фигуру можно нажатием DEL, имея выделенную фигуру.


Передвинуть/изменить габариты фигуры можно с помощью мыши или клавиатуры:

  1. Выделить фигуру, клацнув по ней левой кнопкой мыши.
  2. Перетащить (с помощью мыши или управляющих клавиш) фигуру или одну из её контрольных точек в желаемое место и отпустить кнопку мыши(клавишу).
При перемещении/изменении размеров фигур с помощью клавиатуры для того, чтобы новые координаты точек сохранились, необходимо любое перемещение мыши.

Существует возможность перемещать несколько выделенных (при удержании CTRL) фигур(эта опция работает при отключенной кнопке Holds).


Можно выделить все фигуры, нажав CTRL+A, и перемещать их при помощи мыши или клавиатуры или удалит все фигуры, нажав DEL.


Связать фигуры друг с другом можно следующим образом:

  1. Нажать кнопку Holds.
  2. Выделить одну из фигур и переместить её, её начальную или конечную точку к желаемой начальной или конечной точке другой фигуры так, чтобы она попадала в появившуюся окружность. Связанные фигуры перемещаются также как и отдельные, общая точка перемещается для всех фигур, к котрым она относится(приоритет отдается дуге).

Залить замкнутый контур из фигур можно следующим образом:

  1. Нажать кнопку Holds.
  2. Создать замкнутый контур.
  3. Два раза клацнуть мышкой внутри его.

Удалить заливку замкнутого контура можно, разорвав контур либо клацнув два раза левой кнопкой мыши по залитому контуру.


Поворот фигуры осуществляется вокруг центра виджета.


На рис. 12 представлена часть экрана с кадром, содержащим вышеперечисленные элементарные фигуры.


file:vision_elfig.png
Рис.12 Реализация элементарных фигур в Vision.

Примитив элементов формы (FormEl)

Реализована поддержка элементов формы на кадрах СВУ. Реализованы заложенные свойства?, включая следующие элементы формы:

Редактор строки -- Представлено следующими видами: "Текст", "Combo", "Целое", "Вещественное", "Время", "Дата", "Время и Дата". Все виды редактора строки поддерживают подтверждение ввода.
Редактор текста -- Представляет редактор плоского текста с подтверждением или отказом от ввода.
Поле флажка -- Предоставляет поле бинарного флажка.
Кнопка -- Предоставляет кнопку с поддержкой: цвета кнопки, изображения в кнопке и режима фиксации.
Выбор из списка -- Предоставляет поле выбора элемента, со списка указанных элементов.
Список -- Предоставляет поле списка с контролем за текущим элементом.
Слайдер -- Элемент слайдера.
Прогрес-бар -- Полоска прогресс-бара.

Были реализованы режимы: "Включен" и "Активен", а также передача изменений и событий? в модель данных СВУ (движок).


На рис. 13 представлена часть экрана с кадром, содержащим вышеперечисленные элементы формы.


file:vision_formel.png
Рис.13 Реализация элементов формы в Vision.

Примитив текста (Text)

Реализована поддержка элемента текста со свойствами?:


На рис. 14 представлена часть экрана с кадром, содержащим примеры текста с использованием различных параметров.


file:vision_text.png
Рис.14 Реализация базового элемента текста в Vision.

Примитив отображения медиа-материалов (Media)

Реализована поддержка элемента отображения медиа-материалов со свойствами:


На рис. 15 представлена часть экрана с кадром, содержащим примеры просмотра/проигрывания медиа-данных.


file:vision_media.png
Рис.15 Реализация базового элемента отображения медиа-материалов в Vision.

Примитив построения диаграм/графиков (Diagram)

Реализована поддержка элемента построения диаграм/трендов со свойствами:


На рис. 16 представлена часть экрана с кадром, содержащим примеры диаграммы-тренда.


file:vision_diagramm.png
Рис.16 Реализация базового элемента отображения диаграммы-тренда в Vision.

Примитив формирования протокола (Protocol)

Реализована поддержка элемента формирования протокола со свойствами?:


На рис. 17 представлена часть экрана с кадром, содержащим примеры протоколов со слежением и фиксированным указанием времени.


file:vision_prot.png
Рис.17 Реализация базового элемента отображения протоколов в Vision.

Примитив контейнера (Box)

Реализована поддержка примитива контейнера, по совместительству выполняющего роль страниц проектов. Данный примитив является единственным элементом-контейнером, который может включать в себя ссылки на кадры из библиотеки, формируя тем самым пользовательские элементы нужной конфигурации. Примитив реализует предусмотренные проектом свойства. Перечислим по пунктам свойства данного примитива:

Контейнер -- Позволяет формировать нужные объекты путём группировки базовых в рамках данного примитива.
Страница -- Элементы построенные на данном примитиве могут выполнять роль страницы пользовательского интерфейса.
Контейнер страниц -- Свойство замещения собственного содержимого другой страницей, в процессе исполнения. Используется для формирования фреймов на страницах пользовательского интерфейса. Например, главная страница традиционной SCADA системы с объектами сигнализации строится именно таким образом.
Фон -- Поддерживает возможность указания фона в виде цвета или изображения.
Бордюр -- Поддерживает возможность изображения бордюра с указанным цветом, толщиной и стилем.

Пример редактирования кадра, основанного на данном примитиве, приведен на рис. 8. А на рис. 11 изображена страница содержащая контейнер страниц, построенные на основе данного примитива.

Темы отображения -- В очереди


Карты событий -- В очереди


Реализация слабых связей между моделью данных и представлением -- Выполнено


В процессе реализации данного этапа планируется написание дополнительных сценариев интерфейса управления для покрытия задачи организации слабых связей между моделью (VCAEngine) и визуализатором (Vision). На стороне визуализатора (Vision) планируется полный переход на слабые связи с моделью данных VCA.


На данном этапе были созданы недостающие сценарии интерфейса управления и выполнен полный перевод модуля визуализации (Vision) на слабые связи. В результате этой операции удалось достичь значительной унификации визуализатора и повысить его стабильность. Вопрос производительности остался открытым и будет рассмотрен позже.

Web-интерфейс визуализации сеанса проекта -- В очереди



 
There are no files on this page.[Display files/form]
There is no comment on this page. [Display comments/form]