Назва | Заснування | Статус | Учасники | Опис |
---|---|---|---|---|
Загальна концепція Середовища Візуалізації та Управління (СВУ) | 2006 | Реалізовано у: UI.VCAEngine, UI.Vision, UI.WebVision | Роман Савоченко |
|
Contents
- 1 Вступ
- 2 Призначення
- 3 Вимоги
- 4 Проєктування
- 4.1 Постановка завдання
- 4.2 Формалізація
- 4.3 Кадри та елементи відображення (віджети)
- 4.4 Проєкт
- 4.5 Сеанс виконання проєкту
- 4.6 Стилі
- 4.7 Події, їх обробка та карти події
- 4.8 Сигналізація
- 4.9 Керування правами
- 4.10 Зв'язування з динамікою
- 4.11 Архітектура
- 4.12 Примітиви віджетів
- 4.12.1 Елементарна графічна фігура (ElFigure)
- 4.12.2 Елемент форми (FormEl)
- 4.12.3 Елемент тексту (Text)
- 4.12.4 Елемент відображення медіа-матеріалів (Media)
- 4.12.5 Елемент побудови діаграм (Diagram)
- 4.12.6 Елемент побудови протоколів на основі архівів повідомлень (Protocol)
- 4.12.7 Елемент формування звітної документації (Document)
- 4.12.8 Контейнер (Box)
- 4.13 Використання БД для зберігання бібліотек віджетів та проєктів
- 4.14 API користувацького програмування
- 4.15 Сервісні команди-функції Інтерфейсу Управління
- 4.16 Копіювання елементів
- 4.17 Передбачені функціональні можливості
- 5 Програвання ситуацій з реалізації їх на основі концепції даного проєкту
- 6 Реалізація
- 6.1 Віджети та їх бібліотеки
- 6.2 Проєкти інтерфейсів візуалізації
- 6.3 Сеанси виконання проєктів
- 6.3.1 Формування ієрархічного дерева віджеті кінцевої візуалізації на основі проєкту для якого відкривається сеанс
- 6.3.2 Формування об'єктів значень для процедур обрахунку віджетів кінцевої візуалізації
- 6.3.3 Обробка посилань на параметри джерел даних OpenSCADA
- 6.3.4 Формування вікна виконання проєкту — "Виконання"
- 6.3.5 Візуалізація кадрів проєкту у режимі "Виконання" з періодичним оновленням вмісту
- 6.3.6 Реалізація передачі та обробки повідомлень
- 6.3.7 Реалізація механізму перемикання-відкриття-заміщення-навігації по сторінкам проєкту, з урахуванням сценаріїв обробки
- 6.4 Проєктування та реалізація примітивів відображення
- 6.4.1 Примітив елементарна фігура (ElFigure)
- 6.4.2 Примітив елементу форми (FormEl)
- 6.4.3 Примітив тексту (Text)
- 6.4.4 Примітив відображення медіа-матеріалів (Media)
- 6.4.5 Примітив побудови діаграм-графіків (Diagram)
- 6.4.6 Примітив формування протоколу (Protocol)
- 6.4.7 Примітив формування документу (Document)
- 6.4.8 Примітив контейнеру (Box)
- 6.5 Теми-стилі відображення
- 6.6 Карти повідомлень — У планах
- 6.7 Реалізація слабких зв'язків між моделлю даних та представленням
- 6.8 Web-інтерфейс візуалізації сеансу проєкту
- 7 Оптимізація
- 8 Посилання
1 Вступ
Середовище візуалізації та управління (СВУ) є невід'ємною складовою SCADA системи. Воно застосовується на клієнтських станціях з метою доступного представлення інформації про об'єкт управління та видачі керуючого впливу на об'єкт. У різних практичних ситуаціях та умовах можуть застосовуватися СВУ, побудовані на різних принципах візуалізації. Наприклад, це можуть бути бібліотеки віджетів Qt, GTK+, wxWidgets або гіпертекстові механізми на основі технологій HTML, XHTML, XML, CSS та JavaScript або сторонні додатки візуалізації, реалізовані на різних мовах програмування Java, Python та інше. Будь-який з цих принципів має свої переваги та недоліки, комбінація яких може стати непереборною перепоною у можливості використання СВУ у тому або іншому практичному випадку. Наприклад, технології на кшталт бібліотеки Qt дозволяють створювати високопродуктивні СВУ, що безсумнівно важливо для станцій оператору управління технологічним процесом (ТП). Однак необхідність інсталяції даного клієнтського ПЗ може унеможливити його використання у окремих випадках. З іншого боку, Web-технології не потребують інсталяції на клієнтські системи та є гранично багатоплатформними (достатньо вказати посилання на Web-сервер у будь-якому Web-браузері), що найбільш важливо для різних інженерних та адміністративних станцій. З іншого боку, продуктивність та надійність таких інтерфейсів нижче, що практично виключає їх використання на станціях оператору ТП.
OpenSCADA має гранично гнучку архітектуру, яка дозволяє створювати зовнішні інтерфейси, у тому числі й користувацькі, на будь-якій основі та смак. Наприклад, середовище конфігурації OpenSCADA доступне як на Qt-бібліотеці, так і на Web-основі.
У той-же час, незалежне створення реалізацій СВУ на різній основі може потягти за собою неможливість використання даних конфігурації однієї СВУ на іншій. Що незручно та обмежено з користувацького боку, а також витратно у плані реалізації та подальшої підтримки.
З метою запобігання цих проблем, а також створення у найкоротший термін повного спектру різних типів СВУ, засновано цей проєкт.
Безпосередньою областю застосування СВУ, як складової частин SCADA-системи OpenSCADA, є моніторинг та управління розподіленими системами з локальних та віддалених робочих місць.
2 Призначення
Функціонально, розробка призначена для створення загальної концепції СВУ та використання її у розробці конкретних модулів реалізації СВУ OpenSCADA. На цей час розроблено модулі реалізації СВУ, засновані на Qt-бібліотеці та WEB-технологіях.
Розроблювані модулі СВУ, загалом, призначено для:
- Візуалізації:
- оперативної (поточної) інформації: значень та порушень регламентних границь (алармів), параметрів технологічного процесу (ТП);
- архівних даних: значень параметрів та текстових повідомлень про порушення ведення ТП, діях користувача з управління ТП, а також системних повідомлень від усіх підсистем OpenSCADA.
- Управління технологічним обладнанням та параметрами ведення ТП: зміни налаштувань та режимів роботи контурів регулювання, зміни налаштувань системи протиаварійного захисту (ПАЗ), вводу числових даних.
- Побудови протоколів та іншої звітної документації.
Експлуатаційним призначенням розробки є:
- розширення сфери застосування OpenSCADA, за рахунок функцій модулів СВУ;
- повноцінне використання OpenSCADA для контролю та управління технологічними процесами.
3 Вимоги
3.1 Архітектурні вимоги
Розроблювана концепція та модулі СВУ повинні бути реалізовані згідно до вимог до модулів OpenSCADA. Розроблений концептуальний механізм повинен містити всі алгоритми та дані, які є загальними для СВУ, побудованих на різних принципах, а також містити механізм сеансів виконання проєктів інтерфейсів візуалізації. Фактично, у реалізаціях СВУ мають формуватися індивідуальні механізми візуалізації (зображення) та взаємодії з користувачем на основі даних концепції, тобто формувати індивідуальний інтерфейс представлення даних концепції СВУ згідно до ідеології "Модель/дані — Інтерфейс".
3.2 Загальні вимоги
Візуалізація має включати функції:
- Відображення оперативної та архівної інформації ведення ТП у: числовій, графічній (у вигляді мнемосхеми частини ТП, графіків у часі) формах.
- Сигналізації про порушення ведення ТП: кольором, миготінням фону, ліній, тексту, переліком порушень у табличній формі.
- Надання архівованих повідомлень про порушення ведення ТП, діях оператору та системних операціях. Повідомлення мають виводитися з використанням різного роду фільтрів: за категорією, часом/датою.
Управління технологічним обладнання та параметрами ведення ТП має забезпечити функції:
- Дистанційного управління дискретними виконавчими механізмами, режимами роботи.
- Вводу аналогових значень.
- Підтвердження виконання команди оператору, фіксування дій оператору у підсистемі повідомлень, а також розподіл прав на виконання команд.
Команди оператору, з управління ТП та навігації всередині підсистеми, повинні здійснюватися за допомогою клавіатури та миші, або іншого пристрою вводу.
У якості вхідних даних, реалізації СВУ мають використовувати наступні підсистеми OpenSCADA:
- Підсистема "Збір даних (DAQ)" — для отримання переліку параметрів, їх атрибутів, значень та історії змін значень атрибутів.
- Підсистема "Архіви-Історія" — для отримання та візуалізації архівів (історії) значень та повідомлень.
- Підсистема "Безпека" — для отримання переліку користувачів та контролю доступу.
- Підсистема "БД" — для зберігання та отримання конфігурації СВУ.
У якості вихідної інформації реалізації СВУ виступають:
- Зображення на дисплеї.
- Змінені оператором поточні значення параметрів ТП (режим роботи, завдання, вихід та налаштування регулятору, дистанційне управління обладнанням та інше), що надходять до підсистеми "DAQ".
- Звітна документація у вигляді різних протоколів, звітів та документів.
Конфігурація СВУ має зберігатися у доступних OpenSCADA базах даних, дозволяючи тим самим обирати ту або іншу БД під конкретний практичний випадок. Зображення та інші ресурси мають кодуватися алгоритмом Base64 та зберігатися у БД або братися прямо з ФС.
Цикл оновлення оперативної інформації на екрані залежить від конкретної реалізації СВУ. Для швидких інтерфейсів візуалізації цикл не повинен перевищувати 1 секунду.
3.3 Вимоги до надійності
Забезпечення надійного функціювання та захисту від несанкційованого доступу СВУ повинно бути реалізовано на декількох рівнях:
- На рівні ядра OpenSCADA.
- На рівні концепції СВУ. Для кожного елементу відображення має виконуватися розмежування прав на редагування (режим "Розробка"), динаміку та реагування на події (режим "Виконання"), шляхом зміни власника (використання функцій підсистеми "Безпека"), включення/виключення у групу та зміни прав на модифікацію, читання та виконання, відповідно.
- На рівні окремо взятої реалізації СВУ з використанням загальної концепції.
Реалізації СВУ, у зв'язці з концепцією, повинні задовольняти наступні вимоги надійності:
- Безперервна робота 24 години на добу та 360 днів у році.
- Максимальний час відновлення працездатного стану — не більш 1 години.
- Виявлення помилок (відсутність кадру, виключні ситуації), коректна обробка та видача відповідних повідомлень.
4 Проєктування
4.1 Постановка завдання
4.1.1 Задачі SCADA системи
На цей час, при побудові систем автоматизованого управління технологічними процесами (АСУ ТП), інтерфейс користувача з системою управління реалізуються за допомогою обчислювальних систем. Такий підхід обумовлено декількома причинами: компактністю (у фізичному та енергетичному сенсі) сучасної обчислювальної техніки, розвиненістю способів відображення інформації, великої функціональності та мінливості систем управління.
Застосування комп'ютерної техніки у АСУ ТП загалом, та на робочих місцях операторів зокрема, призвело до зародження класу програмного забезпечення (ПЗ), відомого як SCADA (Supervisory Control and Data Acquisition) та HMI (Human Machine Interface).
Таким чином, найважливішою задачею ПЗ SCADA та HMI є надання інтерфейсу взаємодії між оператором та системою управління ТП. Часто, на SCADA та HMI покладають такі задачі, як: формування сигналізації-сповіщення про відхилення у ТП, ведення архівів-історії параметрів ТП та протоколів подій.
Тому програмне забезпечення SCADA та HMI зручно розглядати як сукупність підсистем: бази даних параметрів ТП та зв'язку із системами управління ТП (контролерами), формування сигналізації-сповіщення про відхилення ведення ТП, архівування-історія, протоколювання, візуалізації оперативних та архівних даних.
Додатково, до вищеперелічених задач можна віднести: розмежування прав доступу на читання-зміну тих або інших параметрів ТП, реалізоване у підсистемі безпеки.
Таким чином, сучасні SCADA та HMI системи представляють з себе достатньо складні програмні комплекси.
Предметом даного під-проєкту є розробка концепції середовища візуалізації та управління (СВУ) та реалізацій СВУ на основні способи представлення, для SCADA системи OpenSCADA.
Під візуалізацією мається на увазі наступний набір задач:
- Надання оператору поточних даних про параметри ТП (покази давачів, положення механізмів виконавчих пристроїв). Велика увага приділяється сигналізації про відхилення (порушення) ведення ТП.
- Відображення архівної інформації (історії) параметрів ТП та події, які відбулися.
- Прийом та передача команд оператора підконтрольній системі.
СВУ повинна працювати у двох режимах — редагування (розробка) та виконання. На першому етапі реалізується режим розробки тільки для Qt-версії СВУ!
У процесі функціювання, СВУ повинна використовувати дані інших підсистем:
- Підсистема "Збір даних (DAQ)":
- "Розробка" — при підключенні динаміки до кадру (віджету).
- "Виконання" — при формуванні динаміки кадру (доступ до поточних значень параметрів, їх історії та порушенням).
- Підсистема "Архіви-Історія":
- "Розробка" — при налаштуванні динаміки кадру.
- "Виконання" — при формуванні динаміки кадру (доступ до архівних значень параметрів).
- Підсистема "Безпека":
- "Розробка" — при налаштуванні доступу до віджетів.
- "Виконання" — при формуванні зображення віджету та можливості управління.
- Підсистема "БД": доступ на завантаження та збереження даних за віджетами, кадрами, бібліотеками кадрів та проєктами як у режимі розробки, так і виконання.
Зображення на екрані повинно формуватися з обмеженого набору базових віджетів — примітивів. Представлення та інтерфейс базових віджетів кожного СВУ реалізується окремо, що зроблено з метою оптимізації продуктивності та спрощення завдання створення бібліотеки базових віджетів. Для сумісності різних реалізацій СВУ, створено загальний опис бібліотеки базових віджетів (моделі даних) з подальшою реалізацією її інтерфейсу у кожній СВУ.
Базові віджети передбачають групування та формування похідних віджетів, з подальшим їх накопиченням у користувацьких бібліотеках віджетів/кадрів.
4.1.2 Завдання систем моніторингу
Враховуючи призначення OpenSCADA, як системи мониторингу даних у багатьох суміжних областях, необхідно сформулювати задачі таких систем загалом.
У системах моніторингу, як правило, відсутня можливість управління, однак елементи інтерактивної взаємодії повинні бути присутніми.
Основним завдання таких систем є безперервне надання інформації у доступному вигляді та на фоні основної роботи.
4.2 Формалізація
Концептуальну модель СВУ опишемо мовою UML, за допомогою діаграм варіантів використання (use case diagram).
У якості актора, у випадку розробки, виступає інженер налаштування верхнього рівня АСУ ТП, у випадку виконання це — оператор.
У режимі розробки, виокремимо такі варіанти використання СВУ:
- Операції над проєктом:
- відкриття/збереження існуючого проєкту візуалізації у БД;
- створення/видалення проєкту візуалізації;
- робота з відкритим проєктом:
- додання/видалення кадру до проєкту візуалізації;
- зв'язування кадру проєкту з динамікою (динамізація властивостей кадрів), створюючи сторінку інтерфейсу візуалізації або шаблон загальної динаміки для сторінок, основаних на даному кадрі;
- створення/видалення сторінки інтерфейсу візуалізації, заснованої на кадрі проєкту;
- зв'язування сторінки інтерфейсу управління з динамікою.
- відкриття/закриття/підключення до сеансу виконання проєкту.
- Операції над кадром (віджетом):
- відкриття/збереження віджету/кадру у бібліотеці БД;
- створення/видалення віджету/кадру;
- робота з відкритим кадром:
- додання/видалення вкладеного віджету на робочий кадр;
- видалення віджетів на робочому кадрі;
- зміна властивостей виділених віджетів за допомогою супервізору віджетів;
- переміщення виділених віджетів за посередництвом маніпулятору миші та/або клавіатури;
- візуальна зміна розмірів та інших геометричних параметрів віджету;
- призначення слотів прив'язки динаміки (параметрів) віджетів або-ж кадру загалом, а також пряма прив'язка динаміки для віджетів кінцевої візуалізації (кадрів);
- формування процедури опису зв'язків та іншої логіки віджету, на мові користувацького програмування OpenSCADA;
- асоціативне встановлення простих та групових логічних зв'язків як графічно, так і конфігураційним чином.
Діаграму варіантів використання, при функціюванні СВУ у режимі розробки, наведено на рисунку 4.2.1.
Варіанти використання у режимі використання:
- слідкування за ТП по миттєвим значенням, графікам та інше.
- управління ТП через кінцевий інтерфейс візуалізації;
- навігація за кадрами та сторінками інтерфейсу візуалізації;
- гаряча заміна динамізованих властивостей кадрів та сторінок;
- формування та друк звітної документації, документів та екранів інтерфейсу візуалізації;
- зміна користувача.
Діаграму використання СВУ у режимі виконання наведено на рисунку 4.2.2.
СВУ, загалом, може працювати у двох режимах — розробки та виконання. У режимі розробки формується інтерфейс СВУ та його компоненти, визначаються механізми взаємодії. У режимі виконання здійснюється формування інтерфейсу СВУ та відбувається взаємодія з кінцевим користувачем, на основі розроблених СВУ.
Інтерфейс СВУ формується з кадрів, кожний з яких, своєю чергою, формується з елементів примітивів або користувацьких елементів інтерфейсу. При цьому, користувацькі елементи інтерфейсу також формуються з примітивів або інших користувацьких елементів. Таким чином забезпечується ієрархічність та повторне використання вже розроблених компонентів.
Кадри та користувацькі елементи розташовуються у бібліотеках віджетів. З елементів цих бібліотек формуються проєкти інтерфейсів кінцевої візуалізації СВУ. На основі-ж цих проєктів формуються сеанси візуалізації.
Описану структуру СВУ приведено на рисунку.
Дана архітектура СВУ дозволяє реалізовувати підтримку трьох рівнів складності у процесі розробки інтерфейсів управління:
- Формування інтерфейсу візуалізації та управління (ВУ) за допомогою бібліотеки шаблонних кадрів, шляхом розташування шаблонів кадрів до проєкту та призначення динаміки.
- Додатково до першого рівня здійснюється формування власних кадрів на основі бібліотеки похідних та базових віджетів. Можливе як пряме призначення динаміки у віджеті, так і подальше її призначення у проєкті.
- Додатково до другого рівня здійснюється самостійне формування довільних віджетів, нових шаблонних кадрів, та кадрів з використанням механізму опису логіки взаємодії та обробки подій на мові користувацького програмування OpenSCADA.
4.3 Кадри та елементи відображення (віджети)
Кадр це вікно, яке безпосередньо надає інформацію користувачу у графічній та/або текстовій формі. Група взаємопов'язаних кадрів формує цілісний користувацький інтерфейс ВУ.
Вміст кадру формується з елементів відображення (віджетів). Віджети можуть бути базовими примітивами (різні елементарні фігури, текст, тренд та інше) та похідні, сформовані з базових або інших похідних віджетів. Всі віджети групуються за бібліотеками. У процесі роботи, користувач може формувати власні бібліотеки похідних віджетів.
Власне сам кадр також є віджетом, який використовується у ролі кінцевого елементу візуалізації. А це означає, що бібліотеки віджетів можуть зберігати і заготовки кадрів, та шаблони результуючих сторінок користувацького інтерфейсу.
Кадри та віджети є пасивними елементами, які зазвичай не містять зв'язків з динамікою та іншими кадрами, а тільки надають інформацію про властивості та характер динаміки(конфігурації), що підключається до властивостей. Активовані кадри, ті що містять посилання на динаміку та активні зв'язки, формують користувацький інтерфейс та зберігаються у проєктах. У деяких випадках можливе пряме призначення динаміки у заготовках кадрів.
Похідні кадри/віджети можуть містити вкладені віджети, які можуть бути склеєні-зв'язані один з одним логікою, за допомогою мови користувацького програмування OpenSCADA.
Віджет є елементом, за посередництвом якого забезпечується:
- візуалізація оперативної та архівної інформації ведення ТП;
- сигналізація про порушення ведення ТП;
- перемикання між кадрами ТП;
- управління технологічним обладнанням та параметрами ведення ТП.
Налаштування та зв'язування віджетів здійснюється за посередництвом їх властивостей. Батьківський віджет, та віджети що містяться у ньому, можуть доповнюватися користувацькими властивостями. Надалі, користувацькі та статичні атрибути пов'язуються з властивостями вкладених віджетів, за посередництвом внутрішньої логіки. Для відображення динаміки (поточних та архівних даних) властивості віджетів динамізуються, тобто пов'язуються з атрибутами параметрів OpenSCADA або властивостями інших віджетів. Використання, для зв'язування вкладених віджетів внутрішньою логікою, мови користувацького програмування OpenSCADA знімає питання реалізації складної логіки візуалізації, забезпечуючи тим самим високу гнучкість. Практично, можна створювати повністю динамізовані кадри зі складними взаємозв'язками на рівні користувача.
4.4 Проєкт
Безпосередня конфігурація, та властивості кінцевого інтерфейсу візуалізації, містяться у проєкті інтерфейсу візуалізації СВУ, яких може бути створено багато.
Кожний проєкт включає сторінки з бібліотек кадрів-віджетів. Для низки режимів, сама сторінка може включати у себе вкладені сторінки як незалежні від батьківської, так і з використанням батьківського у ролі шаблону. Шаблонні сторінки-віджети дозволяють гранично спростити процес створення однотипних кадрів простого моніторингу, інженером АСУ ТП або користувачем OpenSCADA. Прикладом таких однотипних кадрів можуть бути: групи контурів, групи графіків, протоколи та різні зведені таблиці. Мнемосхеми технологічних процесів рідко підпадають під таку схему та формуються у окремій сторінці-віджеті.
Сторінка, як і віджет на якому вона заснована, надає можливість прив'язки динаміки до описаних у ній властивостей — зв'язки, які можуть бути встановлені динамікою або константами. Крім того, зв'язування безпосередньо на рівні сторінки проєкту є переважним, ніж здійснення цього на рівні віджетів бібліотек.
Приклад ієрархічного представлення компонентів проєкту класичного інтерфейсу ВУ технологічного процесу, з описом виразів стандартних викликів, приведено на рисунку.
Передбачено наступні спеціальні властивості сторінок:
- Контейнер — сторінка є контейнером вкладених сторінок.
- Шаблон — сторінка є шаблоном вкладених сторінок.
- Порожньо — порожня та неактивна сторінка. Ця властивість використовується спільно зі властивістю Контейнер, для організації логічних контейнерів сторінок.
- Зв'язок — зв'язок на іншу сторінку як контейнер під-сторінок, які будуть використовуватися на боці виконання проєктів (сеансів) без їх окремого створення.
На комбінаціях вищевказаних спеціальних властивостей сторінок реалізовано наступні їх типи:
- Стандарт — стандартна сторінка (не встановлено жодної з властивостей), є повноцінною кінцевою сторінкою.
- Контейнер — повноцінна сторінка з властивістю контейнера (Контейнер).
- Логічний контейнер — логічний контейнер, фактично сам не є сторінкою (Контейнер|Порожньо), виконує роль проміжного та групуючого елементу у дереві сторінок.
- Шаблон — сторінка-шаблон (Шаблон). Чиста шаблонна сторінка, використовується для опису загальних властивостей та довизначення їх у вкладених сторінках, у приватному порядку.
- Контейнер та шаблон — сторінка шаблону та контейнер (Шаблон|Контейнер), поєднує функції шаблону та контейнеру.
- Зв'язок — зв'язок на іншу сторінку. Зв'язки можуть бути використані на повністю динамічних та високо тиражованих сторінках, для оптимізації використання пам'яті. Для розрізнення відкриття зв'язуваних сторінок Ви маєте використовувати атрибут "path". Функція uiCmd() користувацького API має використовуватися для керування сторінками цього типу замість прямого запису до атрибутів сторінок "pgOpen" та "pgOpenSrc".
На боці візуалізації (RunTime) побудовано логіку, що регулює яким чином відкривати сторінки, на основі наступних атрибутів базового елементу "Box":
- pgOpen — ознака "Сторінка відкрита";
- pgNoOpenProc — ознака "Виконувати сторінку навіть якщо вона не відкрита";
- pgOpenSrc — містить адресу виджета, або сторінки, що відкрила поточну сторінку; у випадку вкладеного контейнерного віджета тут міститься адреса включеної сторінки; для відкриття сторінки із скрипта достатньо тут вказати адресу віджета-джерела відкриття, але для сторінок типу "Зв'язок" Ви маєте віддавати перевагу використанню функції uiCmd() користувацького API, для керування сторінкам;
- pgGrp — група сторінок, використовується для зв'язки контейнерів сторінок зі сторінками, згідно загальної групи; ПОРОЖНЯ та "main" група передбачають використання цієї сторінки як Кореневу-основну сторінку, тож така буде замінювати інші Кореневі-головні сторінки; група "fl" призначена для використання у зовнішніх вікнах, які передбачено для багаторазового одночасного відкриття та які не мають відстежуватися на дублікати; решта передбачено для включення у контейнери-бокси або одноразового одночасного відкриття, тож вони примусово перевіряються на дублікати, коли останнє відкривається, а попередні закриваються.
Логіка визначення способу відкриття сторінок працює наступним чином:
- якщо сторінка має групу "main" або збігається з групою сторінки у головному вікні або немає сторінки на головному вікні, то відкривати сторінку у головному вікні;
- якщо сторінка має групу, яка збігається з групою одного з контейнерів поточної сторінки, то відкрити у цьому контейнері;
- якщо джерело відкриття сторінки збігається з потоковою сторінкою, то відкрити у вигляді додаткового вікна над потоковою сторінкою;
- передати виклик на запит відкриття додатковим вікнам, з обробкою у кожного по першим трьом пунктам;
- якщо ніхто з родинних вікон не відкрив нову сторінку то відкрити її як родинне вікно головного вікна.
4.5 Сеанс виконання проєкту
Сеанс проєкту це розгорнуте дерево проєкту безпосереднього його виконання, що включає окреме завдання ієрархічного виконання процедур віджетів. Для кожного проєкту може бути відкрито багато сеансів. Формування кінцевого інтерфейсу візуалізації здійснюється візуалізаторами, виходячи з даних сеансу проєкту, після створення сеансу за запитом.
Між віджетами, на різних рівнях ієрархії, у кінцевому рахунку вибудовуються достатньо складні спадкові зв'язки, які визначаються можливістю використання одних віджетів іншими, починаючи з бібліотечного віджета та закінчуючи віджетом сеансу. Для роз'яснення цих особливостей взаємодії, на рисунку зображено вичерпну карту "використального" наслідування.
На рівні сеансів, віджет містить об'єкт значень процедури обрахунку. Цей об'єкт ініціюється та використовується у випадку наявності самої процедури обчислення. У момент ініціалізації створюється перелік параметрів процедури та виконується її компіляція з цими параметрами, у модулі, що реалізує обрану мову програмування та з назвою результуючої процедури у вигляді закодованого повного ім'я виджета. Скомпільована функція підключається до об'єкту значень процедури обрахунку, а далі виконується її обчислення з періодом сеансу.
Обчислення та обробка віджету виконується у наступній послідовності:
- обираються події, доступні на момент обчислення, з атрибуту "event" віджету;
- події завантажуються до параметру "event" об'єкта обчислення;
- до об'єкту обчислення завантажуються значення за вхідними зв'язками;
- до об'єкту обчислення завантажуються значення спеціальних змінних (f_frq, f_start та f_stop);
- до об'єкту обчислення завантажуються значення обраних параметрів віджету;
- обчислення;
- вивантаження значень об'єкту обчислення у обрані параметри віджету;
- вивантаження подій з параметру "event" об'єкта обчислення;
- обробка подій та передача необроблених на рівень вище.
Об'єкти сеансу успадковуються від абстрактного об'єкту "Widget" та використовують відповідні об'єкти проєкту. Так, сеанс "Session" використовує проєкт "Project" та формує на його основі розгорнуте дерево. Сторінка проєкту "Page" прямо використовується сторінкою сеансу "SessPage". Решта об'єктів "SessWdg" розгортаються відповідно до ієрархії елементів сторінки.
Додатково до стандартних властивостей абстрактного віджета "Widget", елементи сторінки та самі сторінки сеансу отримують властивості: зберігання об'єкту значень обчислювальної процедури, обрахунку процедур та механізм обробки подій. Сторінки сеансу, додатково до всього, містять контейнер наступних за ієрархією сторінок. Сеанс, загалом, обчислюється з вказаною періодичністю та у послідовності:
- "Сторінка верхнього рівня" -> "Сторінка нижнього рівня"
- "Віджет нижнього рівня" -> "Віджет верхнього рівня"
Така політика дозволяє обходити сторінки відповідно до їх ієрархії, а повідомленням у віджетах "спливати" нагору за одну ітерацію.
Сеанси підтримують багатомовність на рівні інтерфейсу управління OpenSCADA, яка залежить від значень загальних атрибутів "lang" та "user", та які візуалізатор може встановлювати згідно до своєї мови. Ця функція вмикається динамічним перекладом повідомлень OpenSCADA.
4.6 Стилі
Відомо, що людина може мати індивідуальні особливості сприйняття графічної інформації. Якщо ці особливості не враховувати то можна отримати несприйняття та відторгнення користувача до інтерфейсу ВУ. Таке несприйняття та відторгнення може призвести до фатальних помилок при управлінні ТП, а також травмувати людину постійною роботою з інтерфейсом. У SCADA системах прийнято домовленості, які регламентують вимоги по створенню уніфікованого інтерфейсу ВУ, що нормально сприймається більшістю людей. При цьому, практично відсутнє врахування особливостей людей з деякими відхиленнями.
З метою врахувати цю обставину, та надати можливість централізовано та просто змінювати візуальні властивості інтерфейсу, проєктом реалізується менеджер стилів інтерфейсу візуалізації.
Користувачем може бути створено багато стилів, кожний з яких буде зберігати кольорові, шрифтові та інші властивості елементів кадру. Проста зміна стилю дозволить швидко видозмінити інтерфейс ВУ, та можливість призначення індивідуального стилю до користувача дозволить врахувати його особливості.
Для реалізації цієї можливості, при створені кадрів, необхідно для властивостей кольору, шрифту та інших встановити параметр "Конфігурація" (таблиці у вкладці "Обробка") у значення "З стилю". А у параметрі "Конфігураційний шаблон" вказати ідентифікатор поля стиля. Далі, це поле автоматично з'явиться у менеджері стилів та його можна буде там змінювати. Менеджер стилів доступний на сторінці конфігурації проєкту у вкладці "Стилі". На цій вкладці можна стилі створювати, видаляти та змінювати, видаляти їх поля.
Загалом, стилі доступні починаючи з рівня проєктів. На рівні бібліотек віджетів можна тільки визначати поля стилів у віджетів. На рівні проєкту, при виборі стиля, включається робота зі стилями, що передбачає доступ до полів стилів замість безпосередніх значень атрибутів. Фактично, це означає, що при читанні або записі атрибуту віджету, вказані операції будуть здійснюватися над відповідним полем обраного стилю.
При запуску проєкту на виконання буде використано встановлений у проєкті стиль. Надалі, користувач може обрати стиль з переліку доступних. Обраний користувачем стиль буде збережено та використано при наступному запуску проєкту.
4.7 Події, їх обробка та карти події
Враховуючи спектр задач, для яких може використовуватися OpenSCADA, треба передбачити механізм управління інтерактивними користувацькими подіями. Це пов'язано з тим, що при вирішені окремих задач вбудованих систем, пристрої вводу та управління можуть значно відрізнятися. Власне, достатньо поглянути на звичайну офісну клавіатуру та клавіатуру ноутбука, щоб зняти будь-які сумніви у необхідності менеджеру подій.
Менеджер подій має працювати використовуючи карти подій. Карта подій — це перелік іменованих подій з указанням його походження. Походженням події може бути клавіатура, маніпулятор миші, джойстик та інше. При виникненні події, менеджер подій шукає його у активній карті та співставляє з ім'ям події. Співставлене ім'я події поміщається у чергу на обробку. Віджети, у цьому випадку, повинні обробляти отриману чергу подій.
Активна карта повідомлень вказується у профілі кожного користувача або встановлюється по замовченню, у планах.
Загалом, передбачено чотири типи подій:
- події образів-примітивів СВУ (префікс: ws_), наприклад, подія натискання екранної кнопки — "ws_BtPress";
- клавішні події (префікс: key_) — всі події від клавіатури та миші у вигляді "key_presAlt1";
- користувацькі події (префікс: usr_), генеруються користувачем у процедурах обрахунку віджетів;
- маповані події (префікс: map_) — події, отримані з карти події, у планах.
Сама подія надає недостатньо інформації, особливо якщо її обробка відбувається на рівнях вище. Для однозначної ідентифікації події та її джерела, події, загалом, записуються наступним чином: "ws_BtPress:/curtime". Де:
- ws_BtPress — подія;
- /curtime — шлях до дочірнього елементу, який згенерував подію.
У таблиці 3.5 наведено перелік стандартних подій, підтримку яких має бути забезпечено у візуалізаторах СВУ.
Таблиця 3.5. Стандартні події
Ідентифікатор | Опис |
---|---|
Клавіатурні події: 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 | Подвійний натиск лівої кнопки миші. |
Події квітація на боці візуалізатору. | |
ws_alarmChange | Сповіщає щодо зміни статусу порушення, атрибут "alarmSt". |
ws_alarmLev | Квітація всіх порушень всіма способами та типами сповіщення. |
ws_alarmNtf{N} | Квітація всіх порушень сповіщення типу {N} (0...7). |
Події примітиву елементарної фігури ElFigure: | |
ws_Fig[Left|Right|Midle|DblClick] | Активація фігур (заливок) клавішею миші. |
ws_Fig{N}[Left|Right|Midle|DblClick] | Активація фігури (заливки) N клавішею миші. |
Події примітиву елементу форми FormEl: | |
ws_LnAccept | Встановлено нове значення у рядку вводу. |
ws_TxtAccept | Змінено значення редактору тексту. |
ws_ChkChange | Стан ознаки змінено. |
ws_BtPress | Кнопку натиснуто. |
ws_BtRelease | Кнопку відпущено. |
ws_BtToggleChange | Змінено втисненість кнопки. |
ws_BtMenu={Item} | Вибір елементу меню Item за кнопкою. |
ws_BtLoad | Обраний файл завантажено. |
ws_CombChange | Змінено значення поля обрання. |
ws_ListChange | Змінено поточний елемент переліку. |
ws_TreeChange | Змінено поточний елемент дерева. |
ws_TableChangeSel | Змінено вибір елементу таблиці. |
ws_TableEdit_{colN}_{rowN} | Відредаговано клітинку таблиці ({colN}:{rowN}). |
ws_SliderChange | Зміна положення слайдеру. |
Події примітиву медіа-контенту Media: | |
ws_MapAct{N}[Left|Right|Midle] | Активовано медіа-область з номером N, клавішею миші. |
ws_MediaFinished | Закінчено програвання Медіа-потоку. |
Події є основним механізмом сповіщення та активно використовуються для здійснення взаємодії з користувачем. Для обробки події передбачено два механізми:
- Первинний — сценарій управління відкриттям сторінок.
- Вторинний — обчислювальна процедура віджета.
Механізм "Сценарій управління відкриттям сторінок" засновано на базовому атрибуті віджету "evProc", у якому може описуватися відкриття сторінок. Сценарій цього атрибуту записується у вигляді переліку команд з синтаксисом: "{event}:{evSrc}:{com}:{prm}". Де:
- event — очікувана подія;
- evSrc — шлях вкладеного віджета-джерела події;
- com — команда сеансу;
- prm — параметр команди.
Реалізовано наступні команди:
- open — відкриття сторінки; сторінка, що відкривається, вказується у параметрі prm як прямо, так і у вигляді шаблону, наприклад — /pg_so/1/*/*;
- next — відкриття наступної сторінки; сторінка, що відкривається, вказується у параметрі prm, у вигляді шаблону, наприклад: /pg_so/*/*/$;
- prev — відкриття попередньої сторінки; сторінка, що відкривається, вказується у параметрі prm, у вигляді шаблону, наприклад: /pg_so/*/*/$.
Спеціальні символи шаблону розшифровуються наступним чином:
- pg_so — пряме ім'я потрібної-статичної сторінки (з префіксом), потребує обов'язкової відповідності та використовується для ідентифікації попередньої відкритої сторінки;
- 1 — ім'я та місце нової сторінки у загальному шляху (без префіксу);
- * — сторінка береться з ім'я попередньої відкритої сторінки або підставляється перша доступна сторінка, якщо попередня відкрита відсутня;
- $ — вказує на місце відкритої сторінки, відносно якої треба шукати наступну або попередню.
Для правильного розуміння роботи механізму шаблонів, при виборі сторінки, приведемо декілька реальних прикладів:
- Перемикання об'єкту сигналізації:
- Початково: /pg_so/pg_1/pg_mn/pg_1
- Команда: open:/pg_so/2/*/*
- Результат: /pg_so/pg_2/pg_mn/pg_1
- Перемикання виду відображення:
- Початково: /pg_so/pg_1/pg_mn/pg_1
- Команда: open:/pg_so/*/gkadr/*
- Результат: /pg_so/pg_1/pg_gkadr/pg_1
- Наступна/попередня сторінка виду відображення:
- Початково: /pg_so/pg_1/pg_mn/pg_1
- Команда: next:/pg_so/*/*/$
- Результат: /pg_so/pg_1/pg_mn/pg_2
У якості прикладу, наведемо сценарій забезпечення роботи головної сторінки інтерфейсу користувача:
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:
for(ev_rez = "", off = 0; (sval=event.parse(0,"\n",off)).length; ) {
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;
4.8 Сигналізація
Важливим елементом будь-якого інтерфейсу візуалізації є сповіщення користувача про порушення — сигналізація. Для спрощення сприйняття, а також через тісний зв'язок візуалізації та сповіщення (як правило, сповіщення доповнюють візуалізацію) вирішено інтегрувати інтерфейс сповіщень у інтерфейс візуалізації. Для цього, у всіх віджетах, передбачається два додаткових атрибути рівня сеансу: "alarm" та "alarmSt". Атрибут "alarm" використовується для формування сигналу віджетом згідно до його логіки, а атрибут "alarmSt" використовується для контролю за фактом сигналізації гілки дерева сеансу.
Атрибут "alarm" є рядком, який має наступний формат: "{lev}|{categ}|{message}|{type}|{tp_arg}"
Де:
- lev — рівень сигналізації: число від 0 до 255;
- categ — категорія сигналу: параметр підсистеми збору, об'єкт, шлях або комбінація;
- message — повідомлення сигналізації;
- type — типи сповіщень, вказуються у вигляді цілого числа (0...7), що містять ознаки способів сповіщень; типові способи сповіщень:
- 1 — візуальне;
- 2 — гудок, часто відбувається через PC-speaker;
- 4 — звуковий сигнал з файлу звуку або синтез мови; якщо у tp_arg вказано ім'я ресурсу звукового файлу, то відтворюється саме він, інакше виконується синтез мови з тексту, вказаного у message.
- tp_arg — аргумент типу; часто використовується для прямого вказання ресурсу звукового сигналу — файл звукового формату, при здійснені звукової сигналізації.
Атрибут "alarmSt" є цілим числом, яке відображає максимальний рівень сигналу та факт квітування гілки дерева сеансу. Формат числа має наступний вигляд:
- перший байт (0...255) характеризує рівень сигналу гілки;
- другий байт вказує тип сповіщення, так як і у атрибуті "alarm";
- третій байт вказує тип несквітованого сповіщення, так як і у атрибуті "alarm";
- четвертий байт має спеціальне значення, яке визначається окремими бітами:
- біт 0 — вказує, встановленням, на факт квітування сповіщень у першому байті;
- біт 1 — вказує, при встановленні його та бита 0, на повернення квітування — включення сповіщення.
Формування сигналу та отримання його візуалізатором.
Формування сигналу здійснюється самим віджетом, шляхом встановлення власного атрибуту "alarm" потрібним чином та, згідно до нього, автоматично встановлюється атрибут "alarmSt" поточного та вищестоящих віджетів. Візуалізатори отримують сповіщення про сигнал за допомогою стандартного механізму сповіщення про зміну атрибутів віджетів.
Враховуючи те, що обробка умов сигналізації здійснюється у віджетах, сторінки, що містять об'єкти сигналізації, повинні виконуватися у фоні, незалежно від відкритості їх на цей момент. Це здійснюється шляхом встановлення ознаки виконання сторінки у фоні.
Хоча механізм сигналізації й побудовано у середовищі візуалізації, можливість формування невізуальних елементів сигналізації залишається, наприклад, шляхом створення сторінки, яка ніколи не буде відкриватися.
Квітація
Квітація (від quietance) — процес підтвердження факту того, що оперативний персонал звернув увагу на порушення у роботі ТП. Зазвичай цей процес передбачає вживання заходів оператором для усунення порушення та натискання відповідної кнопки припинення сигналізації.
Квітація здійснюється шляхом вказання кореня гілки віджетів та типів сповіщення, що дозволяє реалізувати квітацію на боці візуалізатору як за групами, наприклад, за об'єктом сигналізації, так і індивідуально за об'єктом джерела. При цьому можна незалежно квитувати різні типи сигналізацій. Встановлення квітації здійснюється простою модифікацією атрибуту "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;
//Обробка подій кнопок квітації та квітація різних способів сповіщення
for(ev_rez = "", off = 0; (sval=event.parse(0,"\n",off)).length; ) {
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;
Зовнішні методи сповіщення
Основним та типовим способом сповіщення є дисплейна світлова сигналізація аварійними кольорами та їх динамікою у елементів візуалізації, яка присутня завжди та не потребує специфічної конфігурації. Однак, часто потрібні сповіщення зовнішнього типу, наприклад: зовнішньою лампою, бузером PC або "ревуном", довільним звуком, синтезованою мовою та інше.
Для здійснення такої можливості, зовнішні способи сповіщення, та відповідні до них типи сповіщення, вільно описуються для серверу візуалізації та самого візуалізатору. На боці серверу візуалізації описується формування/отримання ресурсу сповіщення та саме сповіщення. На боці візуалізатору описується сповіщення згідно ресурсам серверу візуалізації.
Опис правил та сценаріїв зовнішнього сповіщення здійснюється за допомогою користувацьких атрибутів текстового типу для сторінок проєкту візуалізації, які застосовуються при відкритті цих сторінок. Тобто, потенційно, для кожної відкриваної сторінки можна описати власні правила сповіщення, хоча, зазвичай достатньо та описуються загальні правила сповіщення на головній сторінці проєкту — сторінці, яка відкривається одноразово та не закривається при роботі:
- Для серверу/рушія візуалізації, атрибутом "notify{N}" у форматі:
//flags=notifyServ[{DL}][|resource[|queue[|qMergeMess]]];
//resStatic={ResourceFile}
if(doRes) { Текст команди формування ресурсу. }
if(doNtf) { Текст команди сповіщення. }
- Для візуалізатору, атрибутом "notifyVis[Vision|WebVision]{N}" у форматі:
//flags=notify[{DL}][|resource[|queue[|quietanceRet]]];
//name={Ім'я сповіщувача}
//ico={Ім'я іконки}
{ Текст команди сповіщення для будь-якого або конкретного візуалізатору. }
Прапорці:
- notify[{DL}], notifyServ[{DL}] — включає сповіщення з повтором через час DL, якщо вказано; для DL = 0 повтор здійснюється одразу; notifyServ[{DL}] використовується для примусового сповіщення на боці серверу замість візуалізатору із notify[{DL}].
- resource — запитувати-формувати (примусово) ресурс сповіщення у сервера візуалізації, може бути звуковим файлом, текстом або іншими даними формування сповіщення; але наразі сповіщувачі переважно очікують аудіо.
- queue — ресурси сповіщення визначаються не лише за глобальною ознакою порушення та квітації, а й згідно до пріоритетної черги джерел сповіщення-ресурсів. Черга формується на боці серверу візуалізації, а для візуалізаторів вказується необхідність роботи з нею при запиті ресурсів.
- qMergeMess — поєднувати сповіщення у черзі за рівністю сповіщення.
- quietanceRet — можливість відкликання-повернення стишення візуалізатору, тобто, по факту — зворотного включення сповіщення.
Наявність поля "resStatic" вмикає отримання ресурсу безпосередньо із таблиці ресурсів або файлу, вказується у спосіб подібний до примітиву "Медіа".
Змінні обміну:
- en[0,1] — сповіщення ввімкнути (1) або вимкнути (0);
- doNtf[0,1] — виклик сценарію сповіщення;
- doRes[0,1] — виклик сценарію формування ресурсу;
- res — вміст або ім'я файлу з вмістом ресурсу, для зовнішніх сценаріїв;
- resTp — тип ресурсу, на кшталт "audio/ogg"; є поверненням та поміщається до стандартного виходу (для Shell) для doRes;
- mess — повідомлення-параметри формування ресурсу або сповіщення;
- lang — мова поточного користувача або системи;
- prcID — унікальний ідентифікатор процедури (на кшталт "ses_AGLKS_ntf2"), переважно для безпечного створення тимчасових файлів.
Приклади та коментарі до функціювання типових способів сповіщення:
- Бузер (buzzer) на боці візуалізатору (flags=notify0) або серверу візуалізації (flags=notifyServ0) із повторенням та контролем програвання:
- alarm = "10|Prm||0x02"
- notifyVisVision1 | notify1 =
//flags=notify0|notifyServ0
if(en && (ntfPrg=SYS.system("which beep")).length &&
(SYS.system("test -s "+prcID+".pid",true) || //No PID file
SYS.system("ps -A -o \"pid cmd\" | grep \"^ *$(cat "+prcID+".pid).*"+ntfPrg.parseLine(0)+"\" > /dev/null",true)) ) //No notify already
{
ntfPrg = ntfPrg.parseLine(0);
SYS.system(ntfPrg+" -f 1000 -l 100000 &\necho $! > "+prcID+".pid", true);
}
else if(!en && !SYS.system("test -s "+prcID+".pid",true))
SYS.system("kill $(cat "+prcID+".pid); rm "+prcID+".pid "+prcID+".res;", true);
- notifyVisVision1 | notify1 =
#!/bin/sh
#flags=notify0|notifyServ0
if test $en = 1; then
ntfPrg=$(which beep)
#No PID file || No notify already
if test ! -s $prcID.pid || ! ps -A -o "pid cmd" | grep "^ *$(cat $prcID.pid).*$ntfPrg" > /dev/null; then
$ntfPrg -f 1000 -l 100000 &
echo $! > $prcID.pid
fi
elif test -s $prcID.pid; then
kill $(cat $prcID.pid)
rm $prcID.pid $prcID.res
fi
- Повторюване програвання готового звукового файлу, одного загального, на боці візуалізатору (flags=notify2) або серверу візуалізації (flags=notifyServ2), тривалість аудіо файлу для внутрішньої мови має бути не більше 10 секунд:
- alarm = "10|Prm||0x04"
- notify2 | notifyVisVision2 =
//flags=notify2|notifyServ2
if(en) SYS.system("play -q alarm.ogg");
- notify2 | notifyVisVision2 =
#!/bin/sh
#flags=notify2|notifyServ2
if test $en = 1; then play -q alarm.ogg; fi
- Програвання індивідуального для джерела звукового файлу, на боці візуалізатору, тривалість аудіо файлу для внутрішньої мови має бути не більше 10 секунд:
- alarm = "10|Prm||0x04|res:al_prm1"
- notify2 =
//flags=queue
- notifyVisVision2 =
//flags=notify2|queue
if(doNtf && en && res.length) {
SYS.fileWrite("tmpPlay", res);
SYS.system("play -q tmpPlay");
SYS.fileRemove("tmpPlay");
}
- notifyVisVision2 =
#!/bin/sh
#flags=notify2|queue
if test $doNtf = 1 -a $en = 1 -a -s $res; then play -q $res; fi
- Синтез мови індивідуального сповіщення для джерела на боці візуалізатору, тривалість повідомлення для внутрішньої мови має бути не більше 10 секунд:
- alarm = "10|Prm|Текстове повідомлення синтезу мови|0x04"
- notify2 =
//flags=queue
- notifyVisVision2 =
//flags=notify2|queue
if(doNtf && en && mess.length) {
SYS.fileWrite("tmpForSpeech", mess);
SYS.system("festival --tts tmpForSpeech");
SYS.fileRemove("tmpForSpeech");
}
- notifyVisVision2 =
#!/bin/sh
#flags=notify2|queue
if test $doNtf = 1 -a $en = 1 -a "x" != "x$mess"; then
echo $mess > tmpForSpeech
festival --tts tmpForSpeech
rm tmpForSpeech
fi
- Приготування звукового файлу, одного загального, та його програвання на боці візуалізатору (flags=notifyServ2) або серверу візуалізації (flags=notifyServ2), тривалість аудіо файлу для внутрішньої мови має бути не більше 10 секунд:
- alarm = "10|Prm||0x04"
- notify2 =
//flags=notify2|notifyServ2|resource
if(doRes) res = SYS.fileRead("alarm.ogg"); //Insert here a different method of the generation
if(doNtf && en && res.length) {
SYS.fileWrite("tmpPlay", res);
SYS.system("play -q tmpPlay");
SYS.fileRemove("tmpPlay");
}
- notify2 =
#!/bin/sh
#flags=notify2|notifyServ2|resource
if test $doRes = 1; then cp -f alarm.ogg $res; fi #Insert here a different method of the generation
if test $doNtf = 1 -a $en = 1 -a -s $res; then play -q $res; fi
- notifyVisVision2 =
//flags=notify2|resource
if(en && res.length) {
SYS.fileWrite("tmpPlay", res);
SYS.system("play -q tmpPlay");
SYS.fileRemove("tmpPlay");
}
- notifyVisVision2 =
#!/bin/sh
#flags=notify2|resource
if test $en = 1 -a -s $res; then play -q $res; fi
- Приготування індивідуального для джерела сповіщення звукового файлу через синтез мови, на боці візуалізатору (flags=notify2) або серверу візуалізації (flags=notifyServ2), тривалість повідомлення для внутрішньої мови має бути не більше 10 секунд:
- alarm = "10|Prm|Текстове повідомлення синтезу мови|0x04"
- notify2 =
//flags=notify2|notifyServ2|queue
if(doRes && mess.length) {
SYS.fileWrite("tmpText", mess);
SYS.system("text2wave tmpText -o tmpWAV");
res = SYS.fileRead("tmpWAV");
SYS.fileRemove("tmpText"); SYS.fileRemove("tmpWAV");
}
if(doNtf && en && res.length) {
SYS.fileWrite("tmpPlay", res);
SYS.system("play -q tmpPlay");
SYS.fileRemove("tmpPlay");
}
- notify2 =
#!/bin/sh
#flags=notify2|notifyServ2|queue
if test $doRes = 1 -a "x" != "x$mess"; then
echo $mess > tmpText
text2wave tmpText -o $res
rm tmpText
fi
if test $doNtf = 1 -a $en = 1 -a -s $res; then play -q $res; fi
- notifyVisVision2 =
//flags=notify2|queue
if(en && res.length) {
SYS.fileWrite("tmpPlay", res);
SYS.system("play -q tmpPlay");
SYS.fileRemove("tmpPlay");
}
- notifyVisVision2 =
#!/bin/sh
#flags=notify2|queue
if test $en = 1 -a -s $res; then play -q $res; fi
4.9 Керування правами
Для поділу доступу до інтерфейсу ВУ та його складовим, кожний віджет містить інформацію про власника, його групи та права доступу. Права доступу записуються у вигляді тріади: "{користувач}{група[,група1,групаN]}{інші}", де кожний елемент складається з двох ознак доступу, для який прийнята наступна інтерпретація:
- r — право на перегляд віджету;
- w — право на контроль над віджетом.
У режимі розробки використовується проста схема доступу "root:UI|RWRWR_", що означає — всі користувачі можуть відкривати та переглядати бібліотеки, їх компоненти та проєкти; а редагувати можуть всі користувачі групи "UI" (користувацькі інтерфейси).
У режимі виконання працюють права, описані у компонентах інтерфейсу, які передбачають можливість наслідування власника та прав, зверху додолу. Причому, по замовченню, наслідування включено у кожному віджеті, що означає — вони отримають власника та права проєкту. У той-же час, пряме встановлення прав складеного віджету розповсюдить їх на всі компоненти цього віджета.
4.10 Зв'язування з динамікою
Для надання до інтерфейсу візуалізації актуальних даних, повинні використовуватися дані підсистеми "Збір даних (DAQ)". Природа цих даних наступна:
- параметри, що містять деяку кількість атрибутів;
- атрибути параметру можуть надавати дані п'яти базових типів: Логічний, Цілий, Реальний, Рядок та Об'єкт;
які доповнено СВУ модифікаторами: "Обирається"; варіантами Рядка: "Текст", "Переклад", "Колір", "Зображення", "Шрифт", "Адреса"; варіантами Цілого: "ДатаЧас". - атрибути параметру можуть мати архів (історію);
- атрибути параметру можуть бути на читання, запис та з повним доступом.
Враховуючи перший пункт, треба забезпечити можливість групового призначення посилання. Для цього використовуємо концепцію логічного рівня.
Згідно до пункту 2, зв'язки забезпечують прозоре перетворення типів та не потребують спеціальної конфігурації.
Для задоволення можливості доступу до архівам, згідно до пункту 3, зв'язки виконують перевірку типу атрибуту та, у випадку підключення до "Адреси", до значення поміщається адреса зв'язку.
У термінах СВУ, динамічні зв'язки та конфігурація динаміки є одним процесом, для опису конфігурації якого передбачено вкладку "Обробка" віджетів. Вкладка містить таблицю конфігурації властивостей атрибутів та текст процедури обчислення віджету.
Крім полів конфігурації атрибутів, у таблиці передбачається стовпчик "Обробка", для вибіркового використання атрибутів у обчислювальній процедурі віджета, та стовпчика "Конфігурація", "Конфігураційний шаблон" для опису конфігурації зв'язків.
Якщо у стовпчику "Обробка" стоїть true, то у обчислювальній процедурі стає доступною змінна {ідентифікатор віджета}_{ідентифікатор атрибуту}, наприклад cw_value.
Стовпчик "Конфігурація" дозволяє вказати тип зв'язку атрибуту віджета:
- Постійна — у вкладці зв'язків віджету з'являється поле визначення постійної, наприклад, особливого кольору або заголовку шаблонних кадрів.
- Вхідний зв'язок — зв'язок з динамікою тільки для читання.
- Вихідний зв'язок — зв'язок з динамікою тільки для запису.
- Повний зв'язок — повний зв'язок з динамікою, читання та запис.
- Зі стиля — брати значення зі стиля проєкту.
Стовпчик "Конфігураційний шаблон" дозволяє зв'язати групи динамічних атрибутів. Наприклад, це можуть бути різні типи параметрів підсистеми "DAQ" та інші віджети інтерфейсу. При коректному формуванні цього поля працює механізм автоматичного призначення атрибутів, при визначені тільки параметру підсистеми "DAQ" або віджету інтерфейсу, що спрощує та прискорює процес конфігурації. Значення цього стовпчика має наступний формат:
- Для постійної: пряме значення атрибуту.
- Для зв'язку: "{параметр}|{ідентифікатор}", де:
- параметр — група атрибутів;
- ідентифікатор — ідентифікатор атрибуту; саме значення у цьому полі співставляється з атрибутами параметрів DAQ після указання групового зв'язку, при автоматичному зв'язувані;
- Для стиля: ідентифікатор-ім'я поля стиля.
Встановлення зв'язків може бути декількох типів, який визначається префіксом:
- val: — Пряме завантаження значення через механізм зв'язків. Наприклад, зв'язок "val:100" завантажує значення 100 до атрибуту віджета. Часто використовується у випадку відсутності кінцевої точки зв'язку, з метою прямого встановлення значення.
- prm: — Зв'язок на атрибут параметру або параметр, загалом, для групи атрибутів підсистеми "Збір даних". Наприклад, зв'язок "prm:/LogicLev/experiment/Pi/var" здійснює доступ атрибуту віджета до атрибуту параметра підсистеми "Збір даних". Знак "(+)", у кінці адреси, вказує на вдале зв'язування-лінкування та присутність цільового об'єкту. Для атрибутів об'єктного типу допустимий ієрархічний доступ до конкретної властивості об'єкту, шляхом вказання її шляху через символ '#', наприклад: "prm:/LogicLev/experiment/Pi/var#pr1/pr2".
- wdg: — Зв'язок на атрибут іншого віджета або віджет, загалом, для групи атрибутів. Наприклад, зв'язок "wdg:/ses_AGLKS/pg_so/pg_1/pg_ggraph/pg_1/a_bordColor" здійснює доступ атрибуту одного віджету до атрибуту іншого. Підтримуються як абсолютні, так і відносні шляхи зв'язків. Точкою відліку адреси абсолютного зв'язку виступає об'єкт кореня модуля "VCAEngine", що означає — першим елементом абсолютної адреси є ідентифікатор сеансу або проєкту. Перший елемент на боці сеансу опускається, тому зв'язки, встановлені у проєкті, там працюють. Відносні зв'язки беруть відлік від віджету, де зв'язок вказано. Спеціальним елементом відносного зв'язку є елемент вищестоячого вузла "..".
- arh: — Особливий тип зв'язку, доступний тільки для окремого атрибуту типу "Адреса", який дозволяє підключитися прямо до архіву значень ("arh:CPU_load"). Може бути корисний для вказання архіву у якості джерела даних примітиву "Діаграма".
Обробка зв'язків відбувається з періодичністю обчислення віджету, у порядку:
- отримання даних вхідних зв'язків;
- виконання обчислення процедури віджету;
- передача значень за вихідними зв'язками.
На рисунку представлено вкладку зв'язків з груповим призначенням атрибутів, шляхом указання тільки параметру. На наступному рисунку представлено індивідуальне призначення атрибутів.
При розташуванні віджета до контейнеру віджетів всі зв'язки початкового віджета додаються до переліку результуючих зв'язків контейнеру віджетів, однак, тільки на глибину у один рівень вкладення.
З вищесказаного видно, що зв'язки встановлюються користувачем у процесі конфігурації інтерфейсу. Однак, для надання можливості створення кадрів загального призначення з функцією надання деталізованих даних різних джерел одного типу, потрібен механізм динамічного встановлення зв'язків. Такий механізм передбачається:
- резервуванням ключового ідентифікатору "<page>" для групи атрибутів зв'язків у кадрів загального призначення;
- динамічним призначенням зв'язків з ідентифікатором "<page>", у процесі відкриття кадру загального призначення за сигналом від іншого віджета.
Розглянемо приклад, коли є кадр загального призначення "Панель контролю графіком" та багато "Графіків" на різних кадрах. "Панель контролю графіком" має зв'язки з шаблонами:
- tSek -> "<page>|tSek"
- tSize -> "<page>|tSize"
- trcPer -> "<page>|trcPer"
- valArch -> "<page>|valArch"
При цьому, кожний віджет "Графік" має атрибути "tSek", "tSize", "trcPer" та "valArch". За викликом сигналу відкриття "Панелі контролю графіком" з будь-якого віджету "Графік", відбувається зв'язування атрибутів "Панелі контролю графіком" з атрибутами віджету "Графік", згідно шаблону. як результат, всі зміни на "Панелі контролю графіком" будуть відображатися на графіку, за посередництвом цих зв'язків.
Якщо у віджета "Графік" наявні зовнішні зв'язки на параметри підсистеми "Збір даних", зв'язки "Панелі контролю графіком" будуть встановлюватися на зовнішнє джерело. Крім того, якщо у "Панелі контролю графіком" будуть заявлені зв'язки на атрибути, відсутні безпосередньо у віджета "Графік", то буде здійснюватися пошук наявності таких атрибутів у зовнішнього джерела — першого на який встановлено прямий зв'язок, виконуючи, тим самим, доповнення відсутніх зв'язків.
Для наочного зображення цього механізмі наведено таблицю.
Таблиця. Механізм динамічної лінковки.
Атрибути "Панелі контролю графіком" (шаблон динамичного зв'язку) | Атрибути "Графіка" | Атрибути зовнішнього "Параметру" | Результуючий зв'язок або значення атрибута, що зв'язується |
---|---|---|---|
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.11 Архітектура
Виходячи з вищевикладених, архітектурних, міркувань сформуємо статичну діаграму класів СВУ, враховуючи поділ на концептуальну частину (рушій) та частину індивідуальної реалізації СВУ (рис.4.11.1). У таблиці 4.11 представлено опис класів діаграми класів.
Таблиця 4.11. Класи СВУ
Класс | Відповідальність | Зв'язки |
---|---|---|
TSecurity | Надає інформацію про користувачів, а також виконує їх аутентифікацію у OpenSCADA. | Використовується віджетами та кадрами СВУ для перевірки прав на доступ до них. |
TFunction | Використовується для доступу до механізму користувацького програмування при описі логіки похідних віджетів, а також для включення функцій API об'єктної моделі до похідних віджетів. | Зберігає структуру параметрів, що обв'язуються логікою, у похідних віджетах. Передається модулю, що надає реалізацію мови користувацького програмування, з метою підключення механізму обробки логіки програми. |
TUI | Кореневий об'єкт модуля підсистеми "Користувацькі інтерфейси", що використовується для інтеграції у ядро OpenSCADA. | Успадковується кореневими об'єктами модуля концепції СВУ та модулями реалізації інтерфейсу СВУ. |
VCA::Engine | Кореневий об'єкт модуля концепції/рушія СВУ. Містить контейнери об'єктів рушія, а також загальні методи та дані. | Використовується інтерфейсами візуалізації для доступу до даних сеансів та концепції загалом. Інтегрує код концепції СВУ до OpenSCADA. |
VCA::WidgetLib | Об'єкт бібліотеки віджетів/кадрів, містить об'єкти бібліотечних віджетів (VCA::LWidget). Склад бібліотек віджетів може вільно формуватися користувачем. | Містить об'єкти бібліотечних віджетів (VCA::LWidget). |
VCA::Widget | Абстрактний об'єкт віджету. | Успадковується об'єктами: бібліотечного віджета (VCA::LWidget), контейнерного віджета (VCA::CWidget), сторінки проєкту (VCA::Page) та об'єктами сеансу (VCA::SessPage, VCA::SessWdg). Віджет-контейнер містить функцію, пов'язану з реалізацією мови користувацького програмування. Використовує об'єкт "OpenSCADA API TSecurity" для управління правами доступу. Використовує події з менеджеру подій. Звертається до менеджеру тем для отримання безпосередніх значень кольорів та шрифтів, згідно поточної теми. |
VCA::LWidget | Об'єкт бібліотечного віджета/кадру. | Зберігається у бібліотеці (VCA::WidgetLib). Може містити вкладені віджети, у особі об'єктів контейнерних віджетів (VCA::CWidget). |
VCA::CWidget | Об'єкт контейнерного віджету бібліотечного віджету/кадру (VCA::LWidget). Фактично виконує роль посилання на бібліотечний віджет. | Міститься у бібліотечному кадрі/віджеті (VCA::LWidget). |
VCA::Project | Об'єкт проєкту користувацького інтерфейсу. Містить сторінки (VCA::Page) з ієрархічним найменуванням. | Міститься у контейнері об'єкту концепції (VCA::Engine). Містить об'єкти сторінок (VCA::Page) проєкту. |
VCA::Page | Об'єкт сторінки інтерфейсу ВУ. Тісно пов'язаний з кадром із бібліотеки віджетів, власне кадр і несе у собі елементи інтерфейсу. Сам об'єкт сторінки, додатково до кадру, розв'язує посилання на динаміку та надає механізм розшарування динаміки кадру на сторінки, з можливістю формування шаблону динаміки. | Міститься у контейнері проєкту. Успадковується від абстрактного віджета (VCA::Widget). Пов'язується з кадром інтерфейсу (VCA::LWidget) у бібліотеці віджетів. |
VCA::Theme | Об'єкт теми інтерфейсу візуалізації. Містить елементи теми (VCA::ThemeEl) | Міститься у контейнері об'єкту рушія (VCA::Engine). Зберігає елементи теми (VCA::ThemeEl). |
VCA::ThemeEl | Об'єкт елементу теми. Містить асоціацію ім'я елементу з кодом кольору та шрифту. | Міститься у контейнері теми (VCA::Theme). Використовується об'єктом віджету (VCA::Widget) для отримання значень кольору та шрифту за іменем елементу теми. |
VCA::EventMap | Об'єкт карти подій. Містить об'єкти подій (VCA::Event). | Міститься у контейнері об'єкту рушія (VCA::Engine). Зберігає опис події (VCA::Event). |
VCA::Event | Об'єкт події, містить асоціацію ім'я об'єкту(події) з реальною подією. | Міститься у контейнері карти подій (VCA::EventMap). |
VCA::Session | Об'єкт сеансу виконання проєкту візуалізації. Відкривається модулем інтерфейсу візуалізації та використовує, надалі, дані сеансу для візуалізації своїм методом. Всі обчислення інтерфейсів візуалізації виконуються саме у сеансі. | Міститься у проєкті інтерфейсу візуалізації. Містить об'єкти сторінок сеансу з даними виконання. Використовується модулями інтерфейсів візуалізації для відображення даних сеансу. |
VCA::SessPage | Об'єкт сторінки сеансу. Містить динамічні дані сторінки проєкту над якими виконує потрібні обчислення. | Міститься у об'єкті сеансу проєкту (VCA::Session). Успадковується від абстрактного віджета (VCA::Widget). Використовує об'єкт сторінки проєкту (VCA::Page), як джерело вихідних параметрів. |
VCA::SessWdg | Об'єкт віджету сеансу. Містить динамічні дані окремого елементу кадру над яким виконує потрібні обчислення. Може вкладатися один у другий згідно ієрархії віджетів кадру. | Міститься у об'єкті сторінки сеансу (VCA::SessPage) або у вищому за ієрархією об'єкті цього типу. Успадковується від абстрактного віджета (VCA::Widget). Використовує об'єкт бібліотечного (VCA::LWidget) та/або контейнерного (VCA::CWidget) віджету як джерело вихідних параметрів. Використовується модулем інтерфейсу візуалізації у ролі джерела динамічних даних для візуалізації. |
TVision, TWebGUI | Кореневі об'єкти модуля інтерфейсу візуалізації, побудовані на основі бібліотеки Qt та Web-технологій. Надають доступ до засобам виконання та розробки інтерфейсів візуалізації у середовищі використаної технології. | Надають доступ до середовища виконання та розробки. інтегрують код інтерфейсу візуалізації до OpenSCADA. |
VRunTime, WebRunTime | Об'єкти середовища виконання інтерфейсу візуалізації на основі бібліотеки Qt та Web-технологій. Безпосередньо надають користувацький інтерфейс візуалізації та управління. | Міститься у кореневих об'єктах модулів візуалізації. Підключаються та використовують дані об'єкту сеансу (VCA::Session) концепції СВУ. Згідно структури сеансу, містять багато спеціалізованих об'єктів безпосереднього відображення. |
VDevelop, WebDevelop | Об'єкти середовища розробки інтерфейсу візуалізації на основі бібліотеки Qt та Web-технологій. Надають інтерфейс інструменту над даними концепції, для розробки інтерфейсів ВУ. | Містяться у кореневих об'єктах модулів візуалізації. Підключаються до об'єкту кореня концепції СВУ (VCA::Engine) та надають графічний інтерфейс управління нею. Згідно структури концепції, містять багато спеціалізованих об'єктів управління. |
Статична діаграма класів не розкриває всієї ієрархії взаємодії об'єктів, заснованих на абстрактному об'єкті VCA::Widget, що пов'язано з неявним наслідуванням даних властивостей віджетів через всі шари рушія, а також тонкощами наслідування, вибудованого шляхом використання даних одних віджетів у інших. Для роз'яснення цих особливостей зображено вичерпну карту "використального" наслідування у розділі 4.5.
4.12 Примітиви віджетів
Будь-який наново створюваний віджет засновується на одному з декількох примітивів — кінцевому елементі візуалізації, шляхом встановлення родинних зв'язків як прямо на примітив, так і посередництвом декільком проміжних користувацьких віджетів. Кожний з примітивів містить механізм моделі даних. Екземпляр віджету зберігає значення властивостей власної конфігурації примітиву.
До завдань інтерфейсу візуалізації входить підтримка та робота з моделлю даних примітивів віджетів. Примітиви віджетів повинні бути ретельно опрацьовані та уніфіковані, з метою охопити як можна більше можливостей у як можна меншій кількості слабко пов'язаних один з одним, по призначенню, примітивів.
Таблиця. Бібліотека примітивів віджетів — базові елементи відображення
Ідентифікатор | Найменування | Функція |
---|---|---|
ElFigure | Елементарна графічна фігура |
Примітив є основою відмальовки елементарних графічних фігур зі всілякими комбінаціями їх у одному об'єкті. Передбачається підтримка наступних елементарних фігур:
Для всіх фігур, що містяться у віджеті, встановлюються єдині властивості товщини, кольору та інше, також, передбачається можливість указання вищеперелічених атрибутів для кожної фігури окремо та їх динамізація. |
FormEl | Елемент форми |
Включає підтримку стандартних компонентів форми:
|
Text | Текст | Елемент тексту-мітка. Характеризується типом шрифту, кольором, орієнтацією та вирівнюванням. Передбачається підтримка аргументів. |
Media | Медіа | Елемент відображення растрових та векторних зображень різних форматів, програвання анімованих зображень, програвання аудіо-фрагментів та перегляд відео-фрагментів. |
Diagram | Діаграма | Елемент діаграми з підтримкою можливості відображення декількох потоків у реальному часі для: трендів (часових графіків), частотного спектру, XY діаграм. |
Protocol | Протокол | Елемент протоколу — візуалізатор повідомлень програми, з підтримкою декількох режимів роботи. |
Document | Документ | Елемент формування звітів, журналів та іншої документації на основі доступних даних. |
Box | Контейнер | Містить механізм розташування-включення інших віджетів для формування нових, більш складних, віджетів та сторінок кінцевої візуалізації. |
Function, у планах | Функція API об'єктної моделі OpenSCADA | Невізуальний віджет, на боці виконання, що дозволяє включати обчислювальні функції об'єктної моделі OpenSCADA до СВУ. |
Таблиця. Загальний набір властивостей/атрибутів віджету
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
id | Ідентифікатор | - | Ідентифікатор елементу. Атрибут тільки для читання, прикликаний надати інформацію про ідентифікатор елементу. |
path | Путь | - | Шлях до цього віджету. Атрибут тільки для читання та надання вичерпної інформації про розташування елементу. |
parent | Батько | - | Шлях до батьківського віджету. Атрибут тільки для читання та надання інформації про розташування предку від якого успадковано віджет. |
owner | Власник | - | Власник та групи віджету, у вигляді "{власник}:{группа[,группа2,группаN]}", по замовченню "root:UI". |
perm | Доступ | - |
Права доступу до віджету, у вигляді "{користувач}{групи}{інші}" плюс ознака наслідування, що вмикає наслідування власника та його прав від вищестоящого віджету.
По замовченню 01000 — наслідування. |
root | Корінь | 1 | Ідентифікатор віджету-примітиву (базового елементу), який лежить у основі образу візуалізації віджету. |
name | Ім'я | - | Ім'я елементу. Доступне до модифікації ім'я елементу. |
dscr | Опис | - | Опис елементу. Текстове поле короткого опису. |
en | Ввімкнено | 5 | Стан "Ввімкнено" елементу. Вимкнений елемент не відображається при виконані. |
active | Активний | 6 | Стан "Активний" елементу. Активний елемент може отримувати фокус при виконанні, тобто — отримувати клавіатурні та інші події з подальшою їх обробкою. |
geomX | Геометрія: x | 7 | Геометрія, координата 'x' положення елементу. |
geomY | Геометрія: y | 8 | Геометрія, координата 'y' положення елементу. |
geomW | Геометрія: ширина | 9 | Геометрія, ширина елементу. |
geomH | Геометрія: висота | 10 | Геометрія, висота елементу. |
geomXsc | Геометрія: x масштаб | 13 | Масштаб елемента по горизонталі. |
geomYsc | Геометрія: y масштаб | 14 | Масштаб елемента по вертикалі. |
geomZ | Геометрія: z | 11 | Геометрія, координата 'z' (рівень) елемента на кадрі. Також визначає порядок передачі фокусу між активними елементами. |
geomMargin | Геометрія: відступ | 12 | Геометрія, поля-відступи елементу. |
tipTool | Допомога: підказка | 15 | Текст короткої допомоги або підказки по даному елементу. Типово реалізується як спливаюча підказка, при утримані курсору миші над елементом. |
tipStatus | Допомога: стан | 16 |
Текст інформації про стан елементу або рекомендації до дії над елементом. Типово реалізується у вигляді повідомлення у рядку статусу, при утримувані курсору миші над елементом.
|
contextMenu | Контекстне меню | 17 |
Контекстне меню у вигляді переліку рядків: "{ItName}:{Signal}".
|
evProc | Обробка подій | - |
Атрибут зберігання сценарію обробки подій безпосереднього управління користувацьким інтерфейсом. Сценарій представляє собою перелік команд інтерфейсу візуалізації, що генеруються при надходженні події (атрибут event). Пряма обробка подій для управління сторінками у вигляді: "{event}:{evSrc}:{com}:{prm}". Де:
Приклади:
|
Додаткові атрибути елементів, поміщених до проєкту у ролі сторінки. | |||
pgOpen | Сторінка: відкрита | - |
Ознака "Сторінка відкрита".
|
pgNoOpenProc | Сторінка: обробляти закритою | - | Ознака "Виконувати сторінку навіть якщо вона закрита". |
pgOpenSrc | Сторінка: джерело відкриття | 3 |
Повня адреса сторінки, що відкрила дану.
|
pgGrp | Сторінка: група | 4 | Група сторінок. ПОРОЖНЯ та "main" група передбачають використання цієї сторінки як Кореневу-основну сторінку, тож така буде замінювати інші Кореневі-головні сторінки; група "fl" призначена для використання у зовнішніх вікнах, які передбачено для багаторазового одночасного відкриття та які не мають відстежуватися на дублікати; решта передбачено для включення у контейнери-бокси або одноразового одночасного відкриття, тож вони примусово перевіряються на дублікати, коли останнє відкривається, а попередні закриваються. |
Додаткові атрибути режиму виконання — сеансу. (Віртуальні атрибути не доступні у процедурі віджету) | |||
event | Події | - | Спеціальний атрибут збору подій віджету у переліку, поділеному новим рядком. Доступ до атрибуту захищено критичною секцією для запобігання втрати подій. Атрибут завжди доступний у процедурі віджету. |
load | Завантаження | -1 | Віртуальна команда групового завантаження даних. |
focus | Фокус | -2 | Спеціальний атрибут індикації факту отримання фокусу, активним віджетом. Атрибут цього віджету та вкладених віджетів доступний у процедурах віджету. |
perm | Доступ | -3 | Віртуальний атрибут прав активного користувача на перегляд та контроль над віджетом. |
- * — Спеціальна функція атрибуту віджета, виконувана у сеансі проєкту при користувацькій модифікації.
Рушій середовища візуалізації передбачає активацію атрибутів, специфічних до візуалізатору. Процес активації здійснюється при відкритті сеансу візуалізації проєкту та передбачає, у цьому проєкті: створення специфічного атрибуту з вказаними властивостями, якщо він відсутній, та активацію відстеження його модифікації рушієм середовища візуалізації, як для атрибутів формування образів примітивів. Для безпосереднього визначення такого атрибута можна також використовувати префікс ідентифікатору атрибуту "vs_", що швидше і виключає стадію активації. З переліком специфічних до візуалізатора атрибутів можна ознайомитися у документації відповідного візуалізатора.
4.12.1 Елементарна графічна фігура (ElFigure)
Примітив є основою відмальовки елементарних графічних фігур з різноманітною їх комбінацією у одному об'єкті. Враховуючи широкий спектр можливих фігур, які повинен підтримувати примітив, та, у цей-же час, бути достатньо простим у використанні та, по можливості, у реалізації, було вирішено обмежити перелік базових фігур, використаних для побудови результуючих графічних об'єктів, до таких: лінія, дуга, крива Без'є та заливка замкнених контурів. Ґрунтуючись вже на цих базових фігурах, можна будувати довільні фігури, комбінуючи базові. У рамках примітиву існує можливість завдання прозорості кольору у діапазоні [0...255], де '0' — повна прозорість.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елементарна фігура (ElFigure)"
4.12.2 Елемент форми (FormEl)
Примітив, призначений для надання, у розпорядження користувача, стандартних елементів форми. Загальний перелік атрибутів залежить від типу елементу.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент форми (FormEl)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
elType | Тип елементу | 20 | Тип елементу, від значення якого залежить перелік додаткових атрибутів:
|
Рядок редагування: | |||
value | Значення | 21 | Вміст рядку. |
view | Вид | 22 | Вид рядка редагування:
|
cfg | Конфігурація | 23 |
Конфігурація рядку. Формат значення даного поля для різних видів рядка:
|
confirm | Підтверджувати | 24 | Включення режиму підтвердження. |
font | Шрифт | 25 |
Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}", де:
Приклади:
|
Редактор тексту: | |||
value | Значення | 21 | Вміст редактору. |
wordWrap | Перенесення слів | 22 | Автоматичний перенесення тексту за словами. |
confirm | Підтверджувати | 24 | Включення режиму підтвердження. |
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
Прапорець: | |||
name | Ім'я | 26 | Ім'я/мітка прапорця. |
value | Значення | 21 | Значення прапорця. |
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
Кнопка: | |||
name | Ім'я | 26 | Ім'я-надпис на кнопці. Допустимі символи '\n' для можливості вводу багаторядних надписів. |
value | Значення | 21 |
Значення, відрізняється для різних режимів:
|
img | Зображення | 22 |
Зображення на кнопці. Ім'я зображення у вигляді "[{src}:]{name}", де:
Приклади:
|
color | Колір | 23 |
Колір кнопки. Ім'я кольору у вигляді "{color}[-{alpha}]", де:
Приклади:
|
colorText | Колір: текст | 27 | Колір тексту (деталі вище). |
mode | Режим | 24 |
Режим роботи кнопки:
|
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
Список: | |||
value | Значення | 21 | Поточне значення списку. |
items | Елементи | 22 | Перелік елементів списку. |
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
mult | Множинний вибір | 23 | Дозволяти вибір множини елементів списку. |
Вибір зі списку, Дерево: | |||
value | Значення | 21 | Поточне значення переліку. |
items | Елементи | 22 | Перелік елементів списку або ієрархічних елементів дерева у вигляді шляху "/{КАТ}/{КАТ}/{ЕЛЕМ}". |
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
Таблиця: | |||
set | Значення встановлення | 23 | Значення редагування клітинки таблиці з адресою у події "ws_TableEdit_{colN}_{rowN}". |
value | Значення | 21 |
Адреса обраного елементу. Зміна супроводжується подією "ws_TableChangeSel". Формат адреси залежить від режиму обрання таблиці:
|
items | Елементи | 22 |
Структура та вміст таблиці у вигляді XML: <tbl>
<h><s>{Заголовок1}</s><s>{Заголовок2}</s></h>
<r><s>{Рядок1Стовпчик1Рядок}</s><i>{Рядок1Стовпчик2Ціле}</i></r>
<r><b>{Рядок2Стовпчик1Логічне}</b><r>{Рядок2Стовпчик2Реальне}</r></r>
</tbl>
Теги:
|
font | Шрифт | 25 | Ім'я шрифту у вигляді "{family} {size} {bold} {italic} {underline} {strike}" (деталі вище). |
Слайдер та стрічка гортання: | |||
value | Значення | 21 | Положення слайдеру. |
cfg | Конфігурація | 22 |
Конфігурація слайдеру у форматі: "{ВертОрієнт}:{Мінімум}:{Максимум}:{ОдинКрок}:{СторКрок}".
|
4.12.3 Елемент тексту (Text)
Даний примітив призначено для виводу простого та HTML тексту, що використовується у ролі міток та різних підписів. З метою створення декоративних оформлень, примітив підтримує обведення тексту рамкою.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент тексту (Text)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
backColor | Фон: колір | 20 |
Фоновий колір. Ім'я кольору у виді "{color}[-{alpha}]", де:
Приклади:
|
backImg | Фон: зображення | 21 |
Фонове зображення. Ім'я зображення у виді "[{src}:]{name}", де:
Приклади:
|
bordWidth | Границя: ширина | 22 | Ширина бордюру. |
bordColor | Границя: колір | 23 | Колір бордюру (детальніше у атрибуті 20). |
bordStyle | Границя: стиль | 24 | Стиль бордюру: "Немає" (0), "Точковий" (1), "Пунктирний" (2), "Суцільний" (3), "Подвійний" (4), "Канавка" (5), "Кромка" (6), "Втиснутий" (7), "Виступаючий" (8). |
font | Шрифт | 25 |
Ім'я шрифту у виді "{family} {size} {bold} {italic} {underline} {strike}", де:
Приклади:
|
color | Колір | 26 | Колір тексту (детальніше у атрибуті 20). |
orient | Кут повороту | 27 | Орієнтація тексту, кут повороту. |
wordWrap | Перенесення слів | 28 | Автоматичне перенесення тексту за словами. |
alignment | Вирівнювання | 29 | Вирівнювання тексту: "Зверху ліворуч" (0), "Зверху праворуч" (1), "Зверху у центрі" (2), "Зверху по ширині" (3), "Знизу ліворуч" (4), "Знизу праворуч" (5), "Знизу у центрі" (6), "Знизу по ширині" (7), "У центрі ліворуч" (8), "У центрі праворуч" (9), "У центрі" (10), "У центрі по ширині" (11). |
inHtml | В HTML | 31 | Відображення та підтримка вмісту аргументу text у HTML. |
text | Текст | 30 | Значення тексту. Використовуйте "%{x}" для розташування значення аргументу "x" (від 1). |
numbArg | Кількість аргументів | 40 | Кількість аргументів. |
Атрибути аргументів | |||
arg{x}val | Аргумент {x}: значення | 50+10*x | Значення аргументу x. |
arg{x}tp | Аргумент {x}: тип | 50+10*x+1 | Тип аргументу x: "Цілий" (0), "Реальний" (1), "Рядок" (2). |
arg{x}cfg | Аргумент {x}: конфігурація | 50+10*x+2 |
Конфігурація аргументу x:
|
4.12.4 Елемент відображення медіа-матеріалів (Media)
Даний примітив призначено для програвання різних медіа-матеріалів, починаючи від простих зображень та закінчуючи повноцінними аудіо та відео потоками.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент відображення медіа-матеріалів (Media)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
backColor | Фон: колір | 20 |
Фоновий колір. Ім'я кольору у виді "{color}[-{alpha}]", де:
Приклади:
|
backImg | Фон: зображення | 21 |
Фонове зображення. Ім'я зображення у виді "[{src}:]{name}", де:
Приклади:
|
bordWidth | Границя: ширина | 22 | Ширина бордюру. |
bordColor | Границя: колір | 23 | Колір бордюру (детальніше у атрибуті 20). |
bordStyle | Границя: стиль | 24 | Стиль бордюру: "Немає", "Точковий", "Пунктирний", "Суцільний", "Подвійний", "Канавка", "Кромка", "Втиснутий", "Виступаючий". |
src | Джерело | 25 |
Ім'я джерела медіа у виді "[{src}:]{name}", де:
Приклади:
|
type | Тип | 27 |
Тип медіа:
|
areas | Області карти | 28 | Кількість активних областей. |
Атрибути зображення (Image) | |||
fit | Заповнювати віджет | 26 | Ознака "Погоджувати вміст з розміром віджету". |
Атрибути анімації-відеоролику (Animation) | |||
fit | Заповнювати віджет | 26 | Ознака "Погоджувати вміст з розміром віджету". |
speed | Швидкість програвання | 29 | Швидкість програвання, у відсотках від оригінальної швидкості. Якщо значення менше або дорівнює 1% то програвання припиняється. |
Атрибути повноформатного відео (Full video) | |||
play | Грати | 29 | Відео/аудіо — "Грати". |
roll | Завертати програвання | 30 | Повторення програвання по завершенню. |
pause | Пауза | 31 | Призупиняти програвання. |
size | Розмір | 32 | Загальний розмір відео, у мілісекундах. |
seek | Положення | 33 | Позиція програвання відео, у мілісекундах. |
volume | Гучність | 34 | Гучність звуку [0...100]. |
Активні області | |||
area{x}shp | Область {x}: образ | 40+3*x | Вид області x: "Квадрат", "Полілінія", "Коло". |
area{x}coord | Область {x}: координати | 40+3*x+1 | Координати області x, через кому йдуть координати: "x1,y1,x2,y2,xN,yN". |
area{x}title | Область {x}: заголовок | 40+3*x+2 | Заголовок області x. |
4.12.5 Елемент побудови діаграм (Diagram)
Цей примітив призначено для побудови різних діаграм у часі, включаючи графіки-тренди відображення поточного процесу та архівних даних. Реалізовано наступні типи діаграм:
- "Графік-тренд" — будує графік значень параметру у часі.
- "Спектр" — будує частотний спектр із значень параметрів. Вікно даних частотного спектру формується виходячи із розміру віджету по горизонталі, у пікселях, та доступних даних параметрів, накладених на ґратку горизонтального розміру. У зв'язку з цим, мінімальна виділювана частота визначається значенням атрибуту "tSize" — "1/tSize", а максимальна, половинною шириною графіка у пікселях помноженою на мінімальну частоту "width/(2*tSize)".
- "XY" — будує двомірний графік значень параметрів, парами на графік, де парні по осі Y (0,2,4...) та непарні по осі X (1,3,5...). Вказаний діапазон часу даних використовується у отримані значень параметрів осі X та Y, з подальшим зображенням.
Для всіх типів діаграм можливе визначення, у якості джерела даних:
- параметру підсистеми "Збір Даних";
- архіву значень;
- прямого блоку даних користувача.
Підтримується режим слідкування за поточними значеннями та значеннями з архіву, а також, можлива побудова графіків параметрів, що не мають архіву значень, шляхом накопичення поточних значень у буфері діаграми та тільки на момент активного відображення цієї діаграми.
Процес доступу до архівних даних оптимізовано шляхом введення проміжного буферу відображення, а також, упаковки трафіку даних при запиті, шляхом приведення даних до якості достатньої для відображення.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент побудови діаграм (Diagram)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
backColor | Фон: колір | 20 |
Фоновий колір. Ім'я кольору у виді "{color}[-{alpha}]", де:
Приклади:
|
backImg | Фон: зображення | 21 |
Фонове зображення. Ім'я зображення у виді "[{src}:]{name}", де:
Приклади:
|
bordWidth | Границя: ширина | 22 | Ширина бордюру. |
bordColor | Границя: колір | 23 | Колір бордюру (детальніше у атрибуті 20). |
bordStyle | Границя: стиль | 24 | Стиль бордюру: "Немає", "Точковий", "Пунктирний", "Суцільний", "Подвійний", "Канавка", "Кромка", "Втиснутий", "Виступаючий". |
trcPer | Період стеження, секунд | 25 | Режим та періодичність стеження. |
type | Тип | 26 | Тип діаграми: "Графік", "Спектр", "XY". |
Атрибути, загальні для всіх типів | |||
tSek | Час: секунди | 27 | Поточний час, секунд. |
tUSek | Час: мікросекунди | 28 | Поточний час, мікросекунди. |
tSize | Розмір, секунди | 29 | Розмір даних, секунди. |
curSek | Курсор: секунди | 30 | Положення курсору, секунди. |
curUSek | Курсор: мікросекунди | 31 | Положення курсору, мікросекунди. |
curColor | Курсор: колір | 32 | Колір курсору. |
sclColor | Шкала: колір | 33 | Колір шкали-решітки (детальніше у атрибуті 20). |
sclHor | Шкала: горизонтальна | 34 | Режим горизонтальної шкали-решітки: "Не зображувати", "Ґратка", "Маркери", "Ґратка та маркери", "Ґратка (лог)", "Маркери (лог)", "Ґратка та маркери (лог)". |
sclHorScl | Шкала: гориз. масштаб (%) | 44 | Горизонтальний масштаб графіку у відсотках, виключно для типу "XY". |
sclHorSclOff | Шкала: зміщ. гориз. масштабу (%) | 45 | Зміщення горизонтального масштабу у відсотках, виключно для типу "XY". |
sclVer | Шкала: вертикальна | 35 | Режим вертикальної шкали-решітки: "Не зображувати", "Ґратка", "Маркери", "Ґратка та маркери", "Ґратка (лог)", "Маркери (лог)", "Ґратка та маркери (лог)". |
sclVerScl | Шкала: верт. масштаб (%) | 40 | Вертикальний масштаб графіку у відсотках. |
sclVerSclOff | Шкала: зміщ. верт. масштабу (%) | 41 | Зміщення вертикального масштабу у відсотках. |
sclMarkColor | Шкала: Маркери: колір | 36 | Колір маркерів шкали-решітки (детальніше у атрибуті 20). |
sclMarkFont | Шкала: Маркери: шрифт | 37 |
Шрифт маркерів шкали-решітки. Ім'я шрифту у виді "{family} {size} {bold} {italic} {underline} {strike}", де:
Приклади:
|
valArch | Архіватор значень | 38 | Архіватор значень у вигляді "{МодульАрхівів}.{IdАрхіватору}". |
valsForPix | Значень на піксель | 42 | Кількість значень на піксель. Збільшити для розширення точності експорту на великих інтервалах часу. |
parNum | Кількість параметрів | 39 | Кількість параметрів, що відображаються на одному тренді. |
Атрибути типу: "Графік" | |||
sclHorPer | Шкала: розмір гор. ґратки, секунди | 43 | Фіксований період ґратки горизонтальної шкали — вимикає автоматичне обчислення періоду ґратки. Активується якщо кількість періодів на загальний розмір більш двох та розмір одного періоду не менше 15 пікселів. |
Індивідуальні атрибути параметрів | |||
prm{X}addr | Параметр {X}: адреса | 50+10*{X} |
Повна адреса до атрибуту параметру X DAQ або архіву.
Приклад:
|
prm{X}bordL | Параметр {X}: границя відображ.: нижня | 50+10*{X}+1 | Нижня границя значень параметру X. |
prm{X}bordU | Параметр {X}: границя відображ.: верхня | 50+10*{X}+2 | Верхня границя значень параметру X. |
prm{X}color | Параметр {X}: колір | 50+10*{X}+3 | Колір відображення графіку параметру X (детальніше у атрибуті 20). |
prm{X}width | Параметр {X}: ширина | 50+10*{X}+6 | Ширина лінії графіку параметра X, у пікселях. |
prm{X}scl | Параметр {X}: шкала | 50+10*{X}+5 | Режим окремої вертикальної шкали параметру X: "Глобально", "Маркери", "Ґратка та маркери", "Маркери (лог)", "Ґратка та маркери (лог)". |
prm{X}val | Параметр {X}: значення | 50+10*{X}+4 | Значення параметру X під курсором, або на поточний час, для типа "XY". |
prm{X}prop | Параметр {X}: властивості | 50+10*{X}+7 | Властивості реального архіву у вигляді "{BegArh}:{EndArh}:{DataPeriod}", де "BegArh", "EndArh", "DataPeriod" — початок, кінець та період даних архіву, у секундах, у реальному представлені, безпосередньо до мікросекунд (1e-6). |
4.12.6 Елемент побудови протоколів на основі архівів повідомлень (Protocol)
Цей примітив призначено для візуалізації даних архіву повідомлень шляхом формування протоколів з різними способами візуалізації, починаючи від статичного сканувального перегляду та закінчуючи динамічним стеженням.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент побудови протоколів на основі архівів повідомлень (Protocol)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
backColor | Фон: колір | 20 |
Фоновий колір. Ім'я кольору у виді "{color}[-{alpha}]", де:
Приклади:
|
backImg | Фон: зображення | 21 |
Фонове зображення. Ім'я зображення у виді "[{src}:]{name}", де:
Приклади:
|
font | Шрифт | 22 |
Ім'я шрифту у виді "{family} {size} {bold} {italic} {underline} {strike}", де:
Приклади:
|
headVis | Заголовок видимий | 23 | Видимість заголовку таблиці. |
time | Час, секунди | 24 | Поточний час, секунди. |
tSize | Розмір, секунди | 25 | Розмір запиту даних, секунди. Встановіть значення у '0' для отримання всіх порушень, для "lev" < 0. |
trcPer | Період стеження, секунди | 26 | Режим та періодичність стеження. |
arch | Архіватор | 27 | Архіватор повідомлень у вигляді "{МодульАрхівів}.{IdАрхіватору}". |
tmpl | Шаблон | 28 |
Шаблон категорії або регулярний вираз "/{re}/". Для шаблона зарезервовано символи:
|
lev | Рівень | 29 | Рівень повідомлень. Встановіть значення < 0 для отримання поточних порушень. |
viewOrd | Порядок відображення | 30 | Порядок відображення: "За часом", "За рівнем", "За категорією", "За повідомленням", "За часом (обернений)", "За рівнем (обернений)", "За категорією (обернений)", "За повідомленням (обернений)". |
col | Показати стовпчики | 31 |
Перелік видимих та порядок стовпчиків, поділених символом ';'. Передбачаються стовпчики:
|
itProp | Властивості елементу | 32 | Кількість властивостей елементу. |
Індивідуальні атрибути властивостей елемента | |||
it{X}lev | Елемент {X}: рівень | 40+5*{X} | Критерій: рівень елементу X більш або дорівнює вказаному. |
it{X}tmpl | Елемент {X}: шаблону | 40+5*{X}+1 | Критерій: шаблон категорії елементу X (детальніше у атрибуті 28). |
it{X}fnt | Елемент {X}: шрифт | 40+5*{X}+2 | Шрифт елементу X (детальніше у атрибуті 22). |
it{X}сolor | Елемент {X}: кольору | 40+5*{X}+3 | Колір елементу X (детальніше у атрибуті 20). |
4.12.7 Елемент формування звітної документації (Document)
Примітив призначено для формування звітної, оперативної та іншої документації на основі шаблонів документів.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Елемент формування звітної документації (Document)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
style | CSS | 20 | Правила CSS в рядках, виду "body { background-color:#818181; }". |
tmpl | Шаблон | 21 |
Шаблон документу у XHTML, починаючи з тегу "body" та включаючи процедурні вставки: <body docProcLang="JavaLikeCalc.JavaScript">
<h1>Значення<?dp return wCod+1.314;?></h1>
</body>
|
doc | Документ | 22 | Фінальний документ у XHTML, починається з тегу "body". |
font | Шрифт | 26 |
Базовий шрифт тексту документа. Ім'я шрифту у виді "{family} {size} {bold} {italic} {underline} {strike}", де:
Приклади:
|
bTime | Час: початок | 24 | Час початку документу, секунди. |
time | Час: поточне | 23 | Час генерації документу, секунди. Записати час для генерації документа від цієї точки або нуль для перегенерації. |
process | У процесі | 27 | Ознака процесу формування документу окремим потоком. |
n | Розмір архіву | 25 | Кількість документів або глибина архіву. |
Атрибути увімкненого режиму архівування | |||
aCur | Архів: курсор: поточний | - | Позиція поточного документу у архіві. Запис значення <0 здійснює архівацію поточного документу. |
vCur | Архів: курсор: вид | - |
Поточний візуалізований документ архіву. Запис значення:
|
aDoc | Архів: поточний документ | - | Поточний документ архіву у XHTML, починається з тегу "body". |
aSize | Архів: розмір | - | Реальний розмір архіву документу. |
Можливості примітиву "Документ":
- Гнучке формування структури документу на основі мови гіпертекстової розмітки, що надає підтримку широких можливостей форматування документів.
- Формування документів за командою або розкладом, що необхідно для формування звітної документації до архіву, з подальшим переглядом архіву.
- Формування документів у режимі реального часу, для надання їх повністю динамічно та на основі архівів за вказаний час.
- Використання атрибутів віджету для передачі у документ значень та адрес на архіви, що дозволяє використовувати віджет документу як шаблон, при формуванні звітів з іншими вхідними даними.
У основі будь-якого документу лежить XHTML-шаблон. XHTML-шаблон це тег "body" WEB-сторінки, що містить статику документу у стандарті XHTML 1.0 та елементи виконувальних інструкцій на мові користувацького програмування OpenSCADA, у вигляді <?dp {procedure} ?>. Результуючий документ формується шляхом виконання процедур та вставки їх результату у документ.
Джерелом значень виконуваних інструкцій є атрибути віджету цього примітиву, а також всі механізми мови користувацького програмування OpenSCADA. Атрибути можуть додаватися користувачем та лінкуватися на реальні атрибути параметрів або-ж бути автономними, значення яких будуть формуватися у процедурі віджету. У випадку зі злінкованими атрибутами, значення можуть вийматися з архіву-історії.
На рисунку зображено структурну схему віджету примітива "Документ". Згідно цієї структури, "Документ" містить: XHTML-шаблон, результатні документи та процедуру обробки даних. Джерелом даних процедури та результатних документів є атрибути віджету.
Передбачено роботу віджету у двох режимах: "Динамічний" та "Архівний". Відмінністю архівного режиму є наявність архіву визначеної глибини та атрибутів, що дозволяють керувати процесом архівування та перегляду вказаного документу у архіві.
Генерація документу завжди здійснюється у момент встановлення атрибуту часу time відносно встановленого раніш початкового часу документу у атрибуті bTime. При вимкненому архіві, результатний документ поміщається безпосередньо у атрибут doc. При увімкненому архіві, результатний документ поміщається до клітинки під курсором, атрибут aCur, а також у doc, якщо значення курсору архіву aCur та курсору візуалізованого документу vCur збігаються. Атрибути архівних курсорів передбачають декілька командних значень:
- "aCur < 0" — переміщує курсор архіватору на наступну позицію, тим самим залишаючи попередній документ у архіві та очищаючи документ під курсором, якщо кільцевий архів замкнувся.
- "vCur == -1" — вибір наступного документу для відображення, обраний документ копіюється до атрибуту doc.
- "vCur == -2" — вибір попереднього документу для відображення, обраний документ копіюється до атрибуту doc.
Як було вказано вище, динаміка шаблону документа визначається вставками виконуваних інструкцій виду "<?dp {procedure} ?>". У процедурах можуть використовуватися однойменні атрибути віджету та функції користувацького інтерфейсу програмування OpenSCADA. Крім атрибутів віджету, зарезервовано спеціальні атрибути, дивись таблицю.
Таблиця. Спеціальні та зарезервовані елементи шаблону.
Ім'я | Призначення |
---|---|
Атрибути | |
rez | Атрибут результату виконання процедури, вміст якого поміщається у дерево документа. |
lTime | Час останнього формування. Якщо документ формується вперше то lTime дорівнює bTime. |
rTime | Містить час перебируваних значень, секунди, визначається всередині тегів з атрибутом "docRept". |
rTimeU | Містить час перебируваних значень, мікросекунди, визначається всередині тегів з атрибутом "docRept". |
rPer | Містить період перебору значень, атрибут "docRept". |
mTime, mTimeU, mLev, mCat, mVal |
Визначаються всередині тегів з атрибутом "docAMess" при розборі повідомлень архіву повідомлень:
|
Спеціальні теги | |
Спеціальні атрибути стандартних тегів | |
body.docProcLang | Мова виконуваних процедур документу, по замовченню це "JavaLikeCalc.JavaScript". |
*.docRept="1s" | Тег з указаним атрибутом розмножується, при формуванні, шляхом зсуву часу у атрибуті "rTime" на значення, вказане у даному атрибуті. |
*.docAMess="1:PLC*" | Вказує на необхідність розмноження тегу з атрибутом, повідомленнями з архіву повідомлень за вказаний інтервал часу, згідно рівня "1" та шаблону запиту "PLC*", за категорією повідомлення. У шаблоні запиту можуть вказуватися регулярні вирази у вигляді "/{re}/". Для даного тегу, у процесі розмноження, визначаються атрибути: "mTime", "mTimeU", "mLev", "mCat" и "mVal". |
*.docAMessArchs="ArchMod0.Archivator0[;ArchModN.ArchivatorN]" | Доповнює атрибут "*.docAMess" переліком архіваторів для читання повідомлень. |
*.docRevers="1" | Вказує на інвертування порядку розмноження — останній нагорі. |
*.docAppend="1" | Ознака необхідності додання результату виконання процедури до тегу процедури. Інакше результат виконання заміняє вміст тегу. |
body.docTime | Час формування документу, використовується для встановлення атрибуту lTime при наступному формуванні документа. Не встановлюється користувачем! |
table.export="1" | Ввімкнення можливості експорту вмісту вказаної таблиці у CSV-файл або інші табличні формати. |
4.12.8 Контейнер (Box)
Примітив контейнеру, використовується для формування складених віджетів та/або сторінок користувацького інтерфейсу.
Таблиця. Набір додаткових властивостей/атрибутів примітиву "Контейнер (Box)"
Ідентифікатор | Ім'я | Номер | Значення |
---|---|---|---|
pgOpenSrc | Сторінка: джерело відкриття | 3 | Повна адреса сторінки, яка включена усередину даного контейнеру. |
pgGrp | Сторінка: група | 4 | Група контейнеру включених сторінок. Лише сторінки у такій групі включатимуться до цього боксу як контейнеру. |
backColor | Фон: колір | 20 |
Фоновий колір. Ім'я кольору у виді "{color}[-{alpha}]", де:
Приклади:
|
backImg | Фон: зображення | 21 |
Фонове зображення. Ім'я зображення у виді "[{src}:]{name}", де:
Приклади:
|
bordWidth | Границя: ширина | 22 | Ширина бордюру. |
bordColor | Границя: колір | 23 | Колір бордюру (детальніше у атрибуті 20). |
bordStyle | Границя: стиль | 24 | Стиль бордюру: "Немає", "Точковий", "Пунктирний", "Суцільний", "Подвійний", "Канавка", "Кромка", "Втиснутий", "Виступаючий". |
4.13 Використання БД для зберігання бібліотек віджетів та проєктів
Зберігання даних віджетів, бібліотек віджетів та проєктів реалізовано у БД, доступних OpenSCADA. БД організовано за приналежністю даних до бібліотеки-проєкту. Тобто, окрема бібліотека-проєкт зберігається у окремій групі таблиць БД. Перелік бібліотек віджетів зберігається у індексній таблиці бібліотек з іменем "VCALibs" та структурою "Libs", а перелік проєктів у індексній таблиці "VCAPrjs" та структурою "Projs". Екземпляр цих таблиць створюється у кожній БД, де зберігаються дані цього модуля. До складу таблиць, що належать бібліотеці віджетів та проєкту, входять наступні:
- "{DB_TBL}" — таблиця віджетів, що належать бібліотеці (структура "LibWigets"), або сторінок, що належать проєкту (структура "ProjPages");
- "{DB_TBL}_io" — таблиця робочих властивостей віджетів та вкладених віджетів бібліотеки (структура "LibWidgetIO") або властивостей сторінок проєкту (структура "ProjPageIO");
- "{DB_TBL}_uio" — таблиця користувацьких властивостей віджетів та вкладених віджетів бібліотеки (структура "LibWidgetUserIO") або користувацьких властивостей сторінок проєкту (структура "ProjPageUserIO");
- "{DB_TBL}_incl" — таблиця віджетів, вкладених у віджети-контейнери, бібліотеки (структура "LibWidgetIncl") або проєкту (структура "ProjPageWIncl");
- "{DB_TBL}_mime" — таблиця ресурсів бібліотеки та її віджетів (структура "LibWidgetMime"), або проєкту та його сторінок (структура "ProjMime");
- "{DB_TBL}_stls" — таблиця значень стильових параметрів проєкту (структура "PrjStlsIO");
- "{DB_TBL}_stl" — застаріла таблиця значень стильових параметрів проєкту (структура "PrjStlIO");
- "{DB_TBL}_ses" — таблиця даних режиму виконання проєкту, тобто сеансів (структура "PrjSesIO").
{DB_TBL} наразі формується у вигляді "wlb_{ID}" для бібліотек та "prj_{ID}" для проєктів, а окреме поле DB_TBL таблиць "Libs", "Projs" застаріле і буде видалене у випуску OpenSCADA 1.0!
Проекції (структури) основних таблиць такі:
- Libs(ID, NAME, DSCR, DB_TBL, ICO) — бібліотеки віджетів ID.
- ID — ідентифікатор;
- NAME — ім'я;
- DSCR — опис;
- DB_TBL (ЗАСТАРІЛЕ) — корінь таблиць БД з віджетами;
- ICO — закодоване (Base64) зображення іконки бібліотеки.
- LibWigets(ID, ICO, PARENT, PROC, PROC_PER, ATTRS, TIMESTAMP) — віджети ID бібліотеки.
- ID — ідентифікатор;
- ICO — закодоване (Base64) зображення іконки віджету;
- PARENT — адреса віджету основи, у вигляді /wlb_originals/wdg_Box;
- PROC — внутрішня процедура та мова процедури віджету;
- PROC_PER — період обчислення процедури віджету;
- ATTRS — перелік атрибутів віджету, модифікованих користувачем;
- TIMESTAMP — мітка часу останньої модифікації.
- LibWidgetIO(IDW, ID, IDC, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL) — робочі атрибути ID віджету IDW дочірнього віджету IDC.
- IDW — ідентифікатор віджету;
- ID — ідентифікатор атрибуту;
- IDC — ідентифікатор дочірнього віджету;
- IO_VAL — значення атрибуту;
- SELF_FLG — внутрішні прапорці атрибутів;
- CFG_TMPL — шаблон елементу конфігурації, заснованого на даному атрибуті;
- CFG_VAL — значення елементу конфігурації (посилання, константа ...).
- LibWidgetUserIO(IDW, ID, IDC, NAME, IO_TP, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL) — користувацькі атрибути ID віджету IDW дочірнього віджету IDC.
- IDW — ідентифікатор віджету;
- ID — ідентифікатор атрибуту;
- IDC — ідентифікатор дочірнього віджету;
- NAME — ім'я атрибуту;
- IO_TP — тип та головні прапорці атрибуту;
- IO_VAL — значення атрибуту;
- SELF_FLG — внутрішні прапорці атрибуту;
- CFG_TMPL — шаблон елементу конфігурації, заснованого на даному атрибуті;
- CFG_VAL — значення елементу конфігурації (посилання, константа ...).
- LibWidgetIncl(IDW, ID, PARENT, ATTRS) — включені у контейнер IDW віджети ID.
- IDW — ідентифікатор віджету;
- ID — ідентифікатор екземпляру вкладеного віджету;
- PARENT — адреса віджету основи, у вигляді /wlb_originals/wdg_Box;
- ATTRS — перелік атрибутів віджету, модифікованих користувачем.
- LibWidgetMime(ID, MIME, DATA) — audio, video, media та інші ресурси віджетів ID бібліотеки.
- ID — ідентифікатор ресурсу;
- MIME — MIME ресурсу, у форматі — "{MIME};{Size}";
- DATA — дані ресурсу, кодовані Base64.
- Projs(ID, NAME, DSCR, DB_TBL, ICO, USER, GRP, PERMIT, PER, FLGS, STYLE) — проєкти ID інтерфейсу візуалізації.
- ID — ідентифікатор проєкту;
- NAME — ім'я проєкту;
- DSCR — опис проєкту;
- DB_TBL (ЗАСТАРІЛЕ) — корінь таблиць БД зі сторінками;
- ICO — закодоване (Base64) зображення іконки проєкту;
- USER — ім'я власника проєкту;
- GRP — ім'я групи користувачів проєкту;
- PERMIT — права доступу до проєкту;
- PER — період обчислення проєкту, у мілісекундах;
- FLGS — прапорці проєкту;
- STYLE — типовий стиль проєкту.
- ProjPages(OWNER, ID, ICO, PARENT, PROC, PROC_PER, FLGS, ATTRS, TIMESTAMP) — сторінки ID, що містяться у проєкті-сторінці OWNER.
- OWNER — проєкт-сторінка — власник даної сторінки, у вигляді — "/AGLKS/so/1/gcadr";
- ID — ідентифікатор сторінки;
- ICO — закодоване (Base64) зображення іконки сторінки;
- PARENT — адреса віджету основи, у вигляді /wlb_originals/wdg_Box;
- PROC — внутрішня процедура та мова процедури сторінки;
- PROC_PER — період обчислення процедури сторінки;
- FLGS — прапорці типів сторінки;
- ATTRS — перелік атрибутів сторінки, модифікованих користувачем;
- TIMESTAMP — мітка часу останньої модифікації.
- ProjPageIO(IDW, ID, IDC, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL) — робочі атрибути сторінок, структура фактично збігається з таблицею "LibWidgetIO".
- ProjPageUserIO(IDW, ID, IDC, NAME, IO_TP, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL) — користувацькі атрибути сторінок, структура фактично збігається з таблицею "LibWidgetUserIO".
- ProjPageWIncl(IDW, ID, PARENT, ATTRS) — віджети, включені на сторінки, структура фактично збігається з таблицею "LibWidgetIncl".
- ProjMime(ID, MIME, DATA) — audio, video, media та інші ресурси сторінок проєктів, структура фактично збігається з таблицею "LibWidgetMime".
- PrjStls(SID, ID, VAL) — значення VAL поля ID стилю SID проєкту.
- IDS — ідентифікатор стилю;
- ID — ідентифікатор поля стилю;
- VAL — значення поля стилю.
- PrjStl(ID, V_0, V_1, V_2, V_3, V_4, V_5, V_6, V_7, V_8, V_9) — значення поля стилю ID проєкту.
- ID — ідентифікатор поля стилю;
- V_{N} — значення поля стилю для стилю N.
- ProjSess(IDW, ID, IO_VAL) — таблиця проєкту IDW для збереження даних сеансів, що виконують проєкт.
- IDW — повний шлях елементу проєкту;
- ID — атрибут елементу;
- IO_VAL — значення атрибуту.
4.14 API користувацького програмування
API користувацького програмування рушія візуалізації безпосередньо представлено об'єктами OpenSCADA, що формують користувацький інтерфейс, а саме "Сеансом" та "Віджетами-сторінками". Для користувача ці об'єкти надають набір функцій управління:
Об'єкт "Сеанс" ( this.ownerSess() )
- string user( ) — поточний користувач сеансу.
- int alrmQuietance( int quit_tmpl, string wpath = "", bool ret = false ) — стишує порушення wpath з шаблоном quit_tmpl. Якщо wpath це порожній рядок то здійснюється глобальне стишення. У рядку wpath, через символ ';', може бути перелічено адреси декількох віджетів. При встановлені ret здійснюється повернення стишення.
- int reqTm( ) — час останнього запиту у секундах від епохи 1.1.1970.
- string reqUser( ) — користувач останнього запиту.
- string reqLang( ) — мова останнього запиту.
- int userActTm( ) — час останньої дії користувача у секундах від епохи 1.1.1970.
- bool uiCmd( string cmd, string prm, string src ) — надсилає UI команду керування сторінками, як то: "open", "next", "prev"; детальніше дивиться у секції подій. Ця функція має бути пріоритетною для використання у керуванні сторінками перед прямим записом до атрибутів сторінок "pgOpen" та "pgOpenSrc", оскільки це єдиний метод коректної поводження з лінкованими сторінками.
- int period( bool isReal = false ) — отримання періоду опрацювання сеансу, isReal для реального періоду.
Об'єкт "Віджет" (this)
- TCntrNodeObj ownerSess( ) — об'єкт сеансу даного віджету.
- TCntrNodeObj ownerPage( ) — об'єкт батьківської сторінки даного віджету.
- TCntrNodeObj ownerWdg( bool base = false ) — об'єкт батьківського віджету даного віджету. При указанні base буде повернено й об'єкти сторінок.
- TCntrNodeObj wdgAdd( string wid, string wname, string parent ) — додає віджет wid з ім'ям wname на основі бібліотечного віджету parent.
//Додає новий віджет на основі віджету текстового примітиву
nw = this.wdgAdd("nw", "Новий віджет", "/wlb_originals/wdg_Text");
nw.attrSet("geomX", 50).attrSet("geomY", 50);
- bool wdgDel( string wid ) — видаляє віджет wid.
- TCntrNodeObj wdgAt( string wid, bool byPath = false ) — підключається до дочірнього або глобального віджету, за посередництвом шляху byPath. У випадку глобального підключення можна використати абсолютний або відносний шлях до віджету. Точкою відліку абсолютної адреси виступає об'єкт кореня модуля "VCAEngine", а значить, першим елементом абсолютної адреси є ідентифікатор сеансу, який опускається. Відносна адреса бере відлік від поточного віджету. Спеціальним елементом відносної адреси є елемент вищестоящого вузла "..".
- Array attrList() — перелік атрибутів віджету.
- bool attrPresent( string attr ) — перевіряє атрибут віджета attr на факт присутності.
- ElTp attr( string attr, bool fromSess = false ) — значення атрибуту віджету attr або з сеансу fromSess. Для відсутніх атрибутів повертає порожній рядок.
- TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false ) — встановлює значення vl у атрибут віджету attr або сеанс, для toSess. Повертає поточний об'єкт, для конкатенації функцій встановлення.
- string link( string attr, bool prm = false ) — посилання атрибуту віджету attr. При встановленні prm запитує посилання групи атрибутів (параметр), представлене вказаним атрибутом.
- string linkSet( string attr, string vl, bool prm = false ) — встановлює посилання атрибуту віджету attr. При встановленні prm здійснює встановлення посилання групи атрибутів (параметр), представленого вказаним атрибутом.
//Встановлює посилання восьмого тренду параметром
this.linkSet("el8.name", "prm:/LogicLev/experiment/Pi", true);
- string {resource,mime}( string addr, string MIME = "" ) — ресурс об'єкту за адресою addr (пряме посилання на ресурс або атрибут віджету з цим посиланням) з типом MIME, з таблиці сеансу або джерела. Призначено для редагування ресурсу об'єкта та підставлення його у контексті сеансу, наприклад, зображень SVG.
- int {resourceSet,mimeSet}( string addr, string data, string MIME = "" ) — встановлює ресурс об'єкту у data з типом MIME за адресою addr.
- int messDebug( string mess ); int messInfo( string mess ); int messNote( string mess ); int messWarning( string mess ); int messErr( string mess ); int messCrit( string mess ); int messAlert( string mess ); int messEmerg( string mess ); — формує повідомлення програми mess з категорією — шлях до даного віджету.
- int calcPer( int set = EVAL ) — отримання, та встановлення за set не EVAL, щодо актуального періоду обчислення-опрацювання. Зарезервовано наступні спеціальні значення:
- 0 — якщо бажаєте періодичного опрацювання сеансу;
- -1 — якщо бажаєте використати період опрацювання батьківського віджету/сторінки/проєкту каскадно;
- -2 — для цілковитого вимкнення періодичного опрацювання.
- -3 — відсутній період часу сеансу, отримання проєктного.
Об'єкт "Віджет", примітиву "Документ" (this)
- string getArhDoc( int nDoc) — текст документу архіву на глибині nDoc (0-{aSize-1}).
Застаріле, але підтримуване, API представляється групою функцій безпосередньо у модулі рушія СВУ. Виклик цих функцій з процедури віджету може здійснюватися прямо за ідентифікатором, оскільки їх область імен визначається у контексті процедур віджетів.
Перелік віджетів (WdgList)
Опис: Повертає перелік віджетів, у контейнері віджетів, або дочірніх віджетів. Якщо встановлено pg, то повертається перелік сторінок проєктів та сеансу.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовчанню |
---|---|---|---|---|
list | Перелік | Рядок | Повернення | |
addr | Адреса | Рядок | Вхід | |
pg | Сторінки | Логічний | Вхід | 0 |
Присутність вузла (NodePresent)
Опис: Перевірка вузла на присутність, включаючи віджети, атрибути та інше.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовченню |
---|---|---|---|---|
rez | Результат | Логічний | Повернення | |
addr | Адреса | Рядок | Вхід |
Перелік атрибутів (AttrList)
Опис: Повертає перелік атрибутів віджету. Якщо встановлено noUser тоді повертаються тільки атрибути не користувача.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовченню |
---|---|---|---|---|
list | Перелік | Рядок | Повернення | |
addr | Адреса | Рядок | Вхід | |
noUser | Без користувацьких | Логічний | Вхід | 1 |
Отримати атрибут (AttrGet)
Опис: Отримання значення атрибуту віджета. Запит може здійснюватися як указанням повної адреси атрибуту у addr, так і окремо: адресу віджету у addr та ідентифікатор атрибута у attr.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовченню |
---|---|---|---|---|
val | Значення | Рядок | Повернення | |
addr | Адреса | Рядок | Вхід | |
attr | Атрибут | Логічний | Вхід |
Встановити атрибут (AttrSet)
Опис: Встановлення значення атрибуту віджета. Встановлення може здійснюватися як указанням повної адреси атрибуту у addr, так і окремо: адресу віджету у addr та ідентифікатор атрибута у attr.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовченню |
---|---|---|---|---|
addr | Адреса | Рядок | Вхід | |
val | Значення | Рядок | Вхід | |
attr | Атрибут | Логічний | Вхід |
Користувач сеансу (SesUser)
Опис: Повертає користувача сеансу за шляхом віджета сеансу.
Параметри:
Ідентифікатор | Ім'я | Тип | Режим | По замовченню |
---|---|---|---|---|
user | Користувач | Рядок | Повернення | |
addr | Адреса | Рядок | Вхід |
4.15 Сервісні команди-функції Інтерфейсу Управління
Сервісні функції — це інтерфейс доступу до OpenSCADA із зовнішніх систем посередництвом Інтерфейсу Управління. Цей механізм покладено в основу усього обміну всередині OpenSCADA, реалізованого шляхом слабких зв'язків та власного протоколу обміну OpenSCADA.
Загальні віджети
- Отримання значень визначених або всіх візуальних атрибутів віджету
- ЗАП: <get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattr">{attributes}</get>
- wAddr — локальна адреса віджету, на кшталт "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1";
- attributes — лише запитані атрибути у тегах "el" із тільки одним атрибутом ідентифікатору "id"; можлива цілковита відсутність тегів атрибутів для запиту усіх наявних.
- ВІДП: <get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattr" rez="0">{attributes}</get>
- attributes — опрацьовувані атрибути у тегах "el": <el id="{ID}" p="{pos}" act="{active}">{value}</el>
- ID — ідентифікатор атрибуту;
- pos — позиція-індекс атрибуту для стандартних;
- active — стан активності атрибуту, лише для прямого запиту;
- value — значення атрибуту.
- attributes — опрацьовувані атрибути у тегах "el": <el id="{ID}" p="{pos}" act="{active}">{value}</el>
<get path="/UI/VCAEngine/wlb_AGLKS/wdg_CM101/wdg_ElFigure1/%2fserv%2fattr" rez="0" user="roman">
<el id="id">ElFigure1</el>
<el id="path">/wlb_AGLKS/wdg_CM101/wdg_ElFigure1</el>
<el id="parent">/wlb_originals/wdg_ElFigure</el>
<el id="owner">root:UI</el>
<el id="perm">948</el>
<el id="root" p="1">ElFigure</el>
<el id="name" />
<el id="dscr" />
</get>
- Встановлення групи значень визначених атрибутів віджетів
- ЗАП[root-UI]: <set path="/UI/VCAEngine/{wAddr}/%2fserv%2fattr">{attributes}</set>
- wAddr — локальна адреса віджету у модулі, на кшталт "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1";
- attributes — атрибути зі значеннями у тегах "el": <el id="{ID}">{value}</el>
- ID — ідентифікатор атрибуту;
- value — встановлюване значення атрибуту.
<set path="/UI/VCAEngine/wlb_AGLKS/wdg_CM101/wdg_ElFigure1/%2fserv%2fattr">
<el id="name">Нова назва</el>
<el id="dscr">Новий опис</el>
</set>
- Отримання значень візуальних атрибутів гілки віджетів, оптимізовано для мереж
- ЗАП: <get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattrBr" />
- wAddr — локальна адреса віджету у модулі, на кшталт "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1".
- ВІДП: <get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattrBr" rez="0">{attributes} {widgets}</get>
- attributes — опрацьовані атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
- ID — ідентифікатор атрибуту;
- pos — позиція-індекс атрибуту для стандартних;
- value — значення атрибуту.
- widgets — дочірні віджети у тегах "w": <w id="{ID}" lnkPath="{lnkPath}">{attributes} {widgets}</w>
- ID — ідентифікатор віджету;
- lnkPath — шлях до пов'язаного віджету для дочірніх віджетів бібліотек віджетів.
- attributes — опрацьовані атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
<get path="/UI/VCAEngine/wlb_AGLKS/wdg_CM101/%2fserv%2fattrBr" rez="0" user="roman">
<el id="id">CM101</el>
<el id="path">/wlb_AGLKS/wdg_CM101</el>
<el id="parent">/wlb_originals/wdg_Box</el>
<el id="owner">root:UI</el>
<el id="perm">948</el>
<el id="root" p="1">Box</el>
<el id="name">КМ101</el>
<w id="AT101_1" lnkPath="/wlb_mnEls/wdg_cooler">
<el id="id">AT101_1</el>
<el id="path">/wlb_AGLKS/wdg_CM101/wdg_AT101_1</el>
<el id="parent">/wlb_mnEls/wdg_cooler</el>
<el id="owner">root:UI</el>
<el id="perm">948</el>
<el id="root" p="1">ElFigure</el>
<el id="name">АТ101 1</el>
</w>
</get>
Бібліотеки віджетів
- Отримання дерева віджетів бібліотек, оптимізовано для мереж
- ЗАП: <get path="/UI/VCAEngine/%2fserv%2fwlbBr" item="{item}" disIconsW="{disIconsW}" disIconsCW="{disIconsCW}" />
- item — елемент бібліотеки отримання, як шлях "wlb_{WLib}[/wdg_{Wdg}[/wdg_{ChildWdg}]]", для порожнього отримуватиметься все дерево;
- disIconsW — вимкнути отримання даних іконки для віджетів [0|1];
- disIconsCW — вимкнути отримання даних іконки для дочірніх віджетів [0|1].
- ВІДП: <get path="/UI/VCAEngine/%2fserv%2fwlbBr" item="{item}" disIconsW="{disIconsW}" disIconsCW="{disIconsCW}" rez="0">{wlibs}</get>
- wlibs — бібліотеки віджетів у тегах "wlb": <wlb id="{ID}" doc="{doc}">{name} {icon} {widgets}</wlb>
- icon — тег "icon" із даними цієї іконки кодоване Base64;
- widgets — теги "w" із описом бібліотек віджетів: <w id="{ID}" doc="{doc}" parent="{parent}">{name} {icon} {widgets}</w>
- parent — адреса батька віджету;
- widgets — теги "сw" із описом дочірніх віджетів: <cw id="{ID}" doc="{doc}">{name} {icon}</cw>
- wlibs — бібліотеки віджетів у тегах "wlb": <wlb id="{ID}" doc="{doc}">{name} {icon} {widgets}</wlb>
<get disIconsCW="1" disIconsW="1" item="/wlb_AGLKS" path="/UI/VCAEngine/%2fserv%2fwlbBr" rez="0" user="roman">
<wlb id="AGLKS">АГЛКС
<ico>iVBORw0KGgoAA...AAAElFTkSuQmCC</ico>
<w id="CM101" parent="/wlb_originals/wdg_Box">КМ101
<cw id="AT101_1">АТ101 1</cw>
<cw id="AT101_2">АТ101 1</cw>
<cw id="C101_1">C101/1</cw>
<cw id="C101_2">C101/1</cw>
<cw id="C101_3">C101/1</cw>
<cw id="CM101">CM101</cw>
<cw id="CM101_1">CM101_1</cw>
<cw id="CM101_2">CM101_2</cw>
<cw id="ElFigure1">ElFigure1</cw>
<cw id="ElFigure2">ElFigure2</cw>
<cw id="ElFigure3">ElFigure3</cw>
<cw id="ElFigure4">ElFigure4</cw>
<cw id="ElFigure5">ElFigure5</cw>
<cw id="ElFigure6">ElFigure6</cw>
<cw id="ElFigure7">ElFigure7</cw>
</w>
<w id="KCH_MN1" parent="/wlb_originals/wdg_Box">KCH_MN1
<cw id="BC1">Кульовий кран</cw>
<cw id="BC2">Кульовий кран</cw>
<cw id="BC21">Кульовий кран</cw>
<cw id="BC22">Кульовий кран</cw>
</w>
<w id="comprEn" parent="/wlb_originals/wdg_ElFigure">Робота компресора</w>
</wlb>
</get>
Проєкти СВУ
- Отримання переліку проєктів розширене деякими опціями
- ЗАП: <get path="/UI/VCAEngine/[%2fbr%2fprj_|%2fprm%2fcfg%2fprj]" chkUserPerm="{chkUserPerm}" getChPgN="{getChPgN}" noName="{noName}" />
- chkUserPerm — перевірка прав користувача перед включенням до переліку [0|1];
- getChPgN — запит кількості дочірніх сторінок у проєктах [0|1];
- noName — не повертати назви сторінок [0|1].
- ВІДП: <get path="/UI/VCAEngine/[%2fbr%2fprj_|%2fprm%2fcfg%2fprj]" chkUserPerm="{chkUserPerm}" getChPgN="{getChPgN}" noName="{noName}" rez="0">{projects}</get>
- projects — перелік проєктів у тегах "el", де назва у тексті тегу та ідентифікатор у атрибуті "id". Розширено додатковими атрибутами:
- "chPgN" — кількість дочірніх сторінок у проєкті за встановлення "getChPgN".
- projects — перелік проєктів у тегах "el", де назва у тексті тегу та ідентифікатор у атрибуті "id". Розширено додатковими атрибутами:
<get getChPgN="1" path="/UI/VCAEngine/%2fbr%2fprj_" rez="0" user="roman">
<el chPgN="2" id="AGLKS">АГЛКС</el>
<el chPgN="2" id="archBrowser">Огляд архівів</el>
<el chPgN="2" id="tmplSO">Групи сигналізації (шаблон)</el>
</get>
- Перевірка доступу на читання проєкту від користувача запиту
- ЗАП: <read path="/UI/VCAEngine/prj_{proj}/%2fserv%2faccess" />
- proj — ідентифікатор проєкту.
- ВІДП: <read path="/UI/VCAEngine/prj_{proj}/%2fserv%2faccess" rez="0">{access}</get>
- access — статус наявності доступу [0|1].
<read path="/UI/VCAEngine/prj_AGLKS/%2fserv%2faccess" rez="0" user="roman">1</read>
Сеанси проєктів
- Отримання переліку сеансів розширене деякими параметрами
- REQ: <get path="/UI/VCAEngine/[%2fbr%2fses_|%2fses%2fses]" chkUserPerm="{chkUserPerm}" onlyMy="{onlyMy}" />
- chkUserPerm — перевірка прав користувача перед доданням до переліку [0|1];
- onlyMy — додавати до переліку лише мої власні сеанси [0|1].
- RESP: <get path="/UI/VCAEngine/[%2fbr%2fses_|%2fses%2fses]" chkUserPerm="{chkUserPerm}" onlyMy="{onlyMy}" rez="0">{sessions}</get>
- sessions — перелік сеансів у тегах "el", де ідентифікатор у тексті тегу. Розширено додатковими атрибутами:
- "user" — користувач сеансу;
- "proj" — проєкт сеансу.
- sessions — перелік сеансів у тегах "el", де ідентифікатор у тексті тегу. Розширено додатковими атрибутами:
<get path="/UI/VCAEngine/%2fses%2fses" rez="0" onlyMy="1" user="roman">
<el user="roman" proj="AGLKS">AGLKS</el>
<el user="roman" proj="AGLKS">AGLKS0</el>
</get>
- Отримання переліку сеансів визначеного проєкту СВУ
- ЗАП: <list path="/UI/VCAEngine/%2fserv%2fsess" prj="{project}" />
- project — ідентифікатор запитаного проєкту.
- ВІДП: <list path="/UI/VCAEngine/%2fserv%2fsess" prj="{project}" rez="0">{sessions}</list>
- sessions — сеанси у тегах "el".
<list path="/UI/VCAEngine/%2fserv%2fsess" prj="AGLKS" rez="0" user="roman">
<el>AGLKS</el>
</list>
- Підключення до визначеного проєкту СВУ або сеансу проєкту
- ЗАП: <connect path="/UI/VCAEngine/%2fserv%2fsess" prj="{project}" sess="{session}" userChange="{userChange}" onlyMy="{onlyMy}" />
- project — ідентифікатор запитаного проєкту, порожнє при підключені до наявного сеансу;
- session — ідентифікатор вже наявного сеансу, порожнє для створення нового сеансу;
- onlyMy — ознака підключення-перепідключення до сеансу лише якщо він мій;
- userChange — ознака зміни користувача [0|1], тобто для оновлення інформації користувача.
- ВІДП: <connect path="/UI/VCAEngine/%2fserv%2fsess" prj="{project}" sess="{session}" userChange="{userChange}" onlyMy="{onlyMy}" rez="0" conId="{conId}" userIsRoot="{userIsRoot}" />
- conId — ідентифікатор підключення сеансу, використовується у подальших запитах;
- project — ідентифікатор проєкту успішно підключеного сеансу;
- session — ідентифікатор новоствореного сеансу успішно підключеного проєкту;
- userIsRoot — користувач має права суперкористувача [0|1].
<connect conId="50860885" path="/UI/VCAEngine/%2fserv%2fsess" prj="AGLKS" rez="0" sess="AGLKS" user="roman" userIsRoot="1" />
- Відключення від визначеного сеансу проєкту СВУ
- Сеанси із нульовою кількістю підключень тут також закриваються.
- ЗАП: <disconnect path="/UI/VCAEngine/%2fserv%2fsess" sess="{session}" conId="{conId}" />
- session — ідентифікатор наявного сеансу;
- conId — ідентифікатор підключення сеансу.
<disconnect path="/UI/VCAEngine/%2fserv%2fsess" sess="AGLKS" conId="50860885" />
- Отримання переліку відкритих сторінок сеансу проєкту
- ЗАП[{owner}-{grp}]: <openlist path="/UI/VCAEngine/ses_{session}/%2fserv%2fpg" conId="{conId}" tm="{clock}" />
- owner, grp — доступ на читання для власника проєкту або користувача у групі та відповідно до прав проєкту;
- session — ідентифікатор сеансу;
- conId — ідентифікатор підключення сеансу;
- clock — значення внутрішнього лічильника (цикл життя) від попереднього опрацьованого запиту, для перевірки змінених.
- ВІДП: <openlist path="/UI/VCAEngine/ses_{session}/%2fserv%2fpg" conId="{conId}" tm="{clock}" rez="0">{pages}</openlist>
- clock — значення внутрішнього лічильника (цикл життя) - 1 на час запиту;
- pages — сторінки у тегах "pg": <pg pgGrp="{pgGrp}" updWdg="{nUpdWdgs}">{ID}</pg>
- ID — ідентифікатор сторінки;
- pgGrp — група сторінок для раннього обчислення включення сторінок;
- nUpdWdgs — кількість оновлених віджетів після останнього запиту та для непорожнього "clock".
<openlist conId="52760577" path="/UI/VCAEngine/ses_AGLKS/%2fserv%2fpg" rez="0" tm="1403" user="roman">
<pg>/ses_AGLKS/pg_so</pg>
<pg pgGrp="so">/ses_AGLKS/pg_so/pg_1/pg_mn/pg_1</pg>
<pg pgGrp="cntr">/ses_AGLKS/pg_control/pg_ElCadr</pg>
</openlist>
- Відкриття або закриття визначеної сторінки сеансу проєкту
- ЗАП[{owner}-{grp}]: <[open|close] path="/UI/VCAEngine/ses_{session}/%2fserv%2fpg" pg="{page}" />
- owner, grp — доступ на запис для власника проєкту або користувача у групі та відповідно до прав проєкту;
- session — ідентифікатор сеансу;
- page — адреса сторінки у контексті сеансу, на кшталт "/ses_AGLKS/pg_so/pg_1/pg_mn/pg_1".
- Отримання статусу сигналізації та ресурсу сповіщення для сеансу проєкту
- ЗАП[{owner}-{grp}]: <get path="/UI/VCAEngine/ses_{session}/%2fserv%2falarm" mode="{mode}" tp="{typeNtf}" wdg="{widget}" />
- owner, grp — доступ на читання для власника проєкту або користувача у групі та відповідно до прав проєкту;
- session — ідентифікатор сеансу;
- mode — режим запиту, лише "resource" для отримання ресурсів сповіщення та пусто тільки статус;
- typeNtf — тип сповіщення для отримання ресурсу, дивіться секцію сигналізації;
- widget — адреса віджету для формування ресурсу сповіщення, порожньо для глобального.
- ВІДП: <get path="/UI/VCAEngine/ses_{session}/%2fserv%2falarm" mode="{mode}" tp="{typeNtf}" rez="0" alarmSt="{alarmSt}" tm="{clock}" wdg="{widget}" resTp="{resTp}" mess="{message}" lang="{language}">{resource}</get>
- alarmSt — статус сигналізації як описано у секції сигналізації;
- clock — значення внутрішнього лічильника (цикл життя) при формуванні ресурсу сповіщення;
- widget — адреса віджету джерела при формуванні ресурсу сповіщення;
- message — повідомлення сповіщення із тексту;
- language — мова сповіщення, переважно для "message";
- resTp — тип ресурсу сповіщення;
- resource — ресурс сповіщення кодований Base64 для бінарних даних.
<get path="/UI/VCAEngine/ses_AGLKS/%2fserv%2falarm" mode="resource" tp="1" rez="0" user="roman"
alarmSt="460554" tm="0" resTp="audio/ogg;73.3428" lang="en_US.UTF-8">
T2dnUwACA...Dg6gwAjo+PAQ==
</get>
- Стишення-квітація сповіщення сигналізації сеансу проєкту
- ЗАП[{owner}-{grp}]: <quietance path="/UI/VCAEngine/ses_{session}/%2fserv%2falarm" wdg="{widget}" tmpl="{template}" ret="{return}" />
- owner, grp — доступ на читання для власника проєкту або користувача у групі та відповідно до прав проєкту;
- session — ідентифікатор сеансу;
- widget — адреса віджету для стишення сповіщення, пусто для глобального;
- template — шаблон сповіщення, тобто бітова збірка відповідно до типів стишуваних сповіщень;
- return — ознака повернення сповіщення, тобто стишення вимикається.
<quietance path="/UI/VCAEngine/ses_AGLKS/%2fserv%2falarm" tmpl="7" />
- Отримання значень модифікованих візуальних атрибутів віджету сеансу
- Перевизначає загальний сервісний запит віджетів "<get path='/UI/VCAEngine/{wAddr}/%2fserv%2fattr' />" щодо специфіки сеансу.
- ЗАП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattr" tm="{clock}" />
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- clock — значення внутрішнього лічильника (цикл життя) від попереднього опрацьованого запиту, для перевірки змінених; за нульового значення примусово додаються сервісні-віртуальні атрибути: "perm", "name".
- ВІДП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattr" tm="{clock}" rez="0">{attributes}</get>
- attributes — модифіковані від "clock" атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
- ID — ідентифікатор атрибуту;
- pos — позиція-індекс атрибуту для стандартних;
- value — значення атрибуту.
- attributes — модифіковані від "clock" атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
<get path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1/%2fserv%2fattr" rez="0" tm="0" user="roman">
<el id="perm" p="-3">6</el>
<el id="root" p="1">ElFigure</el>
<el id="en" p="5">1</el>
<el id="active" p="6">0</el>
<el id="geomX" p="7">488</el>
<el id="geomY" p="8">250</el>
<el id="geomW" p="9">16</el>
<el id="geomH" p="10">100</el>
<el id="geomXsc" p="13">1</el>
<el id="geomYsc" p="14">0.75</el>
<el id="geomZ" p="11">-9</el>
</get>
- Встановлення групи значень визначених атрибутів віджету сеансу
- Перевизначає загальний сервісний запит віджетів "<set path='/UI/VCAEngine/{wAddr}/%2fserv%2fattr' />" щодо специфіки сеансу на кшталт опрацювання атрибуту "event" та виявлення активності-неактивності користувача.
- ЗАП[{owner}-{grp}]: <set path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattr" noUser="{noUser}">{attributes}</set>
- owner, grp — доступ на запис для власника проєкту або користувача у групі та відповідно до прав проєкту;
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- noUser — не маркувати це як активність користувача;
- attributes — атрибути зі значеннями у тегах "el": <el id="{ID}">{value}</el>
- ID — ідентифікатор атрибуту;
- value — встановлюване значення атрибуту.
<set path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1/%2fserv%2fattr">
<el id="name">Нова назва</el>
<el id="dscr">Новий опис</el>
</set>
- Активація атрибуту для використання у якості візуального та його створення за відсутності
- ЗАП: <activate path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattr%2f{aID}" aNm="{aName}" aTp="{aType}" aFlg="{aFlags}" aVls="{aValues}" aNms="{aNames}">{aDef}</activate>
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- aID — ідентифікатор атрибуту сеансу;
- aName — ім'я атрибуту при його створені;
- aType — тип атрибуту при його створені, дивіться об'єкт TFld;
- aFlags — прапорці атрибуту при його створені, дивіться об'єкт TFld;
- aDef — типове значення атрибуту при його створені;
- aValues — значення атрибуту для вибіркових типів при його створені;
- aNames — назви значень атрибуту для вибіркових типів при його створені.
<activate path="/UI/VCAEngine/ses_AGLKS/pg_so/%2fserv%2fattr%2frunWin" aNm="Вікно виконання" aTp="1" aFlg="1" aVls="0;1;2" aNms="Original size;Maximize;Full screen">0</activate>
- Отримання значень візуальних атрибутів гілки віджету сеансу, оптимізовано для мереж
- Перевизначає загальний сервісний запит віджетів "<get path='/UI/VCAEngine/{wAddr}/%2fserv%2fattrBr' />" щодо специфіки сеансу.
- ЗАП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrBr" tm="{clock}" FullTree="{FullTree}" />
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- clock — значення внутрішнього лічильника (цикл життя) від попереднього опрацьованого запиту, для перевірки змінених; за нульового значення примусово додаються сервісні-віртуальні атрибути: "perm", "name".
- fullTree — отримання повного дерева віджетів незалежно від наявності змін, без атрибутів.
- ВІДП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrBr" tm="{clock}" FullTree="{FullTree}" rez="0">{attributes} {widgets}</get>
- attributes — опрацьовані атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
- ID — ідентифікатор атрибуту;
- pos — позиція-індекс атрибуту для стандартних;
- value — значення атрибуту.
- widgets — дочірні віджети у тегах "w": <w id="{ID}">{attributes} {widgets}</w>
- ID — ідентифікатор віджету.
- attributes — опрацьовані атрибути у тегах "el": <el id="{ID}" p="{pos}">{value}</el>
<get path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/%2fserv%2fattrBr" rez="0" tm="0" user="roman">
<el id="name" p="-4">CM101</el>
<el id="perm" p="-3">6</el>
<el id="root" p="1">Box</el>
<el id="en" p="5">1</el>
<el id="active" p="6">0</el>
<el id="geomX" p="7">0</el>
<el id="geomY" p="8">0</el>
<el id="geomW" p="9">900</el>
<el id="geomH" p="10">580</el>
<w id="AT101_1">
<el id="perm" p="-3">6</el>
<el id="root" p="1">ElFigure</el>
<el id="en" p="5">1</el>
<el id="active" p="6">0</el>
<el id="geomX" p="7">338</el>
<el id="geomY" p="8">320</el>
<el id="geomW" p="9">80</el>
<el id="geomH" p="10">100</el>
</w>
</get>
- Отримання значення специфічного до сеансу атрибуту віджету сеансу
- ЗАП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrSess%2f{aID}" />
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- aID — ідентифікатор специфічного до сеансу атрибуту.
- ВІДП: <get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrSess%2f{aID}" rez="0">{value}</get>
- value — значення атрибуту.
<get path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/%2fserv%2fattrSess%2ftestA" rez="0" user="roman">тестове значення</get>
- Встановлення значення специфічного до сеансу атрибуту віджету сеансу
- ЗАП[{owner}-{grp}]: <set path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrSess%2f{aID}">{value}</get>
- owner, grp — доступ на запис для власника проєкту або користувача у групі та відповідно до прав проєкту;
- wAddr — локальна адреса віджету сеансу, на кшталт "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1";
- aID — ідентифікатор специфічного до сеансу атрибуту;
- value — значення атрибуту.
<set path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/%2fserv%2fattrSess%2ftestA">тестове значення</set>
4.16 Копіювання елементів
Для прискорення процесу розробки користувацьких інтерфейсів візуалізації та управління, треба передбачити функцію копіювання елементів. Щоб закласти підтримку різних варіантів копіювання запишемо їх по пунктах:
- "Бібліотека віджетів (wlb_SrcLib)" -> "Бібліотека віджетів (wlb_NewLib)" — копіюються параметри самої бібліотеки та всі віджети-кадри, що містяться у ній.
- "Проєкт (prj_SrcPrj)" -> "Проєкт (prj_NewPrj)" — копіюються параметри проєкту, всі сторінки за ієрархією, а також віджети-кадри, що містяться у активних сторінках.
- "Сторінка проєкту (prj_WPrj.pg_SrcPg)" -> Сторінка проєкту (prj_WPrj.pg_WPg.pg_NewPg)" — копіювання параметрів сторінки, вкладених сторінок та віджетів.
- "Кадр бібліотеки віджетів (wlb_Lib.wdg_SrcWdg)" -> "Кадр бібліотеки віджетів (wlb_LibN.wdg_NewWdg)" — копіювання параметрів віджету та вкладених віджетів.
- "Елемент кадру-сторінки (prj_WPrj.pg_WPage.wdg_SrcWdg)" -> "Кадр бібліотеки віджетів (wlb_Lib.wdg_NewWdg)" — копіювання параметрів віджету та вкладених віджетів.
- "Елемент кадру-сторінки (prj_WPrj.pg_WPage.wdg_SrcWdg)" -> "Елемент кадру-сторінки (wlb_Lib.wdg_WWdg.wdg_NewWdg)" — копіювання параметрів віджету.
4.17 Передбачені функціональні можливості
Перелічимо можливості, які зможе та забезпечує СВУ, побудована на основі даного проєкту:
- три рівні складності у формуванні інтерфейсу візуалізації, які дозволяють органічно освоювати та застосовувати інструментарій за принципом — від простого до складного:
- формування з шаблонних кадрів, шляхом призначення динаміки та без графічної конфігурації;
- графічне формування нових кадрів, шляхом використання готових елементів візуалізації з бібліотеки — мнемосхеми;
- формування, у бібліотеці, нових: кадрів, шаблонних кадрів та елементів відображення.
- побудова інтерфейсів візуалізації практично будь-якої складності (обмежену "дискретністю" функцій примітивів), починаючи від простих інтерфейсів моніторингу та, закінчуючи повноцінними ієрархічними інтерфейсами, що використовуються у SCADA системах;
- надання різних способів формування та конфігурації користувацького інтерфейсу, заснованих на різних інтерфейсах графічного представлення (Qt, Web, ...), або-ж за посередництвом стандартного інтерфейсу управління OpenSCADA;
- побудова та корекція інтерфейсу, призначення та зміна динаміки у процесі виконання;
- побудова, на рівні користувача, нових шаблонних кадрів та формування спеціалізованих, під область застосування, бібліотек кадрів (наприклад, включення кадрів параметрів, графіків та інших елементів з ув'язкою їх один з другим), згідно до ідеї вторинного використання, накопичення та вдосконалення;
- побудова нових користувацьких елементів візуалізації та формування спеціалізованих, під область застосування, бібліотек кадрів, згідно до ідеї вторинного використання, накопичення та вдосконалення;
- опис логіки нових шаблонних кадрів та користувацьких елементів візуалізації як простими зв'язками, так і лаконічною, повноцінною мовою користувацького програмування;
- можливість включення, до користувацьких елементів візуалізації, функцій (або кадрів обчислення функцій) об'єктної моделі OpenSCADA, практично зв'язуючи представлення з алгоритмом обчислення; наприклад, візуалізуючи бібліотеку моделей апаратів ТП, для подальшої візуальної побудови моделей ТП;
- розподіл даних користувацьких інтерфейсів та інтерфейсів представлення цих даних, що дозволяє будувати інтерфейс користувача у одному середовищі, а виконувати у багатьох інших (Qt, Web, ...);
- можливість підключення до виконуваного інтерфейсу для спостереження та корекції дій; наприклад, при навчанні операторів та контролю за його діями у реальному часі;
- візуальна побудова різних схем з накладанням логічних зв'язків та подальшим централізованим виконанням у фоні — візуальна побудова та виконання математичних моделей, логічних схем, релейних схем та іншого;
- надання, до OpenSCADA, функцій об'єктного API; може використовуватися для управління властивостями інтерфейсу візуалізації із користувацьких процедур;
- побудова серверів для: кадрів, елементів візуалізації та проєктів інтерфейсів візуалізації; з можливістю обслуговування множинних клієнтських підключень;
- проста організація клієнтських станцій на різній основі (Qt, Web, ...), з підключенням до центрального серверу;
- повноцінний механізм розподілу повноважень між користувачами, що дозволяє створювати та виконувати проєкти з різними правами доступу до його компонентів;
- гнучке формування правил сигналізацій та повідомлень, з урахуванням та підтримкою різних способів повідомлення;
- підтримка користувацького формування палітри та шрифтових переваг інтерфейсу візуалізації, в стилях;
- підтримка користувацького формування карт повідомлень під різне обладнання управління та переваги користувача;
- підтримка профілів користувача, що дозволяють визначати різні властивості інтерфейсу візуалізації (гама кольорів, шрифтові особливості, переважні карти повідомлень);
- гнучке зберігання та розповсюдження бібліотек віджетів, кадрів та проєктів інтерфейсів візуалізації у БД, підтримуваних OpenSCADA; практично, користувачу треба тільки зареєструвати отриману БД з даними.
5 Програвання ситуацій з реалізації їх на основі концепції даного проєкту
Мета програвання процесу побудови різних інтерфейсів візуалізації на основі концепції даного проєкту полягає у виявлені особливостей різних реалізацій та вузьких місць у описі їх концепцією.
Виконано у думках та без фіксації тут.
6 Реалізація
Реалізація здійснюється поетапно, у напрямку від функцій у концепції до її представлення на бібліотеці Qt, і так до останнього компоненту. Такий підхід дозволяє отримувати результат між етапами, аналізувати його та враховувати особливості на наступних етапах. Для покрокової реалізації розіб'ємо всю задачу на логічні частини та вибудуємо їх у залежності одна від другої, у реалізації.
6.1 Віджети та їх бібліотеки
Цілями даного етапу є:
- Реалізація основи архітектури "Модель даних" — "Представлення" у особі модулів OpenSCADA: "UI.VCAEngine" — "UI.Vision".
- Реалізація базових функцій моделі даних СВУ у модулі UI.VCAEngine:
- Організація сховища даних моделі, модуля UI.VCAEngine, у БД, доступних OpenSCADA.
- Написання сценаріїв управління моделлю даних, модуля UI.VCAEngine, за посередництвом інтерфейсу управління OpenSCADA.
- Створення абстрактного класу віджету VCA::Widget.
- Створення класу бібліотеки віджетів VCA::WdgLib.
- Створення представницьких класів бібліотечного VCA::LWidget та контейнерного VCA::CWidget віджету.
- Створення представницького класу термінального віджету VCA::PrWidget — кінцевого елементу візуалізації.
- Створення первинної версії бібліотеки термінальних віджетів — моделі даних примітивів візуалізації.
- Реалізація базових функцій середовища розробки користувацького інтерфейсу у модулі представлення UI.Vision:
- Побудова основи користувацького інтерфейсу розробки на бібліотеці Qt.
- Формування навігатору за бібліотеками віджетів та механізми управління ними.
- Формування інспектору атрибутів віджету.
- Формування діалогу редагування властивостей бібліотеки.
- Формування діалогу редагування властивостей віджету.
- Формування графічного редактору кадрів та основи графічного редагування елементів кінцевої візуалізації — примітивів.
У результаті виконаної роботи створено модулі моделі даних UI.VCAEngine та представлення UI.Vision, UI.WebVision. На даному етапі, модулями реалізуються більшість передбачених цим проєктом механізмів повноцінної візуалізації та розробки, наразі тільки у візуалізаторі UI.Vision.
Розглянемо результати реалізації даного етапу за пунктами:
6.1.1 Реалізація основи архітектури "Модель даних"-"Представлення"
Згідно до статичної діаграми класів (рис.4.11.1) та загальним вимогам, для OpenSCADA було реалізовано модулі "UI.VCAEngine" та "UI.Vision", "UI.WebVision". Модуль "UI.VCAEngine" реалізує модель даних СВУ та є джерелом для подальшого представлення цих даних різними механізмами візуалізації. Модуль "UI.Vision" реалізує спосіб представлення даних, заснований на бібліотеці Qt версії 4 та 5. Модуль "UI.WebVision" реалізує спосіб представлення даних, заснований на Web-технологіях.
Зв'язки між модулем моделі даних та представлення, первинно, організована за посередництвом прямих викликів (сильні зв'язки). Такий спосіб зв'язку обрано для попереднього абстрагування від особливостей взаємодії та концентрації на основних завданнях реалізації. Надалі, виконано уніфікацію та побудову цих зв'язків за посередництвом інтерфейсу управління OpenSCADA (слабкі зв'язки). У результаті, досягнуто можливість рознесення моделі даних та представлення з можливістю одночасного обслуговування різних механізмів представлення однією моделлю даних СВУ. Це, зокрема, дозволило оцінити ступінь впливу типу зв'язку на продуктивність СВУ.
6.1.2 Реалізація базових функцій моделі даних СВУ у модулі UI.VCAEngine
Модуль моделі даних (рушія) СВУ містить контейнер бібліотек віджетів-кадрів. Модулем надається превизначена бібліотека базових віджетів — примітивів, з реалізацією власних властивостей та логіки обробки цих властивостей.
Зберігання даних віджетів, бібліотек віджетів та проєктів реалізовано у БД, доступних OpenSCADA. БД організовано за приналежністю даних до бібліотеки-проєкту. Тобто, окрема бібліотека-проєкт зберігається у окремій групі таблиць БД, детальніше про актуальну структуру БД описано у розділі "Використання БД для зберігання бібліотек віджетів та проєктів".
Для управління бібліотеками віджетів та окремими віджетами було написано сценарії конфігурації, на мові інтерфейсу управління OpenSCADA. Ці сценарії, переважно, прикликано виконувати функцію централізованої конфігурації елементів рушія СВУ, та, з метою організації "слабких зв'язків" між "Моделлю даних" та "Представленням", їх розширено та наділено функцією обробки запитів до моделі даних від модулів представлення.
Основою практично всіх елементів рушія став об'єкт абстрактного елементу візуалізації VCA::Widget. На своєму абстрактному рівні об'єкт наділено наступними властивостями:
- "Використального" наслідування — механізм наслідування окремих властивостей другого екземпляру об'єкту. Використовується для організації механізму вторинного використання — перевизначення та довизначення елементів візуалізації.
- Зберігання властивостей (атрибутів) віджетів з механізмами "використального" наслідування значень. Механізм "використального" наслідування виконує наслідування значень властивостей з самого кореневого елементу та до верхнього з можливістю перевизначення значень на кожному з рівнів. При цьому, у БД зберігаються тільки значення змінених властивостей.
- Підтримка режиму контейнеру. У цьому режимі віджет може включати інші(дочірні) віджети, як бібліотека віджетів містить віджети. Використовується у бібліотечних віджетах, які успадковують властивості примітиву-контейнеру, наприклад примітив кадру "Box". Також, ця властивість використовується у сеансі проєкту для побудови ієрархічного дерева віджетів (примітивів) при формуванні кінцевого образу візуалізації кадрів.
- Підтримка режиму простого зв'язування. Цей режим використовується для вкладених віджетів бібліотеки. Особливістю цього режиму є те, що він не успадковує властивості контейнеру, а значить не може прямо містити вкладені віджети (розділ 4.5).
- Містить процедуру внутрішньої логіки віджету на мові OpenSCADA. Логіка цієї процедури може використовуватися для організації взаємодії вкладених віджетів та контейнеру один з одним формуючи потрібну поведінку.
- Надання доступу до ресурсів з урахуванням ієрархії "використального" наслідування.
Для надання бібліотеки віджетів реалізовано клас VCA::WdgLib, основними функціями якого є: утримання бібліотечних віджетів, збереження та завантаження їх з БД, надання доступу до ресурсів, а також контроль доступу.
Спеціально для включення до бібліотеки віджетів створено клас бібліотечного віджету VCA::LWidget, який засновано на класі абстрактного віджету VCA::Widget та надає додаткові функції: зберігання даних віджету у таблицях бібліотеки, перевизначення доступу до ресурсів на таблицю з даними бібліотеки та зберігання вкладеного контейнерного віджету VCA::CWidget.
Своєю чергою, клас контейнерного віджету VCA::CWidget надає функції: зберігання даних контейнерного віджету у таблицях бібліотеки, перевизначення доступу до ресурсів на таблицю з даними бібліотеки, а також — примусовий режим простого посилання для всіх контейнерних віджетів.
На основі класу бібліотечного віджету VCA::LWidget сформовано абстрактний клас термінального віджету VCA::PrWidget. А вже на його основі сформовано реалізації примітивів базових віджетів, які й формують бібліотеку базових віджетів, що створюється модулем при ініціалізації. Значення властивостей базових віджетів, також, можуть зберігатися у БД (таблиці бібліотеки віджетів), формуючи потрібні шаблони. Крім того, базова бібліотека примітивів може довизначатися розширеними примітивами, з модулів інтерфейсів представлення, яким базових недостатньо. Але, у цьому випадку, треба враховувати, що подібні дії — це шлях до несумісності між модулями інтерфейсів представлення!
6.1.3 Реалізація базових функцій середовища розробки користувацького інтерфейсу у модулі представлення UI.Vision
Середовище розробки користувацьких інтерфейсів модуля засновано на MDI (Multi Document Interface). Такий підхід дозволяє відкривати на редагування декілька кадрів різних розмірів. Використано наступні механізми управління розробкою: панелі інструментів, пункти меню та контекстне меню. Більшість дій дублюється різними механізмами. Навігаційні інтерфейси реалізовано приєднуваними вікнами. Конфігурація панелей інструментів та приєднуваних вікон зберігається при виході та відновлюється при старті, що дозволяє налаштовувати інтерфейс під себе.
Одним з елементів користувацького інтерфейсу, реалізованим як приєднуване вікно, є навігатор бібліотек віджетів. За допомогою навігатору можна швидко знайти потрібний віджет або бібліотеку та здійснити над ними необхідні операції. Реалізовано операції: додання, видалення, виклик налаштування віджетів та бібліотек, а також виклик візуального редагування віджетів.
Для зручного управління властивостями віджетів-кадрів реалізовано інспектор атрибутів (властивостей) віджетів. Інспектор атрибутів реалізовано як приєднуване вікно, яке активується при обрані кадру або віджету. Вікно інспектору атрибутів можна зручно розташувати на виду, пришвартувавши до однієї з сторін робочого вікна. Інспектором атрибутів реалізовано підтримку групової конфігурації декількох віджетів з групуванням однотипних властивостей.
Реалізовано візуальне редагування віджетів та кадрів на основі примітиву "Box" — контейнерні віджети, а також інших, неконтейнерних, на кшталт "Елементарної фігури". У редакторі контейнерних кадрів реалізовано функції:
- виділення віджету та групи віджетів на кадрі;
- перетаскування виділених віджетів по кадру;
- зміна розмірів виділених віджетів на кадрі;
- редагування властивостей виділених віджетів;
- вирівнювання та управління рівнями відображення виділених віджетів.
Вигляд вікна розробки приведено на рисунку 6.1.1, де можна бачити: панелі інструментів, навігатор віджетів, інспектор атрибутів, вікно редагування кадру та рядок статусу.
Для налаштування об'єктів віджетів та їх бібліотек розроблено два діалоги: діалог налаштування віджету та діалог налаштування бібліотеки віджетів. Діалог налаштування бібліотеки (рис.6.1.2) дозволяє встановити основні властивості та помістити ресурси до БД для подальшого використання у віджетах бібліотеки. Діалог налаштування віджету (рис.6.1.3) дозволяє встановити: основні властивості віджету, індивідуально встановити значення атрибутів та сконфігурувати внутрішню процедуру обчислень віджету з додатковими (користувацькими) властивостями.
6.2 Проєкти інтерфейсів візуалізації
Цілями даного етапу є:
- Реалізація проєктів інтерфейсів візуалізації на рівні моделі даних СВУ, у модулі UI.VCAEngine:
- Розробка механізмів посилань кадру у складі: внутрі-кадрових локальних посилань, зовнішніх посилань на параметри підсистеми збору даних OpenSCADA та дії інтерфейсу за подіями.
- Розробка дерева сторінок проєкту та їх взаємозв'язків.
- Реалізація проєктів інтерфейсів візуалізації у модулі представлення UI.Vision(Qt):
- Формування навігатору за проєктами.
- Формування діалогу налаштування сторінок проєкту;
- Реалізація підтримки можливості безпосереднього графічного формування сторінок на рівні проєкту.
На даному етапі було додано механізм формування проєктів СВУ, посередництвом побудови сторінок візуалізації у ієрархічному вигляді, який відповідає логічним зв'язкам у кінцевому інтерфейсі СВУ. У процесі реалізації даного етапу було розпочато роботи з адаптації модуля візуалізації "Vision" до використання інтерфейсу управління OpenSCADA замість прямих-сильних зв'язків. Ці роботи дозволили досягти значної уніфікації різних діалогів, структур управління та користувацького інтерфейсу загалом.
На цьому етапі реалізовано:
- Механізм посилань. Тільки на параметри джерел даних! Внутрішні зв'язки реалізовано на подальших етапах.
- Інспектор зв'язків модуля "Vision", використовуючи сценарії інтерфейсу управління OpenSCADA.
- Механізм формування дерева сторінок, заснований на термінах: сторінка-шаблон та сторінка-контейнер. Даний механізм дозволяє достатньо просто описати залежності між сторінками більшості відомих типів користувацького інтерфейсу з ефективною адресацією та посиланнями на сторінки як окремо, так і за шаблоном.
- Навігатор за деревом проєкту як на мові сценаріїв інтерфейсу управління, так і у модулі "Vision", використовуючи той-же сценарій інтерфейсу управління.
- Діалог конфігурації проєкту та сторінок проєкту. Фактично діалоги конфігурації елементів проєкту та бібліотеки поєднано, а також виконано перехід на слабкі зв'язки інтерфейсу управління OpenSCADA.
- Завдяки уніфікації інтерфейсу доступу до елементів бібліотеки та проєкту, реалізовано можливість прямого формування сторінок на рівні проєкту.
6.3 Сеанси виконання проєктів
Цілями даного етапу є:
- Реалізація сеансів виконання проєктів на рівні моделі даних СВУ у модулі UI.VCAEngine:
- Формування ієрархічного дерева віджетів кінцевої візуалізації на основі проєкту, для якого відкривається сеанс.
- Формування кадрів значень для процедур обрахунку віджетів кінцевої візуалізації.
- Обробка посилань на параметри джерел даних OpenSCADA.
- Реалізація ієрархічного обрахунку процедур та оновлення посилань віджетів.
- Формування механізму проходження та обробки повідомлень за ієрархічним деревом.
- Реалізація візуалізації сеансів проєктів у модулі представлення UI.Vision(Qt), як повноцінного користувацького інтерфейсу з елементами візуалізації динаміки, історії та управління:
- Формування вікна виконання проєкту — "Виконання".
- Візуалізація кадрів проєкту у режимі "Виконання" з періодичним оновленням вмісту.
- Реалізація передачі та обробки повідомлень.
- Реалізація механізму перемикання-відкриття-заміщення-навігації за сторінками проєкту, з урахуванням сценаріїв обробки.
На даному етапі було додано механізм виконання проєкту у сеансах моделі даних модуля VCAEngine, а також візуалізація сеансу проєкту — режим "Виконання", у модулі візуалізації Vision на бібліотеці Qt, з елементами оновлення даних та інтерактивної взаємодії з користувачем.
6.3.1 Формування ієрархічного дерева віджеті кінцевої візуалізації на основі проєкту для якого відкривається сеанс
Згідно рисунку 4.11.1 та розділу 4.5 об'єкти сеансу проєкту успадковуються від абстрактного об'єкта Widget та використовують відповідні об'єкти проєкту. Так, сеанс Session використовує проєкт Project та формує розгорнуте дерево на основі нього. Сторінка проєкту Page прямо використовується сторінкою сеансу SessPage. Інші об'єкти SessWdg розгортаються згідно ієрархії елементів сторінки (розділ 4.5).
Додатково до стандартних властивостей абстрактного віджету Widget, елементи сторінки та самі сторінки сеансу отримують властивості: зберігання кадру значень обчислювальної процедури, обрахунку процедур та механізм обробки повідомлень. Сторінки сеансу, додатково до всього, містять контейнер сторінок, що слідують згідно до ієрархії. Сеанс, загалом, обраховується з вказаною періодичністю та у порядку, описаному у розділі 4.5. У сеансі, як і у проєкті, реалізуються спеціальні сторінки, які тут виконуються, про що детально описано у розділі 4.4.
6.3.2 Формування об'єктів значень для процедур обрахунку віджетів кінцевої візуалізації
У розділі вище ми вже відзначали, що віджет сеансу містить об'єкт значень процедури обрахунку. Цей об'єкт ініціюється та використовується у випадку наявності самої процедури обчислення, про що детальніше у розділі 4.5.
6.3.3 Обробка посилань на параметри джерел даних OpenSCADA
При виконані віджету сеансу треба та здійснюється виконання обробки посилань, які реалізовано згідно розділу 4.10.
6.3.4 Формування вікна виконання проєкту — "Виконання"
На боці візуалізації (модуль Vision), для візуалізації процесу виконання проєкту реалізовано об'єкт VisRun. При запуску він шле запит на створення та ініціалізацію сеансу. Далі виконується запит на перелік відкритих сторінок. Виходячи з інформації про відкриті сторінки та їх зв'язність, формується результатний інтерфейс. На рисунку 6.3 наведено приклад класичного SCADA інтерфейсу з об'єктами сигналізації, де головне вікно містить сторінку всередині, яка заміщується за натиском на кнопки об'єктів сигналізації та гортання.
6.3.5 Візуалізація кадрів проєкту у режимі "Виконання" з періодичним оновленням вмісту
Реалізовано оновлення вмісту відкритих сторінок інтерфейсу візуалізації з періодичністю виконання сеансу проєкту. У процесі оновлення виконується:
- запит, у моделі, переліку відкритих сторінок та перевірка відповідності реально відкритих сторінок цьому переліку;
- запит змінених даних по кожній відкритій сторінці та її віджетам;
- оновлення вмісту сторінок та їх віджетів, згідно до отриманих змінених даних.
При закритті вікна "Виконання" здійснюється закриття сеансу проєкту у моделі даних, якщо сеанс не фоновий та це було останнє підключення.
Механізм запиту тільки змінених даних засновано на абсолютному лічильнику виконання сеансу. При внесені реальних змін до атрибутів віджетів виконується запам'ятовування значення цього лічильника, що й дозволяє ідентифікувати змінені атрибути. Такий підхід дозволяє підвищити продуктивність та зменшити навантаження на трафік, у випадку доступу до моделі через мережу.
6.3.6 Реалізація передачі та обробки повідомлень
Візуалізатор сеансу ("RunTime"), через свій безпосередній контакт з користувачем, збирає різні повідомлення. Частина повідомлень обробляється образами базових віджетів (Text, Box, Document та інше), у результаті чого можуть формуватися інші повідомлення. Друга частина повідомлень прямо передається у модель даних, де вони й обробляються, про що детально описано у розділі 4.7.
6.3.7 Реалізація механізму перемикання-відкриття-заміщення-навігації по сторінкам проєкту, з урахуванням сценаріїв обробки
Переключення, відкриття, заміщення та навігація за сторінками реалізовано на основі обробки повідомлень за сценарієм, у атрибуті активного віджету "evProc". Сценарій цього атрибуту записується у вигляді переліку команд з синтаксисом: {event}:{srcWdg}:{com}:{prm}, деталі у розділі 4.7 та розділі 4.4.
6.4 Проєктування та реалізація примітивів відображення
На даному етапі реалізується модель даних UI.VCAEngine та образи візуалізатору Vision, WebVision для всіх базових елементів: "ElFigure", "FormEl", "Text", "Media", "Diagram", "Protocol", "Document", "Function", "Box".
6.4.1 Примітив елементарна фігура (ElFigure)
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.12.
6.4.1.1 UI.Vision
Реалізовано підтримку елементарних фігур: лінія, еліптична дуга, крива Без'є та заливка замкнених контурів кольором та зображенням. Для елементарних фігур реалізовано наступні операції:
- створення/видалення фігур;
- копіювання фігур;
- переміщення та зміна розмірів фігур за допомогою маніпулятору миші та клавіатури;
- можливість зв'язування елементарних фігур одна з одною, отримуючи більш складні, для яких доступні всі властивості вихідних елементарних фігур;
- можливість одночасного переміщення декількох фігур;
- заливка замкненого контуру кольором та зображенням;
- генерація повідомлень клавіш миші під час кліку на залиті контури;
- масштабування;
- трансформація: поворот та віддзеркалення.
На рисунку представлена частина екрану з кадром, що містить елементарні фігури.
Щодо внутрішнього графічного редактору на модулі Vision ви можете в деталях почитати у відповідній секції "Векторний графічний редактор", а тут опишемо лише корисні поради.
Фігури, що лежать у основі даного віджету, містять точки(початкова та кінцева), які можуть стикуватися з відповідними точками інших фігур, та точки, за допомогою яких змінюється геометрія фігури.
Додати фігуру можна з допомогою маніпулятору миші:
- Обрати бажану фігуру з контекстного меню.
- Задати, за допомогою лівої кнопки миші, початкову та кінцеву точки (для лінії, при утримані клавіші SHIFT відбувається ортогональне її відображення).
Видалити фігуру(и) можна шляхом натискання кнопки "Del", маючи виділену(і) фігуру(и).
Скопіювати фігуру(и) можна шляхом натиску комбінації клавіш "Ctrl"+"C", маючи виділену(і) фігуру(и).
Пересунути/змінити габарити фігури можна за допомогою маніпулятору миші або клавіатури:
- Виділити фігуру, клацнув по ні лівою кнопкою миші.
- Перетягти (за допомогою миші або керуючих клавіш) фігуру або одну з її контрольних точок у бажане місце та відпустити кнопку миші(клавішу).
Передбачено можливість переміщення декількох виділених фігур, обраних за допомогою утримання "Ctrl" (працює при відімкненій кнопці "Прив'язки") або мишею.
Зв'язати фігури одна з одною можна наступним чином:
- Натиснути кнопку "Прив'язки".
- Виділити одну з фігур та перемістити її початкову або кінцеву точку до бажаної початкової або кінцевої точки другої фігури так, щоб вона попадала у коло, що виникло. Зв'язані фігури переміщаються так само як і окремі — загальна точка переміщається для всіх фігур, яких вона стосується, де пріоритет віддається дузі та дві дуги не може бути з'єднано безпосередньо одна з одною.
Залити замкнений контур з фігур можна наступним чином:
- Натиснути кнопку "Прив'язки".
- Створити замкнений контур.
- Два рази клацнути мишею всередині нього.
Видалити заливку замкненого контуру можна:
- з контекстного меню, клацнув правою кнопкою маніпулятору миші по заливці;
- розірвавши контур заливки;
- подвійним кліком маніпулятору миші по вже залитому контуру.
Обертання фігури здійснюється довкола центру віджета, а віддзеркалення довкола вертикальної центральної вісі-лінії.
6.4.1.2 UI.WebVision
Реалізовано підтримку елементарних фігур: лінії, еліптичної дуги, кривої Без'є та заливка замкнених контурів кольором та зображенням; з властивостями:
- формування довільних зображень із трьох елементарних фігур та заповнень замкнених просторів кольором або зображенням;
- можливість визначення властивостей фігур як загалом, так і окремо для кожної: ширина, колір та стиль лінії, ширина та колір бордюру лінії, колір та зображення заповнення;
- масштабування;
- трансформація: поворот та віддзеркалення;
- підтримка користувацьких атрибутів динамічних: точок, ширин, кольорів, стилів та зображень;
- формування подій за діями маніпулятором миші у замкненому просторі та загалом.
На рисунку представлено частину екрану з кадром, який містить елементарні фігури.
6.4.2 Примітив елементу форми (FormEl)
Реалізацію на стороні моделі даних (UI.VCAEngine) описано у тому-же документі, розділ 4.12.
6.4.2.1 UI.Vision
Реалізовано підтримку елементів форми на кадрах СВУ із закладеними властивостями, включаючи наступні типи:
- Редактор рядку — Представлено наступними видами: "Текст", "Combo", "Ціле", "Реальне", "Час", "Дата", "Час та Дата". Всі види редактору рядка підтримують підтвердження вводу.
- Редактор тексту — Надає редактор плаского тексту з підтвердженням або відмовою від вводу.
- Поле ознаки — Надає поле бінарної ознаки.
- Кнопка — Надає кнопку з підтримкою кольору кнопки, зображення у кнопці та режимів:
- стандартний;
- перемикальний;
- виклик меню;
- виклик завантаження файлу;
- виклик збереження файлу.
- Вибір з переліку — Надає поле вибору елементу з переліку вказаних елементів.
- Перелік — Надає поле переліку з контролем за поточним елементом.
- Дерево — Надає елемент дерева з можливістю обрання елементів.
- Таблиця — Надає елемент таблиці з можливістю вибору клітинок, рядків або стовпчиків, а також редагування вмісту клітинки.
- Слайдер — Елемент слайдеру.
- Прогрес-бар — Стрічка прогрес-бару.
- Пароль — Приховане введення паролю.
Реалізовано режими "Ввімкнено" та "Активний", а також передача змін та повідомлень у модель даних СВУ — рушій. Режим "Активний" призводить до встановлення курсору активності для непорожнього фону та додаткових умов різних видів "Text", "Media" та "Box":
- Text — не порожній текст;
- Media — не порожнє джерело зображення.
На рисунку представлено частину екрану з кадром, що містить вищеперелічені елементи форми.
6.4.2.2 UI.WebVision
Реалізовано підтримку елементів форми на кадрах СВУ із закладеними властивостями, включаючи наступні типи:
- Редактор рядку — Представлено наступними видами: "Текст", "Combo", "Ціле", "Реальне", "Час", "Дата", "Час та Дата". Всі види редактору рядка підтримують підтвердження вводу.
- Редактор тексту — Надає редактор плаского тексту з підтвердженням або відмовою від вводу.
- Поле ознаки — Надає поле бінарної ознаки.
- Кнопка — Надає кнопку з підтримкою кольору кнопки, зображення у кнопці та режимів:
- стандартний;
- перемикальний;
- виклик меню;
- виклик завантаження файлу;
- виклик збереження файлу.
- Вибір з переліку — Надає поле вибору елементу з переліку вказаних елементів.
- Перелік — Надає поле переліку з контролем за поточним елементом.
- Дерево — Надає елемент дерева з можливістю обрання елементів.
- Таблиця — Надає елемент таблиці з можливістю вибору клітинок, рядків або стовпчиків, а також редагування вмісту клітинки.
- Слайдер — Елемент слайдеру.
- Прогрес-бар — Стрічка прогрес-бару (ідентично до Слайдер).
- Пароль — Приховане введення паролю.
Реалізовано режими "Ввімкнено" та "Активний", а також передача змін та повідомлень у модель даних СВУ — рушій. Режим "Активний" призводить до встановлення курсору активності для непорожнього фону та додаткових умов різних видів "Text", "Media" та "Box":
- Text — не порожній текст;
- Media — не порожнє джерело зображення.
На рисунку представлено частину екрану з кадром, що містить вищеперелічені елементи форми.
6.4.3 Примітив тексту (Text)
Реалізацію на боці моделі даних (UI.VCAEngine) описано в цьому-ж документі, розділ 4.12.
6.4.3.1 UI.Vision
Реалізовано підтримку елементу тексту зі властивостями:
- Шрифт зі властивостями: типу-класу, розміру, підсилення, нахилу, підкреслення та перекреслення.
- Колір тексту.
- Орієнтація тексту.
- Автоматичне перенесення за словами.
- Вирівнювання тексту по горизонталі та вертикалі, з усіма варіантами.
- Відображення фону у вигляді кольору та зображення.
- Відображення бордюру довкола тексту з вказаним кольором, шириною та стилем.
- Відображення HTML.
- Доповнення тексту аргументами різного типу та властивостей.
На рисунку представлено частину екрана з кадром, що містить приклади тексту з використанням різних параметрів.
6.4.3.2 UI.WebVision
Реалізовано підтримку елементу тексту зі властивостями:
- Шрифт зі властивостями: типу-класу, розміру, підсилення, нахилу, підкреслення та перекреслення.
- Колір тексту.
- Орієнтація тексту.
- Автоматичне перенесення за словами.
- Вирівнювання тексту по горизонталі та вертикалі, з усіма варіантами.
- Відображення фону у вигляді кольору та зображення.
- Відображення бордюру довкола тексту з вказаним кольором, шириною та стилем.
- Відображення HTML.
- Доповнення тексту аргументами різного типу та властивостей.
На рисунку представлено частину екрана з кадром, що містить приклади тексту з використанням різних параметрів.
6.4.4 Примітив відображення медіа-матеріалів (Media)
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.12.
6.4.4.1 UI.Vision
Реалізовано підтримку елементу відображення медіа-матеріалів з властивостями:
- Вказання джерела медіа даних: зображення або відео-матеріалу.
- Перегляд зображень більшості відомих форматів з можливістю їх вписування у розмір віджету.
- Програвання простих анімованих форматів зображень та відео з можливістю управління швидкістю програвання.
- Програвання повноформатного відео та аудіо, за посередництвом Qt або Phonon.
- Відображення фону у вигляді кольору та зображення.
- Відображення бордюру по периметру віджету, з вказаним кольором, шириною та стилем.
- Формування активних областей та генерація повідомлень при їх активації.
На рисунку представлено частину екрану з кадром, що містить приклади перегляду/програвання медіа-даних.
6.4.4.2 UI.WebVision
Реалізовано підтримку елементу відображення медіа-матеріалів з властивостями:
- Вказання джерела медіа даних: зображення або відео-матеріалу.
- Перегляд зображень більшості відомих форматів з можливістю їх вписування у розмір віджету.
- Програвання простих анімованих форматів зображень та відео з можливістю управління швидкістю програвання (недоступно).
- Програвання повноформатного відео та аудіо за допомогою HTML5.
- Відображення фону у вигляді кольору та зображення.
- Відображення бордюру по периметру віджету, з вказаним кольором, шириною та стилем.
- Формування активних областей та генерація повідомлень при їх активації.
На рисунку представлено частину екрану з кадром, що містить приклади перегляду/програвання медіа-даних.
6.4.5 Примітив побудови діаграм-графіків (Diagram)
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.12.
6.4.5.1 UI.Vision
Реалізовано підтримку елементу побудови діаграм для типів "Графік", "Спектр" та "XY", з властивостями:
- Загальні властивості типів діаграми "Графік", "Спектр" та "XY":
- можливість вибору архіватору, буферу архіву або всіх даних, при роботі з архівними даними;
- адаптація графіку параметра до реальних значень даних шляхом підлаштування шкалы, у випадку відсутності прямо вказаного діапазону значень;
- управління масштабом шкали значень шляхом збільшення, зменшення та зсуву;
- широкий діапазон масштабування та адаптації шкали часу з автоматичним приведенням запитаних даних до якості достатньої до відображення, або потрібної для експорту — вказанням граничної кількості вимірів у пікселі;
- відображення розмірної ґратки та маркерів по горизонталі та вертикалі з адаптацією до діапазону відображення;
- слідкуючий режим за поточним часом шляхом періодичного оновлення та зміщення часу діаграми до поточного часу — часу останніх даних у буфері архіву;
- горизонтальний слайдинг/ковзання за допомогою миші;
- масштабування ділянки обрамленої вікном, мишею.
- Властивості типу діаграми "Графік":
- побудова графіків до 100 параметрів на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: поточних, архівних та користувацьких даних;
- формування проміжного буферу відображення для поточних значень;
- підтримка активного режиму з курсором та отриманням значень під курсором;
- можливість побудови графіків як у лінійній, так і логарифмічній шкалі значень.
- Властивості типу діаграми "Спектр":
- побудова графіків частотного спектру параметрів до 100 на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: архівних та користувацьких даних;
- підтримка активного режиму з курсором та отриманням значень під курсором.
- Властивості типу діаграми "XY":
- побудова XY графіків параметрів до 50 на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: поточних, архівних та користувацьких даних;
- формування проміжного буферу відображення для поточних значень;
- параметри розподіляються парами на графік, де парні за осі Y (0,2,4...) та непарні за осі X (1,3,5...);
- можливість побудови графіків як у лінійній, так і логарифмічній шкалі значень.
Модулем візуалізатору надається та використовується низка специфічних атрибутів даного примітиву, інформацію про який наведено у таблиці.
Ідентифікатор | Ім'я | Призначення |
---|---|---|
sclWin | Масштабування ділянки обрамленої вікном, мишею | Логічний тип атрибуту, створюваний користувачем вручну, за потреби. Для значення "істина" вмикається режим масштабування ділянки тренду обрамленої вікном за допомогою миші. |
На рисунку представлено частину екрану з кадром, що містить приклади діаграм: "Графік", "Спектр" та "XY".
6.4.5.2 UI.WebVision
Реалізовано підтримку елементу побудови діаграм для типів "Графік", "Спектр" та "XY", з властивостями:
- Загальні властивості типів діаграми "Графік", "Спектр" та "XY":
- можливість вибору архіватору, буферу архіву або всіх даних, при роботі з архівними даними;
- адаптація графіку параметра до реальних значень даних шляхом підлаштування шкалы, у випадку відсутності прямо вказаного діапазону значень;
- управління масштабом шкали значень шляхом збільшення, зменшення та зсуву;
- широкий діапазон масштабування та адаптації шкали часу з автоматичним приведенням запитаних даних до якості достатньої до відображення, або потрібної для експорту — вказанням граничної кількості вимірів у пікселі;
- відображення розмірної ґратки та маркерів по горизонталі та вертикалі з адаптацією до діапазону відображення;
- слідкуючий режим за поточним часом шляхом періодичного оновлення та зміщення часу діаграми до поточного часу — часу останніх даних у буфері архіву.
- Властивості типу діаграми "Графік":
- побудова графіків до 100 параметрів на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: поточних, архівних та користувацьких даних;
- формування проміжного буферу відображення для поточних значень;
- підтримка активного режиму з курсором та отриманням значень під курсором;
- можливість побудови графіків як у лінійній, так і логарифмічній шкалі значень.
- Властивості типу діаграми "Спектр":
- побудова графіків частотного спектру параметрів до 100 на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: архівних та користувацьких даних;
- підтримка активного режиму з курсором та отриманням значень під курсором.
- Властивості типу діаграми "XY":
- побудова XY графіків параметрів до 50 на одній діаграмі у процентній шкалі та можливістю відображення обраних параметрів у власній шкалі;
- побудова графіку для: поточних, архівних та користувацьких даних;
- формування проміжного буферу відображення для поточних значень;
- параметри розподіляються парами на графік, де парні за осі Y (0,2,4...) та непарні за осі X (1,3,5...);
- можливість побудови графіків як у лінійній, так і логарифмічній шкалі значень.
На рисунку представлено частину екрану з кадром, що містить приклади діаграм: "Графік", "Спектр" та "XY".
6.4.6 Примітив формування протоколу (Protocol)
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.12.
6.4.6.1 UI.Vision
Реалізовано підтримку елементу формування протоколу з властивостями:
- Формування протоколу з архіву повідомлень на вказаний час та глибину.
- Запит даних з вказаних архіваторів повідомлень.
- Вибірка даних з архівів за рівнем важливості та шаблоном категорії повідомлень.
- Підтримка режиму слідкування за появою повідомлень у архіві повідомлень.
На рисунку представлено частину екрану з кадром, що містить приклад протоколу.
6.4.6.2 UI.WebVision
Реалізовано підтримку елементу формування протоколу з властивостями:
- Формування протоколу з архіву повідомлень на вказаний час та глибину.
- Запит даних з вказаних архіваторів повідомлень.
- Вибірка даних з архівів за рівнем важливості та шаблоном категорії повідомлень.
- Підтримка режиму слідкування за появою повідомлень у архіві повідомлень.
На рисунку представлено частину екрану з кадром, що містить приклад протоколу.
6.4.7 Примітив формування документу (Document)
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.12.
6.4.7.1 UI.Vision
Реалізовано підтримку елементу формування звітної документації з властивостями:
- Гнучке формування структури документу на основі мови гіпертекстової розмітки, що надає підтримку широких можливостей форматування документів.
- Формування документів за командою або розкладом, що необхідно для формування звітної документації до архіву, з подальшим переглядом архіву.
- Формування документів у режимі реального часу, для надання їх повністю динамічно та на основі архівів за вказаний час.
- Використання атрибутів віджету для передачі у документ значень та адрес на архіви, що дозволяє використовувати віджет документу як шаблон, при формуванні звітів з іншими вхідними даними.
У основі будь-якого документу лежить XHTML-шаблон. XHTML-шаблон це тег "body" WEB-сторінки, що містить статику документу у стандарті XHTML 1.0 та елементи виконувальних інструкцій на мові користувацького програмування OpenSCADA, у вигляді <?dp {procedure} ?>. Результуючий документ формується шляхом виконання процедур та вставки їх результату у документ.
Джерелом значень виконуваних інструкцій є атрибути віджету цього примітиву, а також всі механізми мови користувацького програмування OpenSCADA. Атрибути можуть додаватися користувачем та лінкуватися на реальні атрибути параметрів або-ж бути автономними, значення яких будуть формуватися у процедурі віджету. У випадку зі злінкованими атрибутами, значення можуть вийматися з архіву-історії.
На рисунку представлено кадр, що містить приклад документу.
6.4.7.2 UI.WebVision
Реалізовано підтримку елементу формування звітної документації з властивостями:
- Гнучке формування структури документу на основі мови гіпертекстової розмітки, що надає підтримку широких можливостей форматування документів.
- Формування документів за командою або розкладом, що необхідно для формування звітної документації до архіву, з подальшим переглядом архіву.
- Формування документів у режимі реального часу, для надання їх повністю динамічно та на основі архівів за вказаний час.
- Використання атрибутів віджету для передачі у документ значень та адрес на архіви, що дозволяє використовувати віджет документу як шаблон, при формуванні звітів з іншими вхідними даними.
У основі будь-якого документу лежить XHTML-шаблон. XHTML-шаблон це тег "body" WEB-сторінки, що містить статику документу у стандарті XHTML 1.0 та елементи виконувальних інструкцій на мові користувацького програмування OpenSCADA, у вигляді <?dp {procedure} ?>. Результуючий документ формується шляхом виконання процедур та вставки їх результату у документ.
Джерелом значень виконуваних інструкцій є атрибути віджету цього примітиву, а також всі механізми мови користувацького програмування OpenSCADA. Атрибути можуть додаватися користувачем та лінкуватися на реальні атрибути параметрів або-ж бути автономними, значення яких будуть формуватися у процедурі віджету. У випадку зі злінкованими атрибутами, значення можуть вийматися з архіву-історії.
На рисунку представлено кадр, який містить приклад документу.
6.4.8 Примітив контейнеру (Box)
Реалізацію на боці моделі даних (UI.VCAEngine) описано в цьому-ж документі, розділ 4.12.
6.4.8.1 UI.Vision
Реалізовано підтримку примітиву контейнеру, що, за сумісництвом, виконує роль сторінок проєктів. Даний примітив є єдиним елементом-контейнером, який може включати у себе посилання на кадри з бібліотеки, формуючи тим самим користувацькі елементи потрібної конфігурації. Примітив реалізує передбачені проєктом властивості. Перелічимо, по пунктах, властивості даного примітиву:
- Контейнер — Дозволяє формувати потрібні об'єкти шляхом групування базових у межах даного примітиву.
- Сторінка — Елементи, побудовані на даному примітиві, можуть виконувати роль сторінки користувацького інтерфейсу.
- Контейнер сторінок — Властивість заміщення, у процесі виконання, власного вмісту іншою сторінкою. Використовується для формування фреймів на сторінках користувацького інтерфейсу. Наприклад, головна сторінка типової SCADA-системи з об'єктами сигналізації будується саме таким чином.
- Фон — Підтримує можливість указання фону у вигляді кольору та зображення.
- Бордюр — Підтримує можливість зображення бордюру з вказаним кольором, товщиною та стилем.
6.4.8.2 UI.WebVision
Реалізовано підтримку примітиву контейнеру, що, за сумісництвом, виконує роль сторінок проєктів. Даний примітив є єдиним елементом-контейнером, який може включати у себе посилання на кадри з бібліотеки, формуючи тим самим користувацькі елементи потрібної конфігурації. Примітив реалізує передбачені проєктом властивості. Перелічимо, по пунктах, властивості даного примітиву:
- Контейнер — Дозволяє формувати потрібні об'єкти шляхом групування базових у межах даного примітиву.
- Сторінка — Елементи, побудовані на даному примітиві, можуть виконувати роль сторінки користувацького інтерфейсу.
- Контейнер сторінок — Властивість заміщення, у процесі виконання, власного вмісту іншою сторінкою. Використовується для формування фреймів на сторінках користувацького інтерфейсу. Наприклад, головна сторінка типової SCADA-системи з об'єктами сигналізації будується саме таким чином.
- Фон — Підтримує можливість указання фону у вигляді кольору та зображення.
- Бордюр — Підтримує можливість зображення бордюру з вказаним кольором, товщиною та стилем.
6.5 Теми-стилі відображення
Реалізацію на боці моделі даних (UI.VCAEngine) описано у цьому-ж документі, розділ 4.6.
6.5.1 UI.Vision
Відомо, що людина може мати індивідуальні особливості сприйняття графічної інформації. Якщо ці особливості не враховувати то можна отримати несприйняття та відторгнення користувача до інтерфейсу ВУ. Таке несприйняття та відторгнення може призвести до фатальних помилок при управлінні ТП, а також травмувати людину постійною роботою з інтерфейсом. У SCADA системах прийнято домовленості, які регламентують вимоги по створенню уніфікованого інтерфейсу ВУ, що нормально сприймається більшістю людей. При цьому, практично відсутнє врахування особливостей людей з деякими відхиленнями.
З метою врахувати цю обставину, та надати можливість централізовано та просто змінювати візуальні властивості інтерфейсу, проєктом реалізується менеджер стилів інтерфейсу візуалізації.
Користувачем може бути створено багато стилів, кожний з яких буде зберігати кольорові, шрифтові та інші властивості елементів кадру. Проста зміна стилю дозволить швидко видозмінити інтерфейс ВУ, та можливість призначення індивідуального стилю до користувача дозволить врахувати його особливості.
Для реалізації цієї можливості, при створені кадрів, необхідно для властивостей кольору, шрифту та інших встановити параметр "Конфігурація" (таблиці у вкладці "Обробка") у значення "З стилю". А у параметрі "Конфігураційний шаблон" вказати ідентифікатор поля стиля. Далі, це поле автоматично з'явиться у менеджері стилів та його можна буде там змінювати. Менеджер стилів доступний на сторінці конфігурації проєкту у вкладці "Стилі". На цій вкладці можна стилі створювати, видаляти та змінювати, видаляти їх поля.
Загалом, стилі доступні починаючи з рівня проєктів. На рівні бібліотек віджетів можна тільки визначати поля стилів у віджетів. На рівні проєкту, при виборі стиля, включається робота зі стилями, що передбачає доступ до полів стилів замість безпосередніх значень атрибутів. Фактично, це означає, що при читанні або записі атрибуту віджету, вказані операції будуть здійснюватися над відповідним полем обраного стилю.
При запуску проєкту на виконання буде використано встановлений у проєкті стиль. Надалі, користувач може обрати стиль з переліку доступних. Обраний користувачем стиль буде збережено та використано при наступному запуску проєкту.
6.5.2 UI.WebVision
Через відсутність інструменту розробки користувацьких інтерфейсів він не потребує специфічної реалізації стилів.
6.6 Карти повідомлень — У планах
Реалізація даного пункту поки відсутня та буде здійснена за потреби.
6.7 Реалізація слабких зв'язків між моделлю даних та представленням
У процесі реалізації даного етапу написано додаткові сценарії інтерфейсу управління для покриття задачі організації слабких зв'язків між моделлю (VCAEngine) та візуалізатором (Vision). На боці візуалізатору (Vision) виконано повний перехід на слабкі зв'язки з моделлю даних VCA. У результаті цього вдалося досягти значної уніфікації візуалізатору та підвищити його стабільність. питання продуктивності розглянемо нижче.
6.8 Web-інтерфейс візуалізації сеансу проєкту
Реалізацію виконано у модулі UI.WebVision та у об'ємі виконання всіх примітивів та їх видів, для проєктів розроблених у UI.Vision.
7 Оптимізація
У процесі реалізації неодноразово застосовувалися заходи з оптимізації, спрямовані на підвищення продуктивності різних вузлів СВУ та взаємодії між ними. У цьому розділі розташовано звіти, міркування та плани таких заходів.
23.08.2007
Підстава: Найбільш відповідальним, у питанні продуктивності, є взаємодія між моделлю даний СВУ та візуалізаторами, а також цикли обслуговування інтерактивної взаємодії та оновлення. Дане питання набуває ще більшого значення у світлі того, що для взаємодії візуалізаторів з моделлю даних СВУ використовуються слабкі зв'язки, а саме — повідомлення, засновані на XML-запитах, які потенційно повільніше прямих зв'язків. Однак можливість подальшого переспрямування потоку даних взаємодії на мережеві транспортні протоколи, а також більш висока надійність такої взаємодії, виправдовують зусилля з оптимізації цієї взаємодії.
Умови: Основними об'єктами оптимізації є: цикл оновлення візуалізатору "Vision" та цикл обрахунку сеансу на боці моделі даних СВУ. Замір інтервалів часу виконувалося на обчислювальній машині Athlon 64 3000+, з заниженою до 800МГц частотою процесору та тестовій сторінці.
Процес | Початковий час, мілісекунди | Результатний час, мілісекунди | Коментарі |
---|---|---|---|
Цикл оновлення візуалізатору "Vision" | |||
Повний секундний цикл оновлення | 43 | 10 | |
Обробка переліку відкритих вікон | 2.3 | 2.2 | Незначне покращення за рахунок виокремлення функції запиту переліку відкритих вікон у сервісні функції швидкого доступу. |
Оновлення відкритих сторінок | 41 | 9 | |
Запит атрибутів | 24 | 7 | Значно скоротилося за рахунок введення загального лічильника модифікації віджету та виносу запиту оновлення переліку некористувацьких атрибутів до циклу обрахунку сеансу. |
Виклик функції setAttr(), для отриманих атрибутів | 19 | 2 | Значно скоротилося за рахунок перегляду та доопрацювання примітиву "Text". |
Цикл обрахунку сеансу користувацького інтерфейсу моделі даних СВУ. | |||
Повний цикл обчислення | 53 | 21 | Значно скоротився за рахунок перегляду послідовності обчислення віджету та зменшення періодичності оновлення переліку: злінкованих атрибутів та активних дочірніх віджетів. |
11.07.2008
Підстава: Для оцінки потенційних можливостей середовища візуалізації з продуктивності, а також з метою підвищення продуктивності та можливості створення мнемосхем з великою кількістю віджетів, було здійснено оптимізацію візуалізації віджетів, як у режимі розробки, так і у режимі виконання.
Умови: Вимірювання інтервалів часу виконувалося на обчислювальній машині Pentium 4 3200.
Процес | Початковий час, мілісекунди | Результатний час, мілісекунди | Коментарі |
---|---|---|---|
160 еліптичних дуг по одній у кожному віджеті, з радіусами по 20 пікселів та товщиною лінії 1. | Завантаження: 497; Ініціалізація, відмальовка: 355 |
Завантаження: 333; Ініціалізація, відмальовка: 273 |
|
160 еліптичних дуг по одній у кожному віджеті з радіусами по 20 пікселів та товщиною лінії 1, з заповненням у кожній. | Завантаження: 492; Ініціалізація, відмальовка: 1379 |
Завантаження: 326; Ініціалізація, відмальовка: 470 |
|
160 еліптичних дуг по одній у кожному віджеті з радіусами по 20 пікселів та товщиною лінії 1, з заливкою у кожній та з масштабом сторінки 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 |
09.2022
Підстава: Зменшення загального навантаження інтерфейсу на дуже навантажених системах, повільних Інтернет каналах (особливо для Web), для переважно пасивних інтерфейсів без періодичного оновлення та зі збереженням реактивності інтерфейсу — реакції на події; для чого запроваджено такі вдосконалення:
- 2021-03: UI.VCAEngine доповнено щодо раннього опрацювання подій;
- 2022-09-20: UI.VCAEngine адаптовано до функціювання за дуже великих періодичностей опрацювання та вимкнення періодичного опрацювання взагалі.
Умови: Вимірювання навантаження ЦП відбувалося на комп'ютері визначеному у таблиці за допомогою утиліти top.
Умова | Базове навантаження (ЦП%) | VCAEngine Сеанс (ЦП%) | Vision (ЦП%) | WebVision, Cromium (ЦП%) |
---|---|---|---|---|
AMD A8-6500 комп'ютер на політиці масштабування ЦП "Заощадження" для АГЛКС із відкритою основною сторінкою та обраним-блимаючим PC1 | ||||
Оригінально — без оптимізації | 29 | 33 = +4 | 48 = +15 | 52 = +19, 25 |
Період проєкту/сеансу 100 мс, КореневоїСторінки 1000 мс, ПанелейКерування 100 мс | 26.5 | 31.5 = +5 | 46.5 = +15 | 51 = +19.5, 30 |
Період проєкту/сеансу 250 мс, КореневоїСторінки 1000 мс, ПанелейКерування 250 мс | 26.5 | 29.5 = +3 | 40 = +9.5 | 43 = +12.5, 21 |
Період проєкту/сеансу 250 мс, КореневоїСторінки 10000 мс, ПанелейКерування 1000 мс | 26.5 | 28.5 = +2 | 37.5 = +9 | 37 = +8.5, 10 |
Період проєкту/сеансу 250 мс, КореневоїСторінки ВИМКНЕНО, ПанелейКерування 1000 мс | 26.5 | 28.5 = +2 | 37.5 = +9 | 36.5 = +8, 10 |
Період проєкту/сеансу 250 мс, КореневоїСторінки ВИМКНЕНО, ПанелейКерування 1000 мс > без обрання | 26.5 | 27.5 = +1 | 36.5 = +9 | 34 = +6.5, 7 |
Період проєкту/сеансу 100 мс, КореневоїСторінки ВИМКНЕНО, ПанелейКерування 1000 мс | 26.5 | 29.5 = +3 | 40.5 = +11 | 39 = +9.5, 12 |
Період проєкту/сеансу 100 мс, КореневоїСторінки ВИМКНЕНО, ПанелейКерування 1000 мс > без обрання | 26.5 | 29.5 = +3 | 38 = +8.5 | 36 = +6.5, 9 |
AMD Phenom(tm) II X4 900e сервер на політиці масштабування ЦП "Динамічно, переважно 800 МГц" для проєкту РозумнийБудинок | ||||
Період проєкту/сеансу 100 мс, КореневоїСторінки 1000 мс, ПанелейКерування 100 мс > головна сторінка | 6 | 20 = +14 | - | 30 = +10, 16 |
Період проєкту/сеансу 250 мс, КореневоїСторінки 10000 мс, ПанелейКерування 1000 мс > головна сторінка | 6 | 12 = +6 | - | 16 = +4, 9 |
Період проєкту/сеансу 250 мс, КореневоїСторінки 10000 мс, ПанелейКерування 1000 мс > група графіків > без адаптації | 6 | 17 = +11 | - | 35 = +18, 12 |
Період проєкту/сеансу 250 мс, КореневоїСторінки 10000 мс, ПанелейКерування 1000 мс > група графіків > адаптація | 6 | 14 = +8 | - | 30 = +16, 11 (примітив Діаграма працює незалежно у 1000 мс) |
Період проєкту/сеансу 250 мс, КореневоїСторінки 10000 мс, ПанелейКерування 1000 мс > група графіків > розширена адаптація | 6 | 12 = +6 | - | 15 = +3, 4 |
8 Посилання
- UML – проєкт (umbrello)
- Діаграма: Узагальнена структура СВУ.
- Діаграма: Приклад структури похідного віджету СВУ.
- Діаграма: Ієрархічне представлення компонентів проєкту класичного інтерфейсу ВУ технологічного процесу. СВУ.
- Діаграма: Карта "використального" наслідування компонентів концепції-рушія СВУ.
- Діаграма: Структурна схема примітиву "Документ".
- Діаграма: Об'єктна модель користувача модуля VCAEngine.