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, а также модульные объекты хранящие свои данные в БД. |
Публичные методы:
- TConfig( TElem *Elements = NULL ); -- Инициализирующий конструктор.
- TConfig &operator=( TConfig &cfg ); -- Копирование из <cfg>.
- void cfgList( vector<string> &list ); -- Список элементов <list>.
- bool cfgPresent( const string &n_val ); -- Проверка на наличие элемента <n_val>.
- TCfg &cfg( const string &n_val ); -- Получение элемента <n_val>.
- 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 ); -- Назначение cтруктуры в <Elements>.
- void cntrCmdMake( XMLNode *fld, const string &path, int pos, const string &user = "root", const string &grp = "root", int perm = 0664 ); -- Формирование информационного описания элементов конфигурации для интерфейса управления OpenSCADA.
- void cntrCmdProc( XMLNode *fld, const string &elem, const string &user = "root", const string &grp = "root", int perm = 0664 ); -- Обработка запросов интерфейса управления OpenSCADA к элементам конфигурации.
- bool noTransl( ); -- Признак: Не выполнять трансляцию сообщений при работе с БД.
- void setNoTransl( bool vl ); -- Установка признака выполнения трансляции сообщений.
Защищённые методы:
- virtual bool cfgChange( TCfg &cfg ); -- Вызывается в случае изменения содержимого элемента конфигурации.
13.2. Ячейка данных (TCfg)
Данные:
Дополнительные флаги к TFld (enum - TCfg::AttrFlg):
- TCfg::TransltText -- переводить текстовые переменные записи.
- TCfg::NoVal -- не отражать элемент на значение объекта TValue.
- TCfg::Key -- ключевое поле.
- TCfg::Hide -- атрибут скрыт.
Флаги запросов (enum - ReqFlg):
- TFld::ForceUse -- Форсирование установки флага использования элемента при установке его значения.
Публичные методы:
- TCfg( TFld &fld, TConfig &owner ); -- Инициализирующий конструктор.
- const string &name( ); -- Имя ячейки.
- bool operator==( TCfg &cfg ); -- Сравнение ячеек.
- TCfg &operator=( TCfg &cfg ); -- Копирование ячеек.
- bool view( ); -- Признак - «Ячейка видима».
- bool keyUse( ); -- Признак - «Использовать ключ», для запросов dataSeek() и dataDel().
- bool noTransl( ); -- Признак «Отключить перевод» предназначен для отключения механизма перевода текстовых переменных для данной записи на время одного запроса.
- void setView( bool vw ); -- Установка признака «Ячейка видима» в <vw>.
- void setKeyUse( bool vl ); -- Установка признака «Использовать ключ» в <vl>.
- void setNoTransl( bool vl ); -- Установка признака «Отключить перевод».
- TFld &fld( ); -- Конфигурация ячейки.
- string getSEL( char RqFlg = 0 ); -- Получить значение выборочного типа, с флагами запроса <RqFlg>.
- string getS( char RqFlg = 0 ); -- Получить значение строкового типа, с флагами запроса <RqFlg>.
- double getR( char RqFlg = 0 ); -- Получить значение вещественного типа, с флагами запроса <RqFlg>.
- int getI( char RqFlg = 0 ); -- Получить значение целого типа, с флагами запроса <RqFlg>.
- bool getB( char RqFlg = 0 ); -- Получить значение логического типа, с флагами запроса <RqFlg>.
- string &getSd( ); -- Получить прямой доступ к значению строкового типа.
- double &getRd( ); -- Получить прямой доступ к значению вещественного типа.
- int &getId( ); -- Получить прямой доступ к значению целого типа.
- bool &getBd( ); -- Получить прямой доступ к значению логического типа.
- void setSEL( const string &val, char RqFlg = 0 ); -- Установить значение выборочного типа в <val>, с флагами запроса <RqFlg>.
- void setS( const string &val, char RqFlg = 0 ); -- Установить значение строкового типа в <val>, с флагами запроса <RqFlg>.
- void setR( double val, char RqFlg = 0 ); -- Установить значение вещественного типа в <val>, с флагами запроса <RqFlg>.
- void setI( int val, char RqFlg = 0 ); -- Установить значение целого типа в <val>, с флагами запроса <RqFlg>.
- void setB( bool val, char RqFlg = 0 ); -- Установить значение логического типа в <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); -- Получение индекса ячейки по её идентификатору <name>.
- 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 -- флаги отсутствуют;
- TFld::Selected -- режим выборки из доступных значений, выборочный тип;
- TFld::SelfFld -- создавать собственную копию этой ячейки;
- TFld::NoWrite -- недоступна для записи;
- TFld::HexDec -- целый тип: шестнадцатиричное представление;
- TFld::OctDec -- целый тип: восьмеричное представление;
- TFld::DateTimeDec -- целый тип: содержит дату в UTC;
- TFld::FullText -- полнотекстовый, многострочный, режим тестового типа.
Публичные методы:
- TFld( ); -- Инициализация по умолчанию.
- TFld( TFld &ifld ); -- Копирующий конструктор.
- TFld( const char *name, const char *descr, Type type, unsigned char flg, const char *valLen = "", const char *valDef = "", const char *vals = "", const char *nSel = "", const char *res = "" ); -- Инициализация с указанной конфигурацией.
- TFld &operator=( TFld &fld ); -- Копирование ячейки из <fld>.
- const string &name( ); -- Имя ячейки.
- const string &descr( ); -- Описание ячейки.
- int len( ); -- Размер значения ячейки (символов в символьном представлении).
- int dec( ); -- Размер дробной части, для вещественного (символов в символьном представлении).
- Type 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( TVarObj *ivl ); -- Конструктор для объекта.
- TVariant( const TVariant &var ); -- Копирующий конструктор.
- bool operator==( TVariant &vr ); -- Сравнение объекта.
- TVariant &operator=( const TVariant &vr ); -- Копирование объекта.
- bool isNull( ) const; -- Признак того, что объект не инициирован.
- Type type( ) const; -- Тип значения.
- void setType( Type tp ); -- Установка типа.
- bool isModify( ); -- Флаг модификации. Служит в объектных функциях для индикации модификации переменных.
- void setModify( bool vl = true ); -- Установка флага модификации.
- char getB( ) const; -- Получение значения как логическое.
- int getI( ) const; -- Получение значения как целого.
- double getR( ) const; -- Получение значения как вещественного.
- string getS( ) const; -- Получение значения как строки.
- TVarObj *getO( ) const; -- Получение объекта.
- void setB( char val ); -- Установка в значение логического.
- void setI( int val ); -- Установка в значение целого.
- void setR( double val ); -- Установка в значение вещественного.
- void setS( const string &val ); -- Установка в значение строки.
- void setO( TVarObj *val ); -- Установка объекта.
13.7. Пользовательский объект (TVarObj)
Публичные методы:
- TVarObj( ); -- Конструктор.
- int connect( ); -- Подключение к объекту.
- int disconnect( ); -- Отключение от объекта.
- virtual TVariant propGet( const string &id ); -- Запрос свойства объекта с идентификатором <id>.
- virtual void propSet( const string &id, TVariant val ); -- Установка свойства объекта с идентификатором <id> в значение <val>.
- virtual string getStrXML( const string &oid = "" ); -- Преобразование содержимого объекта в поток XML.
- virtual TVariant funcCall( const string &id, vector<TVariant> &prms ); -- Вызов функции объекта с идентификатором <id> и параметрами <prms>.