English Version
Українська версія?
Статус: Реализация
Автор: /RomanSavochenko
Примечание: Проект, на начальном этапе, формировался на основе дипломного проекта
Зайчука Евгения.
Среда визуализации и управления (СВУ) является неотъемлемой составляющей SCADA системы. Она применяется на клиентских станциях с целью доступного предоставления информации об объекте управления и выдачи управляющих воздействий на объект. В различных практических ситуациях и условиях могут применяться СВУ, построенные на различных принципах визуализации. Например, это могут быть библиотеки виджетов Qt, GTK+, wxWidgets или гипертекстовые механизмы на основе технологий HTML, XHTML, XML, CSS и JavaScript или сторонние приложения визуализации, реализованные на различных языках программирования Java, Python и т.д. Любой из этих принципов имеет свои преимущества и недостатки, комбинация которых может стать непреодолимым препятствием в возможности использования СВУ в том или ином практическом случае. Например, технологии вроде библиотеки Qt позволяют создавать высокореактивные СВУ, что несомненно важно для станций оператора управления технологическим процессом (ТП). Однако, необходимость инсталляции данного клиентского ПО может сделать использование его невозможным в отдельных ситуациях. С другой стороны, Web-технологии не требуют инсталляции на клиентские системы и являются предельно многоплатформенными (достаточно указать ссылку на Web-сервер в любом Web-браузере), что наиболее важно для различных инженерных и административных станций. С другой стороны, реактивность и надёжность таких интерфейсов ниже, что практически исключает их использование на станциях оператора ТП.
Система OpenSCADA имеет предельно гибкую архитектуру, которая позволяет создавать внешние интерфейсы, в том числе и пользовательские, на любой основе и на любой вкус. Например, среда конфигурации системы OpenSCADA сейчас доступна как на Qt-библиотеке, так и на Web-основе.
В тоже время независимое создание реализаций СВУ на различной основе может повлечь за собой невозможность использования данных конфигурации одной СВУ в другой. Что неудобно и ограничено с пользовательской стороны, а также накладно в плане реализации и последующей поддержки. С целью избежания этих проблем, а также создания в кратчайшие сроки полного спектра различных типов СВУ и основан данный проект.
Непосредственной областью применения СВУ, как составной части SCADA-системы OpenSCADA, является мониторинг и управление распределёнными системами с локальных и удалённых рабочих мест.
Функционально разработка предназначена для создания общей концепции СВУ и использования её в разработке конкретных модулей реализации СВУ для системы OpenSCADA. Планируется разработка модулей реализации СВУ основанных на QT-библиотеке и WEB-технологиях.
Разрабатываемые модули СВУ, в целом, предназначены для:
Эксплуатационным назначением разработки является:
Разрабатываемая концепция и модули СВУ должны быть реализованы в соответствии с требованиями к модулям системы OpenSCADA. Разработанный концептуальный механизм должен содержать все алгоритмы и данные являющиеся общими для СВУ построенных на различных принципах, а также содержать механизм сессий исполнения проектов интерфейсов визуализации. Фактически в реализациях СВУ должны формироваться индивидуальные механизмы визуализации(отрисовки) и взаимодействия с пользователем на основе данных концепции, т.е. формировать индивидуальный интерфейс представления данных концепции СВУ в соответствии с идеологией "Модель/данные - Интерфейс".
Визуализация должна включать функции:
Управление технологическим оборудованием и параметрами ведения ТП должно обеспечить функции:
Команды оператора по управлению ТП и навигации внутри подсистемы должны производиться с помощью клавиатуры и мыши, или иного устройства ввода.
В качестве входных, реализации СВУ должны использовать данные следующих подсистем OpenSCADA:
В качестве выходной информации реализации СВУ выступают:
Конфигурация СВУ должна храниться в доступных системе OpenSCADA базах данных, позволяя, тем самым, выбирать ту или иную БД под конкретную практическую ситуацию. Изображения и другие ресурсы должны кодироваться алгоритмом Mime Base64 и храниться в БД.
Цикл обновления оперативной информации на экране зависит от конкретной реализации СВУ. Для быстрых интерфейсов визуализации цикл не должен превышать 1 секунды.
Обеспечение надежного функционирования и защиты от несанкционированного доступа СВУ должно быть реализовано на нескольких уровнях:
Реализации СВУ, в связке с концепцией, должны удовлетворять следующим требованиям к надежности:
В настоящее время при построении систем автоматизированного управления технологическими процессами интерфейс пользователя, с системой управления, реализуется с помощью вычислительных систем. Такой подход обусловлен несколькими причинами: компактностью (в физическом и энергетическом смысле) современной вычислительной техники, развитостью способов отображения информации, большой функциональности и изменчивости систем управления.
Применение компьютерной техники в АСУ-ТП вообще, и на рабочих местах операторов в частности, привело к зарождению класса программного обеспечения (ПО), известного как SCADA (Supervisory control and data acquisition).
Таким образом, важнейшей задачей ПО SCADA является предоставление интерфейса взаимодействия между оператором и системой управления ТП. Часто на SCADA возлагают и такие задачи как: формирование сигнализации про отклонение в ТП, ведения архивов параметров ТП и протоколов событий.
Поэтому программное обеспечение SCADA удобно рассматривать как совокупность подсистем: базы данных параметров ТП и связи с системами управления ТП (контроллерами), формирования сигнализации про отклонение ведения ТП, архивирования, протоколирования, визуализации оперативных и архивных данных.
В дополнении, к вышеперечисленным задачам можно отнести разделение прав доступа на чтение-изменение тех или иных параметров ТП, реализованное в подсистеме безопасности.
Таким образом современные SCADA системы представляют собой достаточно сложные программные комплексы.
Предметом данного подпроекта является разработка концепции среды визуализации и управления (СВУ) и реализаций СВУ на основные способы представления, для SCADA системы OpenSCADA.
Под визуализацией подразумевается следующий набор задач:
СВУ должна работать в двух режимах – редактирования (разработки) и исполнения. На первом этапе планируется реализация режима разработки только для QT-версии СВУ!
В процессе функционирования СВУ должна использовать данные других подсистем:
Изображение на экране должно формироваться из ограниченного набора базовых виджетов(примитивов). Представление и интерфейс базовых виджетов для каждого СВУ реализуется отдельно. Это сделано с целью оптимизации производительности и упрощения задачи создания библиотеки базовых виджетов. С целью совместимости между различными реализациями СВУ планируется создание общего описания библиотеки базовых виджетов (модели данных) с последующей реализацией её интерфейса в каждой СВУ.
Базовые виджеты должны группироваться и формировать производные виджеты, с дальнейшим накоплением их в пользовательских библиотеках виджетов/кадров.
Учитывая назначение системы OpenSCADA, как системы для мониторинга данных во многих смежных областях, необходимо сформулировать задачи для таких систем в целом.
В системах мониторинга, как правило, отсутствует возможность управления, однако элементы интерактивного взаимодействия должны присутствовать.
Основной задачей таких систем является непрерывное предоставление информации в доступном виде и на фоне основной работы.
Концептуальную модель СВУ опишем языком UML с помощью диаграмм вариантов использования (use case diagram).
Любая СВУ может работать в двух режимах – разработки и исполнения. В качестве актёра, в первом случае, выступает инженер настройки верхнего уровня АСУ-ТП, в другом – оператор.
В режиме разработки выделим такие варианты использования СВУ:
Диаграмма вариантов использования при функционировании СВУ в режиме разработки приведена на рис. 4.2.1.

Варианты использования в режиме исполнения:
Диаграмма использования СВУ в режиме исполнения приведена на рис.4.2.2.

Исходя из требований и общих соображений можно следующим образом изобразить структуру СВУ рис.4.2.3.

Нужно отметить, что такой подход позволяет реализовать поддержку трёх уровней сложности процесса разработки интерфейсов управления. И как следствие, инженер АСУ-ТП может использовать(начинать) тот из уровней на который у него хватает квалификации, с возможностью повышения её в дальнейшем, практически исключая отторжение системы из-за чрезмерной стартовой сложности на начальном этапе освоения и сохранения, при этом, значительной гибкости и мощности системы. Перечислим эти уровни:
Кадр это окно непосредственно предоставляющее информацию пользователю в графической или текстовой форме. Группа взаимосвязанных кадров формирует цельный пользовательский интерфейс ВУ.
Содержимое кадра формируется из элементов отображения(виджетов). Виджеты могут быть базовыми примитивами (различные плоские фигуры, текст, тренд и т.д.) и производными (сформированные из базовых или других производных виджетов). Все виджеты группированы по библиотекам. В процессе работы пользователь может формировать собственные библиотеки производных виджетов.
Собственно кадр является виджетом, который используется в роли конечного элемента визуализации. А это значит, что библиотеки виджетов могут хранить и заготовки кадров, и шаблоны результирующих страниц пользовательского интерфейса.
Кадры и виджеты являются пассивными элементами, которые обычно не содержат связей с динамикой и другими кадрами, а только предоставляют информацию о свойствах виджета и характере динамики(конфигурации) подключаемой к свойствам кадра. Активированные кадры, т.е. содержащие ссылки на динамику и активные связи, формируют пользовательский интерфейс и хранятся в проектах. В некоторых случаях возможно прямое назначение динамики в заготовках кадров.
Производные кадры/виджеты могут содержать другие виджеты(вложенные), которые могут быть склеены(связаны) логикой один с другим, с помощью одного из языков пользовательского программирования доступного в системе OpenSCADA (рис.4.3). Для удобства редактирования предусматривается поддержка группировки вложенных виджетов и последующая работа с группой виджетов в целом.

Виджет является единственным элементом посредством которого обеспечивается:
Настройка и связывание виджетов производится посредством их свойств. Свойства производных виджетов формируются отдельно и связываются со свойствами вложенных виджетов посредством внутренней логики. Для отображения динамики (т.е. текущих и архивных данных) свойства виджетов динамизируются, т.е связываются с атрибутами параметров OpenSCADA или свойствами других виджетов. Использование для связывания вложенных виджетов внутренней логикой доступных языков пользовательского программирования системы OpenSCADA снимает вопрос реализации сложной логики визуализации, обеспечивая тем самым высокую гибкость. Практически можно создавать полностью динамизированные кадры со сложными взаимосвязями на уровне пользователя.
Непосредственная конфигурация и свойства конечного интерфейса визуализации содержаться в проекте интерфейса визуализации СВУ. Может быть создано множество проектов интерфейсов визуализации.
Каждый проект включает кадры из библиотек кадров/виджетов. Кадр предоставляет инструмент для привязки динамики к описанным в нём свойствам. Все свойства кадра могут быть связаны с динамикой или разрешены константами, а могут выступать в роли шаблона для формирования производных страниц. Фактически каждый кадр может содержать множество страниц с собственной динамикой. Данный механизм позволяет предельно упростить процесс создания однотипных кадров инженером АСУ-ТП или пользователем системы OpenSCADA для простого мониторинга. Примером таких однотипных кадров могут быть: группы контуров, группы графиков, протоколы и различные сводные таблицы. Мнемосхемы технологических процессов редко подпадают под такую схему и будут формироваться прямо в описании кадра.
Для предоставления возможности создания сложных иерархических интерфейсов ВУ кадры, помещённые в проект, могут группироваться путём помещения одних страниц на другие. В придачу к этому, предусматривается механизм ассоциативного описания вызова кадров посредством регулярных выражений.
Пример иерархического представления компонентов проекта классического интерфейса ВУ технологического процесса с описанием выражений стандартных вызовов приведен на рис. 4.4.

Выполнение проекта производится в сеансе проекта. Для каждого проекта может быть открыто множество сеансов. Конкретно взятые реализации СВУ подключаются или создают новый сеанс для проекта. Все вычисления по проекту выполняются в сеансах. Реализации СВУ только используют данные в сеансе для визуализации и сбора пользовательских воздействий. Такое разделение позволит сравнительно просто создавать СВУ для различных способов представления данных.
Для предоставления возможности учета индивидуальных свойств и предпочтений пользователей предусматривается механизм профилирования. В профиле можно установить индивидуальные цветовые и шрифтовые предпочтения пользователя, а также предпочитаемую карту событий для управления интерфейсом ВУ.
Известно, что человек может иметь индивидуальные особенности в восприятии графической информации. Если эти особенности не учитывать то можно получить неприятие и отторжение пользователя к интерфейсу ВУ. Такое неприятие и отторжение может привести к фатальным ошибкам при управлении ТП, а также травмировать человека постоянной работой с таким интерфейсом. В SCADA системах приняты соглашения, которые регламентируют требования по созданию унифицированного интерфейса ВУ нормально воспринимаемого большинством людей. При этом практически отсутствует учёт особенностей людей с некоторыми отклонениями.
С целью учесть это обстоятельство, и предоставить возможность централизованно и просто изменять визуальные свойства интерфейса, проектом предусматривается реализация менеджера стилей интерфейса визуализации.
Пользователем может быть создано множество стилей, каждый из которых будет хранить цветовые, шрифтовые и другие свойства элементов кадра. Простая смена стиля позволит быстро преобразить интерфейс ВУ, а возможность назначения индивидуальной стиля для пользователя позволит учесть его индивидуальные особенности.
Для реализации этой возможности, при создании кадров, необходимо для свойств цвета, шрифта и других установить параметр «Конфигурация» (таблицы во вкладке «Обработка») в значение «Из стиля». А в параметре «Конфигурационный шаблон» указать идентификатор поля стиля. Далее это поле автоматически появится в менеджере стилей и его можно будет там менять. Менеджер стилей доступен на странице конфигурации проекта во вкладке «Стили». На этой вкладке можно создавать новые стили, удалять старые, изменять поля стиля и удалять не нужные.
В целом стили доступны начиная с уровня проектов. На уровне библиотек виджетов можно только определять поля стилей у виджетов. На уровне проекта при выборе стиля включается работа со стилями, что предполагает доступ к полям стилей вместо непосредственных значений атрибутов. Фактически это означает, что при чтении или записи атрибута виджета указанные операции будут осуществляться с соответствующим полем выбранного стиля.
При запуске проекта на исполнения будет использован установленный в проекте стиль. В последствии пользователь может выбрать стиль из перечня доступных. Выбранный пользователем стиль будет сохранён и использован при следующем запуске проекта.
Учитывая спектр задач для которых может использоваться система OpenSCADA нужно предусмотреть и механизм управления интерактивными пользовательскими событиями. Это связано с тем, что при решении отдельных задач встраиваемых систем устройства ввода и управления могут значительно отличатся. Впрочем достаточно взглянуть на обычную офисную клавиатуру и клавиатуру ноутбука что бы снять любые сомнения о необходимости менеджера событий.
Менеджер событий должен работать используя карты событий. Карта событий это список именованных событий с указанием его происхождения. Происхождением события может быть клавиатура, манипулятор мыши, джойстик и т.д. При возникновении события менеджер событий ищет его в активной карте и сопоставляет с именем события. Сопоставленное имя события помещается в очередь на обработку. Виджеты, в этом случае, должны обрабатывать полученную очередь событий.
Активная карта событий указывается в профиле каждого пользователя или устанавливается по умолчанию.
В целом предусмотрены четыре типа событий:
Само событие представляет недостаточно информации, особенно если его обработка происходит на уровнях выше. Для однозначной идентификации события и его источника событие в целом записывается следующим образом: «ws_BtPress:/curtime». Где:
В таблице 4.6 приведён перечень стандартных событий, поддержка которых должна быть обеспечена в визуализаторах СВУ.
Таблица 4.6. Стандартные события
| Id | Описание |
| Клавиатурные события: key_[pres|rels][Ctrl|Alt|Shift]{Key} | |
| *SC#3b | Скан код клавиши. |
| *#2cd5 | Код не именованной клавиши. |
| *Esc | “Esc”. |
| *BackSpace | Удаления предыдущего символа – “<--». |
| *Return, *Enter | Ввод – “Enter”. |
| *Insert | Вставка – “Insert”. |
| *Delete | Удаление – “Delete”. |
| *Pause | Пауза – “Pause”. |
| Печать экрана – “Print Screen”. | |
| *Home | Дом – “Home”. |
| *End | Конец – “End”. |
| *Left | Влево – “<-». |
| *Up | Вверх – "^". |
| *Right | Вправо – “->". |
| *Down | Вниз – "\/". |
| *PageUp | Страницы вверх – «PageUp". |
| *PageDown | Страницы вниз – «PageDown". |
| *F1 – *F35 | Функциональная клавиша от “F1” до “F35”. |
| *Space | Пробел – “ «. |
| *Apostrophe | Апостраф – "`". |
| *Asterisk | Звёздочка на дополнительном поле клавиатуры – "*". |
| *Plus | Плюс на дополнительном поле клавиатуры – "+". |
| *Comma | Запятая – “,". |
| *Minus | Минус – “-". |
| *Period | Точка – ".". |
| *Slash | Наклонная черта – "\". |
| *0 – *9 | Цифра от “0” до “9”. |
| *Semicolon | Точка с запятой – “;". |
| *Equal | Равно – "=". |
| *A – *Z | Клавиши букв латинского алфавита от “A” до “Z”. |
| *BracketLeft | Левая квадратная скобка – "[". |
| *BackSlash | Обратная наклонная линия – «/». |
| *BracketRight | Правая квадратная скобка – "]". |
| *QuoteLeft | Левая кавычка – “'". |
| События клавиатурного фокуса. | |
| ws_FocusIn | Фокус получен виджетом. |
| ws_FocusOut | Фокус утерян виджетом. |
| Мышиные события: | |
| key_mouse[Pres|Rels][Left|Right|Midle] | Нажата/отпущена кнопка мыши. |
| key_mouseDblClick | Двойное нажатие левой кнопки мыши. |
| События примитива элементарной фигуры ElFigure: | |
| ws_Fig{n}[Left|Right|Midle|DblClick] | Активация фигуры {n} клавишей мыши. |
| События примитива элементов формы FormEl: | |
| ws_LnAccept | Установлено новое значение в строке ввода. |
| ws_TxtAccept | Изменено значение редактора текста. |
| ws_ChkChange | Состояние флажка изменено. |
| ws_BtPress | Кнопка нажата. |
| ws_BtRelease | Кнопка отпущена. |
| ws_BtToggleChange | Изменена вдавленность кнопки. |
| ws_CombChange | Изменено значение поля выбора. |
| ws_ListChange | Изменен текущий элемент списка. |
| ws_SliderChange | Изменение положения слайдера. |
| События примитива медиа-контента Media: | |
| ws_MapAct{n}[Left|Right|Midle] | Активирована медиа-область с номером {n} клавишей мыши. |
События являются основным механизмом уведомления и активно используются для осуществления взаимодействия с пользователем. Для обработки событий предусмотрены два механизма: сценарии управления открытием страниц и вычислительная процедура виджета.
Механизм «Сценарии управления открытием страниц» основан на базовом атрибуте виджета “evProc”, который содержит список сценариев операций открытия страниц с синтаксисом: <event>:<evSrc>:<com>:<prm>. Где:
Реализованы следующие команды:
Специальные символы шаблона расшифровываются следующим образом:
В качестве примера приведём сценарий обеспечения работы главной страницы интерфейса пользователя:
ws_BtPress:/prev:prev:/pg_so/*/*/$
ws_BtPress:/next:next:/pg_so/*/*/$
ws_BtPress:/go_mn:open:/pg_so/*/mn/*
ws_BtPress:/go_graph:open:/pg_so/*/ggraph/*
ws_BtPress:/go_cadr:open:/pg_so/*/gcadr/*
ws_BtPress:/go_view:open:/pg_so/*/gview/*
ws_BtPress:/go_doc:open:/pg_so/*/doc/*
ws_BtPress:/go_resg:open:/pg_so/rg/rg/*
ws_BtPress:/so1:open:/pg_so/1/*/*
ws_BtPress:/so2:open:/pg_so/2/*/*
ws_BtPress:/so3:open:/pg_so/3/*/*
ws_BtPress:/so4:open:/pg_so/4/*/*
ws_BtPress:/so5:open:/pg_so/5/*/*
ws_BtPress:/so6:open:/pg_so/6/*/*
ws_BtPress:/so7:open:/pg_so/7/*/*
ws_BtPress:/so8:open:/pg_so/8/*/*
ws_BtPress:/so9:open:/pg_so/9/*/*
ws_BtPress:*:open:/pg_control/pg_terminator
Механизм «Обработка событий с помощью вычислительной процедуры виджета» основан на атрибуте “event” и пользовательской процедуре вычисления на одном из языков пользовательского программирования OpenSCADA. События, по мере поступления, аккумулируются в атрибуте “event” до момента вызова вычислительной процедуры. Вычислительная процедура вызывается с указанной периодичностью вычисления виджета и получает значение атрибута “event” в виде списка событий. В процедуре вычисления пользователь может: проанализировать, обработать и исключить обработанные события из списка, а также добавить в список новые события. Оставшиеся, после исполнения процедуры события, анализируются на предмет соответствия условиям вызова сценарием первого механизма, после чего, оставшиеся события, передаются на верхний по иерархии виджет для обработки им, при этом осуществляется коррекция пути событий в соответствии с иерархией проникновения события.
Содержимое атрибута “event” является списком событий формата <event>:<evSrc>, с событием в отдельной строке. Приведём пример процедуры обработки событий на Java-подобном языке пользовательского программирования OpenSCADA:
using Special.FLibSYS;
ev_rez = "";
off = 0;
while(true)
{
sval = strParse(event,0,"\n",off);
if( sval == "" ) break;
else if( sval == "ws_BtPress:/cvt_light" ) alarmSt = 0x1000001;
else if( sval == "ws_BtPress:/cvt_alarm" ) alarmSt = 0x1000002;
else if( sval == "ws_BtPress:/cvt_sound" ) alarmSt = 0x1000004;
else ev_rez+=sval+"\n";
}
event=ev_rez;
Важным элементом любого интерфейса визуализации является уведомление пользователя про нарушения - сигнализация. Для упрощения восприятия, а также в виду тесной связности визуализации и уведомления (как правило уведомление дополняет визуализацию) решено интегрировать интерфейс уведомления в интерфейс визуализации. Для этого во всех виджетах предусматриваются два дополнительных атрибута (уровня сеанса): "alarm" и "alarmSt". Атрибут "alarm" используется для формирования сигнала виджетом, в соответствии с его логикой, а атрибут "alarmSt" используется для контроля за фактом сигнализации ветви дерева сеанса проекта.
Атрибут "alarm" является строкой и имеет следующий формат: {lev|categ|message|type|tp_arg}
Где:
Атрибут "alarmSt" является целым числом, которое отражает максимальный уровень сигнала и факт квитации ветви дерева сеанса проекта. Формат числа имеет следующий вид:
Формирование сигнала и получение его визуализатором.
Формирование сигнала производится самим виджетом путём установки собственного атрибута "alarm" нужным образом и в соответствии с ним устанавливается атрибут "alarmSt" текущего и вышестоящих виджетов. Визуализаторы получают уведомление о сигнале с помощью стандартного механизма уведомления об изменении атрибутов виджетов.
Такой механизм предоставляет возможность формировать интерфейсы сигнализации как на уровне подсистемы "Сбор данных", так и прямо на уровне представления.
Учитывая то, что обработка условий сигнализации осуществляется в виджетах, страницы содержащие объекты сигнализации должны исполняться в фоне, не зависимо от открытости их на данный момент. Это осуществляется путём установки флага исполнения страницы в фоне.
Хотя механизм сигнализации и построен в среде визуализации возможность формирования не визуальных элементов сигнализации остаётся, например путём создания страницы которая никогда не будет открываться.
Квитация
Квитация производится путём указания корня ветви виджетов и типов уведомления. Это позволяет реализовать квитацию на стороне визуализатора как по группам, например по объектам сигнализации, так и индивидуально по объектам. При этом можно независимо квитировать разные типы сигнализаций. Установка квитации производится простой модификацией атрибута "alarmSt".
Пример скрипта для работы с сигналами приведён ниже:
//Выделение факта наличия сигнализаций разных способов уведомления
cvt_light_en = alarmSt&0x100; cvt_alarm_en = alarmSt&0x200; cvt_sound_en = alarmSt&0x400;
//Выделение факта наличия несквитированных сигнализаций разных способов уведомления
cvt_light_active = alarmSt&0x10000; cvt_alarm_active = alarmSt&0x20000; cvt_sound_active = alarmSt&0x40000;
//Обработка событий кнопок квитации и квитация разных способов уведомлений
ev_rez = "";
off = 0;
while(true)
{
sval = strParse(event,0,"\n",off);
if( sval == "" ) break;
else if( sval == "ws_BtPress:/cvt_light" ) alarmSt = 0x1000001;
else if( sval == "ws_BtPress:/cvt_alarm" ) alarmSt = 0x1000002;
else if( sval == "ws_BtPress:/cvt_sound" ) alarmSt = 0x1000004;
else ev_rez+=sval+"\n";
}
event=ev_rez;
Для разделения доступа к интерфейсу ВУ и его составляющим каждый виджет содержит информацию о владельце его группе и правах доступа. Права доступа записываются, как принято в системе OpenSCADA, в виде триады: <пользователь><группа><остальные>, где каждый элемент состоит из трёх признаков доступа. Для элементов СВУ принята следующая их интерпретация:
В режиме разработки используется простая схема доступа «root.UI:RWRWR_", что означает – все пользователи могут открывать и просматривать библиотеки, их компоненты и проекты; а редактировать могут все пользователи группы “UI” (пользовательские интерфейсы).
В режиме исполнения работают права описанные в компонентах интерфейса.
Для предоставления актуальных данных в интерфейс визуализации должны использоваться данные подсистемы "Сбор данных (DAQ)". Природа этих данных следующая:
Учитывая первый пункт нужно обеспечить возможность группового назначения ссылки. Для этого используем концепцию логического уровня.
В соответствии с пунктом 2, связи обеспечивают прозрачное преобразование типов и не требуют специальной конфигурации.
Для удовлетворения возможности доступа к архивам, в соответствии с пунктом 3, связи выполняют проверку типа атрибута и, в случае подключения к "Адресу", в значение помещается адрес связи.
В терминах СВУ, динамические связи и конфигурация динамики являются одним процессом, для описания конфигурации которого предусматривается вкладка "Обработка" виджетов (рис.4.9.a). Вкладка содержит таблицу конфигурации свойств атрибутов виджета и текст процедуры вычисления виджета.

Кроме полей конфигурации атрибутов в таблице предусматривается колонка "Обработка", для избирательного использования атрибутов виджетов в вычислительной процедуре виджета, и колонки "Конфигурация" и "Конфигурационный шаблон", для описания конфигурации связей.
Колонка "Конфигурация" позволяет указать тип связи для атрибута виджета:
Колонка "Конфигурационный шаблон" позволяет описать группы динамических атрибутов. Например это могут быть разные типы параметров подсистемы "DAQ". Кроме того, при корректном формировании этого поля, работает механизм автоматического назначения атрибутов при указании только параметра подсистемы "DAQ", что упрощает и ускоряет процесс конфигурации. Значение этой колонки имеет следующий формат: <Параметр>|<Идентификатор>, где:
Установка связей может быть нескольких типов, который определяется префиксом:
Обработка связей происходит с периодичностью вычисления виджета в порядке:
На рис. 4.9.b представлена вкладка связей с групповым назначением атрибутов путём указания только параметра, а на рис. 4.9.с с индивидуальным назначением атрибутов.


При размещении виджета, содержащего конфигурацию связей, в контейнер виджетов все связи исходного виджета добавляются в список результирующих связей контейнера виджетов (рис. 4.9.d)

Из вышесказанного видно, что связи устанавливаются пользователем в процессе конфигурации интерфейса. Однако для предоставления возможности создания кадров общего назначения, с функцией предоставления детализированных данных разных источников одного типа, необходим механизм динамической установки связей. Такой механизм предусматривается посредством зарезервированного ключевого идентификатора "<page>" группы атрибутов связей у кадров общего назначения и динамическое назначение связей с идентификатором "<page>" в процессе открытия кадра общего назначения сигналом от другого виджета.
Рассмотрим пример когда имется кадр общего назначения "Панель контроля графиком" и множество "Графиков" на разных кадрах. "Панель контроля графиком" имеет связи с шаблонами:
При этом каждый виджет "График" имеет атрибуты tSek, tSize, trcPer и valArch. В случае вызова сигнала открытия "Панели контроля графиком" из любого виджета "График" происходит связывания атрибутов "Панели контроля графиком" в соответствии атрибуту указанного в шаблоне с атрибутом виджета "График". Как результат, все изменения на "Панели контроля графиком" будут отражаться на графике посредством связи.
В случае наличия у виджета "График" внешних связей на параметры подсистемы "Сбор данных", связи "Панели контроля графиком" будут устанавливаться на внешний источник. Кроме этого, если у "Панели контроля графиком" будут заявлены связи на отсутствующие непосредственно у виджета "График" атрибуты, то будет производится поиск на наличие таких атрибутов у внешнего источника, первого на который установлена прямая связь, выполняя, тем самым, дополнение недостающих связей.
Для наглядного изображения этого механизма приведена таблица 4.9.
Таблица 4.9. Механизм динамической линковки.
| Атрибуты "Панели контроля графиком" (шаблон динамической связи) | Атрибуты "Графика" | Атрибуты внешнего "Параметра" | Результирующая связь или значение связующегося атрибута |
| tSek (<page>|tSek) | tSek | - | "График".tSek |
| tSize (<page>|tSize) | tSize | - | "График".tSize |
| trcPer (<page>|trcPer) | trcPer | - | "График".trcPer |
| valArch (<page>|valArch) | valArch | - | "График".valArch |
| var (<page>|var) | var | var | "Параметр".var |
| ed (<page>|ed) | - | ed | "Параметр".ed |
| max (<page>|max) | - | - | EVAL |
| min (<page>|min) | - | - | EVAL |
Исходя из вышеизложенных, архитектурных, соображений сформируем статическую диаграмму классов СВУ, учитывая разделение на концептуальную часть (движок) и часть индивидуальной реализации СВУ (рис. 4.10.1). В таблице 4.10 представлено описание классов диаграммы классов.

