Данный документ представляет собой описание интерфейса программирования приложения (API) системы OpenSCADA.
OpenSCADA это проект открытой SCADA-системы построенной по модульному принципу. В документе содержится исчерпывающее описание внутренней архитектуры системы OpenSCADA. Кроме информации об архитектуре предоставляются справочные данные по методам и атрибутам объектов системы.
Документ предназначен для программистов желающих разобраться в архитектуре OpenSCADA и разрабатывать расширения для неё. Документ не предназначен для пользователей и интеграторов OpenSCADA!
Для понимания документа требуется знание концепции Объектно Ориентированного Программирования (ООП) и универсального языка моделирования программного обеспечения (UML), а для возможности изучения исходного кода проекта требуется знание языка программирования C++. Кроме того, в документе содержится упоминание о технологиях: реляционные БД, XML.
1. Внутренняя структура, API системы OpenSCADA.
С целью наглядного и доступного восприятия архитектуры системы OpenSCADA в целом на рис.1. изображена статическая диаграмма классов системы OpenSCADA на универсальном языке моделирования (UML). Исходя из диаграммы видно, что система OpenSCADA содержит модульные подсистемы: «Архивы», «Базы данных», «Транспорты», «Транспортные протоколы», «Пользовательские интерфейсы», «Сбор данных» и «Специальные», а также подсистемы: «Безопасность» и «Управление модулями». На диаграмме наглядно представлены взаимосвязи между модульными подсистемами и модулями соответствующих типов.
Рис. 1. Статическая диаграмма классов
2. Общая структура системы. Модульность (TSubSYS, TModule)
Корнем, от которого строится вся система, является объект TSYS. Корень содержит подсистемы (TSubSYS). Подсистемы могут быть: обычными и модульными. Отличие модульных подсистем четко прослеживается на рис. 1. Так, модульные подсистемы обязательно содержат список модульных объектов (TModule), например подсистема архивы TArchiveS содержит модульные объекты TTipArchivator. В тоже время обычная подсистема таких объектов не содержит. Например, подсистема безопасности TSeсurity (рис.2).
Рис. 2. Иерархическая структура системы OpenSCADA.
В процессе инициализации корня (TSYS) определяется глобальная переменная SYS. Переменная SYS может использоваться для прямого обращения к корню системы из любого её узла. Инициализация корня выполняется единожды из главной вызывающей функции. После запуска управление захватывается объектом системы до остановки. Корневой объект концентрирует все общесистемные функции системы OpenSCADA.
Продолжением корневого объекта (TSYS), выполняющего функции обслуживания потока системных сообщений, выступает объект TMess. Объект доступен посредством глобальной переменной Mess, которая инициализируется корнем системы. Объект содержит функции кодирования, декодирования и локализации сообщений.
В подсистемах (TSubSYS) реализуются функции характерные для каждой подсистемы индивидуально, с общим для всех подсистем доступом, через объект TSubSYS. Модульная подсистема имеет возможность расширять функциональность посредством модулей. Для этой цели модульная подсистема предоставляет доступ к модулям своего типа в виде модульных объектов.
Модуль — составная часть модульной подсистемы. В общем, для всех модулей и их подсистем, модуль предоставляет информацию о себе, своём происхождении и экспортируемых функциях. Отдельно взятый модуль реализует функциональность в соответствии со своими потребностями.
2.1. Корневой объект системы (TSYS)
Наследует:
TCntrNode.
Данные:
Информационные переменные программы:
PACKAGE_LICENSE — Лицензия распространения программы
string cfgFile( ); — Имя конфигурационного файла системы.
XMLNode &cfgRoot( ); — Разобранная структура конфигурационного файла.
XMLNode *cfgNode( const string &path, bool create = false ); — Получение узла конфигурации по его пути <path>. Создавать элементы пути в случае их отсутствии <create>.
void modifCfg( ); — Отметка модификации конфигурации, для последующего сохранения в файл.
string workDB( ); — Полное имя рабочей БД.
string selDB( ); — Выбранная БД. Используется для избирательной загрузки из указанной БД, в подсистеме "БД".
bool chkSelDB( const string& wDB ); — Функция проверки на соответствие указанной БД <wDB> выбранной в selDB( ).
void setWorkDB( const string &wdb ); — Установка полного имени рабочей БД.
void setSelDB( const string &vl ); — Установка выбранной БД для избирательной загрузки.
bool saveAtExit( ); — Признак - "Сохранять конфигурацию системы при выходе".
void setSaveAtExit( bool vl ); — Установка признака - "Сохранять конфигурацию системы при выходе".
int savePeriod( ); — Периодичность автоматического сохранения станции в БД (секунд).
void setSavePeriod( int vl ); — Установка периодичности автоматического сохранения станции в БД (секунд).
string optDescr( ); — Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.
static void sighandler( int signal ); — Функция стандартного обработчика сигналов системы в целом.
unsigned long long sysClk( ); — Расчётная частота процессора на котором функционирует система (Гц).
void clkCalc( ); — Расчёт частоты процессора на котором работает система. Вызывается периодически для систем с переменной частотой процессора.
unsigned long long shrtCnt( ); — Функция замера малых интервалов времени по счетчику тактов процессора. Возвращает значение счетчика тактов процессора.
static long HZ( ); — Время системного тика процессора.
bool cntrEmpty( ); — Проверка на отсутствие счётчиков отладки.
void cntrSet( const string &id, double vl ); — Установка счетчика отладки <id> в значение <vl>.
void cntrIter( const string &id, double vl ); — Итерация счётчика отладки <id> на значение <vl>.
void taskCreate( const string &path, int priority, void *(*start_routine)(void *), void *arg, int wtm = 5, pthread_attr_t *pAttr = NULL, bool *startSt = NULL ); — Создание задачи (потока) с идентификатором <path>, приоритетом <priority> (-1...99), функцией задачи <start_routine> и её аргументов <arg>, а так-же ожиданием запуска пользовательской процедуры по признаку <startSt>.
void taskDestroy( const string &path, bool *endrunCntr = NULL, int wtm = 5, bool noSignal = false ); — Удаление задачи с идентификатором <path> и командой останова <endrunCntr>. Используйте <noSignal> для предотвращения отправки задаче сигнала SIGALRM.
static int sysSleep( float tm ); — Функция системного засыпания потока на время в секундах, вплоть до наносекунд (1e-9).
static long long curTime(); — Текущее время в микросекундах с начала эпохи (01.01.1970).
static void taskSleep( long long per, time_t cron = 0 ); — Функция засыпания потока по сетке абсолютного времени с периодом <per> в наносекундах или до запланированного времени <cron>.
static time_t cron( const string &vl, time_t base = 0 ); — Планирование времени исполнения по формату стандарта Cron <vl>, начиная от базового времени <base> или от текущего времени, если база не указана.
static bool eventWait( bool &m_mess_r_stat, bool exempl, const string &loc, time_t time = 0 ); — Функция ожидания события <exempl> для переменной <m_mess_r_stat> в течение указанного интервала времени <time> для источника <loc>.
static string int2str( int val, IntView view = Dec ); — Преобразование целого знакового в строку вида <view>.
static string uint2str( unsigned val, IntView view = Dec ); — Преобразования целого беззнакового в строку вида <view>.
static string ll2str( long long val, IntView view = Dec ); — Преобразования длинного целого (64бит) в строку вида view.
static string real2str( double val, int prec = 15, char tp = 'g' ); — Преобразования вещественного с точностью <prec> знаков и типом <tp> в строку.
static double realRound( double val, int dig = 0, bool toint = false ); — Округление вещественного числа до указанного знака <dig> после запятой с возможностью преобразования к целому после округления <toint>.
static string time2str( time_t tm, const string &format ); — Преобразование UNIX времени <tm> в строку, в соответствии с форматом <format> POSIX-функции strftime().
static string time2str( double utm ); — Преобразование интервала времени, в микросекундах, в строку вида "1час 23мин 10сек".
static string cpct2str( double cnt ); — Преобразование счётчика трафика <cnt> (байт) в строки вида "12.5КиБ".
static string strNoSpace( const string &val ); — Удаляет из исходной строки <val> пустые символы в начале и в конце.
static string strSepParse( const string &path, int level, char sep, int *off = NULL ); — Разбор строки <path> на составляющие, отделённые разделительным символом <sep>, начиная со смещения <off> и контролируя смещение конца элемента в нём же.
static string strParse( const string &str, int level, const string &sep, int *off = NULL, bool mergeSepSymb = false ); — Расширеная версия функции разбора строки strSepParse() позволяющая использовать многосимвольные разделители и объединять односимвольные.
static string strLine( const string &str, int level, int *off = NULL ); — Разбор текста по строкам для разных способов окончания строки (CR, LF и CR/LF).
static string pathLev( const string &path, int level, bool encode = true, int *off = NULL ); — Выделение элементов пути <path> с возможностью их декодирования, начиная со смещения <off> и контролируя смещение конца элемента в нём же.
static string path2sepstr( const string &path, char sep = '.' ); — Преобразование пути в строку с разделителем <sep> элементов.
static string sepstr2path( const string &str, char sep = '.' ); — Преобразование строки с разделителем <sep> элементов в путь.
static inline uint16_t getUnalign16(const void *p); — Невыравненное чтение беззнакового целого в 16-разрядов из буфера по смещению.
static inline uint32_t getUnalign32(const void *p); — Невыравненное чтение беззнакового целого в 32-разряда из буфера по смещению.
static inline uint64_t getUnalign64(const void *p); — Невыравненное чтение беззнакового целого в 64-разряда из буфера по смещению.
static inline int getUnalignInt(const void *p); — Невыравненное чтение знакового целого из буфера по смещению.
static inline float getUnalignFloat(const void *p); — Невыравненное чтение вещественного "float" из буфера по смещению.
static inline double getUnalignDbl(const void *p); — Невыравненное чтение вещественного "double" из буфера по смещению.
static float floatLE(float in); — Преобразование вещественного числа "float" из внутреннего представления в формат IEEE754 Little-Endian (LE).
static float floatLErev(float in); — Преобразование вещественного числа "float" из формата IEEE754 Little-Endian (LE) во внутреннее представление.
static double doubleLE(double in); — Преобразование вещественного числа "double" из внутреннего представления в формат IEEE754 Little-Endian (LE).
static double doubleLErev(double in); — Преобразование вещественного числа "double" из формата IEEE754 Little-Endian (LE) во внутреннее представление.
Публичные атрибуты:
static bool finalKill — Признак "Финальное разрушение объектов". Используется для принудительного отключения заблокированных объектов на финальной стадии выключения.
const int argc — Счётчик аргументов командной строки.
string codeConvIn( const string &fromCH, const string &mess); — Конвертация кодировки сообщения во внутреннюю кодировку системы.
string codeConvOut( const string &toCH, const string &mess); — Конвертация кодировки сообщения из внутренней кодировки системы.
static const char *I18N( const char *mess, const char *d_name = NULL ); — Получение сообщения на языке системы.
static string I18Ns( const string &mess, const char *d_name = NULL ); — Получение сообщения на языке системы.
string lang( ); — Язык системы, в виде en_US.UTF-8.
string lang2Code( ); — Язык системы в двухсимвольной кодировке (en).
string lang2CodeBase( ); — Язык базовых сообщений текстовых переменных в двухсимвольной кодировке (en).
string &charset( ); — Системная кодировка.
int logDirect( ); — Приемники, которым направляются системные сообщения (stdout, stderr, syslog, archive);
int messLevel( ); — Уровень, ниже которого сообщения игнорируются.
bool isUTF8( ); — Внутренняя кодировка UTF-8.
void setLang( const string &lang ); — Установка языка системы (локализации).
void setLang2CodeBase( const string &vl ); — Установка языка базовых сообщений текстовых переменных в двухсимвольной кодировке (en).
void setLogDirect( int dir ); — Установка приемников которым направляются системные сообщения. Для <dir> используется битовая маска. Где:
1 – в syslog;
2 – в stdout;
4 – в stderr;
8 – в архив.
void setMessLevel( int level ); — Установка минимального уровня обрабатываемых сообщений.
void put( const char *categ, int8_t level, const char *fmt, ... ); — Сформировать сообщение за текущее время.
void get( time_t b_tm, time_t e_tm, vector<TMess::SRec> &recs, const string &category = "", int8_t level = Debug ); — Запросить сообщения из архива за промежуток времени <b_tm> — <e_tm> в соответствии с шаблоном категории <category> и минимальным уровнем <level>.
Подсистема «Базы Данных» представлена объектом TBDS, который содержит модульные объекты типов БД TTipBD. Каждый тип базы данных содержит объекты отдельно взятых баз данных данного типа TBD. Каждая БД, в свою очередь, содержит объекты своих таблиц TTable (рис. 3).
Рис. 3. Иерархическая структура подсистемы БД.
Подсистема представляет базовые функции для доступа к типам БД, а также обобщающие функции для манипуляции с базами данных и таблицами. Так, для сокрытия источника данных, которым может быть и конфигурационный файл, предоставляются функции абстрактного доступа к источнику данных. А для хранения общесистемных данных предоставляется системная таблица и функции абстрактного доступа к ней. Следовательно, общесистемные данные могут храниться как в конфигурационном файле, так и в таблице БД. Приоритетным источником в таком случае является таблица БД.
Являясь модульным объектом, тип БД (TTipBD) содержит доступ к реализации механизма той или иной БД. Доступ производится посредством открытых БД модуля отдельно взятого типа БД. Открываемые/регистрируемые БД описываются в таблице открываемых БД или в конфигурационном файле. Существует так называемая рабочая БД, которая открывается всегда и указывается в конфигурационном файле. БД, поддерживающие SQL-запросы, могут предоставлять доступ, основанный на прямых SQL-запросах.
В процессе использования компоненты системы OpenSCADA открывают таблицы (TTable) в доступных БД и работают с ними.
3.1. Объект подсистемы «Базы Данных» (TBDS)
Наследует:
TSubSYS, TElem.
Данные:
Флаги запросов к системной таблице (enum – TDBS::ReqGen):
OnlyCfg — запрос только к конфигурационному файлу.
UseTranslate — использовать перевод текстовой переменной.
Публичные методы:
int subVer( ); — Версия подсистемы.
static string realDBName( const string &bdn ); — Преобразование полного шаблонного имени БД или таблицы (вида *.*.myTbl) в реальное имя. Фактически выполняется замена специальных элементов '*' на элементы рабочей БД.
void dbList( vector<string> &ls, bool checkSel = false ); — Список доступных БД. <checkSel> указывает на необходимость проверки факта загрузки из выбранной БД и вставки в список БД только выбранной.
AutoHD<TTable> open( const string &bdn, bool create = false ); — Открытие таблицы <bdn> БД по её полному пути с созданием <create> в случае отсутствия.
void close( const string &bdn, bool del = false ); — Закрытие таблицы <bdn> БД по её полному пути с возможностью удаления после закрытия <del>.
bool dataSeek( const string &bdn, const string &path, int lev, TConfig &cfg ); — Общее сканирование записей источника данных. В качестве источника выступает конфигурационный файл или БД. В случае отсутствия БД используется конфигурационный файл. Если имя БД <bdn> или путь <path> конфигурационного файла не указаны, то их обработка пропускается.
bool dataGet( const string &bdn, const string &path, TConfig &cfg ); — Получение записи из источника данных (БД или конфигурационный файл). Если имя БД <bdn> или путь <path> конфигурационного файла не указаны, то их обработка пропускается.
void dataSet( const string &bdn, const string &path, TConfig &cfg ); — Установить/сохранить запись в источнике данных (БД или конфигурационный файл). Если имя БД <bdn> или путь <path> конфигурационного файла не указаны, то их обработка пропускается.
bool dataDel( const string &bdn, const string &path, TConfig &cfg, bool useKeyAll = false ); — Удаление записи из источника данных (БД или конфигурационный файл). Если имя БД <bdn> или путь <path> конфигурационного файла не указаны, то их обработка пропускается. <useKeyAll> используется для указания необходимости установки всех ключей для использования их при удалении с восстановлением исходного состояний выбора ключей при выходе из функции. Если этот флаг не установлен, то используются ранее выбранные ключи для выполнения операции.
static string genDBGet( const string &path, const string &oval = "", const string &user = "root", char rFlg = 0 ); — Получить общесистемные данные из конфигурационного файла или системной таблицы от имени пользователя <user>. Если данные отсутствуют, то возвращается значений <oval>.
static void genDBSet( const string &path, const string &val, const string &user = "root", char rFlg = 0 ); — Установить/сохранить обще-системные данные в конфигурационном файле или системной таблице от имени пользователя <user>.
string fullDBSYS( ); — Полное имя системной таблицы.
string fullDB( ); — Полное имя таблицы с описанием зарегистрированных БД.
TElem &openDB_E( ) — Структура таблицы зарегистрированных БД.
AutoHD<TTipBD> at( const string &iid ) — Обращение к модулю БД (типу БД).
string optDescr( ); — Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.
3.2. Модульный объект типов баз данных (TTipBD)
Наследует:
TModule.
Наследуется:
Корневыми объектами модулей подсистемы «БД».
Публичные методы:
bool fullDeleteDB( ); — Признак полного удаления БД.
void list( vector<string> &list ); — Список зарегистрированных (открытых) БД.
bool openStat( const string &idb ); — Проверка на наличие указанной открытой БД.
void open( const string &iid ); — Открытие БД.
void close( const string &iid, bool erase = false ); — Закрытие БД. Если установлен признак <erase>, то БД будет полностью удалена.
string addr( ); — Адрес БД. Форма записи отлична для каждого типа БД.
string codePage( ); — Кодовая страница, в которой хранятся данные БД.
bool enableStat( ); — Состояние БД: "Включена".
bool toEnable( ); — Признак БД: "Включать".
void setName( const string &inm ); — Установка имени БД.
void setDscr( const string &idscr ); — Установка описания БД.
void setAddr( const string &iaddr ); — Установка адреса БД.
void setCodePage( const string &icp ); — Установка кодовой страницы хранения данных в БД.
void setToEnable( bool ivl ); — Установка признака: "Включать".
virtual void enable( ); — Включение БД.
virtual void disable( ); — Отключение БД.
virtual void allowList( vector<string> &list ); — Список таблиц, содержащихся в данной БД.
void list( vector<string> &list ); — Список открытых таблиц.
bool openStat( const string &table ); — Признак указывающий на то, что запрошенная таблица открыта.
void open( const string &table, bool create ); — Открытие таблицы. Если установлен признак <create>, то в случае отсутствия таблица будет создана.
void close( const string &table, bool del = false ); — Закрытие таблицы. Если установлен признак <del>, то таблица будет полностью удалена.
AutoHD<TTable> at( const string &name ); — Подключение к таблице.
virtual void sqlReq( const string &req, vector< vector<string> > *tbl = NULL, char intoTrans = EVAL_BOOL ); — Отправка SQL-запроса <req> на БД и получение результата в виде таблицы <tbl>. При установке <intoTrans> в true для запроса будет открыта транзакция, в false будет закрыта.
virtual void transCloseCheck( ) — Периодически вызываемая функция для проверки транзакций и закрытия старых или содержащих много запросов.
TTipBD &owner( ); — Тип базы данных – владелец данной БД.
Защищённые методы:
virtual TTable *openTable( const string &table, bool create ); — Модульный метод открытия таблицы.
Подсистема “Сбор данных” представлена объектом TDAQS, который содержит модульные объекты типов источников данных TTipDAQ и объекты библиотек шаблонов параметров подсистемы "Сбор данных" TPrmTmplLib. Объект типов источников данных содержит объекты контроллеров TController и объекты типов параметров TTipParam. Объекты типов параметров предоставляются модулем контроллера и содержат структуру БД отдельных типов параметров (аналоговые, дискретные ...). Объекты контроллеров содержат объекты параметров TParamContr. Каждый параметр ассоциируется с одним из типов параметров. Для хранения атрибутов параметр наследуется от объекта значений TValue, который и содержит значения атрибутов TVal. Библиотека шаблонов параметров данной подсистемы содержит объекты шаблонов TPrmTmpl. Пример описанной иерархической структуры приведён на рис. 4.
Рис. 4. Иерархическая структура подсистемы сбора данных.
Подсистема содержит типы источников данных. Источником может выступать практически любая сущность предоставляющая какие либо данные. Тип источника может делиться на отдельные источники (контроллеры) в пределах конкретного типа. Например, если взять данные из операционной системы (ОС), то под отдельным источником можно понимать операционную систему отдельного ПК.
Источник данных (контроллер) далее делится, или содержит, параметры. Под параметром подразумевается какая-то часть источника данных. В случае с ОС это будет, например: расход оперативной памяти, частота процессора и много других составных частей.
Параметр, в свою очередь, содержит атрибуты, которые и предоставляют данные. Кроме основных данных атрибутами могут предоставляться и сопутствующие или детализирующие данные. В случае той-же ОС и расхода памяти, атрибутами может предоставляться не только занятая память, а также и сколько её всего, сколько в swap и т.д.
Некоторые реализации источников данных могут предоставлять возможность формирования структуры параметра по ранее разработанным шаблонам параметров. Для этой цели подсистема содержит библиотеки шаблонов, которые, в свою очередь, содержат шаблоны параметров. В примере изображена библиотека шаблонов "base" с шаблонами "digAlrm" и "smplBrd".
На уровне подсистемы предоставляются механизм резервирования источников данных. Резервирование подразумевает возможность согласованной работы нескольких станций OpenSCADA для выполнения общей задачи сбора данных в одноимённых источниках данных.
4.1. Объект подсистемы «Сбор данных» (TDAQS)
Наследует:
TSubSYS.
Публичные методы:
int subVer( ); — Версия подсистемы.
void subStart( ); — Запуск подсистемы.
void subStop( ); — Останов подсистемы.
AutoHD<TTipDAQ> at( const string &name ); — Подключение к типу источника данных.
string tmplLibTable( ); — Имя таблицы для хранения шаблонов параметров подсистемы "Сбор данных".
void tmplLibList( vector<string> &list ); — Список доступных шаблонов параметров.
bool tmplLibPresent( const string &id ); — Проверка на наличие шаблона параметра <id>.
bool rdActive( ); — Признак активности схемы резервирования. Указывает на факт наличия хотя-бы одной активной резервной станции.
int rdStLevel( ); — Уровень резервирования текущей станции.
void setRdStLevel( int vl ); — Установить уровень резервирования текущей станции.
int rdTaskPer( ); — Периодичность задачи обслуживания резервирования, в секундах.
void setRdTaskPer( int vl ); — Установить периодичность задачи обслуживания резервирования.
int rdRestConnTm( ); — Время повторения попытки восстановления связи с резервными станциями после её потери, в секундах.
void setRdRestConnTm( int vl ); — Установка времени повторения попытки восстановления связи с резервными станциями.
float rdRestDtTm( ); — Максимальная глубина восстановления данных архивов при включении, в часах.
void setRdRestDtTm( float vl ); — Установка максимальной глубины восстановления данных архивов при включении.
void rdStList( vector<string> &ls ); — Список станций в резерве.
void rdActCntrList( vector<string> &ls, bool isRun = false ); — Список активных контроллеров работающих в схеме резервирования. При указании <isRun> в список попадут только исполняющиеся на данной станции контроллеры.
string rdStRequest( const string &cntr, XMLNode &req, const string &prevSt = "", bool toRun = true ); — Запрос <req> к резервной станции от имени контроллера <cntr>. Станция для запроса выбирается после указанной в <prevSt>, для исполняемого удалённого контроллера при указании <toRun>.
TElem &elLib(); — Структура таблицы библиотек шаблонов параметров.
TElem &tplE(); — Структура таблицы шаблонов параметров.
TElem &tplIOE(); — Структура атрибутов шаблонов параметров.
TElem &errE(); — Структура атрибута(ов) ошибок параметров.
bool tpPrmPresent( const string &name_t ); — Проверка на наличие указанного типа параметра.
unsigned tpPrmToId( const string &name_t ); — Получение индекса типа параметров по имени.
int tpParmAdd( const char *id, const char *n_db, const char *name ); — Добавление/регистрация типа параметров.
unsigned tpPrmSize( ); — Количество типов параметров.
TTipParam &tpPrmAt( unsigned id ); — Получить объект типа параметров.
virtual bool compileFuncLangs( vector<string> *ls = NULL ); — Запрос перечня языков для которых реализована возможность формирования пользовательских процедур, в данном модуле, а также проверка факта их поддержки.
virtual void compileFuncSynthHighl( const string &lang, XMLNode &shgl ); — Запрос правил подсветки синтаксиса для указанного языка.
virtual string compileFunc( const string &lang, TFunction &fnc_cfg, const string &prog_text, const string &usings = "", int maxCalcTm = 10 ); — Компиляция/настройка пользовательской функции на поддерживаемом модулем языке программирования <lang> и исходном тексте процедуры <prog_text>, исходя из параметров процедуры <fnc_cfg>. Результатом является адрес к подготовленному объекту функции.
virtual bool redntAllow( ); — Признак поддержки механизмов резервирования модулем. Должен просто переопределяться и возвращать true.
Защищённые методы:
virtual TController *ContrAttach( const string &name, const string &daq_db ); — Подключение контроллера. Обязательно переопределяется в потомке модуля.
virtual void redntDataUpdate( bool firstArchiveSync = false ); — Выполнение операции получения данных из резервной станции. Вызывается автоматически задачей обслуживания схемы резервирования и перед запуском для синхронизации архивов, с установленным параметром <firstArchiveSync>.
void alarmSet( const string &mess, int lev = -TMess::Crit, const string &prm = "" ); — Формирование аварийной ситуации (нарушения) для объекта контроллера <prm>, или контроллера в целом если объект не указан, с сообщением <mess> и уровнем <lev>. Отрицательное значение уровня <lev> служит для установки, а положительное для снятия нарушения. Эта функция формирует нарушения и сообщения с категорией: al{ModId}:{cntrId}[.{PrmId}].
TTipDAQ &owner( ); — Тип источника данных (модуль) - владелец данным контроллером.
long long mRedntTmLast — время последних данных полученных через механизм резервирования.
Защищённые методы:
virtual void setType( const string &tpId ); — вызывается для смены типа параметра <tpId> и может быть обработан в объекте модуля, для смены собственных данных.
AutoHD<TVal> vlAt( const string &name ); — Подключение к атрибуту.
Защищённые методы:
TConfig *vlCfg( ) — Получение связанного объекта конфигурации. Если возвращается NULL то отсутствует связанный объект конфигурации.
void setVlCfg( TConfig *cfg ); — Установка связанного объекта конфигурации <cfg>.
bool vlElemPresent( TElem *ValEl ); — Проверка на наличие элемента атрибутов <ValEl>.
void vlElemAtt( TElem *ValEl ); — Подключение структуры данных <ValEl>.
void vlElemDet( TElem *ValEl ); — Отключение структуры данных <ValEl>.
TElem &vlElem( const string &name ); — Получить структуру данных по её имени <name>.
virtual TVal* vlNew( ); — Создание экземпляра TVal. Может переопределяться в модулях для создания производных объектов атрибутов параметров подсистемы "Сбор данных".
virtual void vlSet( TVal &val, const TVariant &pvl ) — Упреждающая функция установки значения. Используется для прямой (синхронной) записи с предыдущим значением в <pvl>.
virtual void vlGet( TVal &val ); — Упреждающая функция получения значения. Используется для прямого (синхронного) чтения.
virtual void vlArchMake( TVal &val ); — Уведомляющая функция о создании архива для атрибута <val>. Используется для настройки созданного архива, в соответствии с особенностями источника данных.
4.7. Объект атрибута (TVal).
Наследует:
TCntrNode.
Данные:
Дополнительные флаги к объекту TFld (enum TVal::AttrFlag):
DirRead — флаг прямого чтения значения;
DirWrite — флаг прямой записи значения.
Публичные методы:
TVal( ); — Конструктор по умолчанию.
TVal( TFld &fld ); — Инициализация как хранилище динамических данных.
TVal( TCfg &cfg ); — Инициализация как отражение статических данных (БД).
void setFld( TFld &fld ); — Инициализация как хранилище динамических данных.
void setCfg( TCfg &cfg ); — Инициализация как отражение статических данных (БД).
string name( ); — Имя атрибута.
int64_t time( ); — Метка времени последнего/текущего значения.
string getSEL( long long *tm = NULL, bool sys = false ); — Запрос значения выборочного типа на указанное время <tm>. Если NULL то возвратится последнее значение.
TVariant get( long long *tm = NULL, bool sys = false ); — Запрос значения на указанное время <tm>. Если NULL то возвратится последнее значение.
string getS( long long *tm = NULL, bool sys = false ); — Запрос значения строкового типа на указанное время <tm>. Если NULL то возвратится последнее значение.
double getR( long long *tm = NULL, bool sys = false ); — Запрос значения вещественного типа на указанное время <tm>. Если NULL то возвратится последнее значение.
int getI( long long *tm = NULL, bool sys = false ); — Запрос значения целого типа на указанное время <tm>. Если NULL то возвратится последнее значение.
char getB( long long *tm = NULL, bool sys = false ); — Запрос значения логического типа на указанное время <tm>. Если NULL то возвратится последнее значение.
AutoHD<TVarObj> getO( int64_t *tm = NULL, bool sys = false ); — Запрос значения объектного типа.
void setSEL( const string &value, long long tm = 0, bool sys = false ); — Установка значения выборочного типа <value>.
void set( const TVariant &value, long long tm = 0, bool sys = false ); — Установка значения <value>.
void setS( const string &value, long long tm = 0, bool sys = false ); — Установка значения строкового типа <value>.
void setR( double value, long long tm = 0, bool sys = false ); — Установка значения вещественного типа <value>.
void setI( int value, long long tm = 0, bool sys = false ); — Установка значения целого типа <value>.
void setB( char value, long long tm = 0, bool sys = false ); — Установка значения логического типа <value>.
void setO( AutoHD<TVarObj> value, int64_t tm = 0, bool sys = false ); — Установка значения объектного типа <value>.
AutoHD<TVArchive> arch( ); — Получение ассоциированного со значением архива.
void setArch( const AutoHD<TVArchive> &vl ); — Установка ассоциированного со значением архива.
bool reqFlg( ); bool resB1( ); bool resB2( ) — Получить некоторые специфичные для реализации флаги.
void setReqFlg( bool vl ); void setResB1( bool vl ); void setResB2( bool vl ) — Установить некоторые специфичные для реализации флаги.
TFld &fld( ); — Описатель структуры атрибута.
4.8. Объект библиотеки шаблонов параметров подсистемы "DAQ" (TPrmTmplLib)
int maxCalcTm( ); — Лимит на максимальное время вычисления процедуры шаблона.
string progLang( ); — Язык программирования шаблона параметра.
string prog( ); — Программа шаблона параметра.
void setName( const string &inm ); — Установка имени шаблона параметра.
void setDescr( const string &idsc ); — Установка описания шаблона параметра.
void setMaxCalcTm( int vl ); — Установка лимита на максимальное время вычисления процедуры шаблона.
void setProgLang( const string &ilng ); — Установка языка программирования шаблона параметра.
void setProg( const string &iprg ); — Установка программы шаблона параметра.
void setStart( bool val ); — Пуск/останов шаблона параметра.
AutoHD<TFunction> func( ); — Подключение к функции, сформированной шаблоном.
TPrmTmplLib &owner( ); — Объект библиотеки шаблонов - владелец шаблона.
5. Подсистема “Архивы” (TArchiveS)
Подсистема «Архивы» представлена объектом TArchiveS, который содержит на уровне подсистемы модульные объекты типов архиваторов TTipArchivator. Каждый объект типа архиватора содержит объекты архиваторов сообщений TMArchivator и архиваторов значений TVArchivator. Кроме этого объект подсистемы архивы содержит методы архива сообщений и объекты архивов значений TVArchive. Объект архива значений TVArchive содержит буфер значений путём наследования объекта буфера TValBuf. Для связи архива значений с архиваторами предназначен объект элемента значения TVArchEl. Этот объект содержится в архиваторе и на него ссылается архив. Структура подсистемы "Архивы" представлена на рис. 5.
Рис. 5. Иерархическая структура подсистемы архивов.
Подсистема "Архивы" содержит механизмы архивирования сообщений и значений. Непосредственно содержит архив сообщений вместе с его буфером. Содержит методы доступа к архивам значений и архиваторам значений и сообщений. Кроме этого выполняет задачу активного сбора данных из источников значений для архивов значений, а также архивирование архива сообщений по архиваторам.
Архив значений (TVArchive) содержит буфер (TValBuf) для промежуточного накопления значений перед архивированием. Связывается с источником значений в лице параметров системы OpenSCADA в активном или пассивном режиме, а также с другими источниками в пассивном режиме. Для архивирования на физические хранилища связывается с архиваторами значений различных типов.
Объект буфера TValBuf содержит массив значений основных типов системы OpenSCADA: строка, целое, вещественное и логичное. Поддерживается хранение значений в режимах жесткой, мягкой сетки и режиме свободного доступа. Предусмотрен также режим времени высокого разрешения (микросекунды). Используется как для непосредственного хранения больших массивов значений, так и для обмена с большими массивами методом покадрового доступа.
Корневой объект модуля подсистемы "Архивы" (TTipArchivator) содержит информацию о конкретно взятом типе модуля. В рамках отдельных модулей может реализовывать собственные общемодульные функции. В общем для модулей этого типа содержит методы доступа к хранилищам значений и сообщений.
Объект архиватора сообщений (TMArchivator) содержит конкретную реализацию хранилища сообщений. В общем для архиваторов сообщений предоставляется интерфейс доступа к реализации механизма архивирования в модулях.
Объект архиватора значений (TVArchivator) содержит конкретную реализацию хранилища значений. В общем для архиваторов значений предоставляется интерфейс доступа к реализации механизма архивирования и назначение архивов значений на обслуживание архиватором.
Объект элемента архива TVArchEl связывает объекты архивов с архиваторами. Используется для доступа к архиваторам из архива, а также к архивам из архиватора, т.е. для перекрёстных вызовов.
5.1. Объект подсистемы «Архивы» (TArchiveS)
Наследует:
SubSYS.
Публичные методы:
int subVer( ); — Версия подсистемы.
int messPeriod( ); — Период архивирование сообщений из буфера (секунд).
int valPeriod( ); — Период сбора значений для активных архиваторов (миллисекунд).
int valPrior( ); — Приоритет задачи сбора значений для активных архиваторов.
void setMessPeriod( int ivl ); — Установка периода архивирования сообщений из буфера (секунд).
void setValPeriod( int ivl ); — Установка периода сбора значений для активных архиваторов (миллисекунд).
void setValPrior( int ivl ); — Установка приоритета задачи сбора значений для активных архиваторов.
void setToUpdate( ); — Установка флага планирования обновления.
void subStart( ); — Запуск подсистемы.
void subStop( ); — Останов подсистемы.
void valList( vector<string> &list ); — Список архивов значений в подсистеме.
bool valPresent( const string &iid ); — Проверка на наличие архива значений <iid>.
void setActValArch( const string &id, bool val ); — Установка архива <id> в активное состояние <val>. Активный архив будет обеспечиваться периодическим потоком значений (определяется периодичностью архива) подсистемой.
AutoHD<TTipArchivator> at( const string &name ); — Подключение/обращение к типу архиватора (модулю) <name>.
void messPut( time_t tm, int utm, const string &categ, int8_t level, const string &mess ); — Помещение значения <mess> с уровнем <level> категории <categ> и время <tm>+<utm> в буфер, а затем в архив сообщений.
void messPut( const vector<TMess::SRec> &recs ); — Помещение группы значений <recs> в буфер, а затем в архив сообщений.
void messGet( time_t b_tm, time_t e_tm, vector<TMess::SRec> & recs, const string &category = "", int8_t level = TMess::Debug, const string &arch = "", time_t upTo = 0 ); — Запрос значений <reqs> за указанный период времени <b_tm>, <e_tm> для указанной категории (по шаблону) <category> и уровня <level> из архиватора <arch>.
time_t messBeg( const string &arch = "" ); — Начало архива сообщений в целом или для указанного архиватора <arch>.
time_t messEnd( const string &arch = "" ); — Конец архива сообщений в целом или для указанного архиватора <arch>.
TElem &messE( ); — Структура БД архиваторов сообщений.
TElem &valE( ); — Структура БД архиваторов значений.
TElem &aValE( ); — Структура БД архивов значений.
Публичные атрибуты:
bool SubStarting; — Признак запуска подсистемы.
5.2. Объект архива значений (TVArchive)
Наследует:
TCntrNode, TValBuf, TConfig
Данные:
Режим сбора данных/источник (struct — TVArchive::SrcMode):
Passive — пассивный режим сбора данных, источник самостоятельно помещает данные в архив;
PassiveAttr — пассивный режим сбора данных у атрибута параметра, атрибут параметра самостоятельно помещает данные в архив;
ActiveAttr — активный режим сбора данных у атрибута параметра, атрибут параметра периодически опрашивается подсистемой "Архивы".
Публичные методы:
TVArchive( const string &id, const string &db, TElem *cf_el ); — Инициализирующий конструктор архива. Где <id> — идентификатор архива, <db> — БД для хранения и <cf_el> — cтруктура БД архивов значений.
string id( ); — Идентификатор архива.
string name( ); — Имя архива.
string dscr( ); — Описание архива.
SrcMode srcMode( ); — Режим связывания с источником данных.
string srcData( ); — Параметры источника данных, в случае режима доступа к параметру это адрес параметра.
AutoHD<TVal> srcPAttr( bool force = false, const string &ipath = "" ); — Подключение к ассоциированному атрибуту параметра источника данных.
bool toStart( ); — Признак: "Запускать архив при включении".
bool startStat( ); — Состояние: "Архив запущен".
string DB( ); — Адрес БД архива значений.
string tbl( ); — Таблица БД архива значений.
string fullDB( ); — Полное имя таблицы БД архива значений.
long long end( const string &arch = BUF_ARCH_NM ); — Время окончания архива в целом (arch="") или указанного архиватора, буфера (arch="<bufer>").
long long begin( const string &arch = BUF_ARCH_NM ); — Время начала архива в целом (arch="") или указанного архиватора, буфера (arch="<bufer>").
long long period( const string &arch = BUF_ARCH_NM ); — Периодичность буфера архива или указанного архиватора (микросекунд).
TFld::Type valType( ); — Тип архивируемого значения.
bool hardGrid( ); — Использование жесткой сетки в буфере архива.
bool highResTm( ); — Использование высокого разрешения времени в буфере архива (микросекунды).
int size( ); — Размер буфера архива (единицы).
void setName( const string &inm ); — Установка имени архива.
void setDscr( const string &idscr ); — Установка описания архива.
void setSrcMode( SrcMode vl, const string &isrc = "" ); — Установка режима связывания с источником данных.
void setToStart( bool vl ); — Установка признака: "Запускать архив при включении".
void setValType( TFld::Type vl ); — Установка типа архивируемого значения.
void setHardGrid( bool vl ); — Установка использования жесткой сетки в буфере архива.
void setHighResTm( bool vl ); — Установка использования высокого разрешения времени в буфере архива (микросекунды).
void setSize( int vl ); — Установка размера буфера архива (единиц).
void setPeriod( long long vl ); — Установка периодичности буфера архива.
void start( ); — Запуск архива.
void stop( bool full_del = false ); — Останов архива, с полным удалением <full_del>.
TVariant getVal( long long *tm = NULL, bool up_ord = false, const string &arch = "", bool onlyLocal = false ); — Запрос одного значения за время <tm> и признаком притягивания к верху <up_ord> из указанного архиватора <arch>, буфера (arch="<bufer>") или всех архиваторов по мере падения качества (arch=""). Для обработки запроса только локальной станцией устанавиливается <onlyLocal>.
void getVals( TValBuf &buf, long long beg = 0, long long end = 0, const string &arch = "", int limit = 100000, bool onlyLocal = false ); — Запрос кадра значений <buf> за время от <beg> до <end> из указанного архиватора <arch>, буфера (arch="<bufer>") или всех архиваторов по мере падения качества (arch=""), с ограничением размера запроса в <limit> записей. Для запроса только локальных архивов, без компенсации пробелов архивов из резервных станций, устанавливается <onlyLocal>.
void setVals( TValBuf &buf, long long beg, long long end, const string &arch ); — Загрузка кадра значений <buf> за время от <beg> до <end> в указанный архиватор <arch>, буфер (arch="<bufer>") или все архиваторы (arch="").
void getActiveData( ); — Опросить источник данных. Используется подсистемой для периодического сборa данных активными архивами.
void archivatorList( vector<string> &ls ); — Список архиваторов, которыми обслуживается архив.
bool archivatorPresent( const string &arch ); — Проверка архиватора на обслуживание данного архива.
void archivatorAttach( const string &arch ); — Подключение данного архива на обслуживание указанным архиватором.
void archivatorDetach( const string &arch, bool full = false ); — Отключение данного архива от обслуживание указанным архиватором.
void archivatorSort( ); — Сортировка обслуживающих архиваторов в порядке ухудшения качества.
string makeTrendImg( long long beg, long long end, const string &arch, int hsz = 650, int vsz = 230 ); — Формирование изображения (pdf) тренда за указанный промежуток времени <beg>, <end> и указанного архиватора <arch>.
TValBuf( ); — Инициализатор буфера с установками по умолчанию.
TValBuf( TFld::Type vtp, int isz, long long ipr, bool ihgrd = false, bool ihres = false ); — Инициализатор буфера с указанными параметрами.
void clear( ); — Очистка буфера.
TFld::Type valType( ); — Тип значения, хранимого буфером.
bool hardGrid( ); — Работа буфера в режиме жесткой сетки.
bool highResTm( ); — Работа буфера в режиме времени высокого разрешения (микросекунды).
int size( ); — Максимальный размер буфера (едениц).
int realSize( ); — Реальный размер буфера (едениц).
long long period( ); — Периодичность значений в буфере (микросекунд). Если периодичность нулевая то буфер функционирует в режиме свободного доступа.
long long begin( ); — Время начала буфера (микросекунд).
long long end( ); — Время окончания буфера (микросекунд).
bool vOK( long long ibeg, long long iend ); — Проверка наличия значений в буфере за указанный промежуток времени от <ibeg> до <iend>.
void setValType( TFld::Type vl ); — Установка типа значения хранимого буфером.
void setHardGrid( bool vl ); — Установка режима жесткой сетки.
void setHighResTm( bool vl ); — Установка режима времени высокого разрешения (микросекунды).
void setSize( int vl ); — Установка размера буфера (едениц).
void setPeriod( long long vl ); — Установка периодичности значений в буфере (микросекунд).
virtual void getVals( TValBuf &buf, long long beg = 0, long long end = 0 ); — Запрос кадра значений <buf> за время от <beg> до <end>.
virtual string getS( long long *tm = NULL, bool up_ord = false ); — Запрос значения строкового типа за время <tm> и признаком притягивания к верху <up_ord>.
virtual double getR( long long *tm = NULL, bool up_ord = false ); — Запрос значения вещественного типа за время <tm> и признаком притягивания к верху <up_ord>.
virtual int getI( long long *tm = NULL, bool up_ord = false ); — Запрос значения целого типа за время <tm> и признаком притягивания к верху <up_ord>.
virtual char getB( long long *tm = NULL, bool up_ord = false ); — Запрос значения логического типа за время <tm> и признаком притягивания к верху <up_ord>.
virtual void setVals( TValBuf &buf, long long beg = 0, long long end = 0 ); — Установка кадра значений из <buf> за время от <beg> до <end>.
virtual void setS( const string &value, long long tm = 0 ); — Установка значения строкового типа с временем <tm>.
virtual void setR( double value, long long tm = 0 ); — Установка значения вещественного типа с временем <tm>.
virtual void setI( int value, long long tm = 0 ); — Установка значения целого типа с временем <tm>.
virtual void setB( char value, long long tm = 0 ); — Установка значения логического типа с временем <tm>.
Защищённые методы:
void makeBuf( TFld::Type v_tp, int isz, long long ipr, bool hd_grd, bool hg_res ); — Пересоздание буфера для указанных параметров.
5.4. Модульный объект типа архиватора (TTipArchivator)
Наследует:
TModule.
Наследуется:
Корневыми объектами модулей подсистемы «Архивы».
Публичные методы:
void messList( vector<string> &list ); — Список архиваторов сообщений.
bool messPresent( const string &iid ); — Проверка на наличие указанного архиватора сообщений.
int archPeriod( ); — Периодичность архивирования значений архиватором. Время через которое архиватор производит архивирование кадра значений из буфера архива.
bool toStart( ); — Признак «Запускать архиватор».
bool startStat( ); — Состояние архиватора «Запущен».
string DB( ); — Адрес БД архиватора.
string tbl( ); — Адрес таблицы БД архиватора.
string fullDB( ); — Полный адрес таблицы БД архиватора.
void setName( const string &inm ); — Установка имени архиватора.
void setDscr( const string &idscr ); — Установка описания архиватора.
virtual void setArchPeriod( int iper ); — Установка периодичности архивирования значений архиватором. Время через которое архиватор производит архивирование кадра значений из буфера архива.
void setToStart( bool vl ); — Установка признака "Запускать арзиватор".
TVArchEl( TVArchive &iachive, TVArchivator &iarchivator ); — Инициализирующий конструктор для связи архива <iachive> с архиватором <iarchivator>.
virtual void fullErase( ); — Полное удаление элемента.
virtual long long end( ); — Время конца данных (микросекунды).
virtual long long begin( ); — Время начала данных (микросекунды).
long long lastGet( ); — Время последнего сброса данных из буфера в хранилище.
TVariant getVal( long long *tm, bool up_ord, bool onlyLocal = false ); — Запрос значения за время <tm> и признаком притягивания к верху <up_ord>, с указанием запроса только локального архива в <onlyLocal>.
void getVals( TValBuf &buf, long long beg = 0, long long end = 0, bool onlyLocal = false ); — Запрос кадра значений <buf> за время от <beg> до <end>, с указанием запроса только локального архива в <onlyLocal>.
void setVals( TValBuf &buf, long long beg = 0, long long end = 0 ); — Установка кадра значений из <buf> за время от <beg> до <end>.
long long prev_tm; — Время предыдущего значения. Используется для усреднения.
string prev_val; — Предыдущее значение. Используется для усреднения.
Защищённые методы:
virtual TVariant getValProc( long long *tm, bool up_ord ); — Функция обработки запроса одного значения из архива.
virtual void getValsProc( TValBuf &buf, long long beg, long long end ); — Функция обработки запроса модулем на получение данных.
virtual void setValsProc( TValBuf &buf, long long beg, long long end ); — Функция обработки запроса модулем на установку данных.
6. Подсистема "Транспорты" (TTransportS)
Подсистема «Транспорты» представлена объектом TTransportS, который содержит на уровне подсистемы модульные объекты типов транспортов TTipTransport. Каждый тип транспорта содержит объекты входящих TTransportIn и исходящих TTransportOut транспортов. Общая структура подсистемы приведена на рис. 6.
Рис. 6. Слоистая структура подсистемы транспортов.
Корневой объект модуля подсистемы "Транспорты" содержит информацию о конкретно взятом типе модуля и внешних OpenSCADA хостах/станциях. В рамках отдельно взятого модуля может быть реализована собственная общемодульная функциональность. В общем, для всех модулей, содержатся методы доступа к входящим и исходящим транспортам конкретно взятого модуля.
Объект входящего транспорта TTransportIn предоставляет интерфейс к реализации модульного метода входящего транспорта.
Объект исходящего транспорта TTransportOut предоставляет интерфейс к реализации модульного метода исходящего транспорта.
6.1. Объект подсистемы «Транспорты» (TTransportS)
Наследует:
TSubSYS.
Данные:
Структура внешних OpenSCADA хостов/станций (class TTransportS::ExtHost):
void inDel( const string &name, bool complete = false ); — Удаление входящего транспорта. Возможно полное удаление, включающее и БД, путём установки признака <complete>.
void outDel( const string &name, bool complete = false ); — Удаление исходящего транспорта. Возможно полное удаление, включающее и БД, путём установки признака <complete>.
virtual int messIO( const char *obuf, int len_ob, char *ibuf = NULL, int len_ib = 0, int time = 0, bool noRes = false ); — Отправка данных через транспорт. Время ожидания <time> соединения указывается в милисекундах. <noRes> используется протоколами для монопольного блокирования транспорта на время работы с ним и исключения собственной блокировки функцией.
void messProtIO( XMLNode &io, const string &prot ); — Отправка данных в дереве XML <in> через транспорт, используя транспортный протокол <prot>.
TTipTransport &owner( ); — Тип транспорта – владелец исходящим транспортом.
Подсистема «Протоколы коммуникационных интерфейсов» представлена объектом TProtocolS, который содержит на уровне подсистемы модульные объекты отдельных протоколов TProtocol. Каждый протокол содержит объекты открытых сеансов входящих протоколов TProtocolIn.
Объект TProtocolS предоставляет доступ к входящим и исходящим протоколам отдельно взятых типов транспортных протоколов. Внутренняя сторона исходящего протокола строится по потоковому принципу с индивидуальной структурой потока для каждой реализации протокола.
7.1. Объект подсистемы «Протоколы коммуникационных интерфейсов» (TProtocolS)
Подсистема «Пользовательские интерфейсы» представлена объектом TUIS, который содержит на уровне подсистемы модульные объекты пользовательских интерфейсов TUI.
8.1. Объект подсистемы «Пользовательские интерфейсы» (TUIS)
Подсистема безопасности представлена объектом TSeсurity, который содержит объекты групп TGroup и пользователей TUser.
Объект пользователя TUser содержит пользовательскую информацию и выполняет проверку аутентичности пользователя в соответствии с указанным паролем.
Объект пользователя TGroup содержит информацию о группе пользователей и выполняет проверку на принадлежность пользователя к группе.
10.1. Объект подсистемы «Безопасность» (TSeсurity)
Наследует:
TSubSYS.
Публичные методы:
bool access( const string &user, char mode, int owner, int group, int access ); — Проверка доступа для пользователя <user> с правами <mode> к ресурсу с владельцем <owner> и группой <access>.
void usrList( vector<string> &list ); — Список пользователей <list>.
void usrGrpList( const string &name, vector<string> &list ); — Список групп пользователей <list>, в которые пользователь <name> включён.
bool usrPresent( const string &name ); — Проверка на наличие указанного пользователя <name>.
int usrAdd( const string &name, const string &db = "*.*" ); — Добавление пользователя <name> с хранением в БД <db>.
void usrDel( const string &name, bool complete = false ); — Удаление пользователя <name> с возможностью полного удаления <complete>.
Объектная модель системы OpenSCADA строится на основе объекта функции TFunction, параметрах функции IO и кадре значений функции TValFunc. В последствии объекты функции включаются в объектное дерево, формируя объектную модель системы. Использование функций объектной модели производится путём связывания кадра значений TValFunc с функцией.
Идея в целом доступно представленна на рис. 7.
Рис. 7. Основа среды программирования системы OpenSCADA.
Объект функции (TFunction) предоставляет интерфейс для формирования параметров функции и алгоритма вычисления в объекте, наследующем его.
Объект параметра функции (IO) содержит конфигурацию отдельно взятого параметра.
Объект кадра значений (TValFunc) содержит значения в соответствии со структурой связанной функции. При исполнении алгоритма ассоциированой функции используются значения этого объекта.
12.1. Объект функции (TFunction)
Наследует:
TCntrNode
Наследуется:
Модулями и узлами систем, содержащими функции для публикации в объектную модель системы.
Публичные методы:
TFunction( const string &iid ); — Инициализирующий конструктор функции с идентификатором <id>.
virtual void preIOCfgChange( ); — Вызывается перед изменением конфигурации.
virtual void postIOCfgChange( ); — Вызывается после изменения конфигурации.
TValFunc *ctxGet( int key ); — Получение контекста для ключа <key>.
void ctxSet( int key, TValFunc *val ); — Установка контекста для ключа <key>.
void ctxClear( ); — Очистка контекста вызовов внешних функций.
13. Данные в системе OpenSCADA и их хранение в БД (TConfig)
Хранение данных в системе основано на объектах TConfig и TElem. Эти объекты хранят структуру и значения полей БД, что позволяет выполнять прямую загрузку и сохранение конфигурации через подсистему «БД». Для специализированного хранения данных разных типов предусмотрен объект TVariant.
Объект TElem содержит структуру записи БД. Структура записи содержит исчерпывающую информацию об элементах, их типах, размерах и остальных параметрах. Информации в данной структуре достаточно для создания, контроля и управления реальной структурой БД. Элементарной единицей записи является ячейка Tfld.
Объект TСonfig является наследником от TElem и содержит реальные значения элементов. TConfig используется в качестве параметра в функциях манипуляции с записями таблиц в подсистеме «БД». Элементарной единицей записи является ячейка TCfg.
Для предоставления возможности предупреждения хранилища данных о смене структуры предусмотрен объект TValElem, от которого наследуется хранилище TConfig и список которых содержится в структуре TElem.
13.1. Объект данных (TConfig)
Наследует:
TValElem
Наследуется:
TParamContr, TController, TMArchivator, TPrmTempl, TPrmTmplLib, TUser, TGroup, TTransportIn, TTransportOut, TBD, TVArchive, TVArchivator, а также модульные объекты хранящие свои данные в БД.
TCfg *at( const string &n_val, bool noExpt = false ); — Получение указателя на элемент <n_val>. В случае отсутствия элемента генерируется исключение или возвращается нулевой указатель при установке <noExpt>.
void cfgViewAll( bool val = true ); — Установка/снятие признака видимости для всех элементов.
void cfgKeyUseAll( bool val ); — Установка/снятие признака использования ключа для всех элементов.
TElem &elem( ); — Используемая структура.
void setElem( TElem *Elements, bool first = false ); — Назначение структуры в <Elements>.
void cntrCmdMake( XMLNode *fld, const string &path, int pos, const string &user = "root", const string &grp = "root", int perm = 0664 ); — Формирование информационного описания элементов конфигурации для интерфейса управления OpenSCADA.
bool keyUse( ); — Признак - «Использовать ключ», для запросов dataSeek() и dataDel().
bool noTransl( ); — Признак «Отключить перевод» предназначен для отключения механизма перевода текстовых переменных для данной записи на время одного запроса.
void setView( bool vw ); — Установка признака «Ячейка видима» в <vw>.
void setKeyUse( bool vl ); — Установка признака «Использовать ключ» в <vl>.
void setNoTransl( bool vl ); — Установка признака «Отключить перевод».
TFld &fld( ); — Конфигурация ячейки.
string getSEL( ); — Получить значение выборочного типа.
string getS( ); — Получить значение строкового типа.
const char *getSd( ); — Получить прямой доступ к значению строкового типа, только для чтения.
double &getRd( ); — Получить прямой доступ к значению вещественного типа.
int &getId( ); — Получить прямой доступ к значению целого типа.
char &getBd( ); — Получить прямой доступ к значению логического типа.
void setSEL( const string &val, char RqFlg = 0 ); — Установить значение выборочного типа в <val> с флагами запроса <RqFlg>.
void setS(const string &val); TCfg &operator=(const string &vl); TCfg &operator=(const char *vl); void setS(const string &val, char RqFlg); — Установить значение строкового типа в <val> с флагами запроса <RqFlg>.
void setR(double val); TCfg &operator=(double vl); void setR(double val, char RqFlg); — Установить значение вещественного типа в <val> с флагами запроса <RqFlg>.
void setI(int val); TCfg &operator=(int vl); void setI(int val, char RqFlg); — Установить значение целого типа в <val> с флагами запроса <RqFlg>.
void setB(char val); TCfg &operator=(bool vl); void setB(char val, char RqFlg); — Установить значение логического типа в <val> с флагами запроса <RqFlg>.
13.3. Объект структуры данных (TElem)
Наследуется:
TTipParam, TControllerS, TTipController, а также модульными объектами, совмещающими функции хранения структуры.
Публичные методы:
TElem( const string &name = "" ); — Инициализация структуры с указанным именем <name>.
string &elName( ); — Имя структуры.
void fldList( vector<string> &list ); — Список ячеек в структуре <list>.
unsigned fldSize( ); — Количество ячеек в структуре.
unsigned fldId( const string &name, bool noex = false); — Получение индекса ячейки по её идентификатору <name>. В случае установки <noex>, при отсутствии ячейки будет возвращаться общее количество ячеек, а не осуществляться генерация исключения.
bool fldPresent( const string &name ); — Проверка на наличие указанной ячейки <name>.
int fldAdd( TFld *fld, int id = -1 ); — Добавление/вставка ячейки <fld> в позицию <id> (-1 — вставка в конец).
void fldDel( unsigned int id ); — Удаление ячейки <id>.
TFld &fldAt( unsigned int id ); — Получение ячейки <id>.
void valAtt( TValElem *cnt ); — Вызывается автоматически в случае подключения структуры к хранилищу данных <cnt>.
void valDet( TValElem *cnt ); — Вызывается автоматически в случае отключения структуры от хранилища данных <cnt>.
13.4. Ячейка структуры данных (TFld)
Данные:
Тип ячейки (enum – TFld::Type):
TFld::Boolean(0) — логический тип;
TFld::Integer(1) — целочисленный тип;
TFld::Real(4) — вещественный тип;
TFld::String(5) — строковый тип.
Флаги ячейки (enum — TFld::AttrFlg):
TFld::NoFlag(0x00) — флаги отсутствуют;
TFld::Selected(0x01) — режим выборки из доступных значений, выборочный тип;
TFld::SelfFld(0x02) — создавать собственную копию этой ячейки;
TFld::NoWrite(0x04) — недоступна для записи;
TFld::HexDec(0x08) — целый тип: шестнадцатеричное представление;
TFld::OctDec(0x10) — целый тип: восьмеричное представление;
TFld::DateTimeDec(0x20) — целый тип: содержит дату в UTC;
TFld::FullText(0x08) — полнотекстовый, многострочный, режим тестового типа;
TFld::NoStrTransl(0x10) — не выполнять перевод строковых переменных.
TFld &operator=( TFld &fld ); — Копирование ячейки из <fld>.
const string &name( ); — Имя ячейки.
const string &descr( ); — Описание ячейки.
int len( ); — Размер значения ячейки (символов в символьном представлении).
int dec( ); — Размер дробной части для вещественного (символов в символьном представлении).
Type type( ); — Тип ячейки.
static Type type(IO::Type tp); — Тип ячейки из IO::Type типа.
IO::Type typeIO( ); — Тип ячейки в IO::Type.
unsigned flg( ); — Флаги ячейки.
const string &def( ); — Значение по умолчанию.
string values( ); — Рабочий диапазон значения или перечень возможных значений для выборочного типа (в виде — "vl1;vl2;vl3").
string selNames( ); — Перечень имён значений для выборочного типа (в виде — "Value 1;Value 2;Value 3").
const string &reserve( ); — Резервный параметр.
void setDescr( const string &dscr ); — Установка описания в <dscr>.
void setLen( int vl ); — Установка размера ячейки в <vl>.
void setDec( int vl ); — Установка дробной части для вещественного, в <vl>.
void setDef( const string &def ); — Установка значения по умолчанию в <def>.
void setFlg( unsigned flg ); — Установка флагов в <flg>.
void setValues( const string &vls ); — Установка рабочего диапазона значения или перечня возможных значений для выборочного типа (в виде — "vl1;vl2;vl3") в <vls>.
void setSelNames( const string &slnms ); — Установка перечня имён значений для выборочного типа (в виде — "Value 1;Value 2;Value 3") в <slnms>.
void setReserve( const string &ires ); — Установка резервного параметра в <res>.
const vector<string> &selValS(); — Список вариантов значений для строкового типа.
const vector<int> &selValI(); — Список вариантов значений для целого типа.
const vector<double> &selValR(); — Список вариантов значений для вещественного типа.
const vector<bool> &selValB(); — Список вариантов значений для логического типа.
const vector<string> &selNm(); — Список имён вариантов значений.
string selVl2Nm( const string &val ); — Получить выбранное имя по значению <val> строкового типа.
string selVl2Nm( int val ); — Получить выбранное имя по значению целого <val> типа.
string selVl2Nm( double val ); — Получить выбранное имя по значению <val> вещественного типа.
string selVl2Nm( bool val ); — Получить выбранное имя по значению <val> логического типа.
string selNm2VlS( const string &name ); — Получить значение строкового типа по выбранному имени <name>.
int selNm2VlI( const string &name ); — Получить значение целого типа по выбранному имени <name>.
double selNm2VlR( const string &name ); — Получить значение вещественного типа по выбранному имени <name>.
bool selNm2VlB( const string &name ); — Получить значение логического типа по выбранному имени <name>.
XMLNode *cntrCmdMake( XMLNode *opt, const string &path, int pos, const string &user = "root", const string &grp = "root", int perm = 0664 ); — Создать элемент формы в соответствии с параметрами ячейки.
13.5. Объект упреждения про смену структуры (TValElem)
Наследуется:
TValue, TConfig.
Защищённые методы:
virtual void detElem( TElem *el ); — Уведомление элементом <el> контейнера про желание отключиться.
virtual void addFld( TElem *el, unsigned id ) = 0; — Уведомление про добавление ячейки <id> елемента <el>.
virtual void delFld( TElem *el, unsigned id ) = 0; — Уведомление про удаление ячейки <id> елемента <el>.
13.6. Ячейка данных (TVariant)
Данные:
Значения ошибки для различных типов данных (define):
EVAL_BOOL — Значение ошибки логического (2);
EVAL_INT — Значение ошибки целого (-2147483647);
EVAL_REAL — Значение ошибки вещественного (-3.3E308);
EVAL_STR — Значение ошибки строкового ("<EVAL>").
Типы данных (enum — TVariant::Type):
TVariant::Null — тип данных и данные не установлены.
TVariant::Boolean — логический тип (boolean, 8бит).
TVariant::Integer — целочисленный тип (integer, 32бит).
TVariant::Real — вещественный тип (double).
TVariant::String — строка.
TVariant::Object — объект.
Публичные методы:
TVariant( ); — Конструктор по умолчанию.
TVariant( char ivl ); — Конструктор для логического типа.
TVariant( int ivl ); — Конструктор для целого типа.
TVariant( double ivl ); — Конструктор для вещественного типа.
TVariant( string ivl ); — Конструктор для строки.
TVariant( const char *var ); — Конструктор для строки.
virtual TVariant funcCall( const string &id, vector<TVariant> &prms ); — Вызов функции объекта с идентификатором <id> и параметрами <prms>.
14. Интерфейс управления системой и динамическое дерево объектов системы (TCntrNode)
Для полного покрытия ключевых компонентов системы сетью объектов единой структуры предназначен объект узла динамического дерева TCntrNode. На этот объект возлагаются следующие функции:
единообразного доступа к компонентам системы, включая блокировки динамического доступа;
построение распределённого интерфейса управления.
Любой объект, имеющий потребность в предоставлении динамического доступа к себе или своим компонентам должен наследоваться от объекта узла динамического дерева TCntrNode. Данное родство автоматически включает узел в динамическое дерево объектов, охваченное как прямой, так и обратной связью, а также предоставляет возможность создания контейнеров под собственные дочерние узлы. В дополнении к этому узел получает возможность упреждения про включение и исключение/удаление узла из дерева с возможностью отказа от исключения/удаления.
Интерфейс управления системы включён в состав объекта TCntrNode и, соответственно, охватывает все узлы динамического дерева системы, позволяя единообразно управлять системой вне зависимости от используемого клиентского инструмента. Интерфейс управления системой выполнен на основе языка разметки XML. Можно придумать множество способов использования интерфейса управления системой, в качестве примера отметим следующие наиболее яркие решения:
Web интерфейс конфигурации;
GUI интерфейс конфигурации (QT, GTK+, ...);
отражение конфигурации в сеть для распределённого управления множеством OpenSCADA-станций из единой среды администрирования;
использование в роли протокола для доступа к данным объектов из сети;
предоставление сервисных функций для доступа третьих приложений и отдельных компонентов OpenSCADA к внутренним данным.
Интерфейс управления системой реализован посредством составляющих:
информационной структуры конфигурационной пользовательской страницы;
динамической части в виде запросов на получение, модификацию данных и сервисных запросов;
контейнера или группы вышеуказанных элементов.
Информационная иерархическая структура содержит информацию о публичных элементах управления и может быть использована для построения пользовательских диалогов управления узлами системы.
Динамическая часть содержит сценарии обслуживания запросов к элементам управления, описанным в информационной структуре, а также скрытые элементы управления в виде сервисных функций, используемые для унифицированного доступа к узлу.
Контейнер позволяет собрать в один запрос несколько информационных структур и динамических частей, оптимизируя тем самым время запроса особенно на сетевых высоколатентных интерфейсах.
Общий интерфейс управления строится из отдельных узлов динамического дерева. Иерархическое наследование от объекта TCntrNode позволяет реализовывать многоуровневое дополнение конфигурации интерфейса управления. Общий вид динамического дерева узлов представлен на рис. 8.
Рис. 8. Пример динамического дерева узлов системы OpenSCADA.
Узлы системы, содержащие данные для интерфейса управления системой также должны подключаться в динамическое дерево объектов.
Подключение узла в динамическое дерево производится следующим образом:
наследование объекта TCntrNode или его потомка;
формирование информационной структуры;
обслуживание запросов к динамическим данным.
14.1. Синтаксис запроса и ответа интерфейса управления
Весь обмен с интерфейсом управления производится посредством языка XML. При этом внутренний обмен выполняется разобранной структурой языка XML (DOM), а внешний — посредством преобразования в поток символов сплошного XML-файла и обратно.
Запрос выполняется посредством отправки одного контейнера с некоторыми параметрами в атрибутах. Результат помещается в полученный контейнер с изменением некоторых атрибутов корневого контейнера. В общем виде контейнер запроса можно записать следующим образом: <cmd path="/TreePath" user="user" force="1"/>
Где:
cmd — команда запроса; path — путь к узлу или ветви узла; user — пользователь системы от имени которого направлен запрос; force — признак выполнить запрос без предупреждения.
В подтверждение результата запроса устанавливается атрибут результата <rez> в значения: 0-запрос прошел, 1-предупреждение (с возможностью выполнения), 2-ошибка. В случае ошибки и предупреждения сообщения записываются в текст контейнера и атрибут mcat (категория сообщения): <cmd path="/TreePath" user="user" force="1" rez="2" mcat="sub_DAQ/mod_BlockCalc>Невозможно удалить узел</cmd>.
Группирующий запрос <CntrReqs> обрабатываются на уровне API узла и не требуют отдельной обработки в пользовательском коде. Фактически в тег <CntrReqs> могут помещаться любые другие запросы с возможностью иерархической группировки путём включения внутренних тегов <CntrReqs>. Единственным атрибутом этого тега является атрибут path, который указывает путь к узлу и является основой для внутренних запросов.
14.2. Тег информационной структуры для описания групп дочерних веток страницы
Каждая страница может содержать группы дочерних ветвей. Для описания групп ветвей предусмотрен тег <branches>. Тег содержит описание групп ветвей посредством вложенных тегов <grp>. К тегу группы возможен доступ как на "чтение" (видимость) так и на модификацию (выполнение команд добавления и удаления элементов группы), следовательно элемент триады доступа может принимать значения:
00 — доступ вообще отсутствует; 04 — присутствует доступ только на чтение; 02 — присутствует доступ только на запись, обычно такое значение не имеет смысла поскольку доступ на запись подразумевает и доступ на чтение; 06 — присутствует доступ и на чтение, и на запись.
Действия над группой элементов полностью совпадают с действиями над списком визуальных элементов "list", о котором написано ниже.
14.3. Теги описания информационной структуры интерфейса управления
Информационные теги для языка XML составляют алфавит формирования описания конфигурационных диалогов. Команда запроса информационной части имеет вид: <info path="/TreePath" user="user"/>
В результате запроса будет получена информационная структура страницы в соответствии с привилегиями указанного пользователя.
14.3.1. Тег области <area>
Области описываются тегом <area> и предназначены для группировки элементов по различным признакам. Область может включать другие элементы и области. Корневые области формируют закладки в представлении пользовательского интерфейса. К тегу возможен доступ только на "чтение" или видимость, следовательно элемент триады доступа может принимать значение 00, если доступ отсутствует, или 04, если присутствует.
К тегу возможен доступ как на "чтение", так и на "запись", следовательно элемент триады доступа может принимать значения:
00 — доступ вообще отсутствует; 04 — присутствует доступ только на чтение; 02 — присутствует доступ только на запись, обычно такое значение не имеет смысла поскольку доступ на запись подразумевает и доступ на чтение; 06 — присутствует доступ и на чтение и на запись.
Тип элемента, описываемого тегом <fld>, указывается атрибутом <tp> (таблица 2).
<list id='mod_auto' dscr='List of shared libs(modules)' tp='str' dest='file'/>
К тегу возможен доступ как на "чтение", так и на "запись"(модификацию), следовательно элемент триады доступа может принимать значения:
00 — доступ вообще отсутствует; 04 — присутствует доступ только на чтение; 02 — присутствует доступ только на запись, обычно такое значение не имеет смысла поскольку доступ на запись подразумевает и доступ на чтение; 06 — присутствует доступ и на чтение и на запись.
Тип элементов в списке указывается атрибутом <tp>. Значения атрибута <tp> приведены в таблице 1.
Таблица 4. Действия над списком.
Операция
Действие
Опрос
Запрос: команда «get»: <get path="/fld_teg" user="user"/> Результат: подтверждение с результатом в тексте тега или сообщение об ошибке. Результат формируется в виде:
Запрос: команда "add": <add path="/fld_teg" user="user" id="tst">Test</add>
Читается, как добавить строку с идентификатором «tst» и значением «Test». Если список не индексированный, то атрибут id отсутствует.
Результат: подтверждение или сообщение об ошибке.
Вставка строки
Запрос: команда "ins": <ins path="/fld_teg" user="user" pos="3" p_id="tst1" id="tst">Test</ins>
Читается, как вставить строку с идентификатором «tst» и значением «Test» в позицию 3 со строкой «tst1». В случае индексного списка атрибут p_id содержит идентификатор, иначе — текст строки. Если список не индексирован, то атрибут id отсутствует.
Результат: подтверждение или сообщение об ошибке.
Удаление строки
Запрос: команда "del": <del path="/fld_teg" user="user" pos='3' id='tst'>Test</del>
Читается, как удалить строку с идентификатором «tst» и значением «Test» в позиции 3. Если список не индексирован, то атрибут id отсутствует.
Результат: подтверждение или сообщение об ошибке.
Изменение строки
Запрос: команда "edit": <edit path="/fld_teg" user="user" pos='3' p_id='tst1' id='tst' >Test</edit>
Читается, как заменить строку в позиции 3 с идентификатором "tst1" на строку с идентификатором «tst» и значением «Test». В случае индексированного списка атрибут p_id содержит идентификатор, иначе — текст строки. Если список не индексирован, то атрибут id отсутствует.
Результат: подтверждение или сообщение об ошибке.
Перемещение строки
Запрос: команда "move": <move path="/fld_teg" user="user" pos='3' to='5'/>
Читается, как переместить строку с позиции 3 в позицию 5.
К тегу таблицы и колонкам отдельно возможен доступ как на "чтение", так и на "запись"(модификацию), следовательно элемент триады доступа может принимать значения:
00 — доступ вообще отсутствует; 04 — присутствует доступ только на чтение; 02 — присутствует доступ только на запись, обычно такое значение не имеет смысла поскольку доступ на запись подразумевает и доступ на чтение; 06 — присутствует доступ и на чтение и на запись.
Если указан атрибут <key> и в нём перечислены ключевые колонки, то работа с таблицей переходит в режим адресации по идентификаторам колонок и ключам.
Таблица 5. Действия над таблицей.
Операция
Действие
Опрос
Запрос: команда "get": <get path="/fld_teg" user="user" cols="0;2" rows="100;1000"/>
Читается, как получить колонки 0-2 и строки в них с 100 по 1000 таблицы.
Результат: Подтверждение с данными таблицы или сообщение об ошибке. Результат формируется в виде:
<el id='100'>*:(TSYS)Broken PIPE signal allow!</el>
</list>
</get>
Добавление строки
Запрос: команда "add": <add path="/fld_teg" user="user"/> Результат: подтверждение или сообщение об ошибке.
Вставка строки
Запрос: команда "ins": <ins path="/fld_teg" user="user" row='3'/>
Читается, как вставить строку в позицию 3. Команда не работает при установленном атрибуте <key>!
Результат: подтверждение или сообщение об ошибке.
Удаление строки
Запрос: команда "del": <del path="/fld_teg" user="user" row='3'/> или <del path="/fld_teg" user="user" key_id='Test'/> для ключевого режима
Читается, как удалить строку в позиции 3 или строку в позиции, где значение колонки <id> равно 'Test'.
Результат: подтверждение или сообщение об ошибке.
Перемещение строки
Запрос: команда "move": <move path="/fld_teg" user="user" row='3' to='5'/>
Читается, как переместить строку с позиции 3 в позицию 5. Данная команда не работает при установленном атрибуте <key>!
Результат: подтверждение или сообщение об ошибке.
Изменить ячейку
Запрос: команда "set": <set path="/fld_teg" user="user" row='3' col='id'>Test</set> или <set path="/fld_teg" user="user" key_id='Test' col='id'>Test1</set> для ключевого режима
Читается как — установить значение ячейки в строке 3 и колонке 'id' в «Test» или установка колонки с именем 'id' строки в позиции где значение колонки <id> равно 'Test' в значение 'Test1'. Практически данная команда переименовывает ключевой элемент указанной строки.
Результат: подтверждение или сообщение об ошибке.
d) Тег <img>
<img id='ico' descr='Иконка страницы'/>
К тегу возможен доступ как на "чтение", так и на "запись", следовательно элемент триады доступа может принимать значения:
00 — доступ вообще отсутствует; 04 — присутствует доступ только на чтение; 02 — присутствует доступ только на запись, обычно такое значение не имеет смысла поскольку доступ на запись подразумевает и доступ на чтение; 06 — присутствует доступ и на чтение и на запись.
Тег предназначен для передачи изображений клиентам интерфейса управления. Под изображением могут выступать: иконки страниц, графики массивов значений и другие данные, которые можно представить в графическом виде.
К тегу возможен доступ как на "чтение" или видимость+обслуживание запросов, так и на модификацию или выполнение команды, следовательно элемент триады доступа может принимать значение 00, если доступ отсутствует вообще; 04, если команду можно увидеть; и 06, если команду можно инициировать.
Предназначен для передачи команд и действий узлу, а также может использоваться для создания ссылок на другие страницы. Команды могут включать параметры. Параметры описываются тегом <fld>.
Результатом является подтверждение или сообщение об ошибке.
f) Ветки (дочерние узлы)
<list id='k_br' dscr='Kernel branches' tp='br'/>
Ветки описываются обычным списком <list> со специальными атрибутами tp='br'. Методика запроса и модификации веток полностью совпадает с методикой работы со списком <list>.
14.4 Иерархические зависимости информационных элементов языка управления
Таблица 6. Иерархические зависимости информационных элементов языка:
Тег
Описание
Атрибуты
Содержимое
oscada_cntr
Корневой элемент страницы. Является единственным и служит для идентификации принадлежности к языку интерфейса управления.
id — идентификатор; dscr — описание.
area, img, branches
branches
Контейнер групп дочерних веток узла.
id — идентификатор контейнера. Равен: br.
grp
grp
Группа дочерних узлов.
id — префикс группы дочерних узлов в системе; dscr — описание группы веток; acs — опции доступа.
area
Группировка стандартных тегов.
id — идентификатор; dscr — описание; acs — опции доступа.
area, fld, list, table, comm, img
comm
Команды узлу.
id — идентификатор; dscr — описание; help — помощь по команде; tp — тип команды (lnk — ссылка); acs — опции доступа.
fld
fld
Описание данных стандартных типов.
id — идентификатор; dscr — описание; help — помощь; acs — опции доступа. tp — тип элемента:
str(len, dest, cols, rows(SnthHgl)) — строковый элемент; dec(len, max, min, dest) — целое число в десятичном представлении; oct(len, max, min, dest) — целое число в восьмеричном представлении; hex(len, max, min, dest) — целое число в шестнадцатеричном; real(len, max, min, dest) — вещественное число; bool — логический признак; time — время/дата в секундах (от 01/01/1970).
Связные: len — длина значения (симв.); min — минимум значения; max — максимум значения; cols — количество колонок; rows — количество строк; dest — способ ввода:
data — источник бинарных данных (base64). select(select) — выборный тип; sel_ed(select) — выборный тип с возможностью редактирования.
select — путь к скрытому списку; sel_list — статический список (разделитель ';'); sel_id — статический список идентификаторов (разделитель ';').
list
Список данных стандартных типов.
id — идентификатор; dscr — описание; help — помощь по списку; acs — опции доступа. tp — как в <fld> кроме:
void cntrCmd( XMLNode *opt, int lev = 0, const string &path = "", int off = 0 ); — Команда работы с интерфейсом управления системы. Поддерживаются транспортные переходы по полному пути вида: </sub_Seсurity/usr_root/%2fgen> где %2fgen закодированный вложенный путь к конкретному полю страницы (/gen).
static XMLNode *ctrId( XMLNode *inf, const string &n_id, bool noex = false ); — Получение узла XML по значению атрибута 'id' <n_id>. Поддерживаются запросы XML узла по полному пути к нему вида (node1/node2/node3).
static XMLNode *ctrMkNode( const char *n_nd, XMLNode *nd, int pos, const char *req, const string &dscr int perm=0777, const char *user="root", const char *grp="root", int n_attr=0, ... ); — Добавление элемента управления на страницу. Возможно указание множества дополнительных атрибутов в количестве <n_attr> в виде: <атрибут1>,<значений1>,<атрибут2>,<значений2>,... .
bool ctrRemoveNode( XMLNode *nd, const char *path ); — Удаление элемента управления <path> на странице <nd>.
static bool ctrChkNode( XMLNode *nd, const char *cmd="get", int perm=0444, const char *user="root", const char *grp="root", char mode=04, const char *warn = NULL ); — Проверка на получение динамической команды <cmd> и наличие прав на её исполнение.
virtual Res &nodeRes( ); — Ресурс использования узла.
virtual const char *nodeName( ); — Имя узла.
string nodePath( char sep = 0, bool from_root = false ); — Получение полного пути к узлу, начиная с корня <from_root>, и используя разделитель <sep> или обычную запись пути.
void nodeList( vector<string> &list, const string& gid = "" ); — Список дочерних узлов <list> в указанной группе <gid>.
AutoHD<TCntrNode> nodeAt( const string &path, int lev = 0, char sep = 0, int off = 0, bool noex = false ); — Подключение к дочернему узлу.
void nodeDel( const string &path, char sep = 0, int flag = 0 ); — Удаление узла по его полному пути.
XMLNode* setName( const string &s ); — Установка имени тега в <s>.
string text( bool childs = false, bool recursive = false ) const; — Текст тега. <childs> — для получения текст из специализированных узлов текста.
XMLNode* setText( const string &s, bool childs = false ); — Установка текста тега в <s>. <childs> — для установки текста в специализированный узел текста.
void attrList( vector<string> & list ) const; — Список атрибутов <list> в теге.
void load( const string &vl, bool full = false, const string &cp = "UTF-8" ); — Загрузка/парсинг XML-файла, с кодировкой <cp>. <full> — для полной загрузки XML с блоками текстов и комментариев в специализированных узлах.
XMLNode* childGet( const string &name, const int numb = 0, bool noex = false ) const; — Получение вложенного <numb> порядкового тега по имени тега <name>. <noex> указывает на запрет генерации исключения в случае отсутствия тега.
XMLNode* childGet( const string &attr, const string &name, bool noex = false ) const; — Получение вложенного <numb> порядкового тега по значению <name> атрибута <attr>. <noex> указывает на запрет генерации исключения в случае отсутствия тега.
XMLNode* parent( ); — Родительский тег данного тега.
16. Ресурсы в системе OpenSCADA (Res, ResAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах <Res> и <ResAlloc>. Объект <Res> предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте <ResAlloc> реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта TCntrNode, который содержит механизм подключения через шаблон AutoHD. Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от TCntrNode шаблон AutoHD поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект ресурса (Res)
Публичные методы:
Res( ); — Инициализация ресурса.
static void resRequestW( long tm = 0 ); — Запрос ресурса на запись/модификацию с таймаутом ожидания <tm> (в миллисекундах).
bool resTryW( ); — Попытка захвата ресурса на запись/модификацию. При успешном захвате возвращает "true" иначе "false".
static void resRequestR( long tm = 0 ); — Запрос ресурса на чтение с таймаутом ожидания <tm> (в миллисекундах).
bool resTryR( ); — Попытка захвата ресурса на чтение. При успешном захвате возвращает "true" иначе "false".
ResAlloc( Res &rid ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>.
ResAlloc( Res &rid, bool write, long tm = 0 ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>. С указанием типа ресурса <write> (чтение/запись).
void request( bool write = false, long tm = 0 ); — Запрос ресурса в указанном режиме <write> (чтение/запись).
void release( ); — Освобождение ресурса.
16.3. Шаблон (AutoHD)
Публичные методы:
AutoHD( ); — Инициализация без привязки к объекту.
AutoHD( ORes *node, const string &who = "" ); — Инициализация с привязкой к объекту <node>. Объект должен содержать функцию AHDConnect() и AHDDisConnect().
template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s ); — Конструктор приведения типов в безопасном режиме приведения (посредством dynamic_cast). Возвращает свободный ресурс в случае невозможности приведения.
ORes &at( ) const; — Получение объекта за ресурсом.
ResString &operator=( const string &val ); — Функция неявного преобразования из std::string.
operator string( ); — Функция неявного преобразования в std::string.
size_t size( ); — Размер строки.
bool empty( ); — Строка пуста.
void setVal( const string &vl ); — Установка значения строки в <vl>.
const string &getVal( ); — Получение значения строки.
const string &getValRef( ); — Получение прямой ссылки на строку std::string. Ресурс игнорируется в случае использования этой функции!
17. Организация и структура базы данных компонентов системы
Узлы и подсистемы системы OpenSCADA могут иметь собственные таблицы в БД для хранения своих данных. При этом структура таблиц индивидуальна и определяется объектом <TConfig>. Узлы и подсистемы должны создавать и конфигурировать объект <TConfig> под свои требования.
17.1. Системные таблицы
Система OpenSCADA имеет две системные таблицы BD и SYS. Таблица BD содержит записи зарегистрированных БД, а таблица SYS содержит данные общесистемных параметров.
Контроллеры (источники данных) подсистемы "Сбор данных" хранятся в таблицах своих подсистем с именем DQA_<ModName>. Структуры этих таблиц могут значительно отличаться, однако у всех них присутствуют обязательные поля. Общая структура таблиц контроллеров представлена в таблице 9.
Таблица 9. Общая структура таблиц контроллеров подсистемы "Сбор данных" (DQA_<ModName>).
Идентификатор <ID>
Имя контроллера <NAME>
Описание <DESCR>
Включать<ENABLE>
Запускать <START>
Индивидуальные параметры
AutoDA
Автоматический источник
Сбор данных из активных источников с автоматическим их выявлением.
1
1
...
Также как и таблица контроллеров, таблицы параметров для различных типов источников данных могут значительно отличаться, но также имеют обязательные поля. Кроме отличия, характерного для типа источника данных, таблицы параметров ещё могут быть разными для различных типов параметров. Общая структура таблицы параметров приведена в таблице 10.
Таблица 10. Общая структура таблиц параметров подсистемы "Сбор данных".
Шифр параметра <SHIFR>
Имя параметра <NAME>
Описание параметра <DESCR>
Включать <EN>
Индивидуальные параметры
P3
P3
Давление на диафрагме
1
...
Кроме контроллеров и параметров подсистема "Сбор данных" содержит шаблоны параметров. Шаблоны параметров сгруппированы по библиотекам шаблонов и хранятся в таблицах трёх типов: таблица библиотек шаблонов (ParamTemplLibs) таблица 11, таблица шаблонов параметров таблица 12 и таблица параметр шаблонов таблица 13.
Таблица 11. Структура таблицы библиотек шаблонов.
Идентификатор <ID>
Имя <NAME>
Описание <DESCR>
Таблица БД библиотеки <DB>
base
Базовые шаблоны
Библиотека базовых шаблонов
tmplib_base
S7
Библиотека шаблонов для контроллеров серии Siemens S7.
tmplib_S7
Таблица 12. Структура таблицы шаблонов.
Идентификатор <ID>
Имя <NAME>
Описание <DESCR>
Текст процедуры шаблона <PROGRAM>
digAlarm
Дискр. сигнал
Сигнализация по дискретному параметру
JavaLikeCalc.JavaScript
simpleBoard
Простые границы
Формирование простых границ для аналогового сигнала.
JavaLikeCalc.JavaScript
Таблица 13. Структура таблицы параметров шаблонов.
Идентификатор шаблона <TMPL_ID>
Идентификатор параметра <ID>
Имя <NAME>
Тип <TYPE>
Флаги <FLAGS>
Значение <VALUE>
Позиция <POS>
digAlarm
in
Вход
3
144
2
digitBlock
cmdOpen
Команда открытия
3
161
Параметр:com
0
17.3. Таблицы подсистемы “Транспорты”
Подсистема “Транспорты” делится на входящие и исходящие транспорты. Для каждого типа транспортов существует своя таблица с собственной структурой. Имена таблиц соответственно: Transport_In и Transport_Out. Таблицы могут дополняться полями, характерными для типа транспорта.
Таблица 14. Структура таблицы входящих транспортов (Transport_in).
Идентификатор <ID>
Тип <MODULE>
Имя <NAME>
Описание <DESCRIPT>
Адрес <ADDR>
Протокол <PROT>
Запускать <START>
Индивидуальные поля типов транспортов
web1
Sockets
Web 1
Work web transport for proced http requests.
TCP::10002:0
HTTP
1
...
Self
SelfSystem
TCP 1
Test TCP input socket!
Sockets
TCP::10001:1
1
...
Таблица 15. Структура таблицы исходящих транспортов (Transport_out).
Идентификатор <ID>
Тип <MODULE>
Имя <NAME>
Описание <DESCRIPT>
Адрес <ADDR>
Запускать <START>
Индивидуальные поля типов транспортов
tcp_o1
Sockets
TCP Out 1
Output TCP transport 1
TCP::10001
1
...
Для централизованного описания перечня внешних OpenSCADA станций используется таблица внешних хостов (CfgExtHosts). Структура этой таблицы приведена в таблице 16.
Таблица 16. Структура таблицы внешних OpenSCADA хостов (CfgExtHosts).
Пользователь системы <OP_USER>
Идентификатор <ID>
Имя <NAME>
Транспорт <TRANSP>
Адрес удалённого хоста <ADDR>
Пользователь внешнего хоста <USER>
Пароль пользователя внешнего хоста <PASS>
tcp_o1
Sockets
TCP Out 1
Output TCP transport 1
TCP::10001
1
...
17.4. Таблицы подсистемы “Архивы”
Подсистема “Архивы” содержит три таблицы с фиксированными именами:
Архивы значений: Archive_val;
Архиваторы значений: Archive_val_proc;
Архиваторы сообщений: Archive_mess_proc.
Таблицы архиваторов могут дополняться полями, характерными для каждого типа архиватора.
Таблица 17. Структура таблицы архивов значений (Archive_val).
Идентификатор <ID>
Имя <NAME>
Описание <DESCR>
Запускать <START>
Режим источника значений <SrcMode>
Источник значений <Source>
Тип значений <VTYPE>
Периодичность буфера <BPER>
Размер буфера <BSIZE>
Жесткая сетка буфера <BHGRD>
Высокое разрешение времени буфера <BHRES>
Перечень обслуживающих архиваторов <ArchS>
CPULoad_load
1
1
DAQ.System.AutoDA.CPULoad.load
4
1
100
0
0
FSArch.1s;DBArch.1m;FSArch.1m;
ai1_dP
0
0
4
0.0001
100
1
1
FSArch.POMP_20070301;FSArch.1s;
Таблица 18. Структура таблицы архиваторов значений (Archive_val_proc).
Идентификатор <ID>
Тип архиватора <MODUL>
Имя <NAME>
Описание <DESCR>
Запускать <START>
Адрес <ADDR>
Период значений <V_PER>
Период архивирования <A_PER>
Индивидуальные поля типов архиваторов
1s
FSArch
Односекундный
1
ARCHIVES/VAL/1s
1
60
...
POMP_20070301
FSArch
0
ARCHIVES/VAL/POMP_20070301
0.0001
60
...
Таблица 19. Структура таблицы архиваторов сообщений (Archive_mess_proc).
Идентификатор <ID>
Тип архиватора <MODUL>
Имя <NAME>
Описание <DESCR>
Запускать <START>
Шаблон категории сообщений <CATEG>
Уровень сообщений <LEVEL>
Адрес <ADDR>
Индивидуальные поля типов архиваторов
StatErrors
FSArh
Ошибки станции
1
/DemoStation*
4
ARCHIVES/MESS/stError/
...
NetRequsts
FSArh
Сетевые запросы
1
/DemoStation/Transport/Sockets*
1
ARCHIVES/MESS/Net/
...
17.5. Таблицы подсистемы “Безопасность”
Подсистема “Безопасность” содержит две таблицы: таблица пользователей системы (Security_user) и групп системы (Security_grp).
Таблица 20. Структура таблицы пользователей системы (Security_user).
Имя <NAME>
Описание <DESCR>
Пароль <PASS>
Изображение <PICTURE>
root
Суперпользователь
openscada
user
Пользователь
user
Таблица 21. Структура таблицы групп пользователей системы (Security_grp).
Имя <NAME>
Описание <DESCR>
Пользователи в группе <USERS>
root
Группа суперпользователей
root;user
users
Группа пользователей
toot;user
17.6. Структура баз данных модулей
Каждый модуль может иметь собственные таблицы БД для хранения индивидуальных данных. Структура таблиц БД модулей может формироваться свободно, исходя из внутренних потребностей.
18. Сервисные функции интерфейса управления OpenSCADA
Сервисные функции — это интерфейс доступа к системе OpenSCADA посредством интерфейса управления OpenSCADA из внешних систем. Данный механизм положен в основу всех механизмов обмена внутри OpenSCADA, реализованных посредством слабых связей и стандартного протокола обмена OpenSCADA. Основным его преимуществом является приоритетная обработка и возможность использования нестандартной упаковки данных. Для доступа к обычным данным можно использовать стандартные команды интерфейса управления.
18.1. Групповой доступ к значениям атрибутов параметров подсистемы "Сбор данных", а также к детальной информации
Данные запросы позволяют получить детальную информацию о параметрах подсистемы "Сбор данных", запросить значения всех атрибутов параметров, а также выполнить групповую установку. Детальная информация о запросах приведена в таблице 23.
Таблица 23. Атрибуты команд запроса атрибутов параметров подсистемы "Сбор данных"
Id
Имя
Значение
Команда запроса информации об атрибутах параметра:<list path="/sub_DAQ/mod_{SRC}/cntr_{CNTR}/prm_{PRM}/%2fserv%2fattr"/>
<el id="iatr"/>
Информация атрибутов
В отдельных тегах возвращается информация об атрибуте.
id
Идентификатор атрибута
Символьный идентификатор отдельно взятого атрибута.
nm
Имя атрибута
Имя отдельно взятого атрибута.
flg
Флаги атрибута
Флаги отдельно взятого атрибута.
tp
Тип атрибута
Тип отдельно взятого атрибута.
vals
Область значений атрибута.
Область значений отдельно взятого атрибута.
names
Имена значений атрибута для выборочного типа.
Имена значений отдельно взятого атрибута для выборочного типа.
Команда запроса значений всех атрибутов параметра:<get path="/sub_DAQ/mod_{SRC}/cntr_{CNTR}/prm_{PRM}/%2fserv%2fattr"/>
<el id="iatr">val</el>
Значения атрибутов
В отдельных тегах возвращается значение атрибутов.
Команда установки значений указанных атрибутов параметра:<set path="/sub_DAQ/mod_{SRC}/cntr_{CNTR}/prm_{PRM}/%2fserv%2fattr"/>
<el id="iatr">val</el>
Указываются значения атрибутов
В отдельных тегах указываются значение атрибутов.
18.2. Доступ к архивным данным архивов сообщений
Для запроса данных архива в подсистеме архивирования объекта архива сообщений предусмотрена команда <info path="/sub_Archive/%2fserv%2fmess"/> и <get path="/sub_Archive/%2fserv%2fmess"/> для запроса информации об архиве и значений архива соответственно. Детальное описание данных команд представлено в таблице 24.
Таблица 24. Атрибуты команд запроса информации об архиве значений и архивных данных
Id
Имя
Значение
Команда запроса информации об архиве:<info path="/sub_Archive/%2fserv%2fmess"/>
arch
Установка имени архиватора архива
Архиватор архива, для которого определять параметры.
end
Контроль вершины архива в данном архиваторе
В результате запроса указывает на реальную вершину архива сообщений в данном архиваторе <arch>.
beg
Контроль глубины архива в данном архиваторе
В результате запроса указывает на реальную глубину архива сообщений в данном архиваторе <arch>.
Команда запроса архивных и/или текущих данных:<get path="/sub_Archive/%2fserv%2fmess"/>
tm
Установка времени
Время вершины блока архива сообщений.
tm_grnd
Установка времени основания/начала архива
Указывает основание/начало архива.
arch
Установка архиватора архива
Указывает, у какого архиватора запрашивать значения. Если архиватор не указан, то запрос будет производиться последовательно у всех архиваторов с исключением дубликатов.
cat
Установка категории сообщений
Указывает категорю/шаблоны запрашиваемых сообщений.
lev
Установка уровня важности
Указывает уровень важности сообщений, для которого и выше получать сообщения.
<el>mess</el>
Сообщения
В отдельных тегах возвращаются сообщения.
time
Время сообщения
Время отдельно взятого сообщения.
cat
Категория сообщения
Категория отдельно взятого сообщения.
lev
Уровень сообщения
Уровень отдельно взятого сообщения.
18.3. Доступ к архивным данным архивов значений
Для запроса данных архива в подсистеме архивирования объекта архива значения и объекте атрибута параметра подсистемы сбора данных предусмотрена команда <info path="{a_p_addr}/%2fserv%2fval"/> и <get path="{a_p_addr}/%2fserv%2fval"/> для запроса информации об архиве и значений архива соответственно. Атрибуты данных команд, предусматривающие различные механизмы запроса, представлены в таблице 25.
Таблица 25. Атрибуты команд запроса информации об архиве значений и архивных данных
Id
Имя
Значение
Команда запроса информации об архиве:<info path="{a_p_addr}/%2fserv%2fval"/>
arch
Установка имени архиватора архива
Архиватор архива, для которого определять параметры.
end
Контроль вершины архива в данном архиваторе
В результате запроса указывает на реальную вершину архива значений в данном архиваторе <arch>. В случае отсутствия архива атрибут устанавливается в "0".
beg
Контроль глубины архива в данном архиваторе
В результате запроса указывает на реальную глубину архива значений в данном архиваторе <arch>. В случае отсутствия архива атрибут устанавливается в "0".
per
Контроль периодичности архива в данном архиваторе
В результате запроса указывает на реальную периодичность значений в данном архиваторе <arch>. В случае отсутствия архива атрибут устанавливается в "0".
vtp
Контроль типа значений архива/параметра
Возвращает код типа значений архивных данных: 0 — Boolean, 1 — Integer, 4 — Real, 5 — String. Только данное свойство доступно в случае запроса у параметра без архива!
Команда запроса архивных и/или текущих данных:<get path="{a_p_addr}/%2fserv%2fval"/>
tm
Установка и контроль времени
Время запрашиваемого значения или вершины блока архива значений. Если атрибут не указан или равен "0", то возвращается последнее значение. Значение данного атрибута устанавливается в значение времени полученного значения или вершины блока архивных данных.
tm_grnd
Установка и контроль времени основания/начала архива
Указывает основание/начало архива. Если атрибут не указан или равен "0", то производится запрос одного значения. Значение данного атрибута устанавливается в значение времени основания блока архивных данных.
per
Установка и контроль периодичности получаемых значений
Периодичность запрашиваемых значений. Если атрибут не указан, равен "0" или меньше чем реальная периодичность архива, то значения будут возвращаться с реальной периодичностью архива и значение данного атрибута установится в значение реальной периодичности. Если значение атрибута больше реальной периодичности, то значения архива будут усредняться к указанной периодичности.
arch
Установка и контроль архиватора архива
Указывает, у какого архиватора запрашивать значения. Если архиватор не указан, то запрос будет производиться последовательно с приоритетностью от лучшего к худшему. Имя архиватора, у которого получены значения, будет указанно в данном атрибуте при возврате результата. Если архиватор для данного параметра не установлен или такого архиватора нет, то значение данного атрибута будет обнулено. В случае выполнение запроса, пересекающего несколько архиваторов, выполняется обработка только первого архиватора с указанием его имени и размерности в соответствующих атрибутах. Для запроса данных последующих архиваторов запрос повторяется отталкиваясь от размерности предыдущего запроса.
mode
Установка и контроль режима передачи данных архива
Указывается форма, в которой желательно получать данные архива. Предусматриваются следующие режимы/формы передачи данных архивов:
0 — Простая запись: одно значение — одна строка без упаковки смежных значений. В случае архива строк значения кодируются на предмет исключения символов перевода строки. Пример формы записи:
34.5678 23.6543 65.8754 34.6523
1 — Упакованная запись по принципу сворачивания смежных значений: одно значение — одна запись. Перед каждым значением указывается его позиционный номер, отделённый пробелом:
0 34.5678 1 23.6543 4 65.8754 6 34.6523
2 — Массив бинарных неупакованных значений, кодированный Mime Base64. Не может быть использован для строковых архивов.
real_prec
Установка точности вещественных чисел
Указывает, с какой точностью передавать данные значений вещественного типа в режиме "0" и "1". По умолчанию эта точность составляет 6 значащих цифр.
round_perc
Установка процента округления
Указывает процент округления смежных числовых значений, для режима "1".
19. API модулей модульных подсистем
Модули в системе OpenSCADA реализуются в виде разделяемых библиотек. Как уже ранее упоминалось, одна такая библиотека может содержать множество модулей подсистем OpenSCADA, фактически выступая в роли контейнера.
Первым шагом при подключении разделяемых (SO — shared object) библиотек является подключение функций инициализации. Эти функции должны быть определены как обычные “С” функции для исключения искажения имен функций. Обычно это делается следующим образом:
//================== CUT ========================= extern "C" { #ifdef MOD_INCL //Нужно указывать только в случае поддержки модулем возможности //влинковки в ядро OpenSCADA TModule::SAt bd_DBF_module( int n_mod ) #else TModule::SAt module( int n_mod ) #endif { //Формирование описателей модулей из списка //доступных в разделяемой библиотеке. }
#ifdef MOD_INCL //Нужно указывать только в случае поддержки модулем возможности //влинковки в ядро OpenSCADA TModule *bd_Tmpl_attach( const TModule::SAt &AtMod, const string &source ) #else TModule *attach( const TModule::SAt &AtMod, const string &source ) #endif { //Подключить указанный модуль } } //================== CUT =========================
Функции для работы с разделяемой библиотекой: TModule::SAt module( int n_mod );
Функция предназначена для последовательного опроса информации о модулях, содержащихся в SO библиотеке. Параметр <n_mod> указывает на порядковый номер запрашиваемого модуля и должен перебираться, начиная с нуля. В случае отсутствия модуля с данным идентификатором функция должна возвращать структуру с именем модуля нулевой длины, что и служит окончанием процесса сканирования.
Практически все функции и данные системы сведены в API-системы, описываемого в данном документе. Однако для упрощения и ускорения процесса написания модулей основные функции, переопределяемые в модулях, приведены в таблице 22.
Таблица 22. Основные функции, использующиеся при создании модулей
Общее API
API объекта (TCntrNode):
virtual void load_( ); — Загрузка объекта из хранилища.
virtual void save_( ); — Сохранение объекта в хранилище.
Общее API модулей (TModule):
Атрибуты:
string mId; — Идентификатор модуля.
string mName; — Имя модуля.
string mDescr; — Описание модуля.
string mType; — Тип модуля.
string mVers; — Версия модуля.
string mAutor; — Автор модуля.
string mLicense; — Лицензия модуля.
string mSource; — Источник/происхождение модуля.
Методы:
virtual void modStart( ); — Запуск модуля.
virtual void modStop( ); — Останов модуля.
virtual void modInfo( vector<string> &list ); — Список доступных элементов информации о модуле. Предусмотрены следующие информационные элементы:
Module — идентификатор модуля;
Name — локализованное имя модуля;
Type — тип модуля;
Source — источник модуля (контейнер);
Version — версия модуля;
Author — автора модуля;
Description — описание модуля;
License — лицензия модуля.
virtual void sqlReq( const string &req, vector< vector<string> > *tbl = NULL, char intoTrans = EVAL_BOOL ); — Отправка SQL-запроса <req> на БД и получение результата в виде таблицы <tbl>. При установке <intoTrans> в true для запроса будет открыта транзакция, в false будет закрыта.
virtual void transCloseCheck( ) — Периодически вызываемая функция для проверки транзакций и закрытия старых или содержащих много запросов.
virtual TTransportIn *In( const string &name, const string &db ); — Создать/открыть новый «входящий» транспорт.
virtual TTransportOut *Out( const string &name, const string &db ); — Создать/открыть новый «исходящий» транспорт.
Входящий транспорт (потомок от TTransportIn):
virtual string getStatus( ); — Статус интерфейса.
virtual void setAddr( const string &addr ); — Установка адреса транспорта. Может переопределяться для обработки и проверки специфического для модуля формата адреса транспорта.
virtual void start(); — Запуск транспорта.
virtual void stop(); — Останов транспорта.
Исходящий транспорт (потомок от TTransportOut):
virtual string getStatus( ); — Статус интерфейса.
virtual void setAddr( const string &addr ); — Установка адреса транспорта. Может переопределяться для обработки и проверки специфического для модуля формата адреса транспорта.
virtual void start( ); — Запуск транспорта.
virtual void stop( ); — Останов транспорта.
virtual int messIO( const char *obuf, int len_ob, char *ibuf = NULL, int len_ib = 0, int time = 0, bool noRes = false ); — Отправка данных через транспорт. Время ожидания <time> соединения указывается в милисекундах. <noRes> используется протоколами для монопольного блокирования транспорта на время работы с ним и исключения собственной блокировки функцией.
API модулей подсистемы "Протоколы".
Протокол (потомок от TProtocol):
virtual void itemListIn( vector<string> &ls, const string &curIt = "" ); — Перечень подєлементов у входящего протокола, если протокол их предусматривает. Используется при выборе в конфигурации объекта входящего транспорта.
virtual void outMess( XMLNode &io, TTransportOut &tro ); — Передача данных в дереве XML <in> удалённой системе посредством транспорта <tro> и текущего исходящего протокола.
virtual void compileFuncSynthHighl( const string &lang, XMLNode &shgl ); — Запрос правил подсветки синтаксиса <shgl> указанного языка пользовательского программирования <lang>.
virtual string compileFunc( const string &lang, TFunction &fnc_cfg, const string &prog_text ); — Компиляция пользовательской процедуры и создания объекта исполнения функции для указанного языка пользовательского программирования.
virtual bool redntAllow( ); — Признак поддержки механизмов резервирования модулем. Должен просто переопределяться и возвращать true.
virtual void redntDataUpdate( bool firstArchiveSync = false ); — Выполнение операции получения данных из резервной станции. Вызывается автоматически задачей обслуживания схемы резервирования и перед запуском для синхронизации архивов с установленным параметром <firstArchiveSync>.
virtual TParamContr *ParamAttach( const string &name, int type ); — Создание/открытие нового параметра.
Параметр контроллера (потомок от TParamContr->TValue):
virtual void enable( ); — Включить параметр.
virtual void disable( ); — Отключить параметр.
virtual void setType( const string &tpId ); — Вызывается для смены типа параметра <tpId> и может быть обработан в объекте модуля, для смены собственных данных.
virtual TVal* vlNew( ); — Вызывается при создании нового атрибута. Может быть переопределён для реализации особого поведения в рамках своего, наследованного от TVal, класса при доступе к атрибуту.
virtual void vlSet( TVal &val, const TVariant &pvl ); — Вызывается для атрибута с прямым режимом записи TVal::DirWrite (синхронный режим или запись во внутренний буфер объекта) при установке значения, с целью непосредственной записи значения в физический контроллер или буфер объекта.
virtual void vlGet( TVal &val ); — Вызывается для атрибута с прямым режимом чтения TVal::DirRead (синхронный режим или чтение из внутреннего буфера объекта) при чтении значения, с целью непосредственного чтения значения из физического контроллера или буфера объекта.
virtual void vlArchMake( TVal &val ); — Вызывается при создании архива значений с атрибутом <val> в качестве источника с целью инициализации качественных характеристик буфера архива согласно особенностям источника данных и их опроса.
virtual void fullErase( ); — Полное удаление части архива в архиваторе.
virtual int64_t end( ); — Время окончания архива в архиваторе.
virtual int64_t begin( ); — Время начала архива в архиваторе.
virtual TVariant getValProc( long long *tm, bool up_ord ); — Функция обработки запроса одного значения из архива.
virtual void getValsProc( TValBuf &buf, int64_t beg, int64_t end ); — Функция обработки запроса модулем на получение данных группы значений <buf> за указанный промежуток времени.
virtual void setValsProc( TValBuf &buf, int64_t beg, int64_t end ); — Функция обработки запроса модулем на установку данных группы значений <buf> за указанный промежуток времени.
API модулей подсистемы "Пользовательские интерфейсы".
Пользовательский интерфейс (потомок от TUI):
Не содержит специфических функций!
API модулей подсистемы "Специальные”.
Специальные (потомок от TSpecial):
Не содержит специфических функций!
20. Отладка и тестирование проекта OpenSCADA
Для контроля за качеством кода и проверки работоспособности различных участков системы пишутся специальные модули, выполняющие процедуру тестирования с выдачей протокола тестирования. Данные модули необходимо выполнять после завершения работы над любым участком проекта.
21. Правила оформления и комментирования исходных текстов OpenSCADA и его модулей
При написании и оформлении исходных текстов системы OpenSCADA и его модулей необходимо придерживаться следующих правил:
отступ между уровнями вложений: 4 символа;
фигурные скобки открытия и закрытия должны располагаться в отдельных строках на уровне предыдущего текста;
возможно написание вложений в одной строке с предыдущим уровнем вложения, в случае повышения читабельности кода;
расстояние между описаниями функций не менее одного символа;
расстояние между определением переменных и текстом программы не менее одного символа;
допускается определение переменных в тексте при сохранении читабельности;
избегать длины строки более 100 символов;
команды препроцессора располагать на первом уровне вне зависимости от текущего уровня текста;
для форматирования исходного текста, наследованного у других свободных приложений и примеров, рекомендуется использовать утилиту: