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 ); — Назначение структуры в <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 ); — Установка признака выполнения трансляции сообщений.
- TVariant objFunc( const string &id, vector<TVariant> &prms, const string &user ); — Объектные функции доступа к конфигурации.
Защищённые методы:
- 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>.
- TVariant get( 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>.
- ResString &getSd( ); - Получить прямой доступ к значению строкового типа.
- double &getRd( ); - Получить прямой доступ к значению вещественного типа.
- int &getId( ); - Получить прямой доступ к значению целого типа.
- bool &getBd( ); - Получить прямой доступ к значению логического типа.
- void setSEL( const string &val, char RqFlg = 0 ); - Установить значение выборочного типа в <val> с флагами запроса <RqFlg>.
- void set( const TVariant &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(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( ); - Инициализация по умолчанию.
- 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( const char *var ); - Конструктор для строки.
- TVariant( TVarObj *ivl ); - Конструктор для объекта.
- TVariant( const TVariant &var ); - Копирующий конструктор.
- bool operator==( const TVariant &vr ); - Сравнение объекта на равенство.
- bool operator!=( const TVariant &vr ); - Сравнение объекта на неравенство.
- TVariant &operator=( const TVariant &vr ); - Копирование объекта.
- bool isNull( ) const; - Признак того, что объект не инициирован.
- bool isEVal( ) 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 void propList( vector<string> &ls ); - Список свойств <ls> объекта.
- 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>.