Таблица 4.10. Классы СВУ
| Класс | Ответственность | Связи |
| TSecurity | Предоставляет информацию о пользователях, а также выполняет их аутентификацию в системе OpenSCADA. | Используется виджетами и кадрами СВУ для проверки прав на доступ к ним. |
| TFunction | Используется для доступа к механизму пользовательского программирования при описании логики производных виджетов, а также для включения функций API объектной модели в производные виджеты. | Хранит структуру параметров обвязываемых логикой в производных виджетах. Передаётся модулю, предоставляющего реализацию языка пользовательского программирования, с целью подключения механизма обработки логики программы. |
| TUI | Корневой объект модуля подсистемы «Пользовательские интерфейсы», используемый для интеграции в ядро системы OpenSCADA. | Наследуется корневыми объектами модуля концепции СВУ и модулями реализации интерфейса СВУ. |
| VCA::Engine | Корневой объект модуля концепции/движка СВУ. Содержит контейнеры объектов движка, а также общие методы и данные. | Используется интерфейсами визуализации для доступа к данным сеансов проектов и концепции в целом. Интегрирует код концепции СВУ в систему OpenSCADA. |
| VCA::WidgetLib | Объект библиотеки виджетов/кадров, содержит объекты библиотечных виджетов (VCA::LWidget). Состав библиотек виджетов может свободно формироваться пользователем. | Содержит объекты библиотечных виджетов (VCA::LWidget). |
| VCA::Widget | Абстрактный объект виджета. | Наследуется объектами: библиотечного виджета (VCA::LWidget), контейнерного виджета (VCA::CWidget), кадра проекта (VCA::Win) и объектами сеанса исполнения проекта (VCA::SessWin, VCA::SessWdg). Виджет-контейнер содержит функцию связанную с реализацией языка пользовательского программирования. Использует объект OpenSCADA API TSecurity для управления правами доступа. Использует события из менеджера событий. Обращается к менеджеру тем для получения непосредственных значений цветов шрифтов в соответствии с текущей темой. |
| VCA::LWidget | Объект библиотечного виджета/кадра. | Хранится в библиотеке (VCA::WidgetLib). Может содержать вложенные виджеты, в лице объектов контейнерных виджетов (VCA::CWidget). |
| VCA::CWidget | Объект контейнерного виджета библиотечного виджета/кадра (VCA::LWidget). Фактически выполняет роль ссылки на библиотечный виджет. | Содержится в библиотечном кадре/виджете (VCA::LWidget). |
| VCA::Project | Объект проекта пользовательского интерфейса. Содержит окна (VCA::Win) с иерархичным наименованием. | Содержится в контейнере объекта концепции (VCA::Engine). Содержит объекты окон (VCA::Win) проекта. |
| VCA::Page | Объект страницы интерфейса ВУ. Тесно связан с кадром из библиотеки виджетов, собственно кадр и несёт в себе элементы интерфейса. Сам объект окна, в дополнении к кадру, разрешает ссылки на динамику и предоставляет механизм расслоения динамики кадра на страницы, с возможностью формирования шаблона динамики. | Содержится в контейнере проекта. Наследуется от абстрактного виджета (VCA::Widget). Связывается с кадром интерфейса (VCA::LWidget) в библиотеке виджетов. |
| VCA::Theme | Объект темы интерфейса визуализации. Содержит элементы темы (VCA::ThemeEl) | Содержится в контейнере объекта концепции (VCA::ConcVCA). Хранит элементы темы (VCA::ThemeEl). |
| VCA::ThemeEl | Объект элемента темы. Содержит ассоциацию имени элемента с кодом цвета и шрифта. | Содержится в контейнере темы (VCA::Theme). Используется объектом виджета (VCA::Widget) для получения значений цвета и шрифта по имени элемента темы. |
| VCA::EventMap | Объект карты событий. Содержит объекты событий (VCA::Event). | Содержится в контейнере объекта концепции (VCA::ConcVCA). Хранит описания событий (VCA::Event). |
| VCA::Event | Объект события, содержит ассоциацию имени объекта(события) с реальным событием. | Содержится в контейнере карты событий (VCA::EventMap). |
| VCA::Session | Объект сессии исполнения проекта визуализации. Открывается модулем интерфейса визуализации и использует, в дальнейшем, данные сессии для визуализации своим методом. Все вычисления интерфейсов визуализации выполяются именно в сессии. | Содержится в проекте интерфейса визуализации. Содержит объекты окон сесии с данными исполнения. Используется модулями интерфейсов визуализации для отображения данных сессии. |
| VCA::SessPage | Объект страницы сессии. Содержит динамические данные окна проекта над которыми выполняет требуемые вычисления. | Содержится в объекте сессии проекта (VCA::SessProj). Наследуется от абстрактного виджета (VCA::Widget). Использует объект страницы проекта (VCA::Page) как источник исходных параметров. |
| VCA::SessWdg | Объект виджета сессии. Содержит динамические данные отдельного элемента кадра над которыми выполняет требуемые вычисления. Может вкладываться один в другой в соответствии с иерархией виджетов кадра. | Содержится в объекте окна сессии (VCA::SessPage) или в высшем по иерархии объекте этого типа. Наследуется от абстрактного виджета (VCA::Widget). Использует объект библиотечного (VCA::LWidget) и/или контейнерного (VCA::CWidget) виджета как источник исходных параметров. Используется модулем интерфейса визуализации в роли источника динамических данных для визуализации. |
| Vision, WebGUI | Корневые объекты модуля интерфейса визуализации, построенные на основе библиотеки QT и Web-технологий. Предоставляют доступ к средствам исполнения и разработки интерфейсов визуализации в среде используемой технологии. | Предоставляют доступ к среде исполнения и разработки. Интегрируют код интерфейса визуализации в систему OpenSCADA. |
| VRunTime, WebRunTime | Объекты среды исполнения интерфейса визуализации на основе библиотеки QT и Web-технологий. Непосредственно предоставляют пользовательский интерфейс визуализации и управления. | Содержаться в корневых объектах модулей визуализации. Подключаются и используют данные объекта сеанса проекта (VCA::SesProj) концепции СВУ. В соответствии со структурой сеанса содержат множество специализированных объектов непосредственного отображения. |
| VDevelop, WebDevelop | Объекты среды разработки интерфейса визуализации на основе библиотеки QT и Web-технологий. Предоставляют интерфейс инструмента над данными концепции для разработки интерфейсов ВУ. | Содержаться в корневых объектах модулей визуализации. Подключаются к объекту корня концепции СВУ (VCA::Engine) и предоставляют графический интерфейс для управления ею. В соответствии со структурой концепции содержат множество специализированных объектов управления. |
Статическая диаграмма классов (рис.4.10.1) не раскрывает всей иерархии взаимодействия объектов, основанных на абстрактном объекте VCA::Widget. Это связано с неявным наследованием данных свойств виджетов через все слои движка, а также тонкостями наследования, выстроенного путём использования данных одних виджетов в других. Для разъяснения этих особенностей изобразим исчерпывающую карту «использующего» наследования на рис 4.10.2.

