Export translations
Views
Special page
From OpenSCADAWiki
Jump to:
navigation
,
search
Settings
Group
About
Documents
Documents/API
Documents/DAQ
Documents/FAQ
Documents/How to
Documents/How to/Build from source
Documents/How to/Crash report
Documents/How to/Create module
Documents/How to/Create multi language project
Documents/How to/Cyclic programming
Documents/How to/Debug
Documents/How to/Install
Documents/How to/Live disk
Documents/How to/Release
Documents/How to/Transferring project configuration
Documents/How to/Violations, alarms and notifications
Documents/Program manual
Documents/Quick start
Documents/Release 0.8.0
Documents/Release 0.8.0/Update10
Documents/Release 0.8.0/Update11
Documents/Release 0.8.0/Update12
Documents/Release 0.8.0/Update13
Documents/Release 0.8.0/Update14
Documents/Release 0.8.0/Update15
Documents/Release 0.8.0/Update16
Documents/Release 0.8.0/Update17
Documents/Release 0.8.0/Update18
Documents/Release 0.8.0/Update19
Documents/Release 0.8.0/Update20
Documents/Release 0.8.0/Update3
Documents/Release 0.8.0/Update4
Documents/Release 0.8.0/Update5
Documents/Release 0.8.0/Update6
Documents/Release 0.8.0/Update7
Documents/Release 0.8.0/Update8
Documents/Release 0.8.0/Update9
Documents/Release 0.9
Documents/Release 0.9/Update 7
Documents/Release 0.9/Update1
Documents/Release 0.9/Update2
Documents/Release 0.9/Update3
Documents/Release 0.9/Update4
Documents/Release 0.9/Update5
Documents/Release 0.9/Update6
Documents/Release 0.9/Updating 0.8.0 LTS
Documents/Terms
Documents/User API
Functions and demands
Home
Libs
Libs/Devices
Libs/Documents
Libs/Electrical elements
Libs/Generic list
Libs/LowLevelDevices
Libs/Main
Libs/Main graphical elements
Libs/Mnemo elements
Libs/Prescriptions
Libs/Regulation elements
Libs/Service procedures
Libs/Technological apparatuses
Modules
Modules/BFN
Modules/BlockCalc
Modules/Comedi
Modules/DAQGate
Modules/DBArch
Modules/DBF
Modules/DBGate
Modules/DCON
Modules/DiamondBoards
Modules/FireBird
Modules/FLibComplex1
Modules/FLibMath
Modules/FLibSYS
Modules/FSArch
Modules/GPIO
Modules/HTTP
Modules/ICP DAS
Modules/JavaLikeCalc
Modules/LDAP
Modules/LogicLev
Modules/ModBus
Modules/MySQL
Modules/OPC UA
Modules/PostgreSQL
Modules/QTCfg
Modules/QTStarter
Modules/SelfSystem
Modules/Serial
Modules/Siemens
Modules/SMH2Gi
Modules/SNMP
Modules/Sockets
Modules/SoundCard
Modules/SQLite
Modules/SSL
Modules/System
Modules/SystemTests
Modules/UserProtocol
Modules/VCAEngine
Modules/Vision
Modules/WebCfg
Modules/WebCfgD
Modules/WebUser
Modules/WebVision
Sub-projects
Sub-projects/Automatic Builder of OpenSCADA
Sub-projects/Automation Linux distributive
Sub-projects/Embedding and PLC
Sub-projects/Server
Sub-projects/VCA
User:RomanSavochenko
Using
Using/HouseSpirit
Using/Kramatorsk Ball Mills
Using/Kramatorsk Water
Using/Model AGLKS
Using/Model Boiler
Using/OpenWrt TELEOFIS RTU968
Using/Yaroslavskij broiler
Works
Works/Road map
Works/Technical Support
Works/Technical Support/Agreement
Works/To do
Language
aa - Afar
ab - Abkhazian
ace - Achinese
ady - Adyghe
ady-cyrl - адыгабзэ
aeb - Tunisian Arabic
aeb-arab - تونسي
aeb-latn - Tûnsî
af - Afrikaans
ak - Akan
aln - Gheg Albanian
am - Amharic
an - Aragonese
ang - Old English
anp - Angika
ar - Arabic
arc - Aramaic
arn - Mapuche
arq - Algerian Arabic
ary - Moroccan Arabic
arz - Egyptian Arabic
as - Assamese
ase - American Sign Language
ast - Asturian
av - Avaric
avk - Kotava
awa - Awadhi
ay - Aymara
az - Azerbaijani
azb - تۆرکجه
ba - Bashkir
bar - Bavarian
bbc - Batak Toba
bbc-latn - Batak Toba
bcc - Southern Balochi
bcl - Bikol Central
be - Belarusian
be-tarask - Belarusian (Taraškievica orthography)
bg - Bulgarian
bgn - Western Balochi
bho - Bhojpuri
bi - Bislama
bjn - Banjar
bm - Bambara
bn - Bengali
bo - Tibetan
bpy - Bishnupriya
bqi - Bakhtiari
br - Breton
brh - Brahui
bs - Bosnian
bto - Iriga Bicolano
bug - Buginese
bxr - буряад
ca - Catalan
cbk-zam - Chavacano de Zamboanga
cdo - Min Dong Chinese
ce - Chechen
ceb - Cebuano
ch - Chamorro
cho - Choctaw
chr - Cherokee
chy - Cheyenne
ckb - Central Kurdish
co - Corsican
cps - Capiznon
cr - Cree
crh - Crimean Turkish
crh-cyrl - Crimean Turkish (Cyrillic script)
crh-latn - Crimean Turkish (Latin script)
cs - Czech
csb - Kashubian
cu - Church Slavic
cv - Chuvash
cy - Welsh
da - Danish
de - German
de-at - Austrian German
de-ch - Swiss High German
de-formal - German (formal address)
diq - Zazaki
dsb - Lower Sorbian
dtp - Central Dusun
dty - डोटेली
dv - Divehi
dz - Dzongkha
ee - Ewe
egl - Emilian
el - Greek
eml - Emiliano-Romagnolo
en - English
en-ca - Canadian English
en-gb - British English
eo - Esperanto
es - Spanish
et - Estonian
eu - Basque
ext - Extremaduran
fa - Persian
ff - Fulah
fi - Finnish
fit - Tornedalen Finnish
fj - Fijian
fo - Faroese
fr - French
frc - Cajun French
frp - Arpitan
frr - Northern Frisian
fur - Friulian
fy - Western Frisian
ga - Irish
gag - Gagauz
gan - Gan Chinese
gan-hans - Simplified Gan script
gan-hant - Traditional Gan script
gd - Scottish Gaelic
gl - Galician
glk - Gilaki
gn - Guarani
gom - Goan Konkani
gom-deva - Goan Konkani (Devanagari script)
gom-latn - Goan Konkani (Latin script)
got - Gothic
grc - Ancient Greek
gsw - Swiss German
gu - Gujarati
gv - Manx
ha - Hausa
hak - Hakka Chinese
haw - Hawaiian
he - Hebrew
hi - Hindi
hif - Fiji Hindi
hif-latn - Fiji Hindi (Latin script)
hil - Hiligaynon
ho - Hiri Motu
hr - Croatian
hrx - Hunsrik
hsb - Upper Sorbian
ht - Haitian Creole
hu - Hungarian
hy - Armenian
hz - Herero
ia - Interlingua
id - Indonesian
ie - Interlingue
ig - Igbo
ii - Sichuan Yi
ik - Inupiaq
ike-cans - Eastern Canadian (Aboriginal syllabics)
ike-latn - Eastern Canadian (Latin script)
ilo - Iloko
inh - Ingush
io - Ido
is - Icelandic
it - Italian
iu - Inuktitut
ja - Japanese
jam - Jamaican Creole English
jbo - Lojban
jut - Jutish
jv - Javanese
ka - Georgian
kaa - Kara-Kalpak
kab - Kabyle
kbd - Kabardian
kbd-cyrl - Адыгэбзэ
kg - Kongo
khw - Khowar
ki - Kikuyu
kiu - Kirmanjki
kj - Kuanyama
kk - Kazakh
kk-arab - Kazakh (Arabic script)
kk-cn - Kazakh (China)
kk-cyrl - Kazakh (Cyrillic script)
kk-kz - Kazakh (Kazakhstan)
kk-latn - Kazakh (Latin script)
kk-tr - Kazakh (Turkey)
kl - Kalaallisut
km - Khmer
kn - Kannada
ko - Korean
ko-kp - 한국어 (조선)
koi - Komi-Permyak
kr - Kanuri
krc - Karachay-Balkar
kri - Krio
krj - Kinaray-a
ks - Kashmiri
ks-arab - Kashmiri (Arabic script)
ks-deva - Kashmiri (Devanagari script)
ksh - Colognian
ku - Kurdish
ku-arab - كوردي (عەرەبی)
ku-latn - Kurdish (Latin script)
kv - Komi
kw - Cornish
ky - Kyrgyz
la - Latin
lad - Ladino
lb - Luxembourgish
lbe - лакку
lez - Lezghian
lfn - Lingua Franca Nova
lg - Ganda
li - Limburgish
lij - Ligurian
liv - Livonian
lmo - Lombard
ln - Lingala
lo - Lao
loz - Lozi
lrc - Northern Luri
lt - Lithuanian
ltg - Latgalian
lus - Mizo
luz - Southern Luri
lv - Latvian
lzh - Literary Chinese
lzz - Laz
mai - Maithili
map-bms - Basa Banyumasan
mdf - Moksha
mg - Malagasy
mh - Marshallese
mhr - Eastern Mari
mi - Maori
min - Minangkabau
mk - Macedonian
ml - Malayalam
mn - Mongolian
mo - молдовеняскэ
mr - Marathi
mrj - Western Mari
ms - Malay
mt - Maltese
mus - Creek
mwl - Mirandese
my - Burmese
myv - Erzya
mzn - Mazanderani
na - Nauru
nah - Nāhuatl
nan - Min Nan Chinese
nap - Neapolitan
nb - Norwegian Bokmål
nds - Low German
nds-nl - Low Saxon
ne - Nepali
new - Newari
ng - Ndonga
niu - Niuean
nl - Dutch
nl-informal - Nederlands (informeel)
nn - Norwegian Nynorsk
nov - Novial
nrm - Nouormand
nso - Northern Sotho
nv - Navajo
ny - Nyanja
oc - Occitan
olo - Livvi-Karelian
om - Oromo
or - Oriya
os - Ossetic
pa - Punjabi
pag - Pangasinan
pam - Pampanga
pap - Papiamento
pcd - Picard
pdc - Pennsylvania German
pdt - Plautdietsch
pfl - Palatine German
pi - Pali
pih - Norfuk / Pitkern
pl - Polish
pms - Piedmontese
pnb - Western Punjabi
pnt - Pontic
prg - Prussian
ps - Pashto
pt - Portuguese
pt-br - Brazilian Portuguese
qu - Quechua
qug - Chimborazo Highland Quichua
rgn - Romagnol
rif - Riffian
rm - Romansh
rmy - Romani
rn - Rundi
ro - Romanian
roa-tara - tarandíne
ru - Russian
rue - Rusyn
rup - Aromanian
ruq - Megleno-Romanian
ruq-cyrl - Megleno-Romanian (Cyrillic script)
ruq-latn - Megleno-Romanian (Latin script)
rw - Kinyarwanda
sa - Sanskrit
sah - Sakha
sat - Santali
sc - Sardinian
scn - Sicilian
sco - Scots
sd - Sindhi
sdc - Sassarese Sardinian
sdh - Southern Kurdish
se - Northern Sami
sei - Seri
ses - Koyraboro Senni
sg - Sango
sgs - Samogitian
sh - Serbo-Croatian
shi - Tachelhit
shi-latn - Tašlḥiyt
shi-tfng - ⵜⴰⵛⵍⵃⵉⵜ
si - Sinhala
sk - Slovak
sl - Slovenian
sli - Lower Silesian
sm - Samoan
sma - Southern Sami
sn - Shona
so - Somali
sq - Albanian
sr - Serbian
sr-ec - Serbian (Cyrillic script)
sr-el - Serbian (Latin script)
srn - Sranan Tongo
ss - Swati
st - Southern Sotho
stq - Saterland Frisian
su - Sundanese
sv - Swedish
sw - Swahili
szl - Silesian
ta - Tamil
tcy - Tulu
te - Telugu
tet - Tetum
tg - Tajik
tg-cyrl - Tajik (Cyrillic script)
tg-latn - Tajik (Latin script)
th - Thai
ti - Tigrinya
tk - Turkmen
tl - Tagalog
tly - Talysh
tn - Tswana
to - Tongan
tokipona - Toki Pona
tpi - Tok Pisin
tr - Turkish
tru - Turoyo
ts - Tsonga
tt - Tatar
tt-cyrl - Tatar (Cyrillic script)
tt-latn - Tatar (Latin script)
tum - Tumbuka
tw - Twi
ty - Tahitian
tyv - Tuvinian
tzm - Central Atlas Tamazight
udm - Udmurt
ug - Uyghur
ug-arab - Uyghur (Arabic script)
ug-latn - Uyghur (Latin script)
uk - Ukrainian
ur - Urdu
uz - Uzbek
uz-cyrl - ўзбекча
uz-latn - oʻzbekcha
ve - Venda
vec - Venetian
vep - Veps
vi - Vietnamese
vls - West Flemish
vmf - Main-Franconian
vo - Volapük
vot - Votic
vro - Võro
wa - Walloon
war - Waray
wo - Wolof
wuu - Wu Chinese
xal - Kalmyk
xh - Xhosa
xmf - Mingrelian
yi - Yiddish
yo - Yoruba
yue - Cantonese
za - Zhuang
zea - Zeelandic
zh - Chinese
zh-cn - Chinese (China)
zh-hans - Simplified Chinese
zh-hant - Traditional Chinese
zh-hk - Chinese (Hong Kong)
zh-mo - 中文(澳門)
zh-my - 中文(马来西亚)
zh-sg - Chinese (Singapore)
zh-tw - Chinese (Taiwan)
zu - Zulu
qqq - Message documentation
Format
Export for off-line translation
Export in native format
{{DISPLAYTITLE:Подпроекты/Среда Визуализации и Управления}}<languages/> {| class="wikitable" |- ! Наименование !! Основание !! Статус !! Участники !! Описание |- <section begin=info /> | [[Special:MyLanguage/Sub-projects/VCA|Общая концепция Среды Визуализации и Управления (СВУ)]] || 2006 | Реализовано в: [[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]], [[Special:MyLanguage/Modules/Vision|UI.Vision]], [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] <section end=info /> | [[User:RomanSavochenko|Роман Савоченко]] | style="vertical-align: top" | * '''Примечания''': Проект, на начальном этапе, формировался на основе дипломного проекта Зайчука Евгения и, в последствии, был полностью переписан с переходом на Qt4, формализацией и создания данной концепции. |} == Вступление == <section begin=Introduce /> Среда визуализации и управления (СВУ) является неотъемлемой составляющей SCADA системы. Она применяется на клиентских станциях с целью доступного предоставления информации об объекте управления и выдачи управляющих воздействий на объект. В различных практических ситуациях и условиях могут применяться СВУ, построенные на различных принципах визуализации. Например, это могут быть библиотеки виджетов Qt, GTK+, wxWidgets или гипертекстовые механизмы на основе технологий HTML, XHTML, XML, CSS и JavaScript или сторонние приложения визуализации, реализованные на различных языках программирования Java, Python и т.д. Любой из этих принципов имеет свои преимущества и недостатки, комбинация которых может стать непреодолимым препятствием в возможности использования СВУ в том или ином практическом случае. Например, технологии вроде библиотеки Qt позволяют создавать высокопроизводительные СВУ, что несомненно важно для станций оператора управления технологическим процессом (ТП). Однако, необходимость инсталляции данного клиентского ПО может сделать его использование невозможным в отдельных ситуациях. С другой стороны, Web-технологии не требуют инсталляции на клиентские системы и являются предельно многоплатформенными (достаточно указать ссылку на Web-сервер в любом Web-браузере), что наиболее важно для различных инженерных и административных станций. С другой стороны, производительность и надёжность таких интерфейсов ниже, что практически исключает их использование на станциях оператора ТП. OpenSCADA имеет предельно гибкую архитектуру, которая позволяет создавать внешние интерфейсы, в том числе и пользовательские, на любой основе и вкус. Например, среда конфигурации OpenSCADA доступна как на Qt-библиотеке, так и на Web-основе. В тоже время, независимое создание реализаций СВУ на различной основе может повлечь за собой невозможность использования данных конфигурации одной СВУ в другой. Что неудобно и ограничено с пользовательской стороны, а также накладно в плане реализации и последующей поддержки. <section end=Introduce /> С целью избежания этих проблем, а также создания в кратчайшие сроки полного спектра различных типов СВУ, основан данный проект. Непосредственной областью применения СВУ, как составной части SCADA-системы OpenSCADA, является мониторинг и управление распределёнными системами с локальных и удалённых рабочих мест. == Назначение == Функционально, разработка предназначена для создания общей концепции СВУ и использования её в разработке конкретных модулей реализации СВУ OpenSCADA. На данный момент разработаны модули реализации СВУ, основанные на Qt-библиотеке и WEB-технологиях. Разрабатываемые модули СВУ, в целом, предназначены для: * Визуализации: ** оперативной (текущей) информации: значений и нарушений регламентных границ (алармов), параметров технологического процесса (ТП); ** архивных данных: значений параметров и текстовых сообщений о нарушениях ведения ТП, действиях пользователя по управлению ТП, а также системных сообщений от всех подсистем OpenSCADA. * Управления технологическим оборудованием и параметрами ведения ТП: изменения настроек и режимов работы контуров регулирования, изменения настроек системы противоаварийной защиты (ПАЗ), ввода числовых данных. * Построения протоколов и иной отчётной документации. Эксплуатационным назначением разработки является: * расширение сферы применения OpenSCADA, за счёт функций модулей СВУ; * полноценное использования OpenSCADA для контроля и управления технологическими процессами. == Требования == === Архитектурные требования === Разрабатываемая концепция и модули СВУ должны быть реализованы в соответствии с [[Special:MyLanguage/Documents/API#ModAPI|требованиями]] к модулям OpenSCADA. Разработанный концептуальный механизм должен содержать все алгоритмы и данные, являющиеся общими для СВУ, построенных на различных принципах, а также содержать механизм сеансов исполнения проектов интерфейсов визуализации. Фактически, в реализациях СВУ должны формироваться индивидуальные механизмы визуализации (отрисовки) и взаимодействия с пользователем на основе данных концепции, т.е. формировать индивидуальный интерфейс представления данных концепции СВУ в соответствии с идеологией "Модель/данные — Интерфейс". === Общие требования === Визуализация должна включать функции: * Отображения оперативной и архивной информации ведения ТП в: числовой, графической (в виде мнемосхемы части ТП, графиков во времени) формах. * Сигнализации о нарушениях ведения ТП: цветом, миганием фона, линий, текста, перечнем нарушений в табличной форме. * Предоставления архивированных сообщений о нарушениях ведения ТП, действиях оператора и системных операциях. Сообщения должны выводиться с использованием различного рода фильтров: по категории, времени/дате. Управление технологическим оборудованием и параметрами ведения ТП должно обеспечить функции: * Дистанционного управление дискретными исполнительными механизмами, режимами работы. * Ввода аналоговых значений. * Подтверждения выполнения команды оператора, фиксирования действия оператора в подсистеме сообщений, а также разграничение прав на выполнение команд. Команды оператора, по управлению ТП и навигации внутри подсистемы, должны производиться с помощью клавиатуры и мыши, или иного устройства ввода. В качестве входных данных, реализации СВУ должны использовать следующие подсистемы OpenSCADA: * Подсистема "Сбор данных (DAQ)" — для получения списка параметров, их атрибутов, значений и истории изменения значений атрибутов. * Подсистема "Архивы-История" — для получения и визуализации архивов (истории) значений и сообщений. * Подсистема "Безопасность" — для получения списка пользователей и контроля доступа. * Подсистема "БД" — для хранения и получения конфигурации СВУ. В качестве выходной информации реализации СВУ выступают: * Изображение на дисплее. * Измененные оператором текущие значения параметров ТП (режим работы, задание, выход и настройки регулятора, дистанционное управление оборудованием и др.), поступающие в подсистему "DAQ". * Отчётная документация в виде различных протоколов, отчётов и документов. Конфигурация СВУ должна храниться в доступных OpenSCADA базах данных, позволяя тем самым выбирать ту или иную БД под конкретную практическую ситуацию. Изображения и другие ресурсы должны кодироваться алгоритмом Base64 и храниться в БД или браться прямо с ФС. Цикл обновления оперативной информации на экране зависит от конкретной реализации СВУ. Для быстрых интерфейсов визуализации цикл не должен превышать 1 секунды. === Требования к надежности === Обеспечение надежного функционирования и защиты от несанкционированного доступа СВУ должно быть реализовано на нескольких уровнях: * На уровне ядра OpenSCADA. * На уровне концепции СВУ. Для каждого элемента отображения должно выполняться разграничение прав на редактирование (режим "Разработка"), динамику и реагирование на события (режим "Исполнение"), путем смены владельца (использование функций подсистемы "Безопасность"), включения/исключения в группу и смены прав на модификацию, чтение и исполнение, соответственно. * На уровне отдельно взятой реализации СВУ с использованием общей концепции. Реализации СВУ, в связке с концепцией, должны удовлетворять следующим требованиям надежности: * Непрерывная работа 24 часа в сутки и 360 дней в году. * Максимальное время восстановления работоспособного состояния — не более 1 часа. * Обнаружение ошибок (отсутствие кадра, исключительные ситуации), корректная обработка и выдача соответствующих сообщений. == Проектирование == === Постановка задачи === ==== Задачи SCADA системы ==== В настоящее время, при построении систем автоматизированного управления технологическими процессами (АСУ ТП), интерфейс пользователя с системой управления реализуется с помощью вычислительных систем. Такой подход обусловлен несколькими причинами: компактностью (в физическом и энергетическом смысле) современной вычислительной техники, развитостью способов отображения информации, большой функциональности и изменчивости систем управления. Применение компьютерной техники в АСУ ТП вообще, и на рабочих местах операторов в частности, привело к зарождению класса программного обеспечения (ПО), известного как SCADA (Supervisory Control and Data Acquisition) и HMI (Human Machine Interface). Таким образом, важнейшей задачей ПО SCADA и HMI является предоставление интерфейса взаимодействия между оператором и системой управления ТП. Часто, на SCADA и HMI возлагают такие задачи, как: формирование сигнализации-уведомления про отклонения в ТП, ведения архивов-истории параметров ТП и протоколов событий. Поэтому программное обеспечение SCADA и HMI удобно рассматривать как совокупность подсистем: базы данных параметров ТП и связи с системами управления ТП (контроллерами), формирования сигнализации-уведомления про отклонение ведения ТП, архивирования-история, протоколирования, визуализации оперативных и архивных данных. В дополнении, к вышеперечисленным задачам можно отнести: разделение прав доступа на чтение-изменение тех или иных параметров ТП, реализованное в подсистеме безопасности. Таким образом, современные SCADA и HMI системы представляют собой достаточно сложные программные комплексы. Предметом данного под-проекта является разработка концепции среды визуализации и управления (СВУ) и реализаций СВУ на основные способы представления, для SCADA системы OpenSCADA. Под визуализацией подразумевается следующий набор задач: * Предоставление оператору текущих данных про параметры ТП (показания датчиков, положения механизмов исполнительных устройств). Большое внимание уделяется сигнализации про отклонения (нарушения) ведения ТП. * Отображение архивной информации (истории) параметров ТП и события, которые произошли. * Приём и передача команд оператора подконтрольной системе. СВУ должна работать в двух режимах — редактирования (разработка) и исполнения. На первом этапе реализуется режим разработки только для Qt-версии СВУ! В процессе функционирования, СВУ должна использовать данные других подсистем: * Подсистема "Сбор данных (DAQ)": ** "Разработка" — при подключении динамики к кадру (виджету). ** "Исполнение" — при формировании динамики кадра (доступ к текущим значениям параметров, их истории и нарушениям). * Подсистема "Архивы-История": ** "Разработка" — при настройке динамики кадра. ** "Исполнение" — при формировании динамики кадра (доступ к архивным значениям параметров). * Подсистема "Безопасность": ** "Разработка" — при настройке доступа к виджетам. ** "Исполнение" — при формировании изображения виджета и возможности управления. * Подсистема "БД": доступ на загрузку и сохранение данных по виджетам, кадрам, библиотекам кадров и проектам как в режиме разработки, так и исполнения. Изображение на экране должно формироваться из ограниченного набора базовых виджетов — примитивов. Представление и интерфейс базовых виджетов каждого СВУ реализуется отдельно, что сделано с целью оптимизации производительности и упрощения задачи создания библиотеки базовых виджетов. Для совместимости различных реализаций СВУ, создано общее описание библиотеки базовых виджетов (модели данных) с последующей реализацией её интерфейса в каждой СВУ. Базовые виджеты предусматривают группировку и формирование производных виджетов, с дальнейшим их накоплением в пользовательских библиотеках виджетов/кадров. ==== Задачи систем мониторинга ==== Учитывая назначение OpenSCADA, как системы мониторинга данных во многих смежных областях, необходимо сформулировать задачи таких систем в целом. В системах мониторинга, как правило, отсутствует возможность управления, однако элементы интерактивного взаимодействия должны присутствовать. Основной задачей таких систем является непрерывное предоставление информации в доступном виде и на фоне основной работы. === Формализация === Концептуальную модель СВУ опишем языком UML, с помощью диаграмм вариантов использования (use case diagram). В качестве актёра, в случае разработки, выступает инженер настройки верхнего уровня АСУ ТП, в случае исполнения это — оператор. В режиме разработки, выделим такие варианты использования СВУ: * Операции над проектом: ** открытие/сохранение существующего проекта визуализации в БД; ** создание/удаление проекта визуализации; ** работа с открытым проектом: *** добавление/удаление кадра в проект визуализации; *** связывание кадра проекта с динамикой (динамизация свойств кадров), создавая страницу интерфейса визуализации или шаблон общей динамики для страниц, основанных на данном кадре; *** создание/удаление страницы интерфейса визуализации, основанной на кадре проекта; *** связывание страницы интерфейса управления с динамикой. ** открытие/закрытие/подключение к сеансу исполнения проекта. * Операции над кадром (виджетом): ** открытие/сохранение виджета/кадра в библиотеке БД; ** создание/удаление виджета/кадра; ** работа с открытым кадром: *** добавление/удаление вложенного виджета на рабочий кадр; *** выделение виджетов на рабочем кадре; *** изменение свойств выделенных виджетов с помощью супервизора виджетов; *** перемещение выделенных виджетов посредством манипулятора мышь и/или клавиатуры; *** визуальное изменение размеров и других геометрических параметров виджета; *** назначение слотов привязки динамики (параметров) виджетов или-же кадра в целом, а также прямая привязка динамики для виджетов конечной визуализации (кадров); *** формирование процедуры описания связей и другой логики виджета, на языке пользовательского программирования OpenSCADA; *** ассоциативная установка простых и групповых логических связей как графическим, так и конфигурационным образом. Диаграмма вариантов использования, при функционировании СВУ в режиме разработки, приведена на рисунке 4.2.1. [[file:VCA.png|center|frame|Рис.4.2.1. Диаграмма вариантов использования СВУ в режиме разработки.]] Варианты использования в режиме исполнения: * слежение за ТП по мгновенным значениям, графикам и др. * управление ТП через конечный интерфейс визуализации; * навигация по кадрам и страницам интерфейса визуализации; * горячая замена динамизированных свойств кадров и страниц; * формирование и печать отчётной документации, документов и экранов интерфейса визуализации; * смена пользователя. Диаграмма использования СВУ в режиме исполнения приведена на рисунке 4.2.2. [[file:VCA_use.png|center|frame|Рис.4.2.2. Диаграмма использования СВУ в режиме исполнения.]] <section begin=Architecture /> СВУ, в целом, может работать в двух режимах — разработки и исполнения. В режиме разработки формируется интерфейс СВУ и его компоненты, определяются механизмы взаимодействия. В режиме исполнения выполняется формирование интерфейса СВУ и производится взаимодействие с конечным пользователем, на основе разработанных СВУ. Интерфейс СВУ формируется из кадров, каждый из которых, в свою очередь, формируется из элементов примитивов или пользовательских элементов интерфейса. При этом, пользовательские элементы интерфейса также формируются из примитивов или других пользовательских элементов. Таким образом обеспечивается иерархичность и повторное использования уже разработанных компонентов. Кадры и пользовательские элементы размещаются в библиотеках виджетов. Из элементов этих библиотек формируются проекты интерфейсов конечной визуализации СВУ. На основе-же этих проектов формируются сеансы визуализации. Описанная структура СВУ приведена на рисунке. [[file:VCA_struct_ru.png|center]] Данная архитектура СВУ позволяет реализовать поддержку трёх уровней сложности у процесса разработки интерфейсов управления: * Формирования интерфейса визуализации и управления (ВУ) с помощью библиотеки шаблонных кадров, путём помещения шаблонов кадров в проект и назначения динамики. * В дополнении к первому уровню производится формирование собственных кадров на основе библиотеки производных и базовых виджетов. Возможно как прямое назначение динамики в виджете, так и последующее её назначение в проекте. * В дополнении ко второму уровню производится самостоятельное формирование производных виджетов, новых шаблонных кадров, а также кадров с использованием механизма описания логики взаимодействия и обработки событий на языке пользовательского программирования OpenSCADA. <section end=Architecture /> === Кадры и элементы отображения (виджеты) === <section begin=Widgets /> Кадр это окно, непосредственно предоставляющее информацию пользователю в графической и/или текстовой форме. Группа взаимосвязанных кадров формирует цельный пользовательский интерфейс ВУ. Содержимое кадра формируется из элементов отображения (виджетов). Виджеты могут быть базовыми примитивами (различные элементарные фигуры, текст, тренд и т.д.) и производными, сформированные из базовых или других производных виджетов. Все виджеты группируются по библиотекам. В процессе работы, пользователь может формировать собственные библиотеки производных виджетов. Собственно сам кадр также является виджетом, который используется в роли конечного элемента визуализации. А это значит, что библиотеки виджетов могут хранить и заготовки кадров, и шаблоны результирующих страниц пользовательского интерфейса. Кадры и виджеты являются пассивными элементами, которые обычно не содержат связей с динамикой и другими кадрами, а только предоставляют информацию о свойствах и характере динамики(конфигурации), подключаемой к свойствам. Активированные кадры, содержащие ссылки на динамику и активные связи, формируют пользовательский интерфейс и хранятся в проектах. В некоторых случаях возможно прямое назначение динамики в заготовках кадров. Производные кадры/виджеты могут содержать вложенные виджеты, которые могут быть склеены-связаны один с другим логикой, с помощью языка пользовательского программирования OpenSCADA. [[file:VCA_widget_ru.png|center]] Виджет является элементом, посредством которого обеспечивается: * визуализация оперативной и архивной информации ведения ТП; * сигнализация про нарушения ведения ТП; * переключение между кадрами ТП; * управление технологическим оборудованием и параметрами ведения ТП. Настройка и связывание виджетов производится посредством их свойств. Родительский виджет, и виджеты содержащиеся в нем, могут дополняться пользовательскими свойствами. В последствии, пользовательские и статические атрибуты связываются со свойствами вложенных виджетов, посредством внутренней логики. Для отображения динамики (текущих и архивных данных) свойства виджетов динамизируются, т.е связываются с атрибутами параметров OpenSCADA или свойствами других виджетов. Использование, для связывания вложенных виджетов внутренней логикой, языка пользовательского программирования OpenSCADA снимает вопрос реализации сложной логики визуализации, обеспечивая тем самым высокую гибкость. Практически, можно создавать полностью динамизированные кадры со сложными взаимосвязями на уровне пользователя. <section end=Widgets /> === {{Anch|Project|Проект}} === <section begin=Project /> Непосредственная конфигурация, и свойства конечного интерфейса визуализации, содержатся в проекте интерфейса визуализации СВУ, которых может быть создано множество. Каждый проект включает страницы из библиотек кадров-виджетов. В ряде режимов, сама страница может включать в себя вложенные страницы как независимые от родительской, так и с использованием родительского в роли шаблона. Шаблонные страницы-виджеты позволяют предельно упростить процесс создания однотипных кадров простого мониторинга, инженером АСУ ТП или пользователем OpenSCADA. Примером таких однотипных кадров могут быть: группы контуров, группы графиков, протоколы и различные сводные таблицы. Мнемосхемы технологических процессов редко подпадают под такую схему и формируются в отдельной странице-виджете. Страница, как и виджет на котором она основана, предоставляет возможность привязки динамики к описанным в ней свойствам — связи, которые могут быть установлены динамикой или константами. Кроме того, связывание непосредственно на уровне страницы проекта является предпочтительным, чем осуществление этого на уровне виджетов библиотек. Пример иерархического представления компонентов проекта классического интерфейса ВУ технологического процесса, с описанием выражений стандартных вызовов, приведен на рисунке. [[file:VCA_prog_tree_ru.png|center]] Предусмотрены следующие специальные свойства страниц: * ''Контейнер'' — страница является контейнером вложенных страниц. * ''Шаблон'' — страница является шаблоном вложенных страниц. * ''Пусто'' — пустая и неактивная страница. Это свойство используется совместно со свойством ''Контейнер'', для организации логических контейнеров страниц. * ''Связь'' — связь на другую страницу ка контейнер под-страниц, которые будут использоваться на стороне исполнения проектов (сеансов) без их отдельного создания. На комбинациях вышеуказанных специальных свойств страниц реализованы следующие их типы: * ''Стандарт'' — стандартная страница (не установлено ни одно из свойств), является полноценной конечной страницей. * ''Контейнер'' — полноценная страница со свойством контейнера (''Контейнер''). * ''Логический контейнер'' — логический контейнер, фактически сам не являющийся страницей (''Контейнер''|''Пусто''), выполняет роль промежуточного и группирующего элемента в дереве страниц. * ''Шаблон'' — страница-шаблон (''Шаблон''). Чистая шаблонная страница, используется для описания общих свойств и доопределения их во вложенных страницах, в частном порядке. * ''Контейнер и шаблон'' — страница шаблон и контейнер (''Шаблон''|''Контейнер''), совмещает функции шаблона и контейнера. * ''Связь'' — связь на другую страницу. Связи могут быть использованы на полностью динамических и высоко тиражируемых страницах, для оптимизации использования памяти. Для разделения открытия связанных страниц Вы должны использовать атрибут "path". Функция uiCmd() [[#UserAPI|пользовательского API]] должна использоваться для управления страницами этого типа вместо прямой записи в атрибуты страниц "pgOpen" и "pgOpenSrc". На стороне визуализации (RunTime) построена логика, регулирующая каким образом открывать страницы, на основе следующих атрибутов базового элемента "Box": * ''pgOpen'' — признак "Страница открыта"; * ''pgNoOpenProc'' — признак "Исполнять страницу даже если она не открыта"; * ''pgOpenSrc'' — содержит адрес виджета, или страницы, открывшей текущую страницу; в случае вложенного контейнерного виджета здесь содержится адрес включаемой страницы; для открытия страницы из скрипта достаточно здесь указать адрес виджета-источника открытия, но для страниц типа "Связь" Вы должны отдавать предпочтение использованию функции uiCmd() [[#UserAPI|пользовательского API]], для управления страницами; * ''pgGrp'' — группа страниц, используется для связки контейнеров страниц со страницами, согласно общей группы. ПУСТАЯ и "main" группа предусматривает использование этой страницы как Корневую-основную страницу, т.е. такая будет заменять другие Корневые-главные страницы; группа "fl" предназначена для использования во внешних окнах, которые предусмотрены для многоразового одновременного открытия и которые не должны отслеживаться на дубликаты; остальные предусмотрено для включения в контейнеры-боксы или одноразового одновременного открытия, т.е. они принудительно проверяются на дубликаты, когда последнее открывается, а предыдущие закрываются. Логика определения способа открытия страниц работает следующим образом: * если страница имеет группу "main" или совпадает с группой страницы в главном окне или нет страницы на главном окне, то открывать страницу в главном окне; * если страница имеет группу, которая совпадает с группой одного из контейнеров текущей страницы, то открыть в этом контейнере; * если источник открытия страницы совпадает с текущей страницей, то открыть в виде дополнительного окна над текущей страницей; * передать вызов на запрос открытия дополнительным окнам, с обработкой у каждого по первым трем пунктам; * если никто из родственных окон не открыл новую страницу то открыть её как родственное окно главного окна. <section end=Project /> === {{Anch|SessExec|Сеанс исполнения проекта}} === <section begin=Session /> Сеанс проекта это развёрнутое дерево проекта непосредственного его исполнения, включающего отдельную задачу иерархического исполнения процедур виджетов. Для каждого проекта может быть открыто множество сеансов. Формирование конечного интерфейса визуализации осуществляется визуализаторами, исходя из данных сеанса проекта, после создания сеанса по запросу. Между виджетами, на различных уровнях иерархии, в конечном счёте выстраиваются достаточно сложные наследственные связи, которые определяются возможностью использования одних виджетов другими, начиная с библиотечного виджета и заканчивая виджетом сеанса. Для разъяснения этих особенностей взаимодействия, на рисунке изображена исчерпывающая карта "использующего" наследования. [[file:VCA_map_inher_ru.png|center]] На уровне сеансов, виджет содержит объект значений процедуры обсчёта. Этот объект инициируется и используется в случае наличия самой процедуры вычисления. В момент инициализации создаётся перечень параметров процедуры и выполняется её компиляция с этими параметрами, в модуле, реализующем выбранный язык программирования и с названием результирующей процедуры в виде закодированного полного имени виджета. Скомпилированная функция подключается к объекту значений процедуры обсчёта, а далее выполняется её вычисление с периодом сеанса. Вычисление и обработка виджета выполняется в следующей последовательности: * выбираются события, доступные на момент вычисления, из атрибута "event" виджета; * события загружаются в параметр "event" объекта вычисления; * в объект вычисления загружаются значения по входным связям; * в объект вычисления загружаются значения специальных переменных (f_frq, f_start и f_stop); * в объект вычисления загружаются значения выбранных параметров виджета; * вычисление; * выгрузка значений объекта вычисления в выбранные параметры виджета; * выгрузка событий из параметра "event" объекта вычисления; * обработка событий и передача необработанных на уровень выше. Объекты сеанса наследуются от абстрактного объекта "Widget" и используют соответствующие объекты проекта. Так, сеанс "Session" использует проект "Project" и формирует на основе него развёрнутое дерево. Страница проекта "Page" прямо используется страницей сеанса "SessPage". Остальные объекты "SessWdg" разворачиваются в соответствии с иерархией элементов страницы. В дополнение к стандартным свойствам абстрактного виджета "Widget", элементы страницы и сами страницы сеанса получают свойства: хранения объекта значений вычислительной процедуры, обсчёта процедур и механизм обработки событий. Страницы сеанса, в дополнение ко всему, содержат контейнер следующих по иерархии страниц. Сеанс, в целом, вычисляется с указанной периодичностью и в последовательности: * "Страница верхнего уровня" -> "Страница нижнего уровня" * "Виджет нижнего уровня" -> "Виджет верхнего уровня" Такая политика позволяет обходить страницы в соответствии с их иерархией, а событиям в виджетах "всплывать" на верх за одну итерацию. Сеансы поддерживают многоязычность на уровне [[Special:MyLanguage/Documents/API#CntrNode|интерфейса управления OpenSCADA]], которая зависит от значения общих атрибутов "lang" и "user", и которые визуализатор может устанавливать в соответствии со своим языком. Эта функция включается [[Special:MyLanguage/Documents/Program_manual#Config|динамическим переводом сообщений OpenSCADA]]. <section end=Session /> === {{Anch|Styles|Стили}} === <section begin=Styles /> Известно, что человек может иметь индивидуальные особенности восприятия графической информации. Если эти особенности не учитывать то можно получить неприятие и отторжение пользователя к интерфейсу ВУ. Такое неприятие и отторжение может привести к фатальным ошибкам при управлении ТП, а также травмировать человека постоянной работой с интерфейсом. В SCADA системах приняты соглашения, которые регламентируют требования по созданию унифицированного интерфейса ВУ, нормально воспринимаемого большинством людей. При этом, практически отсутствует учёт особенностей людей с некоторыми отклонениями. С целью учесть это обстоятельство, и предоставить возможность централизованно и просто изменять визуальные свойства интерфейса, проектом реализуется менеджер стилей интерфейса визуализации. Пользователем может быть создано множество стилей, каждый из которых будет хранить цветовые, шрифтовые и другие свойства элементов кадра. Простая смена стиля позволит быстро преобразить интерфейс ВУ, а возможность назначения индивидуального стиля для пользователя позволит учесть его особенности. Для реализации этой возможности, при создании кадров, необходимо для свойств цвета, шрифта и других установить параметр "Конфигурация" (таблицы во вкладке "Обработка") в значение "Из стиля". А в параметре "Конфигурационный шаблон" указать идентификатор поля стиля. Далее, это поле автоматически появится в менеджере стилей и его можно будет там менять. Менеджер стилей доступен на странице конфигурации проекта во вкладке "Стили". На этой вкладке можно стили создавать, удалять и изменять, удалять их поля. [[file:VCA_prj_stl_ru.png|center|frame|Рисунок. Вкладка "Стили" страницы конфигурации проекта.]] В целом, стили доступны начиная с уровня проектов. На уровне библиотек виджетов можно только определять поля стилей у виджетов. На уровне проекта, при выборе стиля, включается работа со стилями, что предполагает доступ к полям стилей вместо непосредственных значений атрибутов. Фактически, это означает, что при чтении или записи атрибута виджета, указанные операции будут осуществляться над соответствующим полем выбранного стиля. При запуске проекта на исполнения будет использован установленный в проекте стиль. В последствии, пользователь может выбрать стиль из перечня доступных. Выбранный пользователем стиль будет сохранён и использован при следующем запуске проекта. <section end=Styles /> === {{Anch|Events|События, их обработка и карты событий}} === <section begin=Events /> Учитывая спектр задач, для которых может использоваться OpenSCADA, нужно предусмотреть механизм управления интерактивными пользовательскими событиями. Это связано с тем, что при решении отдельных задач встраиваемых систем, устройства ввода и управления могут значительно отличатся. Впрочем, достаточно взглянуть на обычную офисную клавиатуру и клавиатуру ноутбука, чтобы снять любые сомнения о необходимости менеджера событий. Менеджер событий должен работать используя карты событий. Карта событий — это список именованных событий с указанием его происхождения. Происхождением события может быть клавиатура, манипулятор мыши, джойстик и т.д. При возникновении события менеджер событий ищет его в активной карте и сопоставляет с именем события. Сопоставленное имя события помещается в очередь на обработку. Виджеты, в этом случае, должны обрабатывать полученную очередь событий. Активная карта событий указывается в профиле каждого пользователя или устанавливается по умолчанию, <span style="color: red">в планах</span>. В целом, предусмотрены четыре типа событий: * события образов-примитивов СВУ (префикс: '''ws_'''), например, событие нажатия экранной кнопки — "ws_BtPress"; * клавишные события (префикс: '''key_''') — все события от клавиатуры и мыши в виде "key_presAlt1"; * пользовательские события (префикс: '''usr_'''), генерируются пользователем в процедурах обсчёта виджетов; * мапированные события (префикс: '''map_''') — события, полученные из карты событий, <span style="color: red">в планах</span>. Само событие представляет недостаточно информации, особенно если его обработка происходит на уровнях выше. Для однозначной идентификации события и его источника, событие, в целом, записывается следующим образом: "ws_BtPress:/curtime". Где: :''ws_BtPress'' — событие; :''/curtime'' — путь к дочернему элементу, сгенерировавшее событие. В таблице 3.5 приведён перечень стандартных событий, поддержка которых должна быть обеспечена в визуализаторах СВУ. '''Table 3.5.''' Standard events {| class="wikitable" |- ! Identifier !! Description |- | colspan="2" | ''Keyboard events:'' '''key_[pres|rels][Ctrl|Alt|Shift]{Key}''' |- | *SC#3b || Scan-code of the key. |- | *#2cd5 || Code of the unnamed key. |- | *Esc || "Esc". |- | *BackSpace || Removing of the previous character — "<--". |- | *Return, *Enter || Enter — "Enter". |- | *Insert || Insertion — "Insert". |- | *Delete || Deleting — "Delete". |- | *Pause || Pause — "Pause". |- | *Print || Print of the screen — "Print Screen". |- | *Home || Home — "Home". |- | *End || End — "End". |- | *Left || To the left — "<-". |- | *Up || To the up — '^'. |- | *Right || To the right — "->". |- | *Down || To the down — '\/'. |- | *PageUp || Page up — "PageUp". |- | *PageDown || Page down — "PageDown". |- | *F1 ... *F35 || Function key from "F1" to "F35". |- | *Space || Space — ' '. |- | *Apostrophe || Apostrophe — '`'. |- | *Asterisk || Asterisk on the additional field of the keyboard — '*'. |- | *Plus || Plus on the additional field of the keyboard — '+'. |- | *Comma || Comma — ','. |- | *Minus || Minus — '-'. |- | *Period || Period — '.'. |- | *Slash || Slash — '\'. |- | *0 ... *9 || Number from '0' to '9'. |- | *Semicolon || Semicolon — ';'. |- | *Equal || Equal — '='. |- | *A ... *Z || Keys of Latin alphabet from 'A' to 'Z'. |- | *BracketLeft || Left square bracket - '['. |- | *BackSlash || Backslash — '/'. |- | *BracketRight || Right square bracket — ']'. |- | *QuoteLeft || Left quote — '''. |- | colspan="2" | ''Keyboard focus events.'' |- | ws_FocusIn || Focus is obtained by the widget. |- | ws_FocusOut || Focus is lost by the widget. |- | colspan="2" | ''Mouse events:'' |- | key_mouse[Pres|Rels][Left|Right|Midle] || Pressed/released the mouse button. |- | key_mouseDblClick || Double-click the left mouse button. |- | colspan="2" | ''Events of quietance on the side of the visualizer.'' |- | ws_alarmChange || Notifies about the alarm status change, the attribute "alarmSt". |- | ws_alarmLev || Quietance of all violations by all notices methods and types. |- | ws_alarmNtf{N} || Quietance of all violations by the type {N} (0...7). |- | colspan="2" | ''Events of the elementary figure primitive '''ElFigure''':'' |- | ws_Fig[Left|Right|Midle|DblClick] || Activating of the figures (fills) by the mouse button. |- | ws_Fig{N}[Left|Right|Midle|DblClick] || Activating of the figure (fill) ''N'' by the mouse button. |- | colspan="2" | ''Events of the form element primitive '''FormEl''':'' |- | ws_LnAccept || A new value in the input line is set. |- | ws_TxtAccept || The value of the text editor is changed. |- | ws_ChkChange || The state of the flag is changed. |- | ws_BtPress || The button is pressed. |- | ws_BtRelease || The button is released. |- | ws_BtToggleChange || The button toggle is changed. |- | ws_BtMenu={Item} || Selection of the menu ''Item'' on the button. |- | ws_BtLoad || The selected file loaded. |- | ws_CombChange || The value of the combo box is changed. |- | ws_ListChange || The current list item is changed. |- | ws_TreeChange || The current tree item is changed. |- | ws_TableChangeSel || The table item selection is changed. |- | ws_TableEdit_{colN}_{rowN} || The table cell ({colN}:{rowN}) is edited. |- | ws_SliderChange || The slider position is changed. |- | colspan="2" | ''Events of the media content primitive '''Media''':'' |- | ws_MapAct{N}[Left|Right|Midle] || Media area with the number ''N'' is activated by the mouse button. |- | ws_MediaFinished || Media-stream play is finished. |} События являются основным механизмом уведомления и активно используются для осуществления взаимодействия с пользователем. Для обработки событий предусмотрены два механизма: * Первичный — сценарий управления открытием страниц. * Вторичный — вычислительная процедура виджета. Механизм "Сценарий управления открытием страниц" основан на базовом атрибуте виджета "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''' В качестве примера, приведём сценарий обеспечения работы главной страницы интерфейса пользователя: <pre style="white-space: pre-wrap;"> 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 </pre> Механизм "Обработка событий с помощью вычислительной процедуры виджета" основан на атрибуте "event" и пользовательской процедуре вычисления, на языке программирования OpenSCADA. События, по мере поступления, аккумулируются в атрибуте "event" до момента вызова вычислительной процедуры. Вычислительная процедура вызывается с указанным периодом вычисления виджета и получает значение атрибута "event" в виде списка событий. В процедуре вычисления, пользователь может: проанализировать, обработать и исключить обработанные события из списка, а также добавить в список новые события. Оставшиеся, после исполнения процедуры, и новые события анализируются на предмет соответствия условиям вызова сценарием первичного механизма, после чего, оставшиеся события передаются на верхний по иерархии виджет, для обработки им, при этом осуществляется дополнение пути событий согласно иерархии проникновения. Содержимым атрибута "event" является список событий формата "'''{event}:{evSrc}'''", с событием в отдельной строке. Приведём пример процедуры обработки событий на Java-подобном языке пользовательского программирования OpenSCADA: <syntaxhighlight lang="JavaScript"> 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; </syntaxhighlight> <section end=Events /> === Сигнализация === <section begin=Alarms /> {{Anch|Alarms|Важным элементом}} любого интерфейса визуализации является уведомление пользователя про нарушения — сигнализация. Для упрощения восприятия, а также в виду тесной связи визуализации и уведомления (как правило, уведомление дополняет визуализацию) решено интегрировать интерфейс уведомления в интерфейс визуализации. Для этого, во всех виджетах, предусматриваются два дополнительных атрибута уровня сеанса: "alarm" и "alarmSt". Атрибут "alarm" используется для формирования сигнала виджетом в соответствии с его логикой, а атрибут "alarmSt" используется для контроля за фактом сигнализации ветви дерева сеанса. Атрибут "alarm" является строкой, которая имеет следующий формат: "'''{lev}|{categ}|{message}|{type}|{tp_arg}'''"<br/> Где: * ''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, на возврат квитирования — включение уведомления. '''Формирование сигнала и получение его визуализатором.'''<br/> Формирование сигнала производится самим виджетом, путём установки собственного атрибута "alarm" нужным образом и, в соответствии с ним, автоматически устанавливается атрибут "alarmSt" текущего и вышестоящих виджетов. Визуализаторы получают уведомление о сигнале с помощью стандартного механизма уведомления об изменении атрибутов виджетов. Учитывая то, что обработка условий сигнализации осуществляется в виджетах, страницы, содержащие объекты сигнализации, должны исполняться в фоне, независимо от открытости их в данный момент. Это осуществляется путём установки флага исполнения страницы в фоне. Хотя механизм сигнализации и построен в среде визуализации, возможность формирования невизуальных элементов сигнализации остаётся, например, путём создания страницы, которая никогда не будет открываться. '''Квитация'''<br/> Квитация (от quietance) — процесс подтверждения факта того, что оперативный персонал обратил внимание на нарушение в работе ТП. Обычно этот процесс подразумевает принятие мер оператором для устранения нарушения и нажатие соответствующей кнопки прекращения сигнализации. Квитация производится путём указания корня ветви виджетов и типов уведомления, что позволяет реализовать квитацию на стороне визуализатора как по группам, например, по объектам сигнализации, так и индивидуально по объектам источника. При этом можно независимо квитировать разные типы сигнализаций. Установка квитации производится простой модификацией атрибута "alarmSt". Пример скрипта, для работы с сигналами, приведён ниже: <syntaxhighlight lang="JavaScript"> //Выделение факта наличия сигнализаций разных способов-типов уведомления 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; </syntaxhighlight> '''Внешние методы уведомления'''<br/> Основным и типовым способом уведомления является дисплейная световая сигнализация аварийными цветами и их динамикой у элементов визуализации, которая присутствует всегда и не требует специфической конфигурации. Однако, часто нужны уведомления внешнего типа, например: внешней лампой, бузером PC или "ревуном", произвольным звуком, синтезированной речью и т.д. Для осуществления такой возможности, внешние способы уведомления, и соответствующие им типы уведомления, свободно описываются для сервера визуализации и самого визуализатора. На стороне сервера визуализации описывается формирование/получение ресурса уведомления и само уведомление. На стороне визуализатора описывается уведомление согласно ресурсам сервера визуализации. Описание правил и сценариев внешних уведомлений осуществляется с помощью пользовательских атрибутов текстового типа для страниц проекта визуализации, которые применяются при открытии этих страниц. Т.е. потенциально, для каждой открываемой страницы можно описать собственные правила уведомления, хотя, обычно достаточно и описываются общие правила уведомления на главной странице проекта — странице, которая открывается один раз и не закрывается при работе: * Для сервера/движка визуализации, атрибутом "notify{N}" в формате: <syntaxhighlight lang="JavaScript" style="margin-left: 15px"> //flags=notifyServ[{DL}][|resource[|queue[|qMergeMess]]]; //resStatic={ResourceFile} if(doRes) { Текст команды формирования ресурса. } if(doNtf) { Текст команды уведомления. } </syntaxhighlight> * Для визуализатора, атрибутом "notifyVis[Vision|WebVision]{N}" в формате: <syntaxhighlight lang="JavaScript" style="margin-left: 15px"> //flags=notify[{DL}][|resource[|queue[|quietanceRet]]]; //name={Имя уведомителя} //ico={Имя иконки} { Текст команды уведомления для любого или конкретного визуализатора. } </syntaxhighlight> Flags: * ''notify[{DL}]'', ''notifyServ[{DL}]'' — enables the notification with the repeating by the time ''DL'', if the set; for ''DL'' = 0 the repeat carried out immediately; ''notifyServ[{DL}]'' is used to force the server side notification instead visualiser with ''notify[{DL}]''. * ''resource'' — request-form (force) the notification resource from the visualisation server, can be an audio file, a text or other data for the notification produce; but currently the notifiers mostly expect audio. * ''queue'' — the notification resources are determined not only by the global sign of alarming and quietance, but also according to the priority sources queue of the notification-resources. The queue is formed on the side of the visualisation server, and for the visualisers it is indicated the need to work with it when requesting resources. * ''qMergeMess'' — merging the notifications in the queue by equality their messages. * ''quietanceRet'' — possibility of the visualiser for the quietance recall-return i.e. in fact — the notification enable back. Наличие поля "resStatic" включает получение ресурса непосредственно из таблицы ресурсов или файла, указывается в способ подобный [[#Media|примитиву "Медиа"]]. Переменные обмена: * ''en''[0,1] — уведомление включить (1) или выключить (0); * ''doNtf''[0,1] — вызов сценария уведомления; * ''doRes''[0,1] — вызов сценария формирования ресурса; * ''res'' — содержимое или имя файла с содержимым ресурса, для внешних сценариев; * ''resTp'' — тип ресурса, вроде "audio/ogg"; является возвратом и помещается в стандартный выход (для Shell) для ''doRes''; * ''mess'' — сообщение-параметры формирования ресурса и уведомления; * ''lang'' — язык текущего пользователя или системы; * ''prcID'' — уникальный идентификатор процедуры (вроде "ses_AGLKS_ntf2"), в основном для безопасного создания временных файлов. The examples and comments to work of the typical notification methods: * Beep (buzzer) on the visualiser (flags=notify0) or the visualisation server (flags=notifyServ0) side with repeating and control the playing: :* alarm = "10|Prm||0x02" :* notifyVisVision1 | notify1 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //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); </syntaxhighlight> :* notifyVisVision1 | notify1 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/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 </syntaxhighlight> * Repeating play for a ready audio file, one common, on the visualiser (flags=notify2) or the visualisation server (flags=notifyServ2) side, duration of the audio file for the internal language must be not more 10 seconds: :* alarm = "10|Prm||0x04" :* notify2 | notifyVisVision2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=notify2|notifyServ2 if(en) SYS.system("play -q alarm.ogg");</syntaxhighlight> :* notify2 | notifyVisVision2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/bin/sh #flags=notify2|notifyServ2 if test $en = 1; then play -q alarm.ogg; fi</syntaxhighlight> * Play an individual audio file for the source, on the visualisation server side, duration of the audio file for the internal language must be not more 10 seconds: :* alarm = "10|Prm||0x04|res:al_prm1" :* notify2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=queue</syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=notify2|queue if(doNtf && en && res.length) { SYS.fileWrite("tmpPlay", res); SYS.system("play -q tmpPlay"); SYS.fileRemove("tmpPlay"); }</syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/bin/sh #flags=notify2|queue if test $doNtf = 1 -a $en = 1 -a -s $res; then play -q $res; fi </syntaxhighlight> * Speech synth for an individual message for the source, on the visualiser side, duration of the message for the internal language must be not more 10 seconds: :* alarm = "10|Prm|Text message of the speech synth|0x04" :* notify2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=queue</syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=notify2|queue if(doNtf && en && mess.length) { SYS.fileWrite("tmpForSpeech", mess); SYS.system("festival --tts tmpForSpeech"); SYS.fileRemove("tmpForSpeech"); } </syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/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 </syntaxhighlight> * Preparing a sound file, one common, and playing it on the side of the visualiser (flags=notifyServ2) or the visualisation server (flags=notifyServ2), duration of the audio file for the internal language must be not more 10 seconds: :* alarm = "10|Prm||0x04" :* notify2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //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"); }</syntaxhighlight> :* notify2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/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 </syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=notify2|resource if(en && res.length) { SYS.fileWrite("tmpPlay", res); SYS.system("play -q tmpPlay"); SYS.fileRemove("tmpPlay"); }</syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/bin/sh #flags=notify2|resource if test $en = 1 -a -s $res; then play -q $res; fi </syntaxhighlight> * Prepare an individual audio file for the source of notification through the speech synth, on side of the visualiser (flags=notify2) or the visualisation server (flags=notifyServ2), duration of the message for the internal language must be not more 10 seconds: :* alarm = "10|Prm|Text message of the speech synth|0x04" :* notify2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //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"); }</syntaxhighlight> :* notify2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/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 </syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="JavaScript" style="margin-left: 30px"> //flags=notify2|queue if(en && res.length) { SYS.fileWrite("tmpPlay", res); SYS.system("play -q tmpPlay"); SYS.fileRemove("tmpPlay"); }</syntaxhighlight> :* notifyVisVision2 = <syntaxhighlight lang="BASH" style="margin-left: 30px"> #!/bin/sh #flags=notify2|queue if test $en = 1 -a -s $res; then play -q $res; fi </syntaxhighlight> <section end=Alarms /> === Управление правами === <section begin=Rights /> Для разделения доступа к интерфейсу ВУ и его составляющим, каждый виджет содержит информацию о владельце, его групах и правах доступа. Права доступа записываются в виде триады: "'''{пользователь}{группа[,группа1,группаN]}{остальные}'''", где каждый элемент состоит из двух признаков доступа, для которых принята следующая интерпретация: * '''r''' — право на просмотр виджета; * '''w''' — право на контроль над виджетом. В режиме разработки используется простая схема доступа "root:UI|RWRWR_", что означает — все пользователи могут открывать и просматривать библиотеки, их компоненты и проекты; а редактировать могут все пользователи группы "UI" (пользовательские интерфейсы). В режиме исполнения работают права, описанные в компонентах интерфейса, которые предусматривают возможность наследования владельца и прав, сверху вниз. Причём, по умолчанию, наследование включено в каждом виджете, а значит — они получат владельца и права проекта. В тоже время, прямая установка прав составного виджета распространит их на все компоненты этого виджета. <section end=Rights /> === {{Anch|LinkingDyn|Связывание с динамикой}} === <section begin=LinkDyn /> Для предоставления в интерфейс визуализации актуальных данных, должны использоваться данные подсистемы "Сбор данных (DAQ)". Природа этих данных следующая: # параметры, содержащие некоторое количество атрибутов; # атрибуты параметра могут предоставлять данные пяти базовых типов: Логический, Целый, Вещественный, Строковый и Объект;<br/> которые дополнено СВУ модификаторами: "Выбирается"; вариантами Строки: "Текст", "Перевод", "Цвет", "Изображение", "Шрифт", "Адрес"; вариантами Целого: "ДатаВремя". # атрибуты параметра могут иметь архив (историю); # атрибуты параметра могут быть на чтение, запись и с полным доступом. Учитывая первый пункт, нужно обеспечить возможность группового назначения ссылки. Для этого используем [[Special:MyLanguage/Documents/DAQ#LogicLev|концепцию логического уровня]]. В соответствии с пунктом 2, связи обеспечивают прозрачное преобразование типов и не требуют специальной конфигурации. Для удовлетворения возможности доступа к архивам, в соответствии с пунктом 3, связи выполняют проверку типа атрибута и, в случае подключения к "Адресу", в значение помещается адрес связи. В терминах СВУ, динамические связи и конфигурация динамики являются одним процессом, для описания конфигурации которого предусматривается вкладка "Обработка" виджетов. Вкладка содержит таблицу конфигурации свойств атрибутов и текст процедуры вычисления виджета. [[file:VCA_wdg_proc_ru.png|center|frame|Рисунок. Вкладка "Обработка" страницы конфигурации виджета.]] Кроме полей конфигурации атрибутов, в таблице предусматривается колонка "Обработка", для избирательного использования атрибутов в вычислительной процедуре виджета, и колонки "Конфигурация", "Конфигурационный шаблон" для описания конфигурации связей. Если в колонке "Обработка" стоит 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"). Может быть полезен для указания архива в качестве источника данных примитива "Диаграмма". Обработка связей происходит с периодичностью вычисления виджета, в порядке: * получение данных входных связей; * выполнение вычисления процедуры виджета; * передача значений по выходным связям. На рисунке представлена вкладка связей с групповым назначением атрибутов, путём указания только параметра. На следующем рисунке представлено индивидуальное назначение атрибутов. [[file:VCA_wdg_lnk_grp_ru.png|center|frame|Рисунок. Вкладка "Связи" страницы конфигурации виджета c групповым назначением атрибутов путём указания только параметра.]] [[file:VCA_wdg_lnk_attr_ru.png|center|frame|Рисунок. Вкладка "Связи" страницы конфигурации виджета c индивидуальным назначением атрибутов.]] При размещении виджета в контейнер виджетов все связи исходного виджета добавляются в список результирующих связей контейнера виджетов, однако, только на глубину в один уровень вложения. [[file:VCA_cntwdg_lnk_ru.png|center|frame|Рисунок. Вкладка "Связи" страницы конфигурации контейнера виджетов, включающего виджеты со связями.]] Из вышесказанного видно, что связи устанавливаются пользователем в процессе конфигурации интерфейса. Однако, для предоставления возможности создания кадров общего назначения с функцией предоставления детализированных данных разных источников одного типа, необходим механизм {{Anch|DynLink|динамической установки связей}}. Такой механизм предусматривается: * резервированием ключевого идентификатора "'''<page>'''" для группы атрибутов связей у кадров общего назначения; * динамическим назначением связей с идентификатором "'''<page>'''", в процессе открытия кадра общего назначения сигналом от другого виджета. Рассмотрим пример, когда имеется кадр общего назначения "Панель контроля графиком" и множество "Графиков" на разных кадрах. "Панель контроля графиком" имеет связи с шаблонами: * tSek -> "<page>|tSek" * tSize -> "<page>|tSize" * trcPer -> "<page>|trcPer" * valArch -> "<page>|valArch" При этом, каждый виджет "График" имеет атрибуты "tSek", "tSize", "trcPer" и "valArch". При вызове сигнала открытия "Панели контроля графиком" из любого виджета "График", происходит связывания атрибутов "Панели контроля графиком" с атрибутами виджета "График", согласно шаблону. Как результат, все изменения на "Панели контроля графиком" будут отражаться на графике, посредством этих связей. Если у виджета "График" присутствуют внешние связи на параметры подсистемы "Сбор данных", связи "Панели контроля графиком" будут устанавливаться на внешний источник. Кроме того, если у "Панели контроля графиком" будут заявлены связи на атрибуты, отсутствующие непосредственно у виджета "График", то будет производится поиск наличия таких атрибутов у внешнего источника — первого на который установлена прямая связь, выполняя, тем самым, дополнение недостающих связей. Для наглядного изображения этого механизма приведена таблица. '''Таблица.''' Механизм динамической линковки. {| class="wikitable" |- ! Атрибуты "Панели контроля графиком" (шаблон динамической связи) !! Атрибуты "Графика" !! Атрибуты внешнего "Параметра" !! Результирующая связь или значение связующегося атрибута |- | 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 |} <section end=LinkDyn /> === Архитектура === Исходя из вышеизложенных, архитектурных, соображений сформируем статическую диаграмму классов СВУ, учитывая разделение на концептуальную часть (движок) и часть индивидуальной реализации СВУ (рис.4.11.1). В таблице 4.11 представлено описание классов диаграммы классов. [[file:VCA_class_diagram.png|center|frame|Рис.4.11.1. Статическая диаграмма классов.]] '''Таблица 4.11.''' Классы СВУ {| class="wikitable" |- ! Класс !! Ответственность !! Связи |- | ''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'', что связано с неявным наследованием данных свойств виджетов через все слои движка, а также тонкостями наследования, выстроенного путём использования данных одних виджетов в других. Для разъяснения этих особенностей изображена исчерпывающая карта "использующего" наследования в [[#SessExec|разделе 4.5]]. === Примитивы виджетов === <section begin=Primitives /> Любой вновь создаваемый виджет основывается на одном из нескольких примитивов — конечном элементе визуализации, путём установки родственной связи как прямо на примитив, так и посредством нескольких промежуточных пользовательских виджетов. Каждый из примитивов содержит механизм модели данных. Экземпляр виджета хранит значения свойств собственной конфигурации примитива. В задачи интерфейса визуализации входит поддержка и работа с моделью данных примитивов виджетов. Примитивы виджетов должны быть тщательно проработаны и унифицированы, с целью охватить как можно больше возможностей в как можно меньшем количестве слабо связанных друг с другом, по назначению, примитивов. '''Таблица.''' Библиотека примитивов виджетов — базовые элементы отображения {| class="wikitable" |- ! Идентификатор !! Наименование !! Функция |- | ElFigure || Элементарная графическая фигура || Примитив является основой отрисовки элементарных графических фигур со всевозможной комбинацией их в одном объекте. Предусматривается поддержка следующих элементарных фигур: * Линия. * Дуга. * Кривая Безье. * Заливка замкнутого пространства.<br/> Для всех фигур, содержащихся в виджете, устанавливаются единые свойства толщины, цвета и т.д., также, предусматривается возможность указания вышеперечисленных атрибутов для каждой фигуры отдельно и их динамизация. |- | FormEl || Элемент формы || Включает поддержку стандартных компонентов формы: * Редактирование строки. * Редактирование текста. * Флажок. * Кнопка. * Выбор из списка. * Список. * Дерево. * Таблица. * Слайдер. * Строка прокрутки. |- | Text || Текст || Элемент текста-метка. Характеризуется типом шрифта, цветом, ориентацией и выравниванием. Предусматривается поддержка аргументов. |- | Media || Медиа || Элемент отображения растровых и векторных изображений различных форматов, проигрывания анимированных изображений, проигрывание аудио-фрагментов и просмотр видео-фрагментов. |- | Diagram || Диаграмма || Элемент диаграммы с поддержкой возможности отображения нескольких потоков в реальном времени для: трендов (временных графиков), частотного спектра, XY диаграмм. |- | Protocol || Протокол || Элемент протокола — визуализатор сообщений программы, с поддержкой нескольких режимов работы. |- | Document || Документ || Элемент формирования отчётов, журналов и другой документации на основе доступных данных. |- | Box || Контейнер || Содержит механизм размещения-включения других виджетов для формирования новых, более сложных, виджетов и страниц конечной визуализации. |- | Function, <span style="color: red">в планах</span> || Функция API объектной модели OpenSCADA || Невизуальный виджет, на стороне исполнения, позволяющий включать вычислительные функции объектной модели OpenSCADA в СВУ. |} '''Таблица.''' Общий набор свойств/атрибутов виджета {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | id || Идентификатор || - || Идентификатор элемента. Атрибут только для чтения, призванный предоставить информацию об идентификаторе элемента. |- | path || Путь || - || Путь к этому виджету. Атрибут только для чтения и предоставления исчерпывающей информации о расположения элемента. |- | parent || Родитель || - || Путь к родительскому виджету. Атрибут только для чтения и предоставления информации о расположении предка от которого унаследован виджет. |- | owner || Владелец || - || Владелец и группы виджета, в виде "'''{владелец}:{группа[,группа2,группаN]}'''", по умолчанию "root:UI". |- | perm || Доступ || - || Права доступа к виджету, в виде "'''{пользователь}{группы}{другие}'''" плюс флаг наследования, включающий наследование владельца и его прав от вышестоящего виджета.<br/> Где "'''пользователь'''", "'''группы'''" и "'''другие'''" это: * "__" — нет доступа; * "R_" — только чтение; * "RW" — чтение и запись.<br/> По умолчанию 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}'''".<br/> Где: * "ItName" — имя элемента; * "Signal" — имя сигнала, формирующегося при выборе: "'''usr_{Signal}'''". |- | evProc || Обработка событий || - || Атрибут хранения сценария обработки событий непосредственного управления пользовательским интерфейсом. Сценарий представляет собой список команд интерфейсу визуализации, генерируемых при поступлении события (атрибут '''event'''). Прямая обработка событий для управления страницами в виде: "'''{event}:{evSrc}:{com}:{prm}'''". Где: * "event" — ожидаемое событие; * "evSrc" — источник события; * "com" — команда сеанса: open, next, prev; * "prm" — параметр команды, где используется: ** pg_so — прямое имя желаемой страницы, с префиксом; ** 1 — имя новой страницы в общем пути, без префикса; ** * — имя страницы берётся из имени предыдущей страницы; ** $ — указывает на место, относительно которого открывается страница.<br/> Примеры: * 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 |- | ''Дополнительные атрибуты элементов, помещённых в проект в роли страницы.'' |- | pgOpen || Страница: открыта || - || Признак "Страница открыта". : * Модификация из сеанса осуществляет немедленное открытие/закрытие данной страницы, но для страниц типа "Связь" Вы должны отдавать предпочтение использованию функции uiCmd() [[#UserAPI|пользовательского API]], для управления страницами. |- | pgNoOpenProc || Страница: обрабатывать закрытой || - || Признак "Исполнять страницу даже если она закрыта". |- | pgOpenSrc || Страница: источник открытия || 3 || Полный адрес страницы, открывшей данную. : * Запись/очистка адреса виджета (инициатора открытия), осуществляет немедленное открытие/закрытие страницы. В случае записи адреса, и выполнения [[#DynLink|других условий]], осуществляется динамическое связывание текущего виджета с инициатором. Но для страниц типа "Связь" Вы должны отдавать предпочтение использованию функции uiCmd() [[#UserAPI|пользовательского API]], для управления страницами. |- | pgGrp || Страница: группа || 4 || Группа страницы. ПУСТАЯ и "main" группа предусматривает использование этой страницы как Корневую-основную страницу, т.е. такая будет заменять другие Корневые-главные страницы; группа "fl" предназначена для использования во внешних окнах, которые предусмотрены для многоразового одновременного открытия и которые не должны отслеживаться на дубликаты; остальные предусмотрено для включения в контейнеры-боксы или одноразового одновременного открытия, т.е. они принудительно проверяются на дубликаты, когда последнее открывается, а предыдущие закрываются. |- | colspan="4" | ''Дополнительные атрибуты режима исполнения — сеанса.''<br/>(Виртуальные атрибуты не доступны в процедуре виджета) |- | event || События || - || Специальный атрибут сбора событий виджета в списке, разделённом новой строкой. Доступ к атрибуту защищён критической секцией для избежания потери событий. Атрибут всегда доступен в процедуре виджета. |- | load || Загрузка || -1 || Виртуальная команда групповой загрузки данных. |- | focus || Фокус || -2 || Специальный атрибут индикации факта получения фокуса, активным виджетом. Атрибут этого виджета и вложенных виджетов доступен в процедурах виджета. |- | perm || Доступ || -3 || Виртуальный атрибут прав активного пользователя на просмотр и контроль над виджетом. |} : * — Специальная функция атрибута виджета, выполняемая в сеансе проекта при пользовательской модификации. Движок среды визуализации предусматривает активацию атрибутов, специфичных для визуализатора. Процесс активации осуществляется при открытии сеанса визуализации проекта и предусматривает, в этом проекте: создание специфичного атрибута с указанными свойствами, если он отсутствует, и активацию отслеживания его модификации движком среды визуализации, как для атрибутов формирования образов примитивов. Для непосредственного определения такого атрибута можно также использовать префикс идентификатора атрибута "vs_", что быстрее и исключает стадию активации. С перечнем специфичных для визуализатора атрибутов можно ознакомиться в документации соответствующего визуализатора. ==== {{Anch|ElFigure|Элементарная графическая фигура (ElFigure)}} ==== Примитив является основой в отрисовке элементарных графических фигур со всевозможной их комбинацией в одном объекте. Учитывая широкий спектр всевозможных фигур, которые должен поддерживать примитив, и, в тоже время, являться достаточно простым в использовании и, по возможности, в реализации, было решено ограничить перечень базовых фигур, используемых для построения результирующих графических объектов, до таких: линия, дуга, кривая Безье и заливка замкнутых контуров. Основываясь уже на этих базовых фигурах, можно строить производные фигуры, комбинируя базовые. В рамках примитива существует возможность задания прозрачности цвета в диапазоне [0...255], где '0' — полная прозрачность. '''Таблица.''' Набор дополнительных свойств/атрибутов примитива "Элементарная фигура (ElFigure)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | lineWdth || Линия: ширина || 20 || Ширина линии. |- | lineClr || Линия: цвет || 21 || Имя цвета в виде "'''{color}[-{alpha}]'''", где: * "color" — стандартное имя цвета или его числовое представление из трёх шестнадцатеричных чисел отдельных цветов "#RRGGBB"; * "alpha" — уровень альфа-канала [0...255], где 0 — полностью прозрачный.<br/> Примеры: * "red" — сплошной красный цвет; * "#FF0000" — сплошной красный цвет в цифровом коде; * "red-127" — полупрозрачный красный цвет. |- | lineStyle || Линия: стиль || 22 || Стиль линии: сплошная, пунктир, точечная. |- | bordWdth || Граница: ширина || 23 || Ширина бордюра линии. Нулевая ширина указывает на отсутствие бордюра. |- | bordClr || Граница: цвет || 24 || Цвет бордюра (детали в атрибуте 21). |- | fillColor || Заполнение: цвет || 25 || Цвет заливки (детали в атрибуте 21). |- | fillImg || Заполнение: изображение || 26 || Имя изображения в виде "'''[{src}:]{name}'''", где: * "src" — источник изображения: ** ''file'' — прямо из локального файла по пути; ** ''res'' — из таблицы ресурсов БД. * "name" — путь файла или идентификатор ресурса.<br/> Примеры: * "res:backLogo" — из таблицы ресурсов БД для идентификатора "backLogo"; * "backLogo" — как и предыдущий; * "file:/var/tmp/backLogo.png" — из локального файла по пути "/var/tmp/backLogo.png". |- | orient || Угол поворота || 28 || Угол поворота содержимого виджета. |- | mirror || Отражение || 29 || Отражение содержимого виджета, <span color="red">ограничено на данный момент</span>. |- | elLst || Список элементов || 27 || Список графических элементов в формате: * Линия. Общая форма записи в списке, для статических и динамических параметров (могут смешиваться): ::"'''line:({x}|{y}):({x}|{y})[:{width}[:{color}[:{bord_w}[:{bord_clr}[:{line_stl}]]]]]'''" ::"'''line:{p1}:{p2}[:w{n}[:c{n}[:w{n}[:c{n}[:s{n}]]]]]'''" * Дуга. Общая форма записи в списке, для статических и динамических параметров (могут смешиваться): ::"'''arc:({x}|{y}):({x}|{y}):({x}|{y}):({x}|{y}):({x}|{y})[:{width}[:{color}[:{bord_w}[:{bord_clr}[:{line_stl}]]]]]'''" ::"'''arc:{p1}:{p2}:{p3}:{p4}:{p5}[:w{n}[:c{n}[:w{n}[:c{n}[:s{n}]]]]]'''" :[[File:VCA_arc.png]] ::p1, p2 — начальная и конечная точки эллиптической дуги, соответственно; ::p3 — центр дуги; ::p4 — первый радиус; ::p5 — второй радиус. * Кривая Безье. Форма записи в списке, для статических и динамических параметров (могут смешиваться): ::"'''bezier:({x}|{y}):({x}|{y}):({x}|{y}):({x}|{y})[:{width}[:{color}[:{bord_w}[:{bord_clr}[:{line_stl}]]]]]'''" ::"'''bezier:{p1}:{p2}:{p3}:{p4}[:w{n}[:c{n}[:w{n}[:c{n}[:s{n}]]]]]'''" * Заливка. Форма записи в списке, для статических и динамических параметров (могут смешиваться): ::"'''fill:({x}|{y}):({x}|{y}):...:({x}|{y})[:{fill_clr}[:{fill_img}]]'''" ::"'''fill:{p1}:{p2}:...:{pN}[:c{n}[:i{n}]]'''"<br/> Где: :''x, y'' — прямая точка (x,y), координаты в пикселах с плавающей точкой; :''p1 ... pN'' — динамическая точка 1...N; :''width, bord_w'' — прямая ширина линии и бордюра в пикселах с плавающей точкой; :''w{n}'' — динамическая ширина 'n'; :''color, bord_clr, fill_clr'' — прямой цвет линии, бордюра и заполнения, в виде имени или 32-битного кода с альфа: {имя}[-{AAA}], #RRGGBB-AAA; :''c{n}'' — динамический цвет 'n'; :''line_stl'' — прямой стиль линии: 0-Сплошная, 1-Пунктирная, 2-Точечная; :''s{n}'' — динамический стиль 'n'; :''fill_img'' — прямое изображение заполнения в виде "[{src}%3A]{name}", где: ::"src" — источник изображения: :::''file'' — непосредственно из локального файла по пути; :::''res'' — из таблицы ресурсов БД. ::"name" — путь файла или идентификатор ресурса. :''i{n}'' — динамическое изображение заполнения 'n'.<br/> Например: * line:(50|25):(90.5|25):2:yellow:3:green:2 * arc:(25|50):(25|50):1:4:(25|50)::#000000-0 * fill:(25|50):(25|50):c2:i2 * fill:(50|25):(90.5|25):(90|50):(50|50):#d3d3d3:h_31 |- | colspan="4" | ''Атрибуты каждой точки из списка графических фигур '''elLst''''' |- | p{n}x || Точка {n}:x || 30+n*6 || Координата 'x' точки ''n''. |- | p{n}y || Точка {n}:y || 30+n*6+1 || Координата 'y' точки ''n''. |- | w{n} || Ширина {n} || 30+n*6+2 || Ширина ''n''. |- | с{n} || Цвет {n} || 30+n*6+3 || Цвет ''n'' (детали в атрибуте 21). |- | i{n} || Изображение {n} || 30+n*6+4 || Изображение ''n'' (детали в атрибуте 26). |- | s{n} || Стиль {n} || 30+n*6+5 || Стиль ''n''. |} ==== {{Anch|FormEl|Элемент формы (FormEl)}} ==== Примитив, предназначенный для предоставления, в распоряжение пользователя, стандартных элементов формы. Общий перечень атрибутов зависит от типа элемента. '''Table.''' List of additional properties/attributes of the primitive "Element of the form (FormEl)" {| class="wikitable" |- ! Identifier !! Name !! Number !! Value |- | elType || Element type || 20 || Type of the element, from which depends the list of additional attributes: * Line edit (0) * Text edit (1) * Check Box (2) * Button (3) * Combo box (4) * List (5) * Tree (8) * Table (9) * Slider (6) * Scroll bar (7) |- | colspan="4" | ''Line edit:'' |- | value || Value || 21 || Contents of the line. |- | view || View || 22 || View of the editing line: * Text (0) * Combo Box (1) * Integer (2) * Real (3) * Time (4) * Date (5) * Date and Time (6) * Password (7) |- | cfg || Configuration || 23 || Configuration of the line. Format of the value of the field for different views of the lines: :''Text'' — configuration of the formatted input at the template with the parameters (supported only by Qt in [[Special:MyLanguage/Modules/Vision|UI.Vision]]): :::'''A''' — ASCII alphabetic character required, [A-Za-z]. :::'''a''' — ASCII alphabetic character permitted but not required. :::'''N''' — ASCII alphanumeric character required, [A-Za-z0-9]. :::'''n''' — ASCII alphanumeric character permitted but not required. :::'''X''' — Any character required. :::'''x''' — Any character permitted but not required. :::'''9''' — ASCII digit required, [0-9]. :::'''0''' — ASCII digit permitted but not required. :::'''D''' — ASCII digit required, [1-9]. :::'''d''' — ASCII digit permitted but not required. :::'''#''' — ASCII digit or plus/minus sign permitted but not required. :::'''H''' — Hexadecimal character required, [A-Fa-f0-9]. :::'''h''' — Hexadecimal character permitted but not required. :::'''B''' — Binary character required, [0-1]. :::'''b''' — Binary character permitted but not required. :::'''>''' — All following alphabetic characters are uppercased. :::'''<''' — All following alphabetic characters are lowercased. :::'''!''' — Switch off case conversion. :::'''\\''' — Use to shield the special characters listed above to use them as separators. :''Combobox'' — list of values the editable combobox by lines. :''Integer'' — integer value in the form: "'''{Min}:{Max}:{ChangeStep}:{Prefix}:{Suffix}'''". :''Real'' — real value in the form: "'''{Min}:{Max}:{ChangeStep}:{Prefix}:{Suffix}:{SignsAfterDot}'''". :''Time'', ''Date'', ''Date and time'' — to form the date following the template with the parameters: :::'''d''' — number of the day (1-31); :::'''dd''' — number of the day (01-31); :::'''ddd''' — acronym of the day ("Mon" ... "Sun"); :::'''dddd''' — full name of the day ("Monday" ... "Sunday"); :::'''M''' — number of the month (1-12); :::'''MM''' — number of the month (01-12); :::'''MMM''' — acronym of the month ("Jan" ... "Dec"); :::'''MMMM''' — full name of the month ("January" ... "December"); :::'''yy''' — last two digits of the year; :::'''yyyy''' — full year; :::'''h''' — hour (0-23); :::'''hh''' — hour (00-23); :::'''m''' — minutes (0-59); :::'''mm''' — minutes (00-59); :::'''s''' — seconds (0-59); :::'''ss''' — seconds (00-59); :::'''AP,ap''' — to display AM/PM or am/pm. |- | confirm || Confirm || 24 || Enable the confirming mode. |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''", where: * "family" — font family, for spaces use symbol '_', like: "Arial", "Courier", "Times_New_Roman"; * "size" — font size in pixels; * "bold" — font bold (0 or 1); * "italic" — font italic (0 or 1); * "underline" — font underlined (0 or 1); * "strike" — font struck (0 or 1).<br/> Examples: * "Arial 10 1 0 0 0" — Arial font size 10 pixels and bold. |- | colspan="4" | ''Text edit:'' |- | value || Value || 21 || Content of the editor. |- | wordWrap || Word wrap || 22 || Automatically wrap text by words. |- | confirm || Confirm || 24 || Enable the confirming mode. |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (details above). |- | colspan="4" | ''Check box:'' |- | name || Name || 26 || Name/label of the checkbox. |- | value || Value || 21 || Value of the checkbox. |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (details above). |- | colspan="4" | ''Button:'' |- | name || Name || 26 || Name-inscription on the button. Allowed symbols '\n' for multiple line names. |- | value || Value || 21 || The value, different for modes: * "Standard" — repeating parameters of events on holding '''{delay}-{interval}''', time in milliseconds; * "Checkable" — toggle value; * "Menu" — list of addresses of the menu elements like to '''/grp1/grp2/item1'''; * "Load" — description line '''{FilesTemplate}|{Header}|{FileByDefaultAndLoaded}|{FileMime}''' and loaded file content from next line. The files template like to "Images (*.png *.xpm *.jpg);;CSV-file (*.csv)". * "Save" — description line '''{FilesTemplate}|{Header}|{FileByDefault}|{FileMime}''' and saving file content from next line. The files template like to before one. |- | img || Image || 22 || Image on the button. Image name in the view '''[{src}:]{name}''', where: * "src" — source of the image: ** ''file'' — directly from the local file by the path; ** ''res'' — from the resources table of DB. * "name" — file path or identifier of the resource.<br/> Examples: * "res:backLogo" — from the resources table of DB for the identifier "backLogo"; * "backLogo" — like toe the previous; * "file:/var/tmp/backLogo.png" — from local file by the path "/var/tmp/backLogo.png". |- | color || Color || 23 || Color of the button. Color name form "'''{color}[-{alpha}]'''", where: * "color" — standard color name or its numeric representation of three hexadecimal numbers of individual colors "#RRGGBB"; * "alpha" — level of the alpha [0...255], where 0 — completely transparent.<br/> Examples: * "red" — solid red color; * "#FF0000" — solid red color by the digital code; * "red-127" — half transparent red color. |- | colorText || Color:text || 27 || Color of the text (details above). |- | mode || Mode || 24 || Operation mode of the button: * "Standard" — normal button which allows repeating events on it hold, the parameters in "value"; * "Checkable" — check button, values in "value"; * "Menu" — opens menu on press, items list in "value"; * "Load" — provides for loading of the user-space small files through the visual interface; on the mode the button press will open the selection file dialog for loading and the file content next saving to the attribute "value"; * "Save" — provides for saving of the user-space small files through the visual interface; on the file content writing to the attribute "value" for user will: open the selecting/setting file dialog, save the attribute "value" content to the file, after the selecting, and set clean the attribute "value". |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (details above). |- | colspan="4" | ''List:'' |- | value || Value || 21 || Current value of the list. |- | items || Items || 22 || Entries of the list. |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (details above). |- | mult || Multiple selection || 23 || Allow for multiple entries selection of the list. |- | colspan="4" | ''Combo box, Tree:'' |- | value || Value || 21 || Current value of the list. |- | items || Items || 22 || Entries of the list or hierarchical items list of the tree in path "'''/{DIR}/{DIR}/{ITEM}'''". |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (details above). |- | colspan="4" | ''Table:'' |- | set || Setting value || 23 || Value of edition of a cell of the table which address in the event "'''ws_TableEdit_{colN}_{rowN}'''". |- | value || Value || 21 || Address of the selected item. It changing follows by the event "'''ws_TableChangeSel'''". The address format depends from the table's selection mode: * "Cell" — cell address in the format "'''{row}:{col}'''". * "Row", "Column" — row-column number or cell content of the row-column key, which sets by the attribute "keyID". |- | items || Elements || 22 || The table structure and content in the XML view: <syntaxhighlight lang="XML"> <tbl> <h><s>{Header1}</s><s>{Header2}</s></h> <r><s>{Row1Column1String}</s><i>{Row1Column1Integer}</i></r> <r><b>{Row2Column1Logical}</b><r>{Row2Column2Real}</r></r> </tbl></syntaxhighlight> The tags: :"tbl" — Table, the properties at all: :* "sel" — selection mode of the table items: "row" — by rows, "col" — by columns, "cell" — by cells (by default); :* "keyID" — row-column number of the key, for the selection value get; :* "colsWdthFit" — fits the columns size, in the unfixed size, to fill the full width of the table; :* "hHdrVis", "vHdrVis" — visibility of the headers, for horizontal and vertical; :* "sortEn" — enables sorting directly by the columns. :"h" — Row of the headers. Possible attributes of the header cell tag for the column as a whole: :* "width" — column width, in pixels or percents (10%); :* "edit" — allowing to the cells of the row edition (0 or 1), by default — no (0); :* "color" — column color as a whole in the color name or code; :* "colorText" — color of the column text as a whole in the color name or code; :* "font" — font of the column text in the typical OpenSCADA string; :* "prec" — value precision of the real type cells in the column; :* "sort" — sorting by the column [0 - Ascending-default; 1 - Descending]; :* "align" — alignment the column for: "left", "right" and "center". :"r" — Row of the values. Possible attributes of the row cell tag for the row as a whole: :* "color" — row color as a whole in the color name or code; :* "colorText" — color of the row text as a whole in the color name or code; :* "font" — font of the cell text in the typical OpenSCADA string; :* "prec" — value precision of the real type cells in the row. :"s", "t", "i", "r", "b" — cells of the data types "String", "Text", "Integer", "Real" and "Logical". Possible attributes: :* "color" — cell color; :* "colorText" — color of the cell text in the color name or code; :* "font" — font of the cell text in the typical OpenSCADA string; :* "prec" — value precision of the real type cell; :* "img" — image of the cell in the form "'''[{src}:]{name}'''", the details above; :* "edit" — allowing the cell edition (0 or 1), by default - no (0); :* "align" — alignment the cell for: "left", "right" and "center". |- | font || Font || 25 || Font name in the form "'''{family} {size} {bold} {italic} {underline} {strike}'''" (the details above). |- | colspan="4" | ''Slider and Scroll Bar:'' |- | value || Value || 21 || Slider position. |- | cfg || Configuration || 22 || Configuration of the slider in the format: "'''{VertOrient}:{Min}:{Max}:{SinglStep}:{PageStep}'''".<br/> Where: * "VertOrient" — sign (0 or 1) of the vertical orientation, the default is the horizontal orientation; * "Min" — minimum value; * "Max" — maximum value; * "SinglStep" — size of a single step; * "PageStep" — size of a page step. |} ==== {{Anch|Text|Элемент текста (Text)}} ==== Данный примитив предназначен для вывода простого и HTML текста, используемого в роли меток и различных подписей. С целью создания декоративных оформлений, примитив поддерживает обвод текста рамкой. '''Таблица.''' Набор дополнительных свойств/атрибутов примитива "Элемент текста (Text)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | backColor || Фон: цвет || 20 || Фоновый цвет. Имя цвета в виде "'''{color}[-{alpha}]'''", где: * "color" — стандартное имя цвета или его числовое представление из трёх шестнадцатеричных чисел отдельных цветов "#RRGGBB"; * "alpha" — уровень альфа-канала [0...255], где 0 — полностью прозрачный.<br/> Примеры: * "red" — сплошной красный цвет; * "#FF0000" — сплошной красный цвет в цифровом коде; * "red-127" — полупрозрачный красный цвет. |- | backImg || Фон: изображение || 21 || Фоновое изображение. Имя изображения в виде "'''[{src}:]{name}'''", где: * "src" — источник изображения: ** ''file'' — прямо из локального файла по пути; ** ''res'' — из таблицы ресурсов БД. * "name" — путь файла или идентификатор ресурса.<br/> Примеры: * "res:backLogo" — из таблицы ресурсов БД для идентификатора "backLogo"; * "backLogo" — как и предыдущий; * "file:/var/tmp/backLogo.png" — из локального файла по пути "/var/tmp/backLogo.png". |- | bordWidth || Граница: ширина || 22 || Ширина бордюра. |- | bordColor || Граница: цвет || 23 || Цвет бордюра (детальнее в атрибуте 20). |- | bordStyle || Граница: стиль || 24 || Стиль бордюра: "Нет" (0), "Точечный" (1), "Пунктирный" (2), "Сплошной" (3), "Двойной" (4), "Канавка" (5), "Кромка" (6), "Вдавлен" (7), "Выступающий" (8). |- | font || Шрифт || 25 || Имя шрифта в виде "'''{family} {size} {bold} {italic} {underline} {strike}'''", где: * "family" — семейство шрифта, для пробелов используйте символ '_', вроде: "Arial", "Courier", "Times_New_Roman"; * "size" — размер шрифта в пикселях; * "bold" — усиление шрифта (0 или 1); * "italic" — наклонность шрифта (0 или 1); * "underline" — подчёркивание шрифта (0 или 1); * "strike" — перечёркивание шрифта (0 или 1).<br/> Примеры: * "Arial 10 1 0 0 0" — Arial шрифт размером 10 пикселей и усиленный. |- | 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 || Количество аргументов. |- | colspan="4" | ''Атрибуты аргументов'' |- | 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'': * "Строка": '''{len}''' — ширина строки; * "Вещественный": '''{wdth};{form};{prec}''' — ширина, форма ('g', 'e', 'f') и точность значения; * "Целый": '''{len}''' — ширина значения. |} ==== {{Anch|Media|Элемент отображения медиа-материалов (Media)}} ==== Данный примитив предназначен для проигрывания различных медиа-материалов, начиная от простых изображений и заканчивая полноценными аудио и видео потоками. '''Table.''' List of additional properties/attributes of the primitive "Element of visualization of media-materials (Media)" {| class="wikitable" |- ! Identifier !! Name !! Number !! Value |- | backColor || Background: color || 20 || Background color. Color name in the view "'''{color}[-{alpha}]'''", where: * "color" — standard color name or its numeric representation of three hexadecimal numbers of individual colors "#RRGGBB"; * "alpha" — level of the alpha [0...255], where 0 — completely transparent.<br/> Examples: * "red" — solid red color; * "#FF0000" — solid red color by the digital code; * "red-127" — half transparent red color. |- | backImg || Background: image || 21 || Background image. The image name in the view "'''[{src}:]{name}'''", where: * "src" — source of the image: ** ''file'' — directly from the local file by the path; ** ''res'' — from the resources table of DB. * "name" — file path or identifier of the resource.<br/> Examples: * "res:backLogo" — from the resources table of DB for the identifier "backLogo"; * "backLogo" — like toe the previous; * "file:/var/tmp/backLogo.png" — from local file by the path "/var/tmp/backLogo.png". |- | bordWidth || Border: width || 22 || Border width. |- | bordColor || Border: color || 23 || Border color (details in attribute 20). |- | bordStyle || Border: style || 24 || Border style: "None", "Dotted", "Dashed", "Solid", "Double", "Groove", "Ridge", "Inset", "Outset". |- | src || Source || 25 || Name of the Media source in the view "'''[{src}:]{name}'''", where: * "src" — source: ** ''file'' — directly from the local file, visualizer and engine, by the path; ** ''res'' — from the resources table of DB; ** ''data'' — directly data in the form "data:{mime}\n{base64}"; ** ''stream'' — stream URL for playback video and audio. * "name" — file path or identifier of the resource.<br/> Examples: * "res:workMedia" — from the resources table of DB for the identifier "workMedia"; * "workMedia" — like to previous; * "<nowiki>file:/var/tmp/workMedia.mng</nowiki>" — from the local file by the path "/var/tmp/workMedia.mng"; * "<nowiki>stream:http://localhost.localhost:5050</nowiki>" — playback for video and audio stream from the URL. |- | type || Type || 27 || Media type: * "Image" — raster or vector (can not support) image, like to: PNG, JPEG, GIF, SVG; * "Animation" — simple animation image, like to: GIF, MNG; * "Video" — full video or stream, like to: OGM, AVI, MKV, MPG, MP4; * "Audio" — just audio or stream, like to: OGG, MP3, WAV. |- | areas || Map areas || 28 || Number of the active areas. |- | colspan="4" | ''Attributes of the image (Image)'' |- | fit || Fit to the widget size || 26 || Sign of coordination the contents with the widget size. |- | keepAspect || Keep aspect ratio at fitting || 35 || Sign of keeping image aspect ratio at fitting to whole size of the widget. |- | colspan="4" | ''Attributes of the animation-video (Animation)'' |- | fit || Fit to the widget size || 26 || Sign of coordination the contents with the widget size. |- | speed || Play speed || 29 || Speed of playback, as a percentage from the original speed. If the value is less or even than 1%, the playback stops. |- | colspan="4" | ''Attributes of the full video (Full video)'' |- | play || Play || 29 || Video/audio — "Play". |- | roll || Roll play || 30 || Roll play on the finish. |- | pause || Pause || 31 || Playing pause. |- | size || Size || 32 || Total video size, in milliseconds. |- | seek || Seek || 33 || Seek video playing, in milliseconds. |- | volume || Volume || 34 || Sound volume [0...100]. |- | colspan="4" | ''Active areas'' |- | area{x}shp || Area {x}: shape || 40+3*x || Type of the area ''x'': "Rect", "Poly", "Circle". |- | area{x}coord || Area {x}: coordinates || 40+3*x+1 || Coordinates of the area ''x'', are separated by commas: "x1,y1,x2,y2,xN,yN". |- | area{x}title || Area {x}: title || 40+3*x+2 || Title of the area ''x''. |} ==== {{Anch|Diagram|Элемент построения диаграмм (Diagram)}} ==== Данный примитив предназначен для построения различных диаграмм во времени, включая графики-тренды отображения текущего процесса и архивных данных. Реализованы следующие типы диаграмм: * "График-тренд" — строит график значений параметра во времени. * "Спектр" — строит частотный спектр из значений параметров. Окно данных частотного спектра формируется исходя из размера виджета по горизонтали, в пикселях, и доступных данных параметров, наложенных на сетку горизонтального размера. В связи с этим, минимальная выделяемая частота определяется значением атрибута "tSize" — "'''1/tSize'''", а максимальная, половинной шириной графика в пикселях умноженной на минимальную частоту "'''width/(2*tSize)'''". * "XY" — строит двумерный график значений параметров, парами на график, где чётные по оси Y (0,2,4...) и нечётные по оси X (1,3,5...). Указанный временной диапазон данных используется в получении значений параметров оси X и Y, с последующим изображением. Для всех типов диаграмм возможно указание, в качестве источника данных: * параметра подсистемы "Сбор Данных"; * архива значений; * прямого блока данных пользователя. Поддерживается режим слеживания за текущими значениями и значениями с архива, а также, возможно построение графиков параметров, не имеющих архива значений, путём накопления текущих значений в буфере диаграммы и только на момент активного отображения этой диаграммы. Процесс доступа к архивным данным оптимизирован путём ведения промежуточного буфера отображения, а также, упаковки трафика данных при запросе, путем приведения данных к качеству достаточного для отображения. '''Таблица.''' Набор дополнительных свойств/атрибутов примитива "Элемент построения диаграмм (Diagram)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | backColor || Фон: цвет || 20 || Фоновый цвет. Имя цвета в виде "'''{color}[-{alpha}]'''", где: * "color" — стандартное имя цвета или его числовое представление из трёх шестнадцатеричных чисел отдельных цветов "#RRGGBB"; * "alpha" — уровень альфа-канала [0...255], где 0 — полностью прозрачный.<br/> Примеры: * "red" — сплошной красный цвет; * "#FF0000" — сплошной красный цвет в цифровом коде; * "red-127" — полупрозрачный красный цвет. |- | backImg || Фон: изображение || 21 || Фоновое изображение. Имя изображения в виде "'''[{src}:]{name}'''", где: * "src" — источник изображения: ** ''file'' — прямо из локального файла по пути; ** ''res'' — из таблицы ресурсов БД. * "name" — путь файла или идентификатор ресурса.<br/> Примеры: * "res:backLogo" — из таблицы ресурсов БД для идентификатора "backLogo"; * "backLogo" — как и предыдущий; * "file:/var/tmp/backLogo.png" — из локального файла по пути "/var/tmp/backLogo.png". |- | bordWidth || Граница: ширина || 22 || Ширина бордюра. |- | bordColor || Граница: цвет || 23 || Цвет бордюра (детальнее в атрибуте 20). |- | bordStyle || Граница: стиль || 24 || Стиль бордюра: "Нет", "Точечный", "Пунктирный", "Сплошной", "Двойной", "Канавка", "Кромка", "Вдавлен", "Выступающий". |- | trcPer || Период слежения, секунд || 25 || Режим и периодичность слежения. |- | type || Тип || 26 || Тип диаграммы: "График", "Спектр", "XY". |- | colspan="4" | ''Атрибуты, общие для всех типов'' |- | 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}'''", где: * "family" — семейство шрифта, для пробелов используйте символ '_', вроде: "Arial", "Courier", "Times_New_Roman"; * "size" — размер шрифта в пикселях; * "bold" — усиление шрифта (0 или 1); * "italic" — наклонность шрифта (0 или 1); * "underline" — подчёркивание шрифта (0 или 1); * "strike" — перечёркивание шрифта (0 или 1).<br/> Примеры: * "Arial 10 1 0 0 0" — Arial шрифт размером 10 пикселей и усиленный. |- | valArch || Архиватор значений || 38 || Архиватор значений в виде "'''{МодульАрхивов}.{IdАрхиватора}'''". |- | valsForPix || Значений на пиксель || 42 || Количество значений на пиксель. Увеличить для расширения точности экспорта на больших интервалах времени. |- | parNum || Количество параметров || 39 || Количество параметров, отображаемых на одном тренде. |- | colspan="4" | ''Атрибуты типа: "График"'' |- | sclHorPer || Шкала: размер гор. решетки, секунды || 43 || Фиксированный период решётки горизонтальной шкалы — отключает автоматическое вычисление периода решётки. Активируется если количество периодов на общий размер более двух и размер одного периода не менее 15 пикселей. |- | colspan="4" | ''<u>Индивидуальные атрибуты параметров</u>'' |- | prm{X}addr || Параметр {X}: адрес || 50+10*{X} || Полный адрес к атрибуту параметра ''X'' DAQ или архиву.<br/> Поддерживается прямая установка данных по префиксу: * "'''data:{XMLNodeData}'''" — изображение из прямо установленных данных; * "'''line:{значение}'''" — изображение горизонтальной линии по значению, не имеет смысла для типа "XY".<br/> Пример: * "/DAQ/System/AutoDA/MemInfo/use" — адрес к атрибуту "use" параметра "MemInfo" объекта контроллера "AutoDA" DAQ модуля "System"; * "/Archive/va_CPULoad_load" — адрес к архиву "CPULoad_load"; * "data:<d s="1" aprox="1" tm="1369465209" tm_grnd="1369465200" per="1"> :0 3.14 :1 3.141 :5 3.1415</d>" — 10 секунд данных с периодом 1 секунда от "25.05.2013 10:00:00"; возможно "tm" и "tm_grnd" не указывать, в результате чего будут подставлены значения диапазона диаграммы, также, установкой атрибута "s", можно указать на время в секундах; "aprox" — аппроксимировать переход от одной точки к другой вместо подстановки предыдущего значения во все точки периодичности от упаковки; * "line:3.14159265" — горизонтальная линия по значению "3.14159265". |- | 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). |} ==== {{Anch|Protocol|Элемент построения протоколов на основе архивов сообщений (Protocol)}} ==== Данный примитив предназначен для визуализации данных архива сообщений путём формирования протоколов с различными способами визуализации, начиная от статического сканирующего просмотра и заканчивая динамическим слеживанием. '''Таблица.''' Набор дополнительных свойств/атрибутов примитива "Элемент построения протоколов на основе архивов сообщений (Protocol)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | backColor || Фон: цвет || 20 || Фоновый цвет. Имя цвета в виде "'''{color}[-{alpha}]'''", где: * "color" — стандартное имя цвета или его числовое представление из трёх шестнадцатеричных чисел отдельных цветов "#RRGGBB"; * "alpha" — уровень альфа-канала [0...255], где 0 — полностью прозрачный.<br/> Примеры: * "red" — сплошной красный цвет; * "#FF0000" — сплошной красный цвет в цифровом коде; * "red-127" — полупрозрачный красный цвет. |- | backImg || Фон: изображение || 21 || Фоновое изображение. Имя изображения в виде "'''[{src}:]{name}'''", где: * "src" — источник изображения: ** ''file'' — прямо из локального файла по пути; ** ''res'' — из таблицы ресурсов БД. * "name" — путь файла или идентификатор ресурса.<br/> Примеры: * "res:backLogo" — из таблицы ресурсов БД для идентификатора "backLogo"; * "backLogo" — как и предыдущий; * "file:/var/tmp/backLogo.png" — из локального файла по пути "/var/tmp/backLogo.png". |- | font || Шрифт || 22 || Имя шрифта в виде "'''{family} {size} {bold} {italic} {underline} {strike}'''", где: * "family" — семейство шрифта, для пробелов используйте символ '_', вроде: "Arial", "Courier", "Times_New_Roman"; * "size" — размер шрифта в пикселях; * "bold" — усиление шрифта (0 или 1); * "italic" — наклонность шрифта (0 или 1); * "underline" — подчёркивание шрифта (0 или 1); * "strike" — перечёркивание шрифта (0 или 1).<br/> Примеры: * "Arial 10 1 0 0 0" — Arial шрифт размером 10 пикселей и усиленный. |- | headVis || Заголовок видим || 23 || Видимость заголовка таблицы. |- | time || Время, секунды || 24 || Текущее время, секунды. |- | tSize || Размер, секунды || 25 || Размер запроса данных, секунды. Установить значение в '0' для получения всех нарушений, для "lev" < 0. |- | trcPer || Период слежения, секунды || 26 || Режим и периодичность слежения. |- | arch || Архиватор || 27 || Архиватор сообщений в виде "'''{МодульАрхивов}.{IdАрхиватора}'''". |- | tmpl || Шаблон || 28 || Шаблон категории или регулярное выражение "'''/{re}/'''". Для шаблона зарезервированы символы: * '*' — множество любых, группа символов; * '?' — любой, один символ; * '\\' — используйте для экранирования специальных символов. |- | lev || Уровень || 29 || Уровень сообщений. Установите значение < 0 для получения текущих нарушений. |- | viewOrd || Порядок отображения || 30 || Порядок отображения: "По времени", "По уровню", "По категории", "По сообщению", "По времени (обратно)", "По уровню (обратно)", "По категории (обратно)", "По сообщению (обратно)". |- | col || Показать колонки || 31 || Список видимых и порядок колонок, разделённый символом ';'. Предусматриваются колонки: * "pos" — номер строки; * "tm" — дата и время сообщения; * "utm" — микросекундная часть времени сообщения; * "lev" — уровень сообщения; * "cat" — категория сообщения; * "mess" — текст сообщения. |- | itProp || Свойства элемента || 32 || Количество свойств элемента. |- | colspan="4" | ''<u>Индивидуальные атрибуты свойств элемента</u>'' |- | 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). |} ==== {{Anch|Document|Элемент формирования отчётной документации (Document)}} ==== Примитив предназначен для формирования отчётной, оперативной и иной документации на основе шаблонов документов. '''Таблица.''' Набор дополнительных свойств/атрибутов примитиве "Элемент формирования отчётной документации (Document)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | style || CSS || 20 || Правила CSS в строках, вида "'''body { background-color:#818181; }'''". |- | tmpl || Шаблон || 21 || Шаблон документа в XHTML, начиная с тега "body" и включая процедурные вставки: <syntaxhighlight lang="XML"> <body docProcLang="JavaLikeCalc.JavaScript"> <h1>Значение<?dp return wCod+1.314;?></h1> </body></syntaxhighlight> |- | doc || Документ || 22 || Финальный документ в XHTML, начинается с тега "body". |- | font || Шрифт || 26 || Базовый шрифт текста документа. Имя шрифта в виде "'''{family} {size} {bold} {italic} {underline} {strike}'''", где: * "family" — семейство шрифта, для пробелов используйте символ '_', вроде: "Arial", "Courier", "Times_New_Roman"; * "size" — размер шрифта в пикселях; * "bold" — усиление шрифта (0 или 1); * "italic" — наклонность шрифта (0 или 1); * "underline" — подчёркивание шрифта (0 или 1); * "strike" — перечёркивание шрифта (0 или 1).<br/> Примеры: * "Arial 10 1 0 0 0" — Arial шрифт размером 10 пикселей и усиленный. |- | bTime || Время: начало || 24 || Время начала документа, секунды. |- | time || Время: текущее || 23 || Время генерации документа, секунды. Записать время для генерации документа от этой точки или нуль для перегенерации. |- | process || В процессе || 27 || Признак процесса формирования документа отдельным потоком. |- | n || Размер архива || 25 || Количество документов или глубина архива. |- | colspan="4" | ''Атрибуты включеного режима архивирования'' |- | aCur || Архив: курсор: текущий || - || Позиция текущего документа в архиве. Запись значения ''<0'' производит архивацию текущего документа. |- | vCur || Архив: курсор: вид || - || Текущий визуализируемый документ архива. Запись значения: * ''-1'' — выбор следующего документа; * ''-2'' — выбор предыдущего документа. |- | aDoc || Архив: текущий документ || - || Текущий документ архива в XHTML, начинается с тега "body". |- | aSize || Архив: размер || - || Реальный размер архива документа. |} Возможности примитива "Документ": * Гибкое формирование структуры документа на основе языка гипертекстовой разметки, что предоставляет поддержку широких возможностей форматирования документов. * Формирование документов по команде или расписанию, что необходимо для формирования отчётной документации в архив, с последующим просмотром архива. * Формирование документов в режиме реального времени, для предоставления их полностью динамически и на основе архивов за указанное время. * Использование атрибутов виджета для передачи в документ значений и адресов на архивы, что позволяет использовать виджет документа как шаблон, при формировании отчётов с другими входными данными. В основе любого документа лежит XHTML-шаблон. XHTML-шаблон это тег "body" WEB-страницы, содержащий статику документа в стандарте XHTML 1.0 и элементы исполняемых инструкций на языке пользовательского программирования OpenSCADA, в виде '''<?dp {procedure} ?>'''. Результирующий документ формируется путём исполнения процедур и вставки их результата в документ. Источником значений исполняемых инструкций являются атрибуты виджета этого примитива, а также все механизмы языка пользовательского программирования OpenSCADA. Атрибуты могут добавляться пользователем и линковаться на реальные атрибуты параметров или-же являться автономными, значения которых будут формироваться в процедуре виджета. В случае со слинкованными атрибутами, значения могут извлекаться из архива-истории. На рисунке изображена структурная схема виджета примитива "Документ". Согласно этой структуре, "Документ" содержит: XHTML-шаблон, результирующие документы и процедуру обработки данных. Источником данных процедуры и результирующих документов являются атрибуты виджета. [[file:VCA_document_ru.png|center|frame|Рисунок. Структурная схема примитива "Документ".]] Предусматривается работа виджета в двух режимах: "Динамический" и "Архивный". Отличием архивного режима является наличие архива указанной глубины и атрибутов, позволяющих управлять процессом архивирования и просмотра указанного документа в архиве. Генерация документа всегда производится в момент установки атрибута времени ''time'' относительно установленного ранее начального времени документа в атрибуте ''bTime''. При выключенном архиве, результирующий документ помещается непосредственно в атрибут ''doc''. При включенном архиве, результирующий документ помещается в ячейку под курсором, атрибут ''aCur'', а так-же в ''doc'', если значение курсора архива ''aCur'' и курсора визуализируемого документа ''vCur'' совпадают. Атрибуты архивных курсоров предусматривают несколько командных значений: * "aCur < 0" — перемещает курсор архиватора на следующую позицию, тем самым оставляя предыдущий документ в архиве и очищая документ под курсором, если кольцевой архив замкнулся. * "vCur == -1" — выбор следующего документа для отображения, выбранный документ копируется в атрибут ''doc''. * "vCur == -2" — выбор предыдущего документа для отображений, выбранный документ копируется в атрибут ''doc''. Как было указано выше, динамика шаблона документа определяется вставками исполняемых инструкций вида "'''<?dp {procedure} ?>'''". В процедурах могут использоваться одноимённые атрибуты виджета и функции пользовательского интерфейса программирования OpenSCADA. Кроме атрибутов виджета, зарезервированы специальные атрибуты, смотри таблицу. '''Таблица.''' Специальные и зарезервированные элементы шаблона. {| class="wikitable" |- ! Имя !! Назначение |- | colspan="2" | ''Атрибуты'' |- | rez || Атрибут результата исполнения процедуры, содержимое которого помещается в дерево документа. |- | lTime || Время последнего формирования. Если документ формируется впервые то ''lTime'' равен ''bTime''. |- | rTime || Содержит время перебираемых значений, секунды, определяется внутри тегов с атрибутом "docRept". |- | rTimeU || Содержит время перебираемых значений, микросекунды, определяется внутри тегов с атрибутом "docRept". |- | rPer || Содержит период перебора значений, атрибут "docRept". |- | mTime, mTimeU, mLev, mCat, mVal || Определяются внутри тегов с атрибутом "docAMess" при разборе сообщений архива сообщений: :''mTime'' — время сообщения, секунды; :''mTimeU'' — время сообщения, микросекунды; :''mLev'' — уровень сообщения; :''mCat'' — категория сообщения; :''mVal'' — значение сообщения. |- | colspan="2" | ''Специальные теги'' |- | colspan="2" | ''Специальные атрибуты стандартных тегов'' |- | body.docProcLang || Язык исполняемых процедур документа, по умолчанию это "JavaLikeCalc.JavaScript". |- | *.docRept="1s" || Тег с указанным атрибутом размножается, при формировании, путём смещения времени в атрибуте "rTime" на значение, указанное в данном атрибуте. |- | *.docAMess="1:PLC*" || Указывает на необходимость размножения тега с атрибутом, сообщениями из архива сообщений за указанный интервал времени, согласно уровня "1" и шаблона запроса "PLC*", по категории сообщения. В шаблоне запроса могут указываться [[wikipedia:Regular_expression|регулярные выражения]] в виде "'''/{re}/'''". Для данного тега, в процессе размножения, определяются атрибуты: "mTime", "mTimeU", "mLev", "mCat" и "mVal". |- | *.docAMessArchs="ArchMod0.Archivator0[;ArchModN.ArchivatorN]" || Дополняет атрибут "*.docAMess" перечнем архиваторов для чтения сообщений. |- | *.docRevers="1" || Указывает на инвертирование порядка размножения — последний сверху. |- | *.docAppend="1" || Признак необходимости добавления результата выполнения процедуры в тег процедуры. Иначе результат исполнения заменяет содержимое тега. |- | body.docTime || Время формирования документа, используется для установки атрибута ''lTime'' при следующем формировании документа. Не устанавливается пользователем! |- | table.export="1" || Включение возможности экспорта содержимого указанной таблицы в CSV-файл и другие табличные форматы. |} ==== {{Anch|Box|Контейнер (Box)}} ==== Примитив контейнера, используется для формирования составных виджетов и/или страниц пользовательского интерфейса. '''Таблица.''' Набор дополнительных свойств/атрибутов примитива "Контейнер (Box)" {| class="wikitable" |- ! Идентификатор !! Имя !! Номер !! Значение |- | pgOpenSrc || Страница: источник открытия || 3 || Полный адрес страницы, которая включена внутрь данного контейнера. |- | pgGrp || Страница: группа || 4 || Группа контейнера включаемых страниц. Только страницы в такой группе будут включаться в этот бокс как контейнер. |- | backColor || Фон: цвет || 20 || Фоновый цвет. Имя цвета в виде "'''{color}[-{alpha}]'''", где: * "color" — стандартное имя цвета или его числовое представление из трёх шестнадцатеричных чисел отдельных цветов "#RRGGBB"; * "alpha" — уровень альфа-канала [0...255], где 0 — полностью прозрачный.<br/> Примеры: * "red" — сплошной красный цвет; * "#FF0000" — сплошной красный цвет в цифровом коде; * "red-127" — полупрозрачный красный цвет. |- | backImg || Фон: изображение || 21 || Фоновое изображение. Имя изображения в виде "'''[{src}:]{name}'''", где: * "src" — источник изображения: ** ''file'' — прямо из локального файла по пути; ** ''res'' — из таблицы ресурсов БД. * "name" — путь файла или идентификатор ресурса.<br/> Примеры: * "res:backLogo" — из таблицы ресурсов БД для идентификатора "backLogo"; * "backLogo" — как и предыдущий; * "file:/var/tmp/backLogo.png" — из локального файла по пути "/var/tmp/backLogo.png". |- | bordWidth || Граница: ширина || 22 || Ширина бордюра. |- | bordColor || Граница: цвет || 23 || Цвет бордюра (детальнее в атрибуте 20). |- | bordStyle || Граница: стиль || 24 || Стиль бордюра: "Нет", "Точечный", "Пунктирный", "Сплошной", "Двойной", "Канавка", "Кромка", "Вдавлен", "Выступающий". |} <section end=Primitives /> === {{Anch|DB|Использование БД для хранения библиотек виджетов и проектов}} === <section begin=DB /> Хранение данных виджетов, библиотек виджетов и проектов реализовано в БД, доступных 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"). [[file:at.png]] '''{DB_TBL}''' сейчас формируется в виде "'''wlb_{ID}'''" для библиотек и "'''prj_{ID}'''" для проектов, а отдельное поле ''DB_TBL'' таблиц "Libs", "Projs" застарело и будет удалено в випуске OpenSCADA 1.0! Проекции (структуры) основных таблиц таковы: * '''Libs(<u>ID</u>, NAME, DSCR, DB_TBL, ICO)''' — библиотеки виджетов ''ID''. ::''ID'' — идентификатор; ::''NAME'' — имя; ::''DSCR'' — описание; ::''DB_TBL'' (УСТАРЕЛО) — корень таблиц БД с виджетами; ::''ICO'' — закодированное (Base64) изображение иконки библиотеки. * '''LibWigets(<u>ID</u>, ICO, PARENT, PROC, PROC_PER, ATTRS, TIMESTAMP)''' — виджеты ''ID'' библиотеки. ::''ID'' — идентификатор; ::''ICO'' — закодированное (Base64) изображение иконки виджета; ::''PARENT'' — адрес виджета основы, в виде ''/wlb_originals/wdg_Box''; ::''PROC'' — внутренняя процедура и язык процедуры виджета; ::''PROC_PER'' — период вычисления процедуры виджета; ::''ATTRS'' — перечень атрибутов виджета, модифицированных пользователем; ::''TIMESTAMP'' — метка времени последней модификации. * '''LibWidgetIO(<u>IDW</u>, <u>ID</u>, <u>IDC</u>, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL)''' — рабочие атрибуты ''ID'' виджета ''IDW'' дочернего виджета ''IDC''. ::''IDW'' — идентификатор виджета; ::''ID'' — идентификатор атрибута; ::''IDC'' — идентификатор дочернего виджета; ::''IO_VAL'' — значение атрибута; ::''SELF_FLG'' — внутренние флаги атрибутов; ::''CFG_TMPL'' — шаблон элемента конфигурации, основанного на данном атрибуте; ::''CFG_VAL'' — значение элемента конфигурации (ссылка, константа ...). * '''LibWidgetUserIO(<u>IDW</u>, <u>ID</u>, <u>IDC</u>, 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(<u>IDW</u>, <u>ID</u>, PARENT, ATTRS)''' — включенные в контейнер ''IDW'' виджеты ''ID''. ::''IDW'' — идентификатор виджета; ::''ID'' — идентификатор экземпляра вложенного виджета; ::''PARENT'' — адрес виджета основы, в виде ''/wlb_originals/wdg_Box''; ::''ATTRS'' — перечень атрибутов виджета, модифицированных пользователем. * '''LibWidgetMime(<u>ID</u>, MIME, DATA)''' — audio, video, media и другие ресурсы виджетов ''ID'' библиотеки. ::''ID'' — идентификатор ресурса; ::''MIME'' — MIME ресурса, в формате — "'''{MIME};{Size}'''"; ::''DATA'' — данные ресурса, кодированные Base64. * '''Projs(<u>ID</u>, 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(<u>OWNER</u>, <u>ID</u>, 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(<u>IDW</u>, <u>ID</u>, <u>IDC</u>, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL)''' — рабочие атрибуты страниц, структура фактически совпадает с таблицей "LibWidgetIO". * '''ProjPageUserIO(<u>IDW</u>, <u>ID</u>, <u>IDC</u>, NAME, IO_TP, IO_VAL, SELF_FLG, CFG_TMPL, CFG_VAL)''' — пользовательские атрибуты страниц, структура фактически совпадает с таблицей "LibWidgetUserIO". * '''ProjPageWIncl(<u>IDW</u>, <u>ID</u>, PARENT, ATTRS)''' — виджеты, включенные на страницы, структура фактически совпадает с таблицей "LibWidgetIncl". * '''ProjMime(<u>ID</u>, MIME, DATA)''' — audio, video, media и другие ресурсы страниц проектов, структура фактически совпадает с таблицей "LibWidgetMime". * '''PrjStls(<u>SID</u>, <u>ID</u>, VAL)''' — значение ''VAL'' поля ''ID'' стиля ''IDS'' проекта. ::''IDS'' — идентификатор стиля; ::''ID'' — идентификатор поля стиля; ::''VAL'' — значение поля стиля. * '''PrjStl(<u>ID</u>, 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(<u>IDW</u>, <u>ID</u>, IO_VAL)''' — таблица проекта ''IDW'' для хранения данных сеансов, исполняющих проект. ::''IDW'' — полный путь элемента проекта; ::''ID'' — атрибут элемента; ::''IO_VAL'' — значение атрибута. <section end=DB /> === {{Anch|UserAPI|API of the user programming}} === <section begin=UserAPI /> API of the user programming of the visualization engine are represented directly by the OpenSCADA objects, which form the user interface, that is by the "Session" and "Widgets-pages". For the user, these objects provide a set of control functions: <section begin=API /> [[File:Oscada UserOM VCAEngine.png|right|User object model of the module VCAEngine.]] '''Object "Session" ( this.ownerSess() )''' * ''string user( )'' — current session user. * ''int alrmQuietance( int quit_tmpl, string wpath = "", bool ret = false )'' — quiets of the violations ''wpath'' with the template ''quit_tmpl''. If ''wpath'' is empty string then the global quietance makes. In the string ''wpath'', by symbol ';', can be enumerated addresses of several widgets. When set the ''ret'', the quietance return is performed. * ''int reqTm( )'' — last request time in seconds from the epoch of 1/1/1970. * ''string reqUser( )'' — last request user. * ''string reqLang( )'' — last request language. * ''int userActTm( )'' — last user action time in seconds from the epoch of 1/1/1970. * ''bool uiCmd( string cmd, string prm, string src )'' — sends a UI command of the pages managing, that is: "open", "next", "prev"; for more details see in [[#Events|the events section]]. This function must be in the priority of using to the pages managing before the direct writing to the page attributes "pgOpen" and "pgOpenSrc" due it is single method of the correct work with [[#Project|the linked pages]]. * ''int period( bool isReal = false )'' — getting the session processing period, ''isReal'' for the real one. '''Object "Widget" (this)''' * ''TCntrNodeObj ownerSess( )'' — session object for the current widget. * ''TCntrNodeObj ownerPage( )'' — parent page object for the current widget. * ''TCntrNodeObj ownerWdg( bool base = false )'' — parent widget object for the current widget. If set ''base'' then returns the parent page objects also. * ''TCntrNodeObj wdgAdd( string wid, string wname, string parent )'' — adds the new widget ''wid'' with the name ''wname'' and based on the library widget ''parent''. <syntaxhighlight lang="JavaScript" style="margin-left: 15px"> //Adds the new widget, based at the text primitive nw = this.wdgAdd("nw", "New widget", "/wlb_originals/wdg_Text"); nw.attrSet("geomX", 50).attrSet("geomY", 50); </syntaxhighlight> * ''bool wdgDel( string wid )'' — deletes the widget ''wid''. * ''TCntrNodeObj wdgAt( string wid, bool byPath = false )'' — attaches to child or global widget, by the path ''byPath''. In the case of global connection, you can use absolute or relative path to the widget. For starting point of the absolute address acts the root object of the module "VCAEngine", which means the first element of the absolute address is session identifier, which is ignored. The relative address takes the countdown from the current widget. Special element of the relative address is an element of parent node "..". * ''Array attrList()'' — list of the widget attributes. * ''bool attrPresent( string attr )'' — checks to presence fact of the attribute ''attr'' of the widget. * ''ElTp attr( string attr, bool fromSess = false )'' — value of the attribute ''attr'' of the widget or from the session ''fromSess''. For missing attributes will be return empty string. * ''TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false )'' — sets the value ''vl'' to the attribute ''attr'' of the widget or to the session, by ''toSess''. The object is returned for the function concatenation. * ''string link( string attr, bool prm = false )'' — link for the widget attribute ''attr''. At set ''prm'' requests the link for the attributes block (parameter), represented by the attribute. * ''string linkSet( string attr, string vl, bool prm = false )'' — sets the link for the widget attribute ''attr''. At set ''prm'', sets the link for the attributes block (parameter), represented by the attribute. <syntaxhighlight lang="JavaScript" style="margin-left: 15px"> //Sets the link to the parameter for the eight trend this.linkSet("el8.name", "prm:/LogicLev/experiment/Pi", true); </syntaxhighlight> * ''string {resource,mime}( string addr, string MIME = "" )'' — resource object by the address ''addr'' (the direct link to the resource or the widget attribute contained the link) with the ''MIME'', from the session table or the source. It is designed for the resource objects edition and that substitution to this session's context, for example, images SVG. * ''int {resourceSet,mimeSet}( string addr, string data, string MIME = "" )'' — sets the resource object to ''data'' with ''MIME'' by the address ''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 );'' — formats of the program message ''mess'' with the category — the widget path. * ''int calcPer( int set = EVAL )'' — the actual calculation-processing period getting and setting at ''set'' not EVAL. There reserved the special values: ** '''0''' — if you want the session period processing; ** '''-1''' — if you want to use the parent widget/page/project processing period in the cascade; ** '''-2''' — for disable the periodic processing in whole; ** '''-3''' — no session time period, getting the projecting one. '''Объект "Виджет", примитива "Документ" (this)''' * ''string getArhDoc( int nDoc)'' — текст документа архива на глубине ''nDoc'' (0-{aSize-1}). <section end=API /> Устаревшее, но поддерживаемое, API представляется группой функций непосредственно в модуле движка СВУ. Вызов этих функций из процедуры виджета может осуществляться прямо по идентификатору, поскольку их область имён определяется в контексте процедур виджетов. '''Список виджетов (WdgList)'''<br/> ''Описание:'' Возвращает список виджетов, в контейнере виджетов, или дочерних виджетов. Если установлено ''pg'', то возвращается список страниц проектов и сеанса.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | list || Список || Строка || Возврат || |- | addr || Адрес || Строка || Вход || |- | pg || Страницы || Логический || Вход || 0 |} '''Присутствие узла (NodePresent)'''<br/> ''Описание:'' Проверка узла на присутствие, включая виджеты, атрибуты и другие.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | rez || Результат || Логический || Возврат || |- | addr || Адрес || Строка || Вход || |} '''Список атрибутов (AttrList)'''<br/> ''Описание:'' Возвращает список атрибутов виджета. Если установлен ''noUser'' тогда возвращаются только не пользовательские атрибуты.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | list || Список || Строка || Возврат || |- | addr || Адрес || Строка || Вход || |- | noUser || Без пользовательских || Логический || Вход || 1 |} '''Получить атрибут (AttrGet)'''<br/> ''Описание:'' Запрос значения атрибута виджета. Запрос может осуществляться как указанием полного адреса атрибута в ''addr'', так и: отдельно адрес виджета в ''addr'' и идентификатор атрибута в ''attr''.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | val || Значение || Строка || Возврат || |- | addr || Адрес || Строка || Вход || |- | attr || Атрибут || Логический || Вход || |} '''Установить атрибут (AttrSet)'''<br/> ''Описание:'' Установка значения атрибута виджета. Установка может осуществляться как указанием полного адреса атрибута в ''addr'', так и: отдельно адрес виджета в ''addr'' и идентификатор атрибута в ''attr''.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | addr || Адрес || Строка || Вход || |- | val || Значение || Строка || Вход || |- | attr || Атрибут || Логический || Вход || |} '''Пользователь сеанса (SesUser)'''<br/> ''Описание:'' Возвращает пользователя сеанса по пути к виджету сеанса.<br/> ''Параметры:'' {| class="wikitable" |- ! Идентификатор !! Имя !! Тип !! Режим !! По умолчанию |- | user || Пользователь || Строка || Возврат || |- | addr || Адрес || Строка || Вход || |} <section end=UserAPI /> === Service commands-functions of the Control Interface === <section begin=CntrServComs /> Service functions are an interface for accessing OpenSCADA from external systems through the [[Special:MyLanguage/Documents/API#CntrNode|Control Interface]]. This mechanism is the basis of all exchange within OpenSCADA, implemented through weak links and [[Special:MyLanguage/Modules/SelfSystem|OpenSCADA's own exchange protocol]]. {{CntHdr|The common widgets}} :{{CntHdr|Getting for values of specified or all visual attributes of the widget}} :REQ: ''<get path="/UI/VCAEngine/'''{wAddr}'''/%2fserv%2fattr">'''{attributes}'''</get>'' :* ''wAddr'' — the widget local address, like to "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1"; :* ''attributes'' — the only requested attributes in the tags "el" with only one attribute of the identifier "id"; there can be no the attribute tags for requesting all available ones. :RESP: ''<get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattr" rez="'''0'''">'''{attributes}'''</get>'' :* ''attributes'' — processed attributes in the tags "el": ''<el id="'''{ID}'''" p="'''{pos}'''" act="'''{active}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''pos'' — position-index of the attribute for the standard ones; :** ''active'' — activity state of the attribute, only at the direct requesting; :** ''value'' — value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Setting for group values of the specified widget attributes}} :REQ['''root-UI''']: ''<set path="/UI/VCAEngine/'''{wAddr}'''/%2fserv%2fattr">'''{attributes}'''</set>'' :* ''wAddr'' — the widget local address in the module, like to "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1"; :* ''attributes'' — attributes with values in the tags "el": ''<el id="'''{ID}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''value'' — setting value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <set path="/UI/VCAEngine/wlb_AGLKS/wdg_CM101/wdg_ElFigure1/%2fserv%2fattr"> <el id="name">New name</el> <el id="dscr">New description</el> </set> </syntaxhighlight> :{{CntHdr|Getting for values of the visual attributes of the widget branch, optimised for the networks}} :REQ: ''<get path="/UI/VCAEngine/'''{wAddr}'''/%2fserv%2fattrBr" />'' :* ''wAddr'' — the widget local address in the module, like to "/wlb_AGLKS/wdg_CM101/wdg_ElFigure1". :RESP: ''<get path="/UI/VCAEngine/{wAddr}/%2fserv%2fattrBr" rez="'''0'''">'''{attributes}''' '''{widgets}'''</get>'' :* ''attributes'' — processed attributes in the tags "el": ''<el id="'''{ID}'''" p="'''{pos}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''pos'' — position-index of the attribute for the standard ones; :** ''value'' — value of the attribute. :* ''widgets'' — child widgets in the tags "w": ''<w id="'''{ID}'''" lnkPath="'''{lnkPath}'''">'''{attributes}''' '''{widgets}'''</w>'' :** ''ID'' — identifier of the widget; :** ''lnkPath'' — path to the linked widget for child widgets of the widget libraries. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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">CM101</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> </syntaxhighlight> {{CntHdr|The widget libraries}} :{{CntHdr|Obtaining the widget libraries' tree, optimised for the networks}} :REQ: ''<get path="/UI/VCAEngine/%2fserv%2fwlbBr" item="'''{item}'''" disIconsW="'''{disIconsW}'''" disIconsCW="'''{disIconsCW}'''" />'' :* ''item'' — the library item for obtaining, as the path "wlb_'''{WLib}'''[/wdg_'''{Wdg}'''[/wdg_'''{ChildWdg}''']]", for empty there will be obtained all the tree; :* ''disIconsW'' — disable for obtaining the icon data of the widgets [0|1]; :* ''disIconsCW'' — disable for obtaining the icon data of the child widgets [0|1]. :RESP: ''<get path="/UI/VCAEngine/%2fserv%2fwlbBr" item="{item}" disIconsW="{disIconsW}" disIconsCW="{disIconsCW}" rez="'''0'''">'''{wlibs}'''</get>'' :* ''wlibs'' — the widget libraries in the "wlb" tags: ''<wlb id="{ID}" doc="{doc}">{name} '''{icon}''' '''{widgets}'''</wlb>'' :** ''icon'' — the "icon" tag with the Base64 encoded data of the icon; :** ''widgets'' — the "w" tags with the library widgets description: ''<w id="{ID}" doc="{doc}" parent="'''{parent}'''">{name} {icon} '''{widgets}'''</w>'' :*** ''parent'' — address of the widget parent; :*** ''widgets'' — the "сw" tags with the child widgets description: ''<cw id="{ID}" doc="{doc}">{name} {icon}</cw>'' <syntaxhighlight lang="XML" style="margin-left: 20pt"> <get disIconsCW="1" disIconsW="1" item="/wlb_AGLKS" path="/UI/VCAEngine/%2fserv%2fwlbBr" rez="0" user="roman"> <wlb id="AGLKS">AGLKS <ico>iVBORw0KGgoAA...U5ErkJggg==</ico> <w id="CM101" parent="/wlb_originals/wdg_Box">CM101 <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">Ball crane</cw> <cw id="BC2">Ball crane</cw> <cw id="BC21">Ball crane</cw> <cw id="BC22">Ball crane</cw> </w> <w id="comprEn" parent="/wlb_originals/wdg_ElFigure">Compressor run</w> </wlb> </get> </syntaxhighlight> {{CntHdr|The VCA projects}} :{{CntHdr|Obtaining the project list expanded by some options}} :REQ: ''<get path="/UI/VCAEngine/[%2fbr%2fprj_|%2fprm%2fcfg%2fprj]" chkUserPerm="'''{chkUserPerm}'''" getChPgN="'''{getChPgN}'''" noName="'''{noName}'''" />'' :* ''chkUserPerm'' — checking for the user permition before listing [0|1]; :* ''getChPgN'' — requesting for quantity of the child pages in the projects [0|1]; :* ''noName'' — do not return for names of the pages [0|1]. :RESP: ''<get path="/UI/VCAEngine/[%2fbr%2fprj_|%2fprm%2fcfg%2fprj]" chkUserPerm="{chkUserPerm}" getChPgN="{getChPgN}" noName="{noName}" rez="'''0'''">'''{projects}'''</get>'' :* ''projects'' — projects list in the tags "el", where the name is in the tag text and the identifier in the attribute "id". Expanded by the extra attributes: :** "chPgN" — quantity of the child pages in the project at setting "getChPgN". <syntaxhighlight lang="XML" style="margin-left: 20pt"> <get getChPgN="1" path="/UI/VCAEngine/%2fbr%2fprj_" rez="0" user="roman"> <el chPgN="2" id="AGLKS">AGLKS</el> <el chPgN="2" id="archBrowser">Archives browser</el> <el chPgN="2" id="tmplSO">Signal groups (template)</el> </get> </syntaxhighlight> :{{CntHdr|Checking for read access to the project from the user of the request}} :REQ: ''<read path="/UI/VCAEngine/prj_'''{proj}'''/%2fserv%2faccess" />'' :* ''proj'' — identifier of the project. :RESP: ''<read path="/UI/VCAEngine/prj_{proj}/%2fserv%2faccess" rez="'''0'''">'''{access}'''</get>'' :* ''access'' — the access presence status [0|1]. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <read path="/UI/VCAEngine/prj_AGLKS/%2fserv%2faccess" rez="0" user="roman">1</read> </syntaxhighlight> {{CntHdr|The project sessions}} :{{CntHdr|Obtaining the session list expanded by some options}} :REQ: ''<get path="/UI/VCAEngine/[%2fbr%2fses_|%2fses%2fses]" chkUserPerm="'''{chkUserPerm}'''" onlyMy="'''{onlyMy}'''" />'' :* ''chkUserPerm'' — checking for the user permition before listing [0|1]; :* ''onlyMy'' — listening only my own sessions [0|1]. :RESP: ''<get path="/UI/VCAEngine/[%2fbr%2fses_|%2fses%2fses]" chkUserPerm="{chkUserPerm}" onlyMy="{onlyMy}" rez="'''0'''">'''{sessions}'''</get>'' :* ''sessions'' — sessions list in the tags "el", where the identifier is in the tag text. Expanded by the extra attributes: :** "user" — user of the session; :** "proj" — project of the session. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Obtaining the sessions list of the specified VCA project}} :REQ: ''<list path="/UI/VCAEngine/%2fserv%2fsess" prj="'''{project}'''" />'' :* ''project'' — identifier of the requested project. :RESP: ''<list path="/UI/VCAEngine/%2fserv%2fsess" prj="{project}" rez="'''0'''">'''{sessions}'''</list>'' :* ''sessions'' — sessions in the "el" tags. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <list path="/UI/VCAEngine/%2fserv%2fsess" prj="AGLKS" rez="0" user="roman"> <el>AGLKS</el> </list> </syntaxhighlight> :{{CntHdr|Connection to the specified VCA project or the project session}} :REQ: ''<connect path="/UI/VCAEngine/%2fserv%2fsess" prj="'''{project}'''" sess="'''{session}'''" userChange="'''{userChange}'''" onlyMy="'''{onlyMy}'''" />'' :* ''project'' — identifier of the requested project, empty for connection to the available session; :* ''session'' — identifier of the already present session, empty at a new session creation; :* ''onlyMy'' — sign of connection-reconnection to the session only when it is my; :* ''userChange'' — sign of the user changing [0|1] of the session, that is updation the user information. :RESP: ''<connect path="/UI/VCAEngine/%2fserv%2fsess" prj="'''{project}'''" sess="'''{session}'''" userChange="{userChange}" onlyMy="{onlyMy}" rez="'''0'''" conId="'''{conId}'''" userIsRoot="'''{userIsRoot}'''" />'' :* ''conId'' — the session connection identifier, used in next requests; :* ''project'' — the project identifier of the successfully connected session; :* ''session'' — identifier of the new created session of the successfully connected project; :* ''userIsRoot'' — the user has the root permition [0|1]. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <connect conId="50860885" path="/UI/VCAEngine/%2fserv%2fsess" prj="AGLKS" rez="0" sess="AGLKS" user="roman" userIsRoot="1" /> </syntaxhighlight> :{{CntHdr|Disconnection the specified VCA project session}} :Sessions with zero connections are closed here also.<br/> :REQ: ''<disconnect path="/UI/VCAEngine/%2fserv%2fsess" sess="'''{session}'''" conId="'''{conId}'''" />'' :* ''session'' — identifier of the present session; :* ''conId'' — the session connection identifier. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <disconnect path="/UI/VCAEngine/%2fserv%2fsess" sess="AGLKS" conId="50860885" /> </syntaxhighlight> :{{CntHdr|Getting for the opened pages list of the project session}} :REQ['''{owner}-{grp}''']: ''<openlist path="/UI/VCAEngine/ses_'''{session}'''/%2fserv%2fpg" conId="'''{conId}'''" tm="'''{clock}'''" />'' :* ''owner'', ''grp'' — reading access for the project owner or a user in group and regarding to the project permissions; :* ''session'' — identifier of the session; :* ''conId'' — the session connection identifier; :* ''clock'' — the internal clock (the live cycle) value from the previous processed request, for checking of the changed ones. :RESP: ''<openlist path="/UI/VCAEngine/ses_{session}/%2fserv%2fpg" conId="{conId}" tm="'''{clock}'''" rez="'''0'''">'''{pages}'''</openlist>'' :* ''clock'' — the internal clock (the live cycle) value - 1 at the request time; :* ''pages'' — pages in the tags "pg": ''<pg pgGrp="'''{pgGrp}'''" updWdg="'''{nUpdWdgs}'''">'''{ID}'''</pg>'' :** ''ID'' — identifier of the page; :** ''pgGrp'' — the pages group for early calculation the page including; :** ''nUpdWdgs'' — quantity of the updated widgets after the last request and for not empty "clock". <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Opening or closing for the specified page of the project session}} :REQ['''{owner}-{grp}''']: ''<[open|close] path="/UI/VCAEngine/ses_'''{session}'''/%2fserv%2fpg" pg="'''{page}'''" />'' :* ''owner'', ''grp'' — writing access for the project owner or a user in group and regarding to the project permissions; :* ''session'' — identifier of the session; :* ''page'' — address of the page in the session context, like to "/ses_AGLKS/pg_so/pg_1/pg_mn/pg_1". :{{CntHdr|Getting for the alarm status and the notification resource of the project session}} :REQ['''{owner}-{grp}''']: ''<get path="/UI/VCAEngine/ses_'''{session}'''/%2fserv%2falarm" mode="'''{mode}'''" tp="'''{typeNtf}'''" wdg="'''{widget}'''" />'' :* ''owner'', ''grp'' — reading access for the project owner or a user in group and regarding to the project permissions; :* ''session'' — identifier of the session; :* ''mode'' — the requesting mode, only "resource" for obtaining the notification resources and empty for the status only; :* ''typeNtf'' — the notification type of obtaining the notification resource, see the [[#Alarms|alarming section]]; :* ''widget'' — address of the widget for forming the notification resource, empty for global. :RESP: ''<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'' — the alarm status as that described in the [[#Alarms|alarming section]]; :* ''clock'' — the internal clock (the live cycle) value at the notification resource form; :* ''widget'' — address of the source widget at the notification resource form; :* ''message'' — message of notification from the text; :* ''language'' — language of the notification, for the "message" mostly; :* ''resTp'' — type of the notification resource; :* ''resource'' — resource of the notification encoded by Base64 for the binary data. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Quietance of the alarm notification of the project session}} :REQ['''{owner}-{grp}''']: ''<quietance path="/UI/VCAEngine/ses_'''{session}'''/%2fserv%2falarm" wdg="'''{widget}'''" tmpl="'''{template}'''" ret="'''{return}'''" />'' :* ''owner'', ''grp'' — reading access for the project owner or a user in group and regarding to the project permissions; :* ''session'' — identifier of the session; :* ''widget'' — address of the widget for quietance the notification, empty for global; :* ''template'' — template of the quietance, that is bitset corresponding to the quieting notification types; :* ''return'' — sign of the notification return, that is the quietance disabling. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <quietance path="/UI/VCAEngine/ses_AGLKS/%2fserv%2falarm" tmpl="7" /> </syntaxhighlight> :{{CntHdr|Getting for values of the modified visual attributes of the session widget}} :Redefines the common service request of the widgets "''<get path='/UI/VCAEngine/{wAddr}/%2fserv%2fattr' />''" for the session specific.<br/> :REQ: ''<get path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattr" tm="'''{clock}'''" />'' :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''clock'' — the internal clock (the live cycle) value from the previous processed request, for checking of the changed ones; at zero value there force appended the service-virtual attributes: "perm", "name". :RESP: ''<get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattr" tm="{clock}" rez="'''0'''">'''{attributes}'''</get>'' :* ''attributes'' — modified from "clock" attributes in the tags "el": ''<el id="'''{ID}'''" p="'''{pos}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''pos'' — position-index of the attribute for the standard ones; :** ''value'' — value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Setting for group values of the specified attributes of the session widget}} :Redefines the common service request of the widgets "''<set path='/UI/VCAEngine/{wAddr}/%2fserv%2fattr' />''" for the session specific like to the "event" attribute processing and detection the user activity-inactivity.<br/> :REQ['''{owner}-{grp}''']: ''<set path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattr" noUser="'''{noUser}'''">'''{attributes}'''</set>'' :* ''owner'', ''grp'' — writing access for the project owner or a user in group and regarding to the project permissions; :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''noUser'' — don't mark that as a user activity; :* ''attributes'' — attributes with values in the tags "el": ''<el id="'''{ID}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''value'' — setting value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <set path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1/%2fserv%2fattr"> <el id="name">New name</el> <el id="dscr">New description</el> </set> </syntaxhighlight> :{{CntHdr|Activating the attribute for using as the visual one and creating that at missing}} :REQ: ''<activate path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattr%2f'''{aID}'''" aNm="'''{aName}'''" aTp="'''{aType}'''" aFlg="'''{aFlags}'''" aVls="'''{aValues}'''" aNms="'''{aNames}'''">'''{aDef}'''</activate>'' :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''aID'' — identifier of the attribute; :* ''aName'' — name of the attribute at it creation; :* ''aType'' — type of the attribute at it creation, see to the [[Special:MyLanguage/Documents/API#TFld|object TFld]]; :* ''aFlags'' — flags of the attribute at it creation, see to the [[Special:MyLanguage/Documents/API#TFld|object TFld]]; :* ''aDef'' — default value of the attribute at it creation; :* ''aValues'' — the attribute values for the selective types at it creation; :* ''aNames'' — names to values of the attribute for the selective types at it creation. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <activate path="/UI/VCAEngine/ses_AGLKS/pg_so/%2fserv%2fattr%2frunWin" aNm="Run window" aTp="1" aFlg="1" aVls="0;1;2" aNms="Original size;Maximize;Full screen">0</activate> </syntaxhighlight> :{{CntHdr|Getting for values of the visual attributes of the widget branch of the session, optimised for the networks}} :Redefines the common service request of the widgets "''<get path='/UI/VCAEngine/{wAddr}/%2fserv%2fattrBr' />''" for the session specific.<br/> :REQ: ''<get path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattrBr" tm="'''{clock}'''" FullTree="'''{FullTree}'''" />'' :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''clock'' — the internal clock (the live cycle) value from the previous processed request, for checking of the changed ones; at zero value there force appended the service-virtual attributes: "perm", "name"; :* ''fullTree'' — obtaining the full widgets tree independent from presence the changes, without the attributes. :RESP: ''<get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrBr" tm="{clock}" FullTree="{FullTree}" rez="'''0'''">'''{attributes}''' '''{widgets}'''</get>'' :* ''attributes'' — processed attributes in the tags "el": ''<el id="'''{ID}'''" p="'''{pos}'''">'''{value}'''</el>'' :** ''ID'' — identifier of the attribute; :** ''pos'' — position-index of the attribute for the standard ones; :** ''value'' — value of the attribute. :* ''widgets'' — child widgets in the tags "w": ''<w id="'''{ID}'''">'''{attributes}''' '''{widgets}'''</w>'' :** ''ID'' — identifier of the widget. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <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> </syntaxhighlight> :{{CntHdr|Getting for value of the session specific attribute of the session widget}} :REQ: ''<get path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattrSess%2f'''{aID}'''" />'' :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''aID'' — identifier of the session specific attribute. :RESP: ''<get path="/UI/VCAEngine/ses_{wAddr}/%2fserv%2fattrSess%2f{aID}" rez="'''0'''">'''{value}'''</get>'' :* ''value'' — value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <get path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/%2fserv%2fattrSess%2ftestA" rez="0" user="roman">test val</get> </syntaxhighlight> :{{CntHdr|Setting for value of the session specific attribute of the session widget}} :REQ['''{owner}-{grp}''']: ''<set path="/UI/VCAEngine/ses_'''{wAddr}'''/%2fserv%2fattrSess%2f'''{aID}'''">'''{value}'''</get>'' :* ''owner'', ''grp'' — writing access for the project owner or a user in group and regarding to the project permissions; :* ''wAddr'' — the session widget local address, like to "/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/wdg_ElFigure1"; :* ''aID'' — identifier of the session specific attribute; :* ''value'' — value of the attribute. <syntaxhighlight lang="XML" style="margin-left: 20pt"> <set path="/UI/VCAEngine/ses_AGLKS/pg_so/pg_2/pg_mn/pg_CM101/%2fserv%2fattrSess%2ftestA">test val</set> </syntaxhighlight> <section end=CntrServComs /> === Копирование элементов === Для ускорения процесса разработки пользовательских интерфейсов визуализации и управления, нужно предусмотреть функцию копирования элементов. Чтобы заложить поддержку различных вариантов копирования запишем их по пунктам: * "Библиотека виджетов (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)" — копирование параметров виджета. === Предусмотренные функциональные возможности === <section begin=TargetFeatures /> Перечислим возможности, которые сможет и обеспечивает СВУ, построенная на основе данного проекта: * три уровня сложности в формировании интерфейса визуализации, позволяющие органично осваивать и применять инструментарий по принципу — от простого к сложному: :# формирование из шаблонных кадров, путём назначения динамики и без графической конфигурации; :# графическое формирование новых кадров, путём использования готовых элементов визуализации из библиотеки — мнемосхемы; :# формирование, в библиотеке, новых: кадров, шаблонных кадров и элементов отображения. * построение интерфейсов визуализации практически любой сложности (ограниченную "дискретностью" функций примитивов), начиная от простых интерфейсов мониторинга и, заканчивая полноценными иерархическими интерфейсами, используемыми в SCADA системах; * предоставление различных способов формирования и конфигурации пользовательского интерфейса, основанных на различных интерфейсах графического представления (Qt, Web, ...), или-же посредством стандартного интерфейса управления OpenSCADA; * построение и коррекция интерфейса, установка и смена динамики в процессе исполнения; * построение, на уровне пользователя, новых шаблонных кадров и формирование специализированных, под область применения, библиотек кадров (например, включение кадров параметров, графиков и других элементов с увязкой их друг с другом), согласно идее вторичного использования, накопления и совершенствования; * построение новых пользовательских элементов визуализации и формирование специализированных, под область применения, библиотек кадров, согласно идее вторичного использования, накопления и совершенствования; * описание логики новых шаблонных кадров и пользовательских элементов визуализации как простыми связями, так и лаконичным, полноценным языком пользовательского программирования; * возможность включение, в пользовательские элементы визуализации, функций (или кадров вычисления функций) объектной модели OpenSCADA, практически связывая представление с алгоритмом вычисления; например, визуализируя библиотеку моделей аппаратов ТП, для последующего визуального построения моделей ТП; * разделение данных пользовательских интерфейсов и интерфейсов представления этих данных, позволяющее строить интерфейс пользователя в одной среде, а исполнять во многих других (Qt, Web, ...); * возможность подключения к исполняющемуся интерфейсу для наблюдения и коррекции действий; например, при обучении операторов и контроля за его действиями в реальном времени; * визуальное построение различных схем с наложением логических связей и последующим централизованным исполнением в фоне — визуальное построение и исполнение математических моделей, логических схем, релейных схем и иного; * предоставление, в OpenSCADA, функций объектного API; может использоваться для управления свойствами интерфейса визуализации из пользовательских процедур; * построение серверов для: кадров, элементов визуализации и проектов интерфейсов визуализации; с возможностью обслуживания множественных клиентских соединений; * простая организация клиентских станций на различной основе (Qt, Web, ...), с подключением к центральному серверу; * полноценный механизм разделения полномочий между пользователями, позволяющий создавать и исполнять проекты с различными правами доступа к его компонентам; * гибкое формирование правил сигнализаций и уведомления, с учётом и поддержкой различных способов уведомления; * поддержка пользовательского формирования палитры и шрифтовых предпочтений интерфейса визуализации, в стилях; * поддержка пользовательского формирования карт событий под различное оборудование управления и пользовательские предпочтения; * поддержка профилей пользователей, позволяющая определять различные свойства интерфейса визуализации (цветовая гамма, шрифтовые особенности, предпочтительные карты событий); * гибкое хранение и распространение библиотек виджетов, кадров и проектов интерфейсов визуализации в БД, поддерживаемых OpenSCADA; практически, пользователю нужно только зарегистрировать полученную БД с данными. <section end=TargetFeatures /> == Проигрывание ситуаций по реализации их на основе концепции данного проекта == Цель проигрывания процесса построения различных интерфейсов визуализации на основе концепции данного проекта заключается в выявлении особенностей различных реализаций и узких мест в описании их концепцией. Выполнено в мыслях и без фиксации тут. == Реализация == Реализация производится поэтапно, в направлении от функций в концепции к её представлению на библиотеке Qt, и так до последнего компонента. Такой подход позволяет получать результат между этапами, анализировать его и учитывать особенности на следующих этапах. Для пошаговой реализации разобьем всю задачу на логические части и выстроим их в зависимости одна от другой, в реализации. === Виджеты и их библиотеки === Целями данного этапа является: * Реализация основы архитектуры "Модель данных" — "Представление" в лице модулей 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''. Рассмотрим результаты реализации данного этапа по пунктам: ==== Реализация основы архитектуры "Модель данных"-"Представление" ==== Согласно статической диаграммы классов (рис.4.11.1) и общими требованиями, для OpenSCADA были реализованы модули "UI.VCAEngine" и "UI.Vision", "UI.WebVision". Модуль "UI.VCAEngine" реализует модель данных СВУ и является источником для последующего представления этих данных различными механизмами визуализации. Модуль "UI.Vision" реализует способ представления данных, основанный на библиотеке Qt версии 4 и 5. Модуль "UI.WebVision" реализует способ представления данных, основанный на Web-технологиях. Связь между модулем модели данных и представления, первично, организована посредством прямых вызовов (сильные связи). Такой способ связи выбран для предварительного абстрагирования от особенностей взаимодействия и концентрации на основных задачах реализации. В последствии, выполнена унификация и построение этих связей посредством интерфейса управления OpenSCADA (слабые связи). В результате, достигнута возможность разнесения модели данных и представления с возможностью одновременного обслуживания различных механизмов представления одной моделью данных СВУ. Это, кроме всего, позволило оценить степень влияния типа связи на производительность СВУ. ==== Реализация базовых функций модели данных СВУ в модуле ''UI.VCAEngine'' ==== Модуль модели данных (движка) СВУ содержит контейнер библиотек виджетов-кадров. Модулем предоставляется предопределённая библиотека базовых виджетов — примитивов, с реализацией собственных свойств и логики обработки этих свойств. Хранение данных виджетов, библиотек виджетов и проектов реализовано в БД, доступных OpenSCADA. БД организована по принадлежности данных к библиотеке-проекту. Т.е. отдельная библиотека-проект хранится в отдельной группе таблиц БД, детальнее про актуальную структуру БД описано в разделе "[[#DB|Использование БД для хранения библиотек виджетов и проектов]]". Для управления библиотеками виджетов и отдельными виджетами были написаны сценарии конфигурации, на языке [[Special:MyLanguage/Documents/API#CntrNode|интерфейса управления OpenSCADA]]. Эти сценарии, в основном, призваны выполнять функцию централизованной конфигурации элементов движка СВУ, и, с целью организации "слабых связей" между "Моделью данных" и "Представлением", они расширены и наделены функцией обработки запросов к модели данных от модулей представления. Основой практически всех элементов движка стал объект абстрактного элемента визуализации ''VCA::Widget''. На своём абстрактном уровне объект наделён следующими свойствами: * "Использующего" наследования — механизм наследования отдельных свойств другого экземпляра объекта. Используется для организации механизма вторичного использования — переопределения и доопределения элементов визуализации. * Хранение свойств (атрибутов) виджетов с механизмами "использующего" наследования значений. Механизм "использующего" наследования выполняет наследования значений свойств с самого корневого элемента и до верхнего с возможностью переопределения значений на каждом из уровней. При этом, в БД хранятся только значения изменённых свойств. * Поддержка режима контейнера. В этом режиме виджет может включать другие(дочерние) виджеты, как библиотека виджетов содержит виджеты. Используется в библиотечных виджетах, которые наследуют свойства примитива-контейнера, например, примитив кадра "Box". Также, это свойство используется в сеансе проекта для построения иерархического дерева виджетов (примитивов) при формирование конечного образа визуализации кадров. * Поддержка режима простого связывания. Данный режим используется для вложенных виджетов библиотеки. Особенностью этого режима является то, что он не наследует свойства контейнера, а значит не может прямо содержать вложенные виджеты ([[#SessExec|раздел 4.5]]). * Содержит процедуру внутренней логики виджета на языке OpenSCADA. Логика этой процедуры может использоваться для организации взаимодействия вложенных виджетов и контейнера друг с другом, формируя требуемое поведение. * Предоставление доступа к ресурсам с учётом иерархии "использующего" наследования. Для представления библиотеки виджетов реализован класс ''VCA::WdgLib'', основными функциями которого является: содержание библиотечных виджетов, хранение и загрузка их с БД, предоставление доступа к ресурсам, а также контроль доступа. Специально для включения в библиотеку виджетов создан класс библиотечного виджета ''VCA::LWidget'', который основан на классе абстрактного виджета ''VCA::Widget'' и предоставляет дополнительные функции: хранение данных виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с данными библиотеки и хранение вложенного контейнерного виджета ''VCA::CWidget''. В свою очередь, класс контейнерного виджета ''VCA::CWidget'' предоставляет функции: хранение данных контейнерного виджета в таблицах библиотеки, переопределения доступа к ресурсам на таблицу с данными библиотеки, а также — принудительный режим простой ссылки для всех контейнерных виджетов. На основе класса библиотечного виджета ''VCA::LWidget'' сформирован абстрактный класс терминального виджета ''VCA::PrWidget''. А уже на его основе сформированы реализации примитивов базовых виджетов, которые и формируют библиотеку базовых виджетов, создаваемую модулем при инициализации. Значения свойств базовых виджетов, также, могут сохраняться в БД (таблицы библиотеки виджетов), формируя нужные шаблоны. Кроме того, базовая библиотека примитивов может доопределяться расширенными примитивами, из модулей интерфейсов представления, которым базовых недостаточно. Но, в этом случае, нужно учитывать, что подобные действие — это путь к несовместимости между модулями интерфейсов представления! ==== Реализация базовых функций среды разработки пользовательского интерфейса в модуле представления ''UI.Vision'' ==== Среда разработки пользовательских интерфейсов модуля основана на MDI (Multi Document Interface). Такой подход позволяет открывать на редактирование несколько кадров различных размеров. Использованы следующие механизмы управления разработкой: панели инструментов, пункты меню и контекстное меню. Большинство действий дублируются разными механизмами. Навигационные интерфейсы реализованы присоединяемыми окнами. Конфигурация панелей инструментов и присоединяемых окон сохраняется при выходе и восстанавливается при старте, что позволяет настраивать интерфейс под себя. Одним из элементом пользовательского интерфейса, реализованным как присоединяемое окно, является навигатор библиотек виджетов. С помощью навигатора можно быстро найти нужный виджет или библиотеку и проделать над ними необходимые операции. Реализованы операции: добавления, удаления, вызова настройки виджетов и библиотек, а также вызова визуального редактирования виджетов. Для удобного управления свойствами виджетов-кадров реализован инспектор атрибутов (свойств) виджетов. Инспектор атрибутов реализован как присоединяемое окно, которое активируется при выборе кадра или виджета. Окно инспектора атрибутов можно удобно расположить на виду, пришвартовав к одной из сторон рабочего окна. Инспектором атрибутов реализована поддержка групповой конфигурации нескольких виджетов c группировкой однотипных свойств. Реализовано визуальное редактирования виджетов и кадров на основе примитива "Box" — контейнерные виджеты, а также иных, неконтейнерных, вроде "Элементарной фигуры". В редакторе контейнерных кадров реализованы функции: * выделение виджета и группы виджетов на кадре; * перетаскивание выделенных виджетов по кадру; * изменение размеров выделенных виджетов на кадре; * редактирование свойств выделенных виджетов; * выравнивание и управление уровнями отображения выделенных виджетов. Вид окна разработки приведён на рисунке 6.1.1, где можно видеть: панели инструментов, навигатор виджетов, инспектор атрибутов, окно редактирования кадра и строка статуса. [[file:VCA_vision_win_ru.png|center|frame|Рис.6.1.1. Окно разработки модуля UI.Vision]] Для настройки объектов виджетов и их библиотек разработаны два диалога: диалог настройки виджета и диалог настройки библиотеки виджетов. Диалог настройки библиотеки (рис.6.1.2) позволяет установить основные свойства и поместить ресурсы в БД для последующего использования в виджетах библиотеки. Диалог настройки виджета (рис.6.1.3) позволяет установить: основные свойства виджета, индивидуально установить значения атрибутов и сконфигурировать внутреннюю процедуру вычислений виджета с дополнительными (пользовательскими) свойствами. [[file:VCA_vision_lwdg_dlg_ru.png|center|frame|Рис.6.1.2. Диалог настройки библиотеки виджетов.]] [[file:VCA_vision_wdg_dlg_ru.png|center|frame|Рис.6.1.3. Диалог настройки виджета.]] === Проекты интерфейсов визуализации === Целями данного этапа является: * Реализация проектов интерфейсов визуализации на уровне модели данных СВУ, в модуле ''UI.VCAEngine'': ** Разработка ссылочных механизмов кадра в составе: внутри-кадровых локальных ссылок, внешних ссылок на параметры подсистемы сбора данных OpenSCADA и действия интерфейса по событиям. ** Разработка дерева страниц проекта и их взаимосвязей. * Реализация проектов интерфейсов визуализации в модуле представления ''UI.Vision''(Qt): ** Формирование навигатора по проектам. ** Формирование диалога настройки страницы проекта; ** Реализация поддержки возможности непосредственного графического формирования страницы на уровне проекта. На данном этапе был добавлен механизм формирования проектов СВУ, посредством построения страниц визуализации в иерархическом виде, который соответствует логическим связям в конечном интерфейсе СВУ. В процессе реализации данного этапа были начаты работы по адаптации модуля визуализации "Vision" к использованию интерфейса управления OpenSCADA вместо прямых-сильных связей. Эти работы позволили достичь значительной унификации различных диалогов, структур управления и пользовательского интерфейса в целом. На данном этапе реализовано: * Ссылочный механизм. Только на параметры источников данных! Внутренние связи реализованы на последующих этапах. * Инспектор связей модуля "Vision", используя сценарии интерфейса управления OpenSCADA. * Механизм формирования дерева страниц, основанный на терминах: страница-шаблон и страница-контейнер. Данный механизм позволяет достаточно просто описать зависимости между страницами большинства известных типов пользовательского интерфейса с эффективной адресацией и ссылками на страницы как по отдельности, так и по шаблону. * Навигатор по дереву проекта как на языке сценариев интерфейса управления, так и в модуле "Vision", используя тот же сценарий интерфейса управления. * Диалог конфигурации проекта и страниц проекта. Фактически диалоги конфигурации элементов проекта и библиотеки совмещены, а также выполнен переход на слабые связи интерфейса управления OpenSCADA. * Благодаря унификации интерфейса доступа к элементам библиотеки и проекта, реализована возможность прямого формирования страниц на уровне проекта. === Сеансы исполнения проектов === Целями данного этапа является: * Реализация сеансов исполнения проектов на уровне модели данных СВУ в модуле ''UI.VCAEngine'': ** Формирование иерархического дерева виджетов конечной визуализации на основе проекта, для которого открывается сеанс. ** Формирование кадров значений для процедур обсчёта виджетов конечной визуализации. ** Обработка ссылок на параметры источников данных OpenSCADA. ** Реализация иерархического обсчёта процедур и обновления ссылок виджетов. ** Формирование механизма прохождения и обработки событий по иерархическому дереву. * Реализация визуализации сеансов проектов в модуле представления ''UI.Vision''(Qt), как полноценного пользовательского интерфейса с элементами визуализации динамики, истории и управления: ** Формирование окна исполнения проекта — "Исполнение". ** Визуализация кадров проекта в режиме "Исполнения" с периодическим обновлением содержимого. ** Реализация передачи и обработки событий. ** Реализация механизма переключения-открытия-замещения-навигации по страницам проекта, с учётом сценариев обработки. На данном этапе был добавлен механизм исполнения проекта в сеансах модели данных модуля ''VCAEngine'', а также визуализация сеанса проекта — режим "Исполнение", в модуле визуализации ''Vision'' на библиотеке Qt, с элементами обновления данных и интерактивного взаимодействия с пользователем. ==== Формирование иерархического дерева виджетов конечной визуализации на основе проекта для которого открывается сеанс ==== Согласно рисунку 4.11.1 и [[#SessExec|разделу 4.5]] объекты сеанса проекта наследуются от абстрактного объекта ''Widget'' и используют соответствующие объекты проекта. Так, сеанс ''Session'' использует проект ''Project'' и формирует развёрнутое дерево на основе него. Страница проекта ''Page'' прямо используется страницей сеанса ''SessPage''. Остальные объекты ''SessWdg'' разворачиваются согласно иерархии элементов страницы ([[#SessExec|раздел 4.5]]). В дополнение к стандартным свойствам абстрактного виджета ''Widget'', элементы страницы и сами страницы сеанса получают свойства: хранения кадра значений вычислительной процедуры, обсчёта процедур и механизм обработки событий. Страницы сеанса, в дополнение ко всему, содержат контейнер страниц, следующих согласно иерархии. Сеанс, в целом, обсчитывается с указанной периодичностью и в последовательности, описанной в [[#SessExec|разделе 4.5]]. В сеанса, как и в проекте, реализуются специальные страницы, которые тут исполняются, о чём детально описано в [[#Project|разделе 4.4]]. ==== Формирование объектов значений для процедур обсчёта виджетов конечной визуализации ==== В разделе выше мы уже отмечали, что виджет сеанса содержит объект значений процедуры обсчёта. Этот объект инициируется и используется в случае наличия самой процедуры вычисления, про что детальнее в [[#SessExec|разделе 4.5]]. ==== Обработка ссылок на параметры источников данных OpenSCADA ==== При исполнении виджета сеанса необходимо и осуществляется выполнение обработки ссылок, которые реализованы согласно [[#LinkingDyn|разделу 4.10]]. ==== Формирование окна исполнения проекта — "Исполнение" ==== На стороне визуализации (модуль ''Vision''), для визуализации процесса исполнения проекта реализован объект ''VisRun''. При запуске он шлёт запрос на создание и инициализацию сессии. Далее выполняется запрос на перечень открытых страниц. Исходя из информации об открытых страницах и их связности, формируется результирующий интерфейс. На рисунке 6.3 приведён пример классического SCADA интерфейса с объектами сигнализации, где главное окно содержит страницу внутри, которая замещается по нажатию на кнопки объектов сигнализации и листания. [[file:VCA_vision_run_ru.png|center|frame|Рис.6.3. Окно визуализации исполнения проекта — режим "RunTime".]] ==== Визуализация кадров проекта в режиме "Исполнение" с периодическим обновлением содержимого ==== Реализовано обновление содержимого открытых страниц интерфейса визуализации с периодичностью исполнения сеанса проекта. В процессе обновления выполняется: * запрос, у модели, списка открытых страниц и проверка соответствия реально открытых страниц этому списку; * запрос изменённых данных по каждой открытой странице и её виджетам; * обновление содержимого страниц и их виджетов в соответствии с полученными измененными данными. По закрытию окна "Исполнения" производится закрытие сеанса проекта в модели данных, если сеанс не фоновый и это было последнее подключение. Механизм запроса только изменённых данных основан на абсолютном счётчике исполнения сеанса. При внесении реальных изменений в атрибуты виджетов выполняется запоминание значения этого счётчика, что и позволяет идентифицировать изменённые атрибуты. Такой подход позволяет повысить производительность и уменьшить нагрузку на трафик, в случае доступа к модели через сеть. ==== Реализация передачи и обработки событий ==== Визуализатор сеанса ("RunTime"), в виду своего непосредственного контакта с пользователем, собирает различные события. Часть событий обрабатывается образами базовых виджетов (Text, Box, Document и т.д.), в результате чего могут формироваться другие события. Другая часть событий прямо передаётся в модель данных, где они и обрабатываются, про что детально описано в [[#Events|разделе 4.7]]. ==== Реализация механизма переключения-открытия-замещения-навигации по страницам проекта, с учётом сценариев обработки ==== Переключение, открытие, замещение и навигация по страницам реализовано на основе обработки событий по сценарию, в атрибуте активного виджета "evProc". Сценарий этого атрибута записывается в виде списка команд с синтаксисом: '''{event}:{srcWdg}:{com}:{prm}''', детали в [[#Events|разделе 4.7]] и [[#Project|разделе 4.4]]. === Проектирование и реализация примитивов отображения === На данном этапе реализуется модель данных [[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]] и образов визуализатора [[Special:MyLanguage/Modules/Vision|Vision]], [[Special:MyLanguage/Modules/WebVision|WebVision]] для всех базовых элементов: "ElFigure", "FormEl", "Text", "Media", "Diagram", "Protocol", "Document", "Function", "Box". ==== Примитив элементарная фигура (''ElFigure'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#ElFigure|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|ElFigure}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|ElFigure}} ==== Примитив элемента формы (''FormEl'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#FormEl|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|FormEl}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|FormEl}} ==== Примитив текста (''Text'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Text|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Text}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Text}} ==== {{Anch|ImplMedia|Примитив отображения медиа-материалов (''Media'')}} ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Media|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Media}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Media}} ==== Примитив построения диаграмм-графиков (''Diagram'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Diagram|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Diagram}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Diagram}} ==== {{Anch|ImplProtocol|Примитив формирования протокола (''Protocol'')}} ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Protocol|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Protocol}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Protocol}} ==== Примитив формирования документа (''Document'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Document|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Document}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Document}} ==== Примитив контейнера (''Box'') ==== Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документа, [[#Box|раздел 4.12]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|Box}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== {{#lst:Modules/WebVision/ru|Box}} === Темы-стили отображения === Реализацию на стороне модели данных ([[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]]) описано в этом-же документе, [[#Styles|раздел 4.6]]. ===== [[Special:MyLanguage/Modules/Vision|UI.Vision]] ===== {{#lst:Modules/Vision/ru|style}} ===== [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] ===== В виду отсутствия инструмента разработки пользовательских интерфейсов он не нуждается в специфической реализации стилей. === Карты событий — <span style="color: red">В планах</span> === Реализация данного пункта пока отсутствует и будет осуществлена по надобности. === Реализация слабых связей между моделью данных и представлением === В процессе реализации данного этапа написано дополнительные сценарии интерфейса управления для покрытия задачи организации слабых связей между моделью (VCAEngine) и визуализатором (Vision). На стороне визуализатора (Vision) выполнен полный переход на слабые связи с моделью данных VCA. В результате этого удалось достичь значительной унификации визуализатора и повысить его стабильность. Вопрос производительности рассмотрен ниже. === Web-интерфейс визуализации сеанса проекта === Реализация выполнена в модуле [[Special:MyLanguage/Modules/WebVision|UI.WebVision]] и в объёме исполнения всех примитивов и их видов, для проектов разработанных в [[Special:MyLanguage/Modules/Vision|UI.Vision]]. == {{Anch|Optimization|Оптимизация}} == В процессе реализации неоднократно принимались меры по оптимизации, направленные на повышение производительности различных узлов СВУ и взаимодействия между ними. В данном разделе размещаются отчёты, соображения и планы таких мер. '''23.08.2007'''<br/> ''Основание:'' Наиболее ответственным, в вопросе производительности, является взаимодействие между моделью данный СВУ и визуализаторами, а также циклы обслуживания интерактивного взаимодействия и обновления. Данный вопрос приобретает ещё большее значение в свете того, что для взаимодействия визуализаторов с моделью данных СВУ используются слабые связи, а именно — события, основанные на XML-запросах, которые потенциально медленнее прямых связей. Однако возможность последующего перенаправления потока данных взаимодействия на сетевые транспортные протоколы, а также более высокая надёжность такого взаимодействия, оправдывают усилия по оптимизации этого взаимодействия.<br/> ''Условия:'' Основными объектами оптимизации являются: цикл обновления визуализатора "Vision" и цикл обсчёта сеанса на стороне модели данных СВУ. Замер временных интервалов выполнялся на вычислительной машине Athlon 64 3000+, с пониженной до 800МГц частотой процессора и тестовой странице. {| class="wikitable" |- ! Процесс !! Исходное время, миллисекунды !! Результирующее время, миллисекунды !! Комментарии |- | colspan=4 | ''Цикл обновления визуализатора "Vision"'' |- | Полный секундный цикл обновления || 43 || 10 || |- | Обработка списка открытых окон || 2.3 || 2.2 || Незначительное улучшение за счёт выделения функции запроса перечня открытых окон в сервисные функции быстрого доступа. |- | Обновление открытых страниц || 41 || 9 || |- | Запрос атрибутов || 24 || 7 || Значительно сократилось за счёт введения общего счетчика модификации виджета и выноса запроса обновления списка непользовательских атрибутов в цикл обсчёта сеанса. |- | Вызов функции ''setAttr()'', для полученных атрибутов || 19 || 2 || Значительно сократилось за счёт пересмотра и доработки примитива "Text". |- | colspan=4 | ''Цикл обсчета сеанса пользовательского интерфейса модели данных СВУ.'' |- | Полный цикл вычисления || 53 || 21 || Значительно сократился за счёт пересмотра последовательности вычисления виджета и уменьшения периодичности обновления списка: слинкованых атрибутов и активных дочерних виджетов. |} '''11.07.2008'''<br/> ''Основание:'' Для оценки потенциальных возможностей среды визуализации по производительности, а также с целью повышения производительности и возможности создания мнемосхем с большим количеством виджетов, была проведена оптимизация визуализации виджетов, как в режиме разработки, так и в режиме исполнения. <br/> ''Условия:'' Замер временных интервалов выполнялся на вычислительной машине Pentium 4 3200. {| class="wikitable" |- ! Процесс !! Исходное время, миллисекунды !! Результирующее время, миллисекунды !! Комментарии |- | 160 эллиптических дуг по одной в каждом виджете, с радиусами по 20 пикселей и толщиной линии 1. || Загрузка: 497;<br/>Инициализация, отрисовка: 355 || Загрузка: 333;<br/>Инициализация, отрисовка: 273 || |- | 160 эллиптических дуг по одной в каждом виджете с радиусами по 20 пикселей и толщиной линии 1, с заливкой в каждой. || Загрузка: 492;<br/>Инициализация, отрисовка: 1379 || Загрузка: 326;<br/>Инициализация, отрисовка: 470 || |- | 160 эллиптических дуг по одной в каждом виджете с радиусами по 20 пикселей и толщиной линии 1, с заливкой в каждой и с масштабом страницы 0.5, по X и по Y. || Загрузка: 495;<br/>Инициализация, отрисовка: 1430 || Загрузка: 334;<br/>Инициализация, отрисовка: 452 || Как видно, присутствие масштабных коэффициентов, не равных 1, существенно не влияет ни на загрузку, ни на инициализацию с отрисовкой. |- | 160 линий по одной в каждом виджете длиной 40 и толщиной 10 пикселей. || Загрузка: 451;<br/>Инициализация, отрисовка: 70 || Загрузка: 315;<br/>Инициализация, отрисовка: 5 || |- | 160 прямоугольников по одном в каждом виджете длиной 40, шириной 10, толщиной линии 1 пиксель и с заливкой в каждом. || Загрузка: 486;<br/>Инициализация, отрисовка: 175 || Загрузка: 336;<br/>Инициализация, отрисовка: 38 || |- | 240 линий по 20 в каждом виджете (всего 12 виджетов), толщиной 10 и длиной, приблизительно равной 50 пикселей. || Загрузка: 58;<br/>Инициализация, отрисовка: 53 || Загрузка: 30;<br/>Инициализация, отрисовка: 8 || Время и до и после оптимизации значительно меньше в сравнении с одной линией в одном виджете (всего 160 линий) за счёт уменьшения количества виджетов. |- | 240 четырехугольников с заливкой, шириной примерно 15, длиной примерно 50 пикселей и с толщиной линии в 1 пиксель, по 20 в каждом виджете (всего 12 виджетов). || Загрузка: 95;<br/>Инициализация, отрисовка: 272 || Загрузка: 42;<br/>Инициализация, отрисовка: 93 || |} '''09.2022'''<br/> ''Reason:'' Decreasing common loading of the interface for very busy systems, slow Internet channels (especially for Web), for mostly passive interfaces without the periodic updation and with storing the interface reactivity — reaction for events; for what there provided such improvements: * ''2021-03'': [[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]] appended of the events early processing; * ''2022-09-20'': [[Special:MyLanguage/Modules/VCAEngine|UI.VCAEngine]] adapted to work in very big processing periods and disabling the periodic processing in whole. ''Conditions:'' Measurement of the CPU loading was performed on computer specified in the table by the '''top''' utility. {| class="wikitable" |- ! Condition !! Base loading (CPU%) !! [[Special:MyLanguage/Modules/VCAEngine|VCAEngine]] Session (CPU%) !! [[Special:MyLanguage/Modules/Vision|Vision]] (CPU%) !! [[Special:MyLanguage/Modules/WebVision|WebVision]], Cromium (CPU%) |- | colspan="5" style="text-align: center;" | ''AMD A8-6500 computer on the CPU scaling policy "Powersave" for [[Special:MyLanguage/Using/Model_AGLKS|AGLKS]] with opened the main page and selected-blinked PC1'' |- | Original — no optimisation || 29 || 33 = +4 || 48 = +15 || 52 = +19, 25 |- | Period the project/session 100 ms, RootPgSo 1000 ms, ControlPanels 100 ms || 26.5 || 31.5 = +5 || 46.5 = +15 || 51 = +19.5, 30 |- | Period the project/session 250 ms, RootPgSo 1000 ms, ControlPanels 250 ms || 26.5 || 29.5 = +3 || 40 = +9.5 || 43 = +12.5, 21 |- | Period the project/session 250 ms, RootPgSo 10000 ms, ControlPanels 1000 ms || 26.5 || 28.5 = +2 || 37.5 = +9 || 37 = +8.5, 10 |- | Period the project/session 250 ms, RootPgSo DISABLED, ControlPanels 1000 ms || 26.5 || 28.5 = +2 || 37.5 = +9 || 36.5 = +8, 10 |- | Period the project/session 250 ms, RootPgSo DISABLED, ControlPanels 1000 ms > no selection || 26.5 || 27.5 = +1 || 36.5 = +9 || 34 = +6.5, 7 |- | Period the project/session 100 ms, RootPgSo DISABLED, ControlPanels 1000 ms || 26.5 || 29.5 = +3 || 40.5 = +11 || 39 = +9.5, 12 |- | Period the project/session 100 ms, RootPgSo DISABLED, ControlPanels 1000 ms > no selection || 26.5 || 29.5 = +3 || 38 = +8.5 || 36 = +6.5, 9 |- | colspan="5" style="text-align: center;" | ''AMD Phenom(tm) II X4 900e server on the CPU scaling policy "OnDeman, 800 MHz mostly" for the SmartHome project'' |- | Period the project/session 100 ms, RootPgSo 1000 ms, ControlPanels 100 ms > the main page || 6 || 20 = +14 || - || 30 = +10, 16 |- | Period the project/session 250 ms, RootPgSo 10000 ms, ControlPanels 1000 ms > the main page || 6 || 12 = +6 || - || 16 = +4, 9 |- | Period the project/session 250 ms, RootPgSo 10000 ms, ControlPanels 1000 ms > the graph group > no adaption || 6 || 17 = +11 || - || 35 = +18, 12 |- | Period the project/session 250 ms, RootPgSo 10000 ms, ControlPanels 1000 ms > the graph group > adaption || 6 || 14 = +8 || - || 30 = +16, 11<BR/>(the Diagram primitive works in 1000 ms independently) |- | Period the project/session 250 ms, RootPgSo 10000 ms, ControlPanels 1000 ms > the graph group > extended adaption || 6 || 12 = +6 || - || 15 = +3, 4 |} == Ссылки == * [[:File:vca.xmi.gz|UML – проект (umbrello)]] * [[:File:vca_struct_ru.odg|Диаграмма: Обобщённая структура СВУ.]] * [[:File:vca_widget_ru.odg|Диаграмма: Пример структуры производного виджета СВУ.]] * [[:File:vca_prog_tree_ru.odg|Диаграмма: Иерархическое представления компонентов проекта классического интерфейса ВУ технологического процесса СВУ.]] * [[:File:vca_map_inher_ru.odg|Диаграмма: Карта "использующего" наследования компонентов концепции-движка СВУ.]] * [[:File:vca_document_ru.odg|Диаграмма: Структурная схема примитива "Документ" СВУ.]] * [[:File:Oscada UserOM VCAEngine_ru.odg|Диаграмма: Объектная модель пользователя модуля VCAEngine.]]
Navigation menu
OpenSCADA
Site
Download
Old Wiki
OpenSCADA Wiki
Home
About OpenSCADA
Functions and demands
Tasks
Using
Fund
Recent changes
Random page
Search
Tools
Special pages
Printable version
MediaWiki
Help
Personal tools
English
Log in