Любой, вновь создаваемый виджет, основывается на одном из нескольких примитивов(конечный элемент визуализации), путём установки родственной связи как прямо на примитив, так и посредством нескольких промежуточных пользовательских виджетов. Каждый из примитивов содержит механизм (логику) модели данных. Экземпляр виджета хранит значения свойств конфигурирования примитива, специально для себя.
В задачи интерфейса визуализации входит поддержка и работа с моделью данных примитивов виджетов. Примитивы виджетов должны быть тщательно проработаны и унифицированы с целью охватить как можно больше возможностей в как можно меньшем количестве слабо связанных друг с другом, по назначению, примитивов.
В таблице 4.11.a приведён перечень примитивов виджетов(базовых элементов отображения).
Таблица 4.11.a. Библиотека примитивов виджетов(базовых элементов отображения)
Каждый примитив, и виджет вообще, содержит общий набор свойств/атрибутов в составе приведенном в таблице 4.11.b:
Таблица 4.11.b. Общий набор свойств/атрибутов в виджете
Примитив является основой для отрисовки элементарных графических фигур со всевозможной комбинацией их в одном объекте. Учитывая широкий спектр всевозможных фигур, которые должен поддерживать примитив, и в тоже время являться достаточно простым в использовании, и, по возможности, в реализации, решено было ограничить перечень базовых фигур, используемых для построения результирующих графических объектов до таких фигур: линия, дуга, кривая Безье и заливка. Основываясь уже на этих базовых фигурах, можно строить производные фигуры комбинируя базовыми.
Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.1.
Таблица 4.11.1. Набор дополнительных свойств/атрибутов в примитиве ElFigure
Примитив, предназначенный для предоставления стандартных элементов формы в распоряжение пользователя. Общий перечень атрибутов зависит от типа элемента. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.2.
Таблица 4.11.2. Набор дополнительных свойств/атрибутов в примитиве FormEl
| Id | Имя | Номер | Значение |
| elType | Element type | 20 | Тип элемента (Строка редактирования; Редактор текста; Флажок; Кнопка; Выбор из списка; Список; Слайдер; Полоса прокрутки). От его значения зависит перечень дополнительных атрибутов. |
| Строка редактирования: | |||
| value | Value | 21 | Содержимое строки. |
| view | View | 22 | Вид строки редактирования (Текст; Комбобокс; Целое; Вещественное; Время; Дата; Дата и время). |
| cfg | Config | 23 | Конфигурация строки. Формат значения данного поля для различных видов строки: Текст -- указывается шаблон ввода в формате
Комбобокс -- содержит список значений редактируемого комбобокса. Целое -- содержит конфигурацию поля ввода целочисленного представления в формате: <Минимум>:<Максимум>:<Шаг изменения>:<Префикс>:<Суффикс>. Вещественное -- содержит конфигурацию поля ввода вещественного представления в формате: <Минимум>:<Максимум>:<Шаг изменения>:<Префикс>:<Суффикс>:<Число знаков после запятой>. Время, Дата, Дата и время -- формировать дату по шаблону с параметрами: d -- номер дня (1-31); dd -- номер дня (01-31); ddd -- сокращённое наименование дня ('Mon' ... 'Sun'); dddd -- полное наименование дня ('Monday' ... 'Sunday'); M -- номер месяца (1-12); MM -- номер месяца (01-12); MMM -- сокращённое имя месяца ('Jan' ... 'Dec'); MMMM -- полное имя месяца ('January' ... 'December'); yy -- последние две цифры года; yyyy -- год полностью; h -- час (0-23); hh -- час (00-23); m -- минуты (0-59); mm -- минуты (00-59); s -- секунды (0-59); ss -- секунды (00-59); AP,ap -- отображать AM/PM или am/pm. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Редактор текста: | |||
| value | Value | 21 | Содержимое редактора. |
| wordWrap | Word wrap | 22 | Автоматический перенос текста по словам. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Флажок: | |||
| name | Name | 26 | Имя/метка флажка. |
| value | Value | 21 | Значение флажка. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Кнопка: | |||
| name | Name | 26 | Имя, надпись на кнопке. |
| value | Value | 21 | Значение для фиксированной кнопки. |
| img | Image | 22 | Изображение на кнопке. |
| color | Color | 23 | Цвет кнопки. |
| colorText | Color:text | 27 | Цвет текста. |
| checkable | Checkable | 24 | Признак функционирования как фиксированная кнопка. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Выбор из списка: | |||
| value | Value | 21 | Текущее значение списка. |
| items | Items | 22 | Перечень элементов списка. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Список: | |||
| value | Value | 21 | Выбранное значение списка. |
| items | Items | 22 | Перечень элементов списка. |
| font | Font | 25 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| Слайдер и полоса прокрутки: | |||
| value | Value | 21 | Положение слайдера. |
| cfg | Config | 22 | Конфигурация слайдера в формате: <VertOrient>:<Min>:<Max>:<SinglStep>:<PageStep>. Где:
|
Данный примитив предназначен для вывода простого текста используемого в роли меток и различных подписей. С целью простого создания частых декоративных оформлений, примитив должен поддерживать обвод текста рамкой. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.3.
Таблица 4.11.3. Набор дополнительных свойств/атрибутов в примитиве Text
Данный примитив предназначен для проигрывания различных медиа-материалов, начиная от простых изображений и заканчивая полноценными аудио и видео потоками. Учитывая многообразность способов и библиотек проигрывания полноценных аудио и видео потоков, а также достаточно серьёзную трудоёмкость по имплиминтации всех этих механизмов в данный виджет, решено было на первоначальном этапе реализовать только работу с изображениями и простыми анимационными форматами изображений и видео. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.4.
Таблица 4.11.4. Набор дополнительных свойств/атрибутов в примитиве Media
| backColor | Background:color | 20 | Фоновый цвет. |
| backImg | Background:image | 21 | Фоновое изображение. |
| bordWidth | Border:width | 22 | Ширина бордюра. |
| bordColor | Border:color | 23 | Цвет бордюра. |
| bordStyle | Border:style | 24 | Стиль бордюра (None;Dotted;Dashed;Solid;Double;Groove;Ridge;Inset;Outset). |
| src | Source | 25 | Источник медиа-данных. |
| fit | Fit to widget size | 26 | Признак "Согласовать содержимое с размером виджета. |
| type | Type | 27 | Тип медиа (Image;Movie). |
| areas | Map areas | 28 | Количество активных областей. |
| Атрибуты видеоролика (Movie) | |||
| speed | Play speed | 29 | Скорость проигрывания, в процентах от оригинальной скорости. Если значение меньше 1%, то проигрывание прекращается. |
| Активные области | |||
| area{x}shp | Area {x}:shape | 40+3*x | Вид области (Rect;Poly;Circle). |
| area{x}coord | Area {x}:coordinates | 40+3*x+1 | Координаты областей. Через запятую идут координаты: "x1,y1,x2,y2,xN,yN" |
| area{x}title | Area {x}:title | 40+3*x+2 | Заголовок области. |
Данный примитив предназначен для построения различных диаграмм, включая и графики/тренды отображения текущего процесса и архивных данных. На данный момент реализованы следующие типы диаграмм:
Процесс доступа к архивным данным оптимизирован, путём ведения промежуточного буфера, для отображения, а также упаковки трафика данных при запросе. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.5.
Таблица 4.11.5. Набор дополнительных свойств/атрибутов в примитиве Diagram
| Id | Имя | Номер | Значение |
| backColor | Background:color | 20 | Фоновый цвет. |
| backImg | Background:image | 21 | Фоновое изображение. |
| bordWidth | Border:width | 22 | Ширина бордюра. |
| bordColor | Border:color | 23 | Цвет бордюра. |
| bordStyle | Border:style | 24 | Стиль бордюра (None;Dotted;Dashed;Solid;Double;Groove;Ridge;Inset;Outset). |
| trcPer | Tracing period (s) | 25 | Режим и периодичность слежения. |
| type | Type | 26 | Тип диаграммы: "Trend". |
| Атрибуты тренда/графика (Trend) | |||
| tSek | Time:sek | 27 | Текущее время, секунд. |
| tUSek | Time:usek | 28 | Текущее время, микросекунды. |
| tSize | Size, sek | 29 | Размер тренда, секунды. |
| curSek | Cursor:sek | 30 | Положение курсора, секунды. |
| curUSek | Cursor:usek | 31 | Положение курсора, микросекунды. |
| curColor | Cursor:color | 32 | Цвет курсора. |
| sclColor | Scale:color | 33 | Цвет шкалы/решетки. |
| sclHor | Scale:horizontal | 34 | Режим горизонтальной шкалы/решетки: "No draw", "Grid;Markers" и "Grid and markers". |
| sclVer | Scale:vertical | 35 | Режим вертикальной шкалы/решетки: "No draw", "Grid", "Markers", "Grid and markers", "Grid (log)", "Marker (log)", "Grid and markers (log)". |
| sclMarkColor | Scale:Markers:color | 36 | Цвет маркеров шкалы/решетки. |
| sclMarkFont | Scale:Markers:font | 37 | Шрифт маркеров шкалы/решетки в виде {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| valArch | Value archivator | 38 | Архиватор архивов параметров. |
| parNum | Parameters number | 39 | Количество параметров, отображаемых на одном тренде. |
| Индивидуальные атрибуты параметров тренда/графика | |||
| prm{X}addr | Parametr {X} :address | 50+10*{X} | Полный адрес к параметру {X} или архиву значений. |
| prm{X}bordL | Parametr {X} :view border:lower | 50+10*{X} +1 | Нижняя граница значений параметра {X}. |
| prm{X}bordU | Parametr {X} :view border:upper | 50+10*{X} +2 | Верхняя граница значений параметра {X}. |
| prm{X}color | Parametr {X} :color | 50+10*{X} +3 | Цвет отображения тренда параметра {X}. |
| prm{X}val | Parametr {X} :value | 50+10*{X} +4 | Значение параеметра {X} под курсором. |
Примитив предназначен для визуализации данных архива сообщений, путём формирования протоколов с различными способами визуализации, начиная от статического сканирующего просмотра и заканчивая динамическим отслеживанием протокола сообщения. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.6.
Таблица 4.11.6. Набор дополнительных свойств/атрибутов в примитиве Protocol
| Id | Имя | Номер | Значение |
| backColor | Background:color | 20 | Фоновый цвет. |
| backImg | Background:image | 21 | Фоновое изображение. |
| font | Font | 22 | Шрифт текста в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| time | Time, sek | 24 | Текущее время, секунд. |
| tSize | Size, sek | 25 | Размер запроса, секунды. |
| trcPer | Tracing period (s) | 26 | Режим и периодичность слежения. |
| arch | Archival | 27 | Архиватор архива сообщений. |
| tmpl | Template | 28 | Шаблон запроса в архиве. |
| lev | Level | 29 | Уровень сообщений. |
| viewOrd | View order | 30 | Порядок отображения ("По времени", "По уровню", "По категории", "По сообщению", "По времени (обратно)", "По уровню (обратно)", "По категории (обратно)", "По сообщению (обратно)"). |
| col | View columns | 31 | Отображаемые колонки. |
| itProp | Item's properties | 32 | Количество свойств элементов. |
| Индивидуальные атрибуты свойств элементов | |||
| it{X}lev | Item {X}:level | 40+5*{X} | Критерий: уровень элемента {X}. Более или равно указанному. |
| it{X}tmpl | Item {X}:template | 41+5*{X} | Критерий: шаблон категории элемента {X}. Включая специальные символы '*' и '?'. |
| it{X}fnt | Item {X}:font | 42+5*{X} | Шрифт элемента {X}. |
| it{X}сolor | Item {X}:color | 43+5*{X} | Цвет элемента {X}. |
Примитив предназначен для формирования отчётной, оперативной и иной документации на основе шаблонов документов.Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.7.
Таблица 4.11.7. Набор дополнительных свойств/атрибутов в примитиве Document
| Id | Имя | Номер | Значение |
| style | CSS | 20 | Стиль документа (CSS). |
| tmpl | Template | 21 | XHTML исходный шаблон документа. |
| doc | Document | 22 | Псевдо-виртуальный атрибут текущего (выбранного) документа. |
| font | Font | 26 | Базовый шрифт текста документа в полной записи {<Family> <Size> <Bold> <Italic> <Underline> <Strikeout>}. |
| bTime | Time:begin | 24 | Время начала документа, секунд. |
| time | Time:current | 23 | Время генерации документа, секунд. |
| n | Archive size | 25 | Количество документов или глубина архива. |
| Атрибуты включеного режима архивирования | |||
| aCur | Cursor:archive | - | Позиция текущего документа в архиве. Запись значения <0 производит архивацию текущего документа. |
| vCur | Cursor:view | - | Текущий визуализируемый документ архива. Запись значения -1 -- выбор следующего документа, -2 -- выбор предыдущего документа. |
| Атрибуты архива | |||
| doc{X} | Document {X} | - | Архивный документ X (0...(n-1)) |
Положения документа
Для более предметного рассмотрения архитектуры примитива документа изложим требования к нему:
В основе любого документа лежит XHTML-шаблон. XHTML-шаблон это тег 'body', WEB-страницы, содержащий статику документа в стандарте XHTML 1.0 и элементы исполняемых инструкций на одном из языков пользовательского программирования OpenSCADA в виде <?dp <procedure> ?>. Результирующий документ формируется путём исполнения процедур и вставки их результата в документ.
Источником значений исполняемых инструкций являются атрибуты виджета этого примитива, а также все механизмы языка пользовательского программирования. Атрибуты могут добавляться пользователем и линковаться на реальные атрибуты параметров или-же являться автономными, значения которых будут формироваться в скрипте виджета. В случае со слинкованными атрибутами могут извлекаться значения из истории, архива.
На рис. 4.11.7.1 изображена структурная схема виджета примитива "Документ". Согласно этой структуре "Документ" содержит: XHTML-шаблон, результирующие документы и скрипт обработки данных. Источником данных для скрипта и результирующих документов являются атрибуты виджета.

Предусматривается работа виджета в двух режимах: Динамический и Архивный. Отличие архивного режима заключается в наличии архива указанной глубины и атрибутов позволяющих управлять процессом архивирования и просмотра указанного документа в архиве.
Генерация документа всегда производится в момент установки атрибута времени <time> относительно установленного начального времени документа в атрибуте <bTime>. При выключенном архиве результирующий документ помещается непосредственно в атрибут <doc>. При включенном архиве результирующий документ помещается в ячейку под курсором, атрибут <aCur>, а так-же в <doc> если значение курсора архива <aCur> и курсора визуализируемого документа <vCur> совпадают. Атрибуты архивных курсоров предусматривают несколько командных значений:
Как было указано выше динамика шаблона документа определяется вставками исполняемых инструкций вида <?dp <procedure> ?>. В процедурах могут использоваться одноимённые атрибуты виджета и функции пользовательского интерфейса программирования OpenSCADA. Кроме атрибутов виджета зарезервированы специальные атрибутами (табл. 4.11.7.1).
Кроме специальных атрибутов в XHTML шаблоне зарезервированы теги и атрибуты тегов специального назначения (табл. 4.11.7.1).
Таблица 4.11.7.1. Специальные и зарезервированные элементы шаблона.
| Имя | Назначение |
| Атрибуты | |
| rez | Атрибут результата исполнения процедуры содержимое которого помещается дерево документа. |
| lTime | Время последнего формирования. Если документ формируется впервые то <lTime> равен <bTime>. |
| rTime | Содержит время для перебираемых значений в секундах. Определяется внутри тегов с атрибутом 'docRept'. |
| rTimeU | Содержит время для перебираемых значений в микросекундах. Определяется внутри тегов с атрибутом 'docRept'. |
| rPer | Содержит периодичность перебора значений (атрибут 'docRept'). |
| mTime, mLev, mCat, mVal | Определяются внутри тегов с атрибутом 'docAMess' при разборе сообщений архива сообщений: mTime - время сообщения; mLev - уровень сообщения; mCat - категория сообщения; mVal - значение сообщения. |
| Специальные теги | |
| <docRes attr="ResAttr"/> | Вставка ресурса (изображение, звук ...) из контейнера данного виджета с именем 'ResAttr' |
| <docDiagram h="400" v="200" tm="time" sz="size" vl1="atr1" vl2="atr2" vl3="atr3"/> | Вставка диаграммы (тренда) размером 400x200 на время 'time' и глубиной 'size' для атрибутов параметров: atr1, atr2 и atr3. |
| <docKeyword pos="up"> ... </docKeyword> | Колонтитул документа. Описывает общую часть документа размещаемую сверху и снизу каждой печатной страницы. Содержит атрибут 'pos' принимающий значения 'up' или 'down'. |
| <docPage/> | Вставляет номер текущей страницы при формировании печатного документа. |
| <docPages/> | Вставляет количество страниц при формировании печатного документа. |
| <docEnter tp="str" attr="attr1"/> | Поле ввода значения атрибута <attr1> виджета с типом <str>. Предусматриваются типы: str(Строка), dec(Десятичное), hex(Шестьнадцатеричное), oct(Восьмеричное), bool(Логичный) |
| Специальные атрибуты стандартных тегов | |
| body.docProcLang | Язык исполняемых процедур документа. По умолчанию это JavaLikeCalc.JavaScript. |
| *.docRept="1s" | Тег с указанным атрибутом при формировании размножается путём смещения времени в атрибуте 'rTime' на значение указанное в данном атрибуте. |
| *.docAMess="1:PLC*" | Указывает на необходимость размножения тега с атрибутом сообщениями из архива сообщений за указанный интервал времени и в соответствии с уровнем (1) и шаблоном запроса (PLC*). Для данного тега, в процессе размножения, определяются атрибуты: mTime, mLev, mCat и mVal |
| *.docRevers="1" | Указывает на инвертирование порядок размножения, последний сверху. |
| *.docAppend="1" | Признак необходимости добавления результата выполнения процедуры в тег процедуры. Иначе результат исполенеия заменяет содержимое тега. |
| body.docTime | Время формирования документа. Используется для установки атрибута <lTime> при следующем формировании документа. Не устанавливается пользователем! |
Примитив контейнера, используется для формирования составных виджетов и/или страниц пользовательского интерфейса. Перечень дополнительных свойств/атрибутов данного примитива приведён в таблице 4.11.8.
Таблица 4.11.8. Набор дополнительных свойств/атрибутов в примитиве Box
| Id | Имя | Номер | Значение |
| pgOpenSrc | Page:open source | 3 | Полный адрес страницы, которая включена внутрь данного контейнера. |
| pgGrp | Page:group | 4 | Группа контейнера страниц. |
| backColor | Background:color | 20 | Фоновый цвет. |
| backImg | Background:image | 21 | Фоновое изображение. |
| bordWidth | Border:width | 22 | Ширина бордюра. |
| bordColor | Border:color | 23 | Цвет бордюра. |
| bordStyle | Border:style | 24 | Стиль бордюра (None;Dotted;Dashed;Solid;Double;Groove;Ridge;Inset;Outset). |
Все данные концепции СВУ должны храниться в БД. Это позволит гибко распространять и использовать данные СВУ, выбирая наиболее подходящую случаю БД из списка поддерживаемых системой OpenSCADA. Проекции основных таблиц запишем таким образом :
API пользовательского программирования движка визуализации представлено группой функций непосредственно в модуле движка СВУ. Вызов этих функций из скриптов виджетов может осуществляться прямо по идентификатору функции, поскольку их область имён указывается для контекста скриптов виджетов.
Описание: Возвращает список виджетов в контейнере виджетов или список дочерних виджетов. Если установлено <pg> то возвращается список страниц для проектов и сеансов.
Параметры:
| ID | Имя | Тип | Режим | По умолчанию |
| list | Список | Строка | Возврат | |
| addr | Адрес | Строка | Вход | |
| pg | Страницы | Bool | Вход | 0 |
Описание: Проверка на присутствие узла, включая виджеты, атрибуты и другие.
Параметры:
| ID | Имя | Тип | Режим | По умолчанию |
| rez | Результат | Bool | Возврат | |
| addr | Адрес | Строка | Вход |
Описание: Возвращает список атрибутов виджета. Если установлен <noUser> тогда возвращаются только не пользовательские атрибуты.
Параметры:
| ID | Имя | Тип | Режим | По умолчанию |
| list | Список | Строка | Возврат | |
| addr | Адрес | Строка | Вход | |
| noUser | Без пользовательских | Bool | Вход | 1 |
Описание: Запрос значения атрибута виджета. Запрос может осуществляться как указанием полного адреса атрибута в <addr>, так и отдельно адреса виджета в <addr>, а идентификатора атрибута в <attr>.
Параметры:
| ID | Имя | Тип | Режим | По умолчанию |
| val | Значение | Строка | Возврат | |
| addr | Адрес | Строка | Вход | |
| attr | Атрибут | Bool | Вход |
Описание: Установка значения атрибута виджета. Установка может осуществляться как указанием полного адреса атрибута в <addr>, так и отдельно адреса виджета в <addr>, а идентификатора атрибута в <attr>.
Параметры:
| ID | Имя | Тип | Режим | По умолчанию |
| addr | Адрес | Строка | Вход | |
| val | Значение | Строка | Вход | |
| attr | Атрибут | Bool | Вход |
Сервисные интерфейсы это интерфейсы доступа к системе OpenSCADA посредством интерфейса управления OpenSCADA из внешних систем. Данный механизм положен в основу всех механизмов обмена внутри OpenSCADA, реализованных посредством слабых связей и стандартного протокола обмена OpenSCADA.
С целью предоставления унифицированного, группового и сравнительно быстрого доступа к значениям атрибутов визуальных элементов предусмотрена сервисная функция визуального элемента "/serv/attr" и команды получения/установки значений атрибутов: <get path="/UI/VCAEngine/{wdg_addr}/%2fserv%2fattr"/> и <set path="/UI/VCAEngine/{wdg_addr}/%2fserv%2fattr"/>. Атрибуты данных команд, предусматривающие различные механизмы запроса, представим в таблице 4.13.2.a.
Таблица 4.13.2.a Атрибуты команд получения/установки атрибутов визуальных элементов
| Id | Имя | Значение |
| Команда запроса визуальных атрибутов виджета: <get path="/UI/VCAEngine/{wdg_addr}/%2fserv%2fattr"/> | ||
| tm | Время/счётчик изменений | Установка времени/счётчика изменений для запроса только изменившихся атрибутов. |
| <el id="{attr}" p="{a_id}">{val}</el> | Формирование дочерних элементов с результатами атрибутов | В дочернем элементе указываются: строковых идентификатор {attr} атрибута, индекс {a_id} атрибута и его значение {val}. |
| Команда установки визуальных атрибутов виджета: <set path="/UI/VCAEngine/{wdg_addr}/%2fserv%2fattr"/> | ||
| <el id="{attr}">{val}</el> | Установка атрибутов | В дочерних элементах указывается идентификатор атрибута {attr} и его значение {val}. |
С целью оптимизации трафика сетевого взаимодействия путём исключения мелких запросов, а использования одного, но большого запроса создан групповой запрос значений атрибутов визуальных элементов. Группировка данного запроса подразумевает запрос атрибутов всей ветви виджета, включая и вложенные элементы. Для данного запроса предусмотрена сервисная команда "/serv/attrBr". Запрос данной сервисной команды эквивалентен сервисной команде "/serv/attr" и выглядит следующим образом:
<get path="/UI/VCAEngine/{wdg_addr}/%2fserv%2fattrBr"/>
Результат:
<el id="{attr}" p="{a_id}">{val}</el> -- Элементы с результатами атрибутов. В элементе указываются: строковых идентификатор {attr} атрибута, индекс {a_id} атрибута и его значение {val}.
<w id="{wid}" lnkPath="{lnk_path}">{childs+attrs}</w> -- Элементы с дочерними виджетами и их атрибутами. В элементе указываются идентификатор дочернего виджета {wid} и путь виджета на который ссылается данный виджет если он является ссылкой {lnk_path}.
С целью унификации и оптимизации доступа к страницам предусмотрена сервисная функция сеанса "/serv/pg" и команды запроса перечня открытых страниц (<openlist path="/UI/VCAEngine/ses_{Session}/%2fserv%2fpg"/>); открытия страницы (<open path="/UI/VCAEngine/ses_{Session}/%2fserv%2fpg"/>); и закрытия страницы <close path="/UI/VCAEngine/ses_{Session}/%2fserv%2fpg"/>).
Результатом запроса перечня открытых страниц являются дочерние элементы <el>{OpPage}</el> содержащие полный путь открытой страницы. Кроме перечня открытых страниц запрос возвращает значение текущего счётчика вычисления сеанса в атрибуте <tm>. Если данный атрибут устанавливается при запросе, то для каждой открытой страницы возвращается список изменённых, с момента указанного значения счётчика, виджетов открытой страницы.
Для предоставления механизма глобального контроля за сигнализацией сеанса предусмотрена сервисная функция сеанса "/serv/alarm" и команды запроса статуса сигналов (<get path="/UI/VCAEngine/ses_{Session}/%2fserv%2falarm"/>); и квитации сигналов (<quittance path="/UI/VCAEngine/ses_{Session}/%2fserv%2falarm"/>).
Запрос статуса сигналов возвращает обобщённое состояние сигналов, а так-же дополнительную информацию для звуковой сигнализации. Дополнительная информация звуковой сигнализации предоставляет текущий ресурс, звуковой файл, для воспроизведения и обеспечивает отслеживание последовательности сигнализации и квитации отдельных файлов звуковых сообщений.
Запрос на квитацию выполняет квитацию указанного виджета, атрибут <wdg>, в соответствии с шаблоном, атрибут <tmpl>.
Для предоставления унифицированного механизма манипуляции сеансами, визуализаторам СВУ, в модуле движка СВУ (VCAEngin) предусмотрена сервисная функция "/serv/sess" и команды запроса перечня открытых сеансов, подключения/создания нового сеанса и отключения/удаления сеанса: <list path="/UI/VCAEngine/%2fserv%2fsess"/>, <connect path="/UI/VCAEngine/%2fserv%2fsess"/> и <disconnect path="/UI/VCAEngine/%2fserv%2fsess"/> соответственно. Атрибуты данных команд, предусматривающие различные механизмы запроса, представим в таблице 4.13.2.b.
Таблица 4.13.2.b. Атрибуты команд механизма манипуляции сеансами
| Id | Имя | Значение |
| Команда запроса перечня открытых сеансов для проекта: <list path="/UI/VCAEngine/%2fserv%2fsess"/> | ||
| prj | Указание проекта | Указывает проект для которого возвращать перечень открытых сеансов. |
| <el>{Session}</el> | Контроль перечня сеансов | В дочерних элементах указываются сеансы, открытые для запрошенного проекта. |
| Команда подключения/открытия сеанса: <connect path="/UI/VCAEngine/%2fserv%2fsess"/> | ||
| sess | Установка и контроль имени сеанса | Если атрибут определён, то производится подключение к существующему сеансу, иначе создание нового сеанса. В случае открытия нового сеанса в данный атрибут помещается его имя. |
| prj | Установка имени проекта | Используется для открытия нового сеанса для указанного проекта и если атрибут {sess} не указан. |
| Команда отключения/закрытия сеанса: <disconnect path="/UI/VCAEngine/%2fserv%2fsess"/> | ||
| sess | Установка имени сеанса | Указывает имя сеанса от которого выполняется отключение или закрытие. Сеансы, не являющиеся фоновыми и к которым ни один из визуализаторов не подключен автоматически закрываются. |
С целью оптимизации производительности локального и особенно сетевого взаимодействия предусмотрена сервисная функция "/serv/wlbBr" и команда запроса дерева библиотек виджетов: <get path="/UI/VCAEngine/%2fserv%2fwlbBr"/>. Результатом запроса является дерево с элементами библиотек виджетов, теги <wlb>. Внутри тегов библиотек виджетов содержаться тег иконки <ico> и теги виджетов библиотеки <w>. Теги виджетов, в свою очередь, содержат тег иконки и теги дочерних виджетов <cw>.
Для ускорения процесса разработки пользовательских интерфейсов визуализации и управления нужно предусмотреть функцию копирования элементов. Что-бы заложить поддержку различных вариантов копирования запишим их по пунктам:
Перечислим возможности, которые сможет обеспечить СВУ, построенная на основе данного проекта:
Цель проигрывания процесса построения различных интерфейсов визуализации на основе концепции данного проекта заключается в выявлении особенностей различных реализаций и узких мест в описании их концепцией.
Реализацию будем производить поэтапно, в направлении от функций в концепции к её представлению на библиотеке QT, и так до последнего компонента. Такой подход позволит получать результат между этапами, анализировать его и учитывать особенности на следующих этапах. Для пошаговой реализации разобьем всю задачу на логические части и выстроим их в зависимости одна от другой, в реализации.
Целями данного этапа является:
В результате проделанной работы созданы модули модели данных (UI.VCAEngine) и представления (UI.Vision). На данном этапе модулями реализуются механизмы формирования элементов пользовательского интерфейса. На следующий этапе данные элементы будут использованы для формирования цельных интерфейсов визуализации и управления.
Рассмотрим по пунктам результаты реализации данного этапа:
В соответствии со статической диаграммой классов (рис.4.10.1) и общими требованиями были реализованы модули "UI.VCAEngine" и "UI.Vision" для системы OpenSCADA. Модуль "UI.VCAEngine" реализует модель данных СВУ и является источником для последующего представления этих данных различными механизмами визуализации. Модуль "UI.Vision" реализует способ представления данных, основанный на библиотеке QT версии 4 фирмы
Trolltech.
Связь между модулем модели данных и представления организована посредством прямых вызовов (сильные связи). Такой способ связи выбран для предварительного абстрагирования от особенностей взаимодействия и концентрации на основных задачах реализации. В последствии планируется унификация и построение этих связей посредством интерфейса управления системой OpenSCADA (слабые связи). В результате будет достигнута возможность разнесения модели данных и представления с возможностью одновременного обслуживания различных механизмов представления одной моделью данных СВУ. Кроме того, можно будет оценить степень влияния типа связи на производительность СВУ.
Модуль модели данных(движка) СВУ содержит контейнер библиотек виджетов/кадров. Модулем предоставляется предопределённая библиотека базовых виджетов(примитивов) с первичной реализацией собственных свойств и логики обработки этих свойств.
Хранение данных виджетов и библиотек виджетов реализовано в БД, доступных системе OpenSCADA. БД организована по принадлежности данных к библиотеке. Т.е. отдельная библиотека хранится в отдельной группе таблиц одной или разных БД. Перечень библиотек виджетов хранится в индексной таблице библиотек с именем "VCALibs" и структурой "Libs", раздела БД. Экземпляр этой таблицы создаётся в каждой БД, где хранятся данные этого модуля, с перечнем библиотек, содержащихся в конкретно взятой БД. В состав таблиц, принадлежащих библиотеке виджетов, входят следующие:
Для управления библиотеками виджетов и отдельными виджетами были написаны сценарии конфигурации на языке интерфейса управления ~OpenSCADA. На данный момент эти сценарии призваны выполнять только функции централизованной конфигурации элементов движка СВУ, однако, в последствии их планируется расширить и наделить функциями обработки запросов к модели данных от модулей представления с целью организации "слабых связей" между "Моделью данных" и "Представлением".
Основой практически всех элементов движка стал объект абстрактного элемента визуализации (VCA::Widget). На своём, абстрактном, уровне объект наделён следующими свойствами:
Для представления библиотеки виджетов реализован класс (VCA::WdgLib). Основными его функциями является содержание библиотечных виджетов, хранение и загрузка их с БД, предоставление доступа к ресурсам (Mime-данные), а также разделение доступа.
Специально для включения в библиотеку виджетов был создан класс библиотечного виджета (VCA::LWidget), который основан на классе абстрактного виджета (VCA::Widget) и предоставляет дополнительные функции: хранения данных виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с mime-данными библиотеки и хранение вложенного контейнерного виджета (VCA::CWidget).
В свою очередь класс контейнерного виджета (VCA::CWidget) предоставляет функции: хранения данных контейнерного виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с mime-данными библиотеки, а также принудительный режим простой ссылки для всех контейнерных виджетов.
На основе класса библиотечного виджета (VCA::LWidget) был сформирован абстрактный класс терминального виджета (VCA::PrWidget). А уже на его основе сформированы реализации примитивов базовых виджетов, которые и сформировали библиотеку базовых виджетов, создаваемую модулем при инициализации. Значения свойств базовых виджетов также могут сохраняться в БД (таблицы библиотеки виджетов), формируя нужные шаблоны. Кроме того, базовая библиотека примитивов может доопределяться расширенными примитивами из модулей интерфейсов представления, которым базовых недостаточно. Но в этом случае нужно учитывать, что подобные действие - путь к несовместимости между модулями интерфейсов представления!
Интерфейс разработки пользовательских интерфейсов модуля основан на MDI(Multi Document Interface) интерфейсе. Данный подход позволяет одновременно редактировать несколько кадров различных размеров. Использованы следующие механизмы управления разработкой: панели инструментов, пункты меню и контекстное меню. Большинство действий дублируются в разных механизмах, что позволяет быстро найти инструмент предпочитаемым способом. Навигационные интерфейсы реализованы присоединяемыми окнами. Конфигурация панелей инструментов и присоединяемых окон сохраняется при выходе и восстанавливается при старте, что позволяет настраивать интерфейс под себя.
Одним из элементом пользовательского интерфейса, реализованным как присоединяемое окно, является навигатор библиотек виджетов. С помощью навигатора можно быстро найти нужный виджет или библиотеку и проделать над ними необходимые операции. Реализованы операции: добавления, удаления, настройки виджетов и библиотек, а также визуального редактирования виджетов.
Для удобного управления свойствами виджетов/кадров реализован инспектор атрибутов(свойств) виджетов. Инспектор атрибутов реализован как присоединяемое окно, которое активируется при выборе кадра или виджета. Окно инспектора атрибутов можно удобно расположить на виду, пришвартовав к одной из сторон рабочего окна. Инспектором атрибутов реализована поддержка групповой конфигурации нескольких виджетов, а также группирование однотипных свойств.
Для визуального редактирования кадров реализована первичная поддержка редактирования виджетов и кадров. Уже сейчас редактор позволяет редактировать кадры, основанные на примитиве "Box" и полноценно отображать примитив текстового поля "Text". В редакторе кадров реализованы функции:
Вид окна разработки приведён на рис. 6.1.1. На рисунке можно видеть: панели инструментов, навигатор виджетов, инспектор атрибутов, окно редактирования кадра и строка статуса.

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


Целями данного этапа является:
На данном этапе был добавлен механизм формирования проектов СВУ посредством построения страниц визуализации в иерархическом виде, который соответствует логическим связям в конечном интерфейсе СВУ. В процессе реализации данного этапа были начаты работы по адаптации модуля визуализации Vision к использованию интерфейса управления OpenSCADA вместо прямых-сильных связей. Эти работы позволили достичь значительной унификации различных диалогов, структур управления и пользовательского интерфейса в целом.
На данном этапе реализовано:
Целями данного этапа является:
На данном этапе был добавлен механизм исполнения проекта в сеансах модели данных модуля VCAEngine, а также визуализация сеанса проекта, режим "RunTime" в модуле визуализации на библиотеке QT Vision с элементами обновления данных и интерактивного взаимодействия с пользователем.
В соответствии с рис.4.10.1 и рис.4.10.2 объекты сессии проекта наследуются от абстрактного объекта Widget и используют соответствующие объекты проекта. Так, сессия (Session) использует проект (Project) и формирует развёрнутое дерево на основе него. Страница проекта Page прямо используется страницей сессии SessPage. Остальные объекты (SessWdg) разворачиваются в соответствии с иерархией элементов страницы (рис.4.10.2).
В дополнение к стандартным свойствам абстрактного виджета (Widget) элементы страницы и сами страницы, сессии получают свойства хранения кадра значений вычислительной процедуры, обсчёта процедур и механизм обработки событий. Страницы сессии, в дополнение ко всему, содержат контейнер следующих по иерархии страниц. Сессия в целом обсчитывается с указанной периодичностью и в последовательности:
Такая политика позволяет обходить страницы в соответствии с иерархией, а событиям в виджетах всплывать наверх за одну итерацию.
В сессии реализована поддержка специальных свойств страниц:
На основе этих свойств реализованы следующие типы страниц:
В разделе выше мы уже отмечали, что виджет сессии содержит кадр значений процедуры обсчёта. Этот кадр инициируется и используется в случае наличия процедуры обсчёта. В момент инициализации создаётся перечень параметров процедуры и выполняется компиляция процедуры с этими параметрами в модуле, реализующем выбранный язык программирования, и закодированным полным именем виджета. Скомпилированная функция подключается к кадру значений процедуры обсчёта. Далее выполняется вычисление с периодичностью сессии.
Вычисление и обработка виджета в целом выполняется в следующей последовательности:
При исполнении виджета сеанса необходимо выполнение обработки ссылок. На данный момент подключение по ссылкам выполняется в момент вычисления, что является небыстрой операцией. Реализация обработки ссылок будет пересмотрена и оптимизирована в дальнейшем.
Заложена поддержка следующих типов ссылок:
На данный момент реализованы первые два типа ссылок. Последняя будет реализована вместе с реализацией базового виджета "Link".
На стороне визуализации (модуль Vision) для визуализации процесса исполнения проекта реализован объект VisRun. При запуске он шлёт запрос на создание и инициализацию сессии. Далее выполняется запрос на перечень открытых страниц. Исходя из информации об открытых страницах VisRun и их связности, формируется результирующий интерфейс. На рис. 6.3 приведён пример классического SCADA интерфейса с объектами сигнализации, где главное окно содержит страницу внутри, которая замещается по нажатию на кнопки объектов сигнализации и листания.

Реализовано обновление содержимого открытых страниц интерфейса визуализации с периодичностью исполнения сессии проекта. В процессе обновления выполняется:
- запрос списка открытых страниц у модели и проверка соответствия реально открытых страниц этому списку;
- запрос изменённых данных по каждой странице и её виджету;
- обновление содержимого страниц и их виджетов в соответствии с полученными измененными данными.
По закрытию "RunTime" окна производится и закрытие сессии проекта в модели данных. В дальнейшем будет реализована возможность подключения к ранее открытой сессии и отключение от сессии, без её закрытия.
Механизм запроса только изменённых данных основан на абсолютном счётчике исполнения сессии. При внесении реальных изменений в атрибуты виджетов выполняется запоминание значения этого счётчика, что и позволяет идентифицировать изменённые атрибуты. Такой подход позволяет повысить производительность и уменьшить нагрузку на трафик в случае доступа к модели через сеть.
Визуализатор сессии ("RunTime"), в виду своего непосредственного контакта с пользователем, собирает различные события. Часть событий обрабатывается образами базовых виджетов (Text, Box, Document и т.д.), в результате чего могут формироваться другие события. Другая часть прямо передаётся в модель данных, где они и обрабатываются.
В модель данных события передаются сразу после получения, где они собираются в атрибуте виджета "event" до момента следующей итерации исполнения сессии. Далее, в процессе обсчёта сессии, события извлекаются из атрибута "event" и обрабатываются в процедуре виджета или в соответствии со сценарием в атрибуте "evProc". Не обработанные событие поднимаются к вышестоящему виджету модели.
Переключение, открытие, замещение и навигация по страницам реализовано на основе обработки событий по сценарию, в атрибуте активного виджета "evProc". Сценирий этого атрибута записывается в виде списка команд с синтаксисом: <event>:<srcWdg>:<com>:<prm>
где:
Реализованы следующие команды:
Специальные символы шаблона расшифровываются следующим образом:
Для понимания работы механизма шаблонов приведём несколько реальных примеров:
Переключение вида:
Следующая/предыдущая страница вида:
В связке с выше описанным механизмом, на стороне визуализации (RunTime), построена логика, регулирующая каким образом открывать страницы. Логика построена на следующих атрибутах базового элемента "Box":
Логика определения способа открытия страниц работает следующим образом:
Совокупность всех этих механизмов уже сейчас позволяет строить сложные, многоуровневые и многооконные интерфейсы пользователя.
На данном этапе планируется реализация моделей данных и образов визуализатора Vision для всех базовых элементов: ElFigure", «FormEl", Text, Media, Diagram, Protocol, Document, Function, Box, Link.
Реализована поддержка элементарных фигур: линии, эллиптической дуги и кривой Безье, обладающих свойствами. Для элементарных фигур реализованы следующие операции:
Фигуры, лежащие в основе данного, виджета содержат точки(начальная и конечная), которые могут привязываться к соответственными точками других фигур, и точки, с помощью которых изменяется геометрия фигуры.
Добавить фигуру можно с помощью мыши:
Удалить фигуру можно нажатием DEL, имея выделенную(ые) фигуру(ы).
Передвинуть/изменить габариты фигуры можно с помощью мыши или клавиатуры:
Существует возможность копировать выделенную(ые) фигуру(ы).
Можно выделить все фигуры, нажав CTRL+A. С выделенными таким образом фигурами доступны все вышеперечисленные действия.
Связать фигуры друг с другом можно следующим образом:
Залить замкнутый контур из фигур можно следующим образом:
Удалить заливку замкнутого контура можно, разорвав контур либо клацнув два раза левой кнопкой мыши по залитому контуру.
Поворот фигуры осуществляется вокруг центра виджета.
На рис. 6.4.1 представлена часть экрана с кадром, содержащим вышеперечисленные элементарные фигуры.

Реализована поддержка элементов формы на кадрах СВУ. Реализованы заложенные свойства, включая следующие элементы формы:
Были реализованы режимы: «Включен» и «Активен», а также передача изменений и событий в модель данных СВУ (движок).
На рис. 6.4.2 представлена часть экрана с кадром, содержащим вышеперечисленные элементы формы.

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

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

Реализована поддержка элемента построения диаграм/трендов со свойствами:
На рис.6.4.5 представлена часть экрана с кадром, содержащим примеры диаграммы-тренда.

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

Реализована поддержка примитива контейнера, по совместительству выполняющего роль страниц проектов. Данный примитив является единственным элементом-контейнером, который может включать в себя ссылки на кадры из библиотеки, формируя тем самым пользовательские элементы нужной конфигурации. Примитив реализует предусмотренные проектом свойства. Перечислим по пунктам свойства данного примитива:
В процессе реализации данного этапа планируется написание дополнительных сценариев интерфейса управления для покрытия задачи организации слабых связей между моделью (VCAEngine) и визуализатором (Vision). На стороне визуализатора (Vision) планируется полный переход на слабые связи с моделью данных VCA.
На данном этапе были созданы недостающие сценарии интерфейса управления и выполнен полный перевод модуля визуализации (Vision) на слабые связи. В результате этой операции удалось достичь значительной унификации визуализатора и повысить его стабильность. Вопрос производительности остался открытым и будет рассмотрен позже.
В процессе реализации неоднократно принимались меры по оптимизации направленной на повышений производительности различных узлов СВУ и взаимодействия между ними. В данном разделе размещаются отчёты, соображения и планы таких мер.
Наиболее ответственным, в вопросе производительности, является взаимодействие между моделью данный СВУ и визуализаторами, а также циклы обслуживания интерактивного взаимодействия и обновления. Данный вопрос приобретает ещё большее значений в свете того, что для взаимодействия визуализаторов с моделью данных СВУ используются слабые связи, а именно события основанный на XML-запросах, которые потенциально медленнее прямых связей. Однако возможность последующего перенаправления потока данных взаимодействия на сетевые транспортные протоколы, а также более высокая надёжность такого взаимодействия оправдывают усилия по оптимизации этого взаимодействия.
Основными объектами оптимизации являются: цикл обновления визуализатора "Vision" и цикл обсчёта сеанса на стороне модели данных СВУ. Замер временных интервалов выполнялся на вычислительной машине Athlon 64 3000+, с пониженной до 800МГц частотой процессора и тестовой странице. Результаты выполненной оптимизации сведены в таблицу 7.1
Таблица 7.1 Результирующие данные и комментарии оптимизации взаимодействия между моделью данный СВУ и визуализаторами
| Процесс | Исходное время (мс) | Результирующее время (мс) | Коментарии |
| Цикл обновления визуализатора "Vision" | |||
| Полный секундный цикл обновления | 43 | 10 | |
| Обработка списка открытых окон | 2.3 | 2.2 | Незначительное улучшение за счёт выделение функции запроса перечня открытых окон в сервисные функции быстрого доступа. |
| Обновление открытых страниц | 41 | 9 | |
| Запрос атрибутов | 24 | 7 | Значительно сократилось за счёт введения общего счетчика модификации виджета и вынос запроса на обновления списка не пользовательских атрибутов в цикл обсчёта сеанса. |
| Вызов функции setAttr(), для полученных атрибутов | 19 | 2 | Значительно сократилось за счёт пересмотра и доработки примитива "ElText". |
| Цикл обсчета сеанса пользовательского интерфейса модели данных СВУ. | |||
| Полный цикл вычисления | 53 | 21 | Значительно сократилось, за счёт пересмотра последовательности вычисления виджета и уменьшения периодичности обновления списка: слинкованых атрибутов и активных дочерних виджетов. |
Для оценки потенциальных возможностей по производительности среды визуализации, а также с целью повышения производительности и возможности создания мнемосхем с большим количеством виджетов была проведена оптимизация визуализации виджетов, как в режиме разработки, так и в режиме исполнения.
Замер временных интервалов выполнялся на вычислительной машине Pentium 4 3200. Результаты выполненной оптимизации сведены в таблицу 7.2
Таблица 7.2 Результирующие данные и комментарии оптимизации визуализации виджетов
| Процесс | Исходное время (мс) | Результирующее время (мс) | Коментарии |
| 160 эллиптических дуг по одной в каждом виджете с радиусами по 20 пискселов и толщиной линии, равной 1 | Загрузка:497; Инициализация, отрисовка: 355 | Загрузка:333; Инициализация, отрисовка: 273 | |
| 160 эллиптических дуг по одной в каждом виджете с радиусами по 20 пискселов и толщиной линии, равной 1 с заливкой в каждой | Загрузка:492; Инициализация, отрисовка: 1379 | Загрузка:326; Инициализация, отрисовка: 470 | |
| 160 эллиптических дуг по одной в каждом виджете с радиусами по 20 пискселов и толщиной линии, равной 1 с заливкой в каждой и с масштабом страницы, на которой лежат эти 160 виджетов, равным 0.5 по X и по Y | Загрузка:495; Инициализация, отрисовка: 1430 | Загрузка:334; Инициализация, отрисовка: 452 | Как видно, присутствие масштабных коэффиуиентов, не равных 1, существенно не влияет ни на загрузку, ни на инициализацию и отрисовку |
| 160 линий по одной в каждом виджете, длиной 40 и тощиной 10 пикселов | Загрузка:451; Инициализация, отрисовка: 70 | Загрузка:315; Инициализация, отрисовка: 5 | |
| 160 прямоугольников по одном в каждом виджете, длиной 40, шириной 10 и толщиной линии 1 пиксел с заливкой в каждом | Загрузка:486; Инициализация, отрисовка: 175 | Загрузка:336; Инициализация, отрисовка: 38 | |
| 240 линий по 20 в каждом виджете(всего 12 виджетов), толщной 10 и длиной, приблизительно равной 50 пикселов | Загрузка:58; Инициализация, отрисовка: 53 | Загрузка:30; Инициализация, отрисовка:8 | Время и до и после оптимизации значительно меньше в сравнении с одной линией в одном виджете(всего 160 линий) за счёт уменьшения количества виджетов |
| 240 четырехугольников с заливкой, шириной примерно 15 и длиной примерно 50 пикселов и с толщиной линии в 1 пиксел по 20 в каждом виджете(всего 12 виджетов) | Загрузка:95; Инициализация, отрисовка:272 | Загрузка:42; Инициализация, отрисовка:93 |