Данный документ представляет собой описание интерфейса программирования приложения (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 содержит модульные объекты TTypeArchivator. В тоже время обычная подсистема таких объектов не содержит. Например, подсистема безопасности TSeсurity (рис.2).
Рис. 2. Иерархическая структура системы OpenSCADA.
В процессе инициализации корня (TSYS) определяется глобальная переменная SYS. Переменная SYS может использоваться для прямого обращения к корню системы из любого её узла. Инициализация корня выполняется единожды из главной вызывающей функции. После запуска управление захватывается объектом системы до остановки. Корневой объект концентрирует все общесистемные функции системы OpenSCADA.
Продолжением корневого объекта (TSYS), выполняющего функции обслуживания потока системных сообщений, выступает объект TMess. Объект доступен посредством глобальной переменной Mess, которая инициализируется корнем системы. Объект содержит функции кодирования, декодирования и локализации сообщений.
В подсистемах (TSubSYS) реализуются функции характерные для каждой подсистемы индивидуально, с общим для всех подсистем доступом, через объект TSubSYS. Модульная подсистема имеет возможность расширять функциональность посредством модулей. Для этой цели модульная подсистема предоставляет доступ к модулям своего типа в виде модульных объектов.
Модуль — составная часть модульной подсистемы. В общем, для всех модулей и их подсистем, модуль предоставляет информацию о себе, своём происхождении и экспортируемых функциях. Отдельно взятый модуль реализует функциональность в соответствии со своими потребностями.
2.1. Корневой объект системы (TSYS)
Наследует:
TCntrNode.
Данные:
Информационные переменные программы:
PACKAGE_LICENSE — Лицензия распространения программы
FormatPrint — Кодирование/экранирование элементов форматирования для функций вроде "printf";
oscdID — Кодирование идентификаторов узлов.
Bin — Кодирование бинарных данных в текст и обратно.
Reverse — Инверсия порядка символов в строке.
ShieldSimb — Кодирование экранированных символов вроде "\n" в реальные коды.
ToLower — Преобразование в нижний регистр.
Виды представления целого в функциях TSYS::int2str() и TSYS::ll2str() (enum — TSYS::IntView):
Dec — десятичное;
Oct — восьмеричное;
Hex — шестнадцатеричное.
Структура задачи OpenSCADA (class — TSYS::STask):
STask( pthread_t ithr, char ipolicy, char iprior ); — конструктор описателя задачи для потока ithr, его политики планирования ipolicy и приоритета iprior.
float consumpt( ) const; — последнее использование времени процессора, в секундах.
float period( ); — мгновенная периодичность вызова задачи, в секундах.
string path; — путь.
pthread_t thr; — указатель потока.
uint8_t policy, prior; — политика и приоритет планирования.
pid_t tid; — идентификатор потока как идентификатор процесса Linux.
int64_t tm_beg, tm_end, tm_per, tm_pnt, cycleLost, lagMax, consMax; — переменные статистики исполнения задачи.
Структура резервной станции (class — TSYS::SStat):
int8_t lev; — уровень станции;
bool isLive; — признак "Станиця Жива";
float cnt; — счётчик запросов к резервной станции или таймер повторной попытки подключения;
SStat( int8_t ilev, bool iisLive = false, float icnt = 0 ) — конструктор объекта станции с уровнем ilev, инициированная как "живая" iisLive и счётчиком icnt;
SStat( ) — конструктор по умолчанию, инициируется как отсутствующая и неактивная станция;
bool isActive( ) — станция активна.
Шаблоны/определения:
USER_FILE_LIMIT — Лимит на размер файлов для пользовательской загрузки (1 МБ).
STR_BUF_LEN — Стандартная длина строковых буферов (10000).
NSTR_BUF_LEN — Стандартная длина строковых буферов, для чисел (100).
STD_WAIT_DELAY — Стандартный квант времени циклов ожидания (100 мс).
void setDocDir( const string &idir, bool init = false ); — Установка директории документов OpenSCADA.
string cfgFile( ); — Имя конфигурационного файла системы.
XMLNode &cfgRoot( ); — Разобранная структура конфигурационного файла.
XMLNode *cfgNode( const string &path, bool create = false ); — Получение узла конфигурации по его пути path. Создавать элементы пути в случае их отсутствии create.
void modifCfg( bool chkPossibleWR = false ); — Отметка модификации конфигурации или проверка на возможность записи chkPossibleWR, для последующего сохранения в файл.
string workDB( ); — Полное имя рабочей БД.
string selDB( ); — Выбранная БД. Используется для избирательной загрузки из указанной БД, в подсистеме "БД".
string mainCPUs( ); — Список используемых процессоров.
bool clockRT( ); — Выбор часов реального времени для планирования задач, иначе используются монотонные (по умолчанию).
bool saveAtExit( ); — Признак - "Сохранять конфигурацию системы при выходе".
int savePeriod( ); — Периодичность автоматического сохранения станции в БД (секунд).
void setWorkDB( const string &wdb ); — Установка полного имени рабочей БД.
void setSelDB( const string &vl ); — Установка выбранной БД для избирательной загрузки.
void setClockRT( bool vl ); — Установка выбора часов реального времени для планирования задач.
void setSaveAtExit( bool vl ); — Установка признака - "Сохранять конфигурацию системы при выходе".
void setSavePeriod( int vl ); — Установка периодичности автоматического сохранения станции в БД (секунд).
bool chkSelDB( const string& wDB ); — Функция проверки на соответствие указанной БД wDB выбранной в "selDB()".
string optDescr( ); — Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.
static void sighandler( int signal ); — Функция стандартного обработчика сигналов системы в целом.
unsigned long long sysClk( ); — Расчётная частота процессора на котором функционирует система (Гц).
void clkCalc( ); — Расчёт частоты процессора на котором работает система. Вызывается периодически для систем с переменной частотой процессора.
unsigned long long shrtCnt( ); — Функция замера малых интервалов времени по счетчику тактов процессора. Возвращает значение счетчика тактов процессора.
static long HZ( ); — Время системного тика процессора.
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.
double taskUtilizTm( const string &path, bool max = false ); — Время, в секундах, утилизации ресурсов процессора задачей path, или его максимальное значение max.
static bool taskEndRun( ); — Проверка на команду окончания задачи, посредством сигнала SIGUSR1.
static int sysSleep( float tm ); — Функция системного засыпания потока на время в секундах, вплоть до наносекунд (1e-9).
time_t sysTm( ); — Системное время быстрого доступа, из обновляемой ячейки.
static int64_t curTime(); — Текущее время в микросекундах с начала эпохи (01.01.1970).
string prjUserDir( ); — Директория проектов пользователя.
bool prjCustMode( ); — Специальный режим проектов.
void setPrjCustMode( bool vl ); — Установка специального режима проектов.
string prjNm( ); — Имя проекта конфигурации.
void setPrjNm( const string &vl ); — Установка имени проекта конфигурации.
bool prjSwitch( const string &prj, bool toCreate = false ); — Переключение на проект prj.
int prjLockUpdPer( ); — Получение периода обновления замка проекта, нуль для отключения замка.
bool prjLock( const char *cmd ); — Обработка замка проекта для команды cmd ("hold", "free", "update").
static void taskSleep( int64_t per, const string &cron = "", int64_t *lag = NULL ); — Функция засыпания потока по сетке абсолютного времени с периодом per в наносекундах или до запланированного времени cron. Если указано запаздывание lag то в него будет возвращена разница между реальным и запланированным пробуждением (потеря циклов).
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.
bool cntrEmpty( ); — Проверка на отсутствие счётчиков отладки.
int rdStLevel( ); — Уровень текущей станции в системе резервирования.
void setRdStLevel( int vl ); — Установка уровня текущей станции в системе резервирования.
float rdTaskPer( ); — Периодичность исполнения задачи резервирования.
void setRdTaskPer( float vl ); — Установка периодичности исполнения задачи резервирования.
int rdRestConnTm( ); — Время повторения попытки восстановления связи с резервными станциями после её потери, в секундах.
void setRdRestConnTm( int vl ); — Установка времени повторения попытки восстановления связи с резервными станциями.
string rdStRequest( XMLNode &req, const string &st = "" ); — Общий запрос req к указанной резервной станции st.
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 atime2str( time_t tm, const string &format = "" ); — Преобразование астрономичного UNIX времени tm в строку, в соответствии с форматом format POSIX-функции "strftime()".
static string time2str( double tm ); — Преобразование интервала времени, в секундах, в строку вида "1час 23мин 10сек".
static string cpct2str( double cnt ); — Преобразование счётчика трафика cnt (байт) в строки вида "12.5КиБ".
static string strTrim( const string &val, const string &cfg = " \n\t\r" ); — Удаляет из исходной строки val указанные cfg (в основном пустые) символы в начале и в конце.
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 decode = 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 string strEncode( const string &in, Code tp, const string &opt1 = "" ); — Кодирование строки по указанному правилу tp и опцией opt1 (символы для "Custom").
static string strDecode( const string &in, Code tp = Custom, const string &opt1 = "" ); — Декодирование строки in по указанному правилу tp и опцией opt1 (разделитель или "<text>" для "Bin").
static string strMess( const char *fmt, ... ); static string strMess( unsigned len, const char *fmt, ... ); — Формирование стоки по шаблону fmt и аргументам. Реализован на основе "printf". Для варианта ограничения длины превышение отмечается добавлением "...".
static string strLabEnum( const string &base ); — Формирование индивидуальных строковых меток от базы base путём инкрементации в конце. Поддерживается нумерация в десятичном, шестнадцатеричном (префикс "0x") и восьмеричном (префикс "0") представлении.
string strCompr( const string &in, int lev = -1 ); — Компрессия строки in с уровнем компрессии lev.
string strUncompr( const string &in ); — Декомпрессия строки in.
static inline int getUnalignInt( const void *p ); — Невыравненное чтение знакового целого из буфера по смещению.
static inline float getUnalignFloat( const void *p ); — Невыравненное чтение вещественного "float" из буфера по смещению.
static inline double getUnalignDbl( const void *p ); — Невыравненное чтение вещественного "double" из буфера по смещению.
static uint16_t i16_LE( uint16_t in ); static uint32_t i32_LE( uint32_t in ); static uint64_t i64_LE( uint64_t in ); — Преобразование порядка целого числа in из формата Little-Endian (LE) во внутреннее представление.
static uint16_t i16_BE( uint16_t in ); static uint32_t i32_BE( uint32_t in ); static uint64_t i64_BE( uint64_t in ); — Преобразование порядка целого числа in из формата Big-Endian (BE) во внутреннее представление.
static float floatLE( float in ); static double doubleLE( double in ); — Преобразование вещественного числа in из внутреннего представления в формат IEEE754 Little-Endian (LE).
static float floatLErev( float in ); static double doubleLErev( double in ); — Преобразование вещественного числа in из формата IEEE754 Little-Endian (LE) во внутреннее представление.
static float floatBE( float in ); static double doubleBE( double in ); — Преобразование вещественного числа in из внутреннего представления в формат IEEE754 Big-Endian (BE).
static float floatBErev( float in ); static double doubleBErev( double in ); — Преобразование вещественного числа in из формата IEEE754 Big-Endian (BE) во внутреннее представление.
string getCmdOpt( int &curPos, string *argVal = NULL ); static string getCmdOpt_( int &curPos, string *argVal, int argc, char **argv ); — Разбор параметров командной строки с перебором по курсору curPos. Возвращает имя аргумента и его возможное значение в argVal. Реализует форматы коротких ключей: "-v", "-v val", "-abcv", "-abcv val"; и длинных ключей: "--var", "--var=val", "--var val".
string cmdOpt( const string &opt, const string &setVl = "" ); — Получения параметра opt командной строки. Установка в setVl, если указан.
static void ctrListFS( XMLNode *nd, const string &fsBase, const string &fileExt = "" ); — Список обзора элементов файловой системы относительно базы fsBase, для файлов c расширениями fileExt в виде списка "png;jpeg;gif;".
ResRW &cfgRes( ); — Локатор ресурса дерева конфигурационного файла.
Публичные атрибуты:
static bool finalKill — Признак "Финальное разрушение объектов". Используется для принудительного отключения заблокированных объектов на финальной стадии выключения.
Короткие вызовы глобальных функций в области имён "OSCADA":
template <class fVal> fVal fmin( fVal a, fVal b ); template <class fVal> fVal fmax( fVal a, fVal b ); — функциональные шаблоны определения минимума и максимума двух значений.
string categ; — категория сообщения (обычно путь внутри системы);
int8_t level; — уровень сообщения;
string mess; — сообщение.
Шаблоны:
_(mess) — Обёртка над функцией трансляции сообщений для предоставления принятого во многих программах вызова перевода сообщений.
trL(base,lng); trU(base,usr); trLU(base,lng,usr) — Обёртки над функциями динамической трансляции текстовых переменных по языку и пользователю.
trSetL(base,lng,mess); trSetU(base,usr,mess); trSetLU(base,lng,usr,mess) — Обёртки над функциями установки динамической трансляции текстовых переменных по языку и пользователю.
FTM(rec); FTM2(tm, utm) — Получения полного времени сообщения в микросекундах, используя два поля времени структуры сообщения.
mess_lev() — Уровень сообщений системы. Часто используется для для проверки режима отладки (=Debug).
message(cat,lev,fmt,args...) — Формирование полного сообщения.
mess_debug(cat,fmt,args...) — Формирование отладочного сообщения.
mess_info(cat,fmt,args...) — Формирование информационного сообщения.
mess_note(cat,fmt,args...) — Формирования сообщения - замечания.
mess_warning(cat,fmt,args...) — Формирование предупредительного сообщения.
mess_err(cat,fmt,args...) — Формирование сообщения ошибки.
mess_crit(cat,fmt,args...) — Формирование сообщения критического состояния.
mess_alert(cat,fmt,args...) — Формирование сообщения тревоги.
mess_emerg(cat,fmt,args...) — Формирование сообщения аварии.
message_(cat,lev,fmt,args...) — Формирование полного сообщения (игнорируется выбранный уровень и категории отладки).
mess_debug_(cat,fmt,args...) — Формирование отладочного сообщения (игнорируется выбранный уровень и категории отладки).
mess_info_(cat,fmt,args...) — Формирование информационного сообщения (игнорируется выбранный уровень).
mess_note_(cat,fmt,args...) — Формирования сообщения - замечания (игнорируется выбранный уровень).
mess_warning_(cat,fmt,args...) — Формирование предупредительного сообщения (игнорируется выбранный уровень).
mess_err_(cat,fmt,args...) — Формирование сообщения ошибки (игнорируется выбранный уровень).
mess_crit_(cat,fmt,args...) — Формирование сообщения критического состояния (игнорируется выбранный уровень).
mess_alert_(cat,fmt,args...) — Формирование сообщения тревоги (игнорируется выбранный уровень).
mess_emerg_(cat,fmt,args...) — Формирование сообщения аварии (игнорируется выбранный уровень).
string codeConvIn( const string &fromCH, const string &mess); — Конвертация кодировки сообщения во внутреннюю кодировку системы.
string codeConvOut( const string &toCH, const string &mess); — Конвертация кодировки сообщения из внутренней кодировки системы.
const char *I18N( const char *mess, const char *d_name = NULL, const char *mLang = NULL ); — Получение сообщения на языке mLang или языке системы если указанный NULL или пуст или для не режима динамического перевода сообщений.
string I18Ns( const string &mess, const char *d_name = NULL, const char *mLang = NULL ); — Получение сообщения на языке mLang или языке системы если указанный NULL или пуст или для не режима динамического перевода сообщений.
string lang( ); — Язык системы, в виде en_US.UTF-8.
string lang2Code( ); — Язык системы в двухсимвольной кодировке (en).
string &charset( ); — Системная кодировка.
int logDirect( ); — Приемники, которым направляются системные сообщения (stdout, stderr, syslog, archive);
int messLevel( ); — Уровень, ниже которого сообщения игнорируются.
string selDebCats( ); — Выбранные категории отладки (списком с разделителем ';').
bool isUTF8( ); — Внутренняя кодировка UTF-8.
void setLang( const string &lang, bool init = false ); — Установка языка системы (локализации).
void setLogDirect( int dir ); — Установка приемников которым направляются системные сообщения. Для dir используется битовая маска. Где:
1 – в syslog;
2 – в stdout;
4 – в stderr;
8 – в архив.
void setMessLevel( int level ); — Установка минимального уровня обрабатываемых сообщений.
void setSelDebCats( const string &vl ); — Установка категорий отладки (списком с разделителем ';').
void put( const char *categ, int8_t level, const char *fmt, ... ); — Формирование сообщения за текущее время с категорией categ, уровнем level форматированным сообщение fmt и следующими аргументами.
void put_( const char *categ, int8_t level, const char *fmt, ... ); void putArg( const char *categ, int8_t level, const char *fmt, va_list ap ); — Формирование сообщения за текущее время (игнорируется выбранный уровень и категории отладки) с категорией categ, уровнем level форматированным сообщение 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.
string lang2CodeBase( ); — Язык базовых сообщений текстовых переменных в двухсимвольной кодировке (en).
bool translDyn( bool plan = false ); — Режим "Динамический перевод" или его план plan на следующий запуск.
bool translEnMan( ); — Признак "Включен менеджер переводов", для активации индекса встроенных сообщений перевода и менеджера перевода.
string translLangs( ); — Список языков перевода, в менеджере.
string translFld( const string &lng, const string &fld, bool isCfg = false ); — Представление наименования поля с переводом с именем fld и языком lng для конфигурации isCfg или БД.
void setLang2CodeBase( const string &vl ); — Установка языка базовых сообщений текстовых переменных в двухсимвольной кодировке (en).
void setTranslDyn( bool val, bool plan = true ); — Установка режима "Динамический перевод" или его плана plan в значение val на следующий запуск.
void setTranslEnMan( bool vl, bool passive = false ); — Установка "Включен менеджер переводов" в значение vl и пассивном режиме passive.
void setTranslLangs( const string &vl ); — Установка списка языков перевода.
string translGet( const string &base, const string &lang, const string &src = "" ); string translGetU( const string &base, const string &user, const string &src = "" ); string translGetLU( const string &base, const string &lang, const string &user, const string &src = "" ); — Получение перевода базовой текстовой переменной base для языка lang или пользователя user и опционального источника src.
string translSet( const string &base, const string &lang, const string &mess, bool *needReload = NULL ); string translSetU( const string &base, const string &user, const string &mess, bool *needReload = NULL ); string translSetLU( const string &base, const string &lang, const string &user, const string &mess, bool *needReload = NULL ); — Установка перевода базовой текстовой переменной base для языка lang или пользователя user и опционального источника src в значение mess.
void translReg( const string &mess, const string &src, const string &prms = "" ); — Регистрация переводимого сообщения mess с источником src и вспомогательными параметрами prms в индексе переводов.
virtual void perSYSCall( unsigned int cnt ); — Периодичный вызов из системного потока, с периодичностью 10 секунд и секундным счётчиком cnt.
virtual bool rdProcess( XMLNode *reqSt = NULL ); — Обработка резервирования подсистемы, вызывается из системной задачи резервирования. В reqSt передаётся результат запроса состояния резервной станции по данной подсистеме.
TSYS &owner( ) const; — Система - владелец подсистемы.
virtual void modInfo( vector<string> &list ); — Список list информационных элементов модуля.
virtual string modInfo( const string &name ); — Получение содержимого указанного информационного элемента name. Для получения элемента на другом языке, при динамическом переводе сообщений, Вы можете установить имя в виде "{Имя}:{язык}".
virtual void perSYSCall( unsigned int cnt ); — Периодичный вызов из системного потока, с периодичностью 10 секунд и секундным счётчиком cnt.
void modFuncList( vector<string> &list ); — Список list экспортируемых функций модуля.
bool modFuncPresent( const string &prot ); — Проверка на наличие указанной функции по её прототипу prot.
ExpFunc &modFunc( const string &prot ); — Получить информацию об экспортируемой функции модуля prot.
bool modFunc( const string &prot, void (TModule::**offptr)(), bool noex = false ); — Получение относительного адреса offptr экспортируемой функции prot. Возвращает "true" в случае успеха и режима без исключений noex.
const char *I18N( const char *mess ); — Локализация модульного сообщения mess в соответствии с текущей локалью.
Подсистема "Базы Данных" представлена объектом TBDS, который содержит модульные объекты типов БД TTypeBD. Каждый тип базы данных содержит объекты отдельно взятых баз данных данного типа TBD. Каждая БД, в свою очередь, содержит объекты своих таблиц TTable (рис. 3).
Рис. 3. Иерархическая структура подсистемы БД.
Подсистема представляет базовые функции для доступа к типам БД, а также обобщающие функции для манипуляции с базами данных и таблицами. Так, для сокрытия источника данных, которым может быть и конфигурационный файл, предоставляются функции абстрактного доступа к источнику данных. А для хранения общесистемных данных предоставляется системная таблица и функции абстрактного доступа к ней. Следовательно, общесистемные данные могут храниться как в конфигурационном файле, так и в таблице БД. Приоритетным источником в таком случае является таблица БД.
Являясь модульным объектом, тип БД (TTypeBD) содержит доступ к реализации механизма той или иной БД. Доступ производится посредством открытых БД модуля отдельно взятого типа БД. Открываемые/регистрируемые БД описываются в таблице открываемых БД или в конфигурационном файле. Существует так называемая рабочая БД, которая открывается всегда и указывается в конфигурационном файле. БД, поддерживающие 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, bool forceCfg = false, vector< vector<string> > *full = NULL ); — Общее сканирование записей источника данных. В качестве источника выступает конфигурационный файл или БД. В случае отсутствия БД используется конфигурационный файл. Если имя БД bdn или путь path конфигурационного файла не указаны, то их обработка пропускается. full определяется перед запросом для предзагрузки результата целиком и значительного ускорения.
bool dataGet( const string &bdn, const string &path, TConfig &cfg, bool forceCfg = false, bool noEx = false ); — Получение записи из источника данных (БД или конфигурационный файл). Если имя БД bdn или путь path конфигурационного файла не указаны, то их обработка пропускается.
void dataSet( const string &bdn, const string &path, TConfig &cfg, bool forceCfg = false, bool noEx = false ); — Установить/сохранить запись в источнике данных (БД или конфигурационный файл). Если имя БД bdn или путь path конфигурационного файла не указаны, то их обработка пропускается.
bool dataDel( const string &bdn, const string &path, TConfig &cfg, bool useKeyAll = false, bool forceCfg = false, bool noEx = 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<TTypeBD> at( const string &iid ) — Обращение к модулю БД (типу БД).
string optDescr( ); — Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.
3.2. Модульный объект типов баз данных (TTypeBD)
Наследует:
TModule.
Наследуется:
Корневыми объектами модулей подсистемы "БД".
Публичные методы:
bool fullDeleteDB( ); — Признак полного удаления БД.
string addr( ) const; — Адрес БД. Форма записи отлична для каждого типа БД.
string codePage( ); — Кодовая страница, в которой хранятся данные БД.
bool enableStat( ) const; — Состояние БД: "Включена".
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 ) const; — Список таблиц, содержащихся в данной БД.
void list( vector<string> &list ) const; — Список открытых таблиц.
bool openStat( const string &table ) const; — Признак указывающий на то, что запрошенная таблица открыта.
void open( const string &table, bool create ); — Открытие таблицы. Если установлен признак create, то в случае отсутствия таблица будет создана.
void close( const string &table, bool del = false, long tm = -1 ); — Закрытие таблицы. Если установлен признак del, то таблица будет полностью удалена.
virtual void sqlReq( const string &req, vector< vector<string> > *tbl = NULL, char intoTrans = EVAL_BOOL ); — Отправка SQL-запроса req на БД и получение результата в виде таблицы tbl. При установке intoTrans в true для запроса будет открыта транзакция, в false будет закрыта.
virtual void transCloseCheck( ) — Периодически вызываемая функция для проверки транзакций и закрытия старых или содержащих много запросов.
TTypeBD &owner( ) const; — Тип базы данных – владелец данной БД.
Защищённые методы:
virtual TTable *openTable( const string &table, bool create ); — Модульный метод открытия таблицы.
string fullDBName( ); — Полное имя хранилища-таблицы в БД.
virtual void fieldStruct( TConfig &cfg ); — Получение структуры таблицы.
virtual bool fieldSeek( int row, TConfig &cfg, vector< vector<string> > *full = NULL ); — Сканирование записей cfg таблицы по row, где full определяется перед запросом для предзагрузки результата целиком и значительного ускорения.
virtual void fieldGet( TConfig &cfg ); — Запрос указанной записи. Запрашиваемая запись определяется значениями ключевых ячеек исходной записи cfg.
virtual void fieldSet( TConfig &cfg ); — Установка значений указанной записи. В случае отсутствия запись будет создана.
TBD &owner( ) const; — БД – владелец данной таблицы.
4. Подсистема "Сбор данных" (TDAQS)
Подсистема "Сбор данных" представлена объектом TDAQS, который содержит модульные объекты типов источников данных TTypeDAQ и объекты библиотек шаблонов параметров подсистемы "Сбор данных" TPrmTmplLib. Объект типов источников данных содержит объекты контроллеров TController и объекты типов параметров TTypeParam. Объекты типов параметров предоставляются модулем контроллера и содержат структуру БД отдельных типов параметров (аналоговые, дискретные ...). Объекты контроллеров содержат объекты параметров TParamContr. Каждый параметр ассоциируется с одним из типов параметров. Для хранения атрибутов параметр наследуется от объекта значений TValue, который и содержит значения атрибутов TVal. Библиотека шаблонов параметров данной подсистемы содержит объекты шаблонов TPrmTmpl. Пример описанной иерархической структуры приведён на рис. 4.
Рис. 4. Иерархическая структура подсистемы сбора данных.
Подсистема содержит типы источников данных. Источником может выступать практически любая сущность предоставляющая какие либо данные. Тип источника может делиться на отдельные источники (контроллеры) в пределах конкретного типа. Например, если взять данные из операционной системы (ОС), то под отдельным источником можно понимать операционную систему отдельного ПК.
Источник данных (контроллер) далее делится, или содержит, параметры. Под параметром подразумевается какая-то часть источника данных. В случае с ОС это будет, например: расход оперативной памяти, частота процессора и много других составных частей.
Параметр, в свою очередь, содержит атрибуты, которые и предоставляют данные. Кроме основных данных атрибутами могут предоставляться и сопутствующие или детализирующие данные. В случае той-же ОС и расхода памяти, атрибутами может предоставляться не только занятая память, а также и сколько её всего, сколько в swap и т.д.
Некоторые реализации источников данных могут предоставлять возможность формирования структуры параметра по ранее разработанным шаблонам параметров. Для этой цели подсистема содержит библиотеки шаблонов, которые, в свою очередь, содержат шаблоны параметров. В примере изображена библиотека шаблонов "base" с шаблонами "digAlrm" и "smplBrd".
На уровне подсистемы предоставляются механизм резервирования источников данных. Резервирование подразумевает возможность согласованной работы нескольких станций OpenSCADA для выполнения общей задачи сбора данных в одноимённых источниках данных.
4.1. Объект подсистемы "Сбор данных" (TDAQS)
Наследует:
TSubSYS.
Публичные методы:
int subVer( ); — Версия подсистемы.
void subStart( ); — Запуск подсистемы.
void subStop( ); — Останов подсистемы.
AutoHD<TTypeDAQ> at( const string &name ) const; — Подключение к типу источника данных.
AutoHD<TValue> prmAt( const string &path, char sep = 0, bool noex = false ) const; — Подключение к параметру по пути path или строке с разделителем sep. Не генерировать исключения если установлен noex.
AutoHD<TVal> attrAt( const string &path, char sep = 0, bool noex = false ) const; — Подключение к атрибуту параметра по пути path или строке с разделителем sep. Не генерировать исключения если установлен noex.
void ctrListPrmAttr( XMLNode *nd, const string &addrBase, bool toPrm = false, char sep = 0, const string &pref = "" ); — Список обзора элементов атрибутов параметров или toPrm параметров DAQ с префиксом pref от пути или строке с разделителем sep базового адреса addrBase.
string tmplLibTable( ); — Имя таблицы для хранения шаблонов параметров подсистемы "Сбор данных".
float rdRestDtTm( ); — Максимальная глубина восстановления данных архивов при включении, в часах.
void setRdRestDtTm( float vl ); — Установка максимальной глубины восстановления данных архивов при включении.
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 &elTmpl( ); — Структура таблицы шаблонов параметров.
TElem &elTmplIO( ); — Структура атрибутов шаблонов параметров.
TElem &elErr( ); — Структура атрибута(ов) ошибок параметров.
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( ); — Количество типов параметров.
TTypeParam &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 = 0 ); — Компиляция/настройка пользовательской функции на поддерживаемом модулем языке программирования lang и исходном тексте процедуры prog_text, исходя из параметров процедуры fnc_cfg. Результатом является адрес к подготовленному объекту функции.
virtual bool redntAllow( ); — Признак поддержки механизмов резервирования модулем. Должен просто переопределяться и возвращать true.
Защищённые методы:
virtual TController *ContrAttach( const string &name, const string &daq_db ); — Подключение контроллера. Обязательно переопределяется в потомке модуля.
virtual void redntDataUpdate( ); — Выполнение операции получения данных из резервной станции. Вызывается автоматически процедурой обслуживания схемы резервирования подсистемы.
virtual string catsPat( ); — список правил регулярного выражения разделённые '|' для выбора сообщений генерированных источником данных этого объекта по категориям.
void alarmSet( const string &mess, int lev = -TMess::Crit, const string &prm = "" ); — Формирование аварийной ситуации (нарушения) для объекта контроллера prm, или контроллера в целом если объект не указан, с сообщением mess и уровнем lev. Отрицательное значение уровня lev служит для установки, а положительное для снятия нарушения. Эта функция формирует нарушения и сообщения с категорией: al{ModId}:{CntrId}[.{PrmId}].
TTypeDAQ &owner( ) const; — Тип источника данных (модуль) - владелец данным контроллером.
virtual void vlGet( TParamContr *prm, TVal &vo ); — Упреждающая функция получения значения, через параметр prm. Используется для прямого (синхронного) чтения.
virtual void vlSet( TParamContr *prm, TVal &vo, const TVariant &vl, const TVariant &pvl ); — Упреждающая функция установки значения, через параметр prm. Используется для прямой (синхронной) записи vl с предыдущим значением в pvl.
virtual void vlArchMake( TParamContr *prm, TVal &val ); — Уведомляющая функция о создании архива для атрибута val, через параметр prm. Используется для настройки созданного архива, в соответствии с особенностями источника данных.
virtual void getVals( TParamContr *prm ); — Функция внутренней реализация асинхронного режима, вызывается в цикле объекта контроллера для параметра prm.
virtual bool cntrCmdProc( TParamContr *prm, XMLNode *opt ); — Функция обслуживания запросов интерфейса управления, от параметра prm.
Публичные атрибуты:
string name; — Имя типа параметра.
string descr; — Описание типа параметра.
string db; — БД типа параметра.
4.5. Объект параметра физического уровня (TParamContr)
virtual void setType( const string &tpId ); — вызывается для смены типа параметра tpId и может быть обработан в объекте модуля, для смены собственных данных.
4.6. Объект значения (TValue)
Наследует:
TCntrNode, TValElem.
Наследуется:
TParamContr.
Публичные методы:
bool dataActive( ); — Флаг активности (обновляемости) данных.
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 vlGet( TVal &vo ); — Упреждающая функция получения значения. Используется для прямого (синхронного) чтения.
virtual void vlSet( TVal &vo, const TVariant &vl, const TVariant &pvl ); — Упреждающая функция установки значения. Используется для прямой (синхронной) записи vl с предыдущим значением в pvl.
virtual void vlArchMake( TVal &val ); — Уведомляющая функция о создании архива для атрибута val. Используется для настройки созданного архива, в соответствии с особенностями источника данных.
4.7. Объект атрибута (TVal).
Наследует:
TCntrNode.
Данные:
Дополнительные флаги к объекту TFld (enum TVal::AttrFlag):
TVal::DirRead(0x100) — флаг прямого чтения значения;
TVal::DirWrite(0x200) — флаг прямой записи значения;
TVal::Dynamic(0x400) — флаг динамического атрибута, обычно создаваемого из пользовательских процедур.
Публичные методы:
TVal( ); — Конструктор по умолчанию.
TVal( TFld &fld ); — Инициализация как хранилище динамических данных.
TVal( TCfg &cfg ); — Инициализация как отражение статических данных (БД).
void setFld( TFld &fld ); — Инициализация как хранилище динамических данных.
void setCfg( TCfg &cfg ); — Инициализация как отражение статических данных (БД).
string name( ); — Имя атрибута.
int64_t time( ); — Метка времени последнего/текущего значения (10-6с).
bool isCfg( ); — Признак объекта значения, созданного на основе элемента конфигурации.
bool dataActive( ); — Флаг активности (обновляемости) данных.
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 то возвратится последнее значение.
int64_t 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( int64_t 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 ); — Установка ассоциированного со значением архива.
string setArch( const string &nm = "" ); — Установка/создание нового архива с предложенным именем nm или автоматически, если имя пусто.
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( ); — Язык программирования шаблона параметра.
bool progTr( ); — Перевод программы шаблона параметра.
string prog( ); — Программа шаблона параметра.
int64_t timeStamp( ); — Метка времени изменения объекта в БД.
void setName( const string &inm ); — Установка имени шаблона параметра.
void setDescr( const string &idsc ); — Установка описания шаблона параметра.
void setMaxCalcTm( int vl ); — Установка лимита на максимальное время вычисления процедуры шаблона.
void setProgLang( const string &ilng ); — Установка языка программирования шаблона параметра.
void setProgTr( bool vl ); — Установка перевода программы шаблона параметра.
void setProg( const string &iprg ); — Установка программы шаблона параметра.
void setStart( bool val ); — Пуск/останов шаблона параметра.
AutoHD<TFunction> func( ); — Подключение к функции, сформированной шаблоном.
TPrmTmplLib &owner( ) const; — Объект библиотеки шаблонов - владелец шаблона.
5. Подсистема "Архивы" (TArchiveS)
Подсистема "Архивы" представлена объектом TArchiveS, который содержит на уровне подсистемы модульные объекты типов архиваторов TTypeArchivator. Каждый объект типа архиватора содержит объекты архиваторов сообщений TMArchivator и архиваторов значений TVArchivator. Кроме этого объект подсистемы архивы содержит методы архива сообщений и объекты архивов значений TVArchive. Объект архива значений TVArchive содержит буфер значений путём наследования объекта буфера TValBuf. Для связи архива значений с архиваторами предназначен объект элемента значения TVArchEl. Этот объект содержится в архиваторе и на него ссылается архив. Структура подсистемы "Архивы" представлена на рис. 5.
Рис. 5. Иерархическая структура подсистемы архивов.
Подсистема "Архивы" содержит механизмы архивирования сообщений и значений. Непосредственно содержит архив сообщений вместе с его буфером. Содержит методы доступа к архивам значений и архиваторам значений и сообщений. Кроме этого выполняет задачу активного сбора данных из источников значений для архивов значений, а также архивирование архива сообщений по архиваторам.
Архив значений (TVArchive) содержит буфер (TValBuf) для промежуточного накопления значений перед архивированием. Связывается с источником значений в лице параметров системы OpenSCADA в активном или пассивном режиме, а также с другими источниками в пассивном режиме. Для архивирования на физические хранилища связывается с архиваторами значений различных типов.
Объект буфера TValBuf содержит массив значений основных типов системы OpenSCADA: строка, целое, вещественное и логичное. Поддерживается хранение значений в режимах жесткой, мягкой сетки и режиме свободного доступа. Предусмотрен также режим времени высокого разрешения (микросекунды). Используется как для непосредственного хранения больших массивов значений, так и для обмена с большими массивами методом покадрового доступа.
Корневой объект модуля подсистемы "Архивы" (TTypeArchivator) содержит информацию о конкретно взятом типе модуля. В рамках отдельных модулей может реализовывать собственные общемодульные функции. В общем для модулей этого типа содержит методы доступа к хранилищам значений и сообщений.
Объект архиватора сообщений (TMArchivator) содержит конкретную реализацию хранилища сообщений. В общем для архиваторов сообщений предоставляется интерфейс доступа к реализации механизма архивирования в модулях.
Объект архиватора значений (TVArchivator) содержит конкретную реализацию хранилища значений. В общем для архиваторов значений предоставляется интерфейс доступа к реализации механизма архивирования и назначение архивов значений на обслуживание архиватором.
Объект элемента архива TVArchEl связывает объекты архивов с архиваторами. Используется для доступа к архиваторам из архива, а также к архивам из архиватора, т.е. для перекрёстных вызовов.
5.1. Объект подсистемы "Архивы" (TArchiveS)
Наследует:
SubSYS.
Публичные методы:
int subVer( ); — Версия подсистемы.
int messPeriod( ); — Период архивирование сообщений из буфера (секунд).
int valPeriod( ); — Период сбора значений для активных архиваторов (миллисекунд).
int valPrior( ); — Приоритет задачи сбора значений для активных архиваторов.
bool valForceCurTm( ); — Указывает на принудительную установку текущего время в качестве метки времени получаемого значения.
void setMessPeriod( int ivl ); — Установка периода архивирования сообщений из буфера (секунд).
void setValPeriod( int ivl ); — Установка периода сбора значений для активных архиваторов (миллисекунд).
void setValPrior( int ivl ); — Установка приоритета задачи сбора значений для активных архиваторов.
void setValForceCurTm( bool vl ); — Принудительная установка текущего время в качестве метки времени получаемого значения.
void setToUpdate( ); — Установка флага планирования обновления.
void subStart( ); — Запуск подсистемы.
void subStop( ); — Останов подсистемы.
void valList( vector<string> &list ) const; — Список архивов значений в подсистеме.
bool valPresent( const string &iid ) const; — Проверка на наличие архива значений iid.
void setActMess( TMArchivator *a, bool val ); — Установка архиватора сообщений a в активное состояние val. Активный архиватор будет подсистемой обеспечиваться потоком сообщений.
void setActVal( TVArchive *a, bool val ); — Установка архива значений a в активное состояние val. Активный архив будет подсистемой обеспечиваться периодическим потоком значений (определяется периодичностью архива).
AutoHD<TTypeArchivator> at( const string &name ); — Подключение/обращение к типу архиватора (модулю) name.
void messPut( time_t tm, int utm, const string &categ, int8_t level, const string &mess, const string &arch = "", bool force = false ); — Помещение значения mess с уровнем level категории categ и время tm+utm в буфер, а затем в архив сообщений или прямо в указанный архиваторы arch (разделены символом ';'). force для прямой записи в архиватор минуя резервирование.
void messPut( const vector<TMess::SRec> &recs, const string &arch = "", bool force = false ); — Помещение группы значений recs в буфер, а затем в архив сообщений или прямо в указанный архиваторы arch (разделены символом ';'). force для прямой записи в архиватор минуя резервирование.
time_t messGet( time_t bTm, time_t eTm, vector<TMess::SRec> &recs, const string &category = "", int8_t level = TMess::Debug, const string &arch = "", time_t upTo = 0 ); — Запрос значений reqs за указанный период времени bTm, eTm для указанной категории (по шаблону) category и уровня level из архиваторов arch (разделены символом ';'). Возвращает время остановки запроса, полезно для продолжения с указанной точки.
time_t messBeg( const string &arch = "" ); — Начало архива сообщений в целом или для указанного архиватора arch.
time_t messEnd( const string &arch = "" ); — Конец архива сообщений в целом или для указанного архиватора arch.
float rdRestDtOverTm( ); — Глубина принудительной перезагрузки истории резерва при запуске, в сутках.
void setRdRestDtOverTm( float vl ); — Установка глубины принудительной перезагрузки истории резерва при запуске, в сутках.
void rdActArchMList( vector<string> &ls, bool isRun = false ); — Список активных архиваторов сообщений, работающих в схеме резервирования. При указании isRun в список попадут только исполняющиеся на данной станции архиваторы сообщения.
string rdStRequest( const string &arch, XMLNode &req, const string &prevSt = "", bool toRun = true ); — Запрос req к резервной станции от имени архиватора сообщения arch. Станция для запроса выбирается после указанной в prevSt, для исполняемого удалённо архиватора сообщений, при указании toRun.
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( ); — Признак: "Запускать архив при включении".
TFld::Type valType( bool full = false ); — Тип архивируемого значения. full — получать полный тип, иначе только общий.
bool hardGrid( ); — Использование жесткой сетки в буфере архива.
bool highResTm( ); — Использование высокого разрешения времени в буфере архива (микросекунды).
bool fillLast( ); — Заполнение проходных точек последним значением. В основном проходные значения заполняются EVAL однако иногда периодичность значений источника больше периодичности этого архива и это нормально.
int size( ); — Размер буфера архива (единицы).
void setName( const string &inm ); — Установка имени архива.
void setDscr( const string &idscr ); — Установка описания архива.
void setSrcMode( SrcMode vl = SaveCur, const string &isrc = "<*>", bool noex = false ); — Установка режима связывания с источником данных.
void setToStart( bool vl ); — Установка признака: "Запускать архив при включении".
void setValType( TFld::Type vl ); — Установка типа архивируемого значения.
void setHardGrid( bool vl ); — Установка использования жесткой сетки в буфере архива.
void setHighResTm( bool vl ); — Установка использования высокого разрешения времени в буфере архива (микросекунды).
void setFillLast( bool vl ); — Установка заполнения проходных точек последним значением.
void setSize( int vl ); — Установка размера буфера архива (единиц).
void setPeriod( int64_t vl ); — Установка периодичности буфера архива.
void start( ); — Запуск архива.
void stop( bool full_del = false ); — Останов архива, с полным удалением full_del.
TVariant getVal( int64_t *tm = NULL, bool up_ord = false, const string &arch = "", bool onlyLocal = false ); — Запрос одного значения за время tm и признаком притягивания к верху <up_ord> из указанного архиватора <arch>, буфера (arch="<bufer>") или всех архиваторов по мере падения качества (arch=""). Для обработки запроса только локальной станцией устанавиливается <onlyLocal>.
void getVals( TValBuf &buf, int64_t beg = 0, int64_t end = 0, const string &arch = "", int limit = 100000, bool onlyLocal = false ); — Запрос кадра значений buf за время от beg до end из указанного архиватора arch, буфера (arch="<bufer>") или всех архиваторов по мере падения качества (arch=""), с ограничением размера запроса в limit записей. Для запроса только локальных архивов, без компенсации пробелов архивов из резервных станций, устанавливается onlyLocal.
void setVals( TValBuf &buf, int64_t beg, int64_t end, const string &arch ); — Загрузка кадра значений buf за время от beg до end в указанный архиватор arch, буфер (arch="<bufer>") или все архиваторы (arch="").
void getActiveData( const int64_t &tm = 0 ); — Опросить источник данных с принудительной установкой метки времени в tm (не нулевое). Используется подсистемой для периодического сбор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( int64_t beg, int64_t end, const string &arch, int hsz = 650, int vsz = 230 ); — Формирование изображения (pdf) тренда за указанный промежуток времени beg, end и указанного архиватора arch.
TFld::Type valType( bool full = false ); — Тип значения, хранимого буфером. full — получать полный тип, иначе только общий.
bool hardGrid( ); — Работа буфера в режиме жесткой сетки.
bool highResTm( ); — Работа буфера в режиме времени высокого разрешения (микросекунды).
bool fillLast( ); — Заполнение проходных точек последним значением. В основном проходные значения заполняются EVAL однако иногда периодичность значений источника больше периодичности этого архива и это нормально.
int size( ); — Максимальный размер буфера (едениц).
int realSize( ); — Реальный размер буфера (едениц).
int64_t period( ); — Периодичность значений в буфере (микросекунд). Если периодичность нулевая то буфер функционирует в режиме свободного доступа.
int64_t begin( ); — Время начала буфера (микросекунд).
int64_t end( ); — Время окончания буфера (микросекунд).
bool vOK( int64_t ibeg, int64_t iend ); — Проверка наличия значений в буфере за указанный промежуток времени от ibeg до iend.
void setValType( TFld::Type vl ); — Установка типа значения хранимого буфером.
void setHardGrid( bool vl ); — Установка режима жесткой сетки.
void setHighResTm( bool vl ); — Установка режима времени высокого разрешения (микросекунды).
void setFillLast( bool vl ); — Установка заполнения проходных точек последним значением.
void setSize( int vl ); — Установка размера буфера (едениц).
void setPeriod( int64_t vl ); — Установка периодичности значений в буфере (микросекунд).
virtual void getVals( TValBuf &buf, int64_t beg = 0, int64_t end = 0 ); — Запрос кадра значений buf за время от beg до end.
TVariant get( int64_t *tm = NULL, bool up_ord = false ); — Запрос значения за время tm и признаком притягивания к верху up_ord.
virtual string getS( int64_t *tm = NULL, bool up_ord = false ); — Запрос значения строкового типа за время tm и признаком притягивания к верху up_ord.
virtual double getR( int64_t *tm = NULL, bool up_ord = false ); — Запрос значения вещественного типа за время tm и признаком притягивания к верху up_ord.
virtual int64_t getI( int64_t *tm = NULL, bool up_ord = false ); — Запрос значения целого типа за время tm и признаком притягивания к верху up_ord.
virtual char getB( int64_t *tm = NULL, bool up_ord = false ); — Запрос значения логического типа за время tm и признаком притягивания к верху up_ord.
virtual void setVals( TValBuf &buf, int64_t beg = 0, int64_t end = 0 ); — Установка кадра значений из buf за время от beg до end.
void set( const TVariant &value, int64_t tm = 0 ); — Установка значения с временем tm.
virtual void setS( const string &value, int64_t tm = 0 ); — Установка значения строкового типа с временем tm.
virtual void setR( double value, int64_t tm = 0 ); — Установка значения вещественного типа с временем tm.
virtual void setI( int64_t value, int64_t tm = 0 ); — Установка значения целого типа с временем tm.
virtual void setB( char value, int64_t tm = 0 ); — Установка значения логического типа с временем tm.
//
Защищённые методы:
void makeBuf( TFld::Type v_tp, int isz, int64_t ipr, bool hd_grd, bool hg_res ); — Пересоздание буфера для указанных параметров.
5.4. Модульный объект типа архиватора (TTypeArchivator)
Наследует:
TModule.
Наследуется:
Корневыми объектами модулей подсистемы "Архивы".
Публичные методы:
void messList( vector<string> &list ) const; — Список архиваторов сообщений.
bool messPresent( const string &iid ) const; — Проверка на наличие указанного архиватора сообщений.
TMArchivator( const string &id, const string &db, TElem *cf_el ); — Инициализирующий конструктор архиватора сообщений с идентификатором id, для хранения на БД db со структурой cf_el.
string id( ); — Идентификатор архиватора.
string workId( ); — Рабочий идентификатор, включает имя модуля.
string name( ); — Имя архиватора.
string dscr( ); — Описание архиватора.
bool toStart( ); — Признак "Запускать архиватор".
bool startStat( ) const; — Состояние архиватора "Запущен".
string &addr( ) const; — Адрес хранилища архиватора.
int &level( ); — Уровень сообщений, обслуживаемых архиватором.
virtual void redntDataUpdate( ); — Выполнение операции получения данных из резервной станции. Вызывается автоматически процедурой обслуживания схемы резервирования подсистемы.
virtual void start( ); — Запуск архиватора.
virtual void stop( ); — Останов архиватора.
virtual time_t begin( ); — Начало архива данного архиватора.
virtual time_t end( ); — Конец архива данного архиватора.
virtual bool put( vector<TMess::SRec> &mess, bool force = false ); — Поместить группу сообщений в архив сообщений данного архиватора. Возвращает "true", при успешной операции. force для прямой записи в архиватор минуя резервирование.
virtual time_t get( time_t bTm, time_t eTm, vector<TMess::SRec> &mess, const string &category = "", char level = 0, time_t upTo = 0 ); — Получить сообщения из архива данного архиватора для указанных параметров фильтра. Возвращает время остановки запроса, полезно для продолжения с указанной точки.
TVArchivator( const string &id, const string &db, TElem *cf_el ); — Инициализирующий конструктор архиватора значений с идентификатором id, для хранения на БД db со структурой cf_el.
string id( ); — Идентификатор архиватора.
string workId( ); — Рабочий идентификатор, включает имя модуля.
string name( ); — Имя архиватора.
string dscr( ); — Описание архиватора.
string addr( ) const; — Адрес хранилища архиватора.
int archPeriod( ); — Периодичность архивирования значений архиватором. Время через которое архиватор производит архивирование кадра значений из буфера архива.
int selPrior( ); — Приоритет выбора для режима "Все" архиваторы.
bool toStart( ); — Признак "Запускать архиватор".
bool startStat( ) const; — Состояние архиватора "Запущен".
string DB( ); — Адрес БД архиватора.
string tbl( ); — Адрес таблицы БД архиватора.
string fullDB( ); — Полный адрес таблицы БД архиватора.
void setName( const string &inm ); — Установка имени архиватора.
void setDscr( const string &idscr ); — Установка описания архиватора.
void setArchPeriod( int iper ); — Установка периодичности архивирования значений архиватором. Время через которое архиватор производит архивирование кадра значений из буфера архива.
void setSelPrior( int vl ); — Установка приоритета выбора для режима "Все" архиваторы.
void setToStart( bool vl ); — Установка признака "Запускать арзиватор".
TVArchEl( TVArchive &iarchive, TVArchivator &iarchivator ); — Инициализирующий конструктор для связи архива iarchive с архиватором iarchivator.
virtual void fullErase( ); — Полное удаление элемента.
virtual int64_t end( ); — Время конца данных (микросекунды).
virtual int64_t begin( ); — Время начала данных (микросекунды).
int64_t lastGet( ); — Время последнего сброса данных из буфера в хранилище.
TVariant getVal( int64_t *tm, bool up_ord, bool onlyLocal = false ); — Запрос значения за время tm и признаком притягивания к верху up_ord, с указанием запроса только локального архива в onlyLocal.
void getVals( TValBuf &buf, int64_t beg = 0, int64_t end = 0, bool onlyLocal = false ); — Запрос кадра значений buf за время от beg до end, с указанием запроса только локального архива в onlyLocal.
void setVals( TValBuf &buf, int64_t beg = 0, int64_t end = 0, bool toAccum = false ); — Установка кадра значений из buf за время от beg до end, через аккумуляцию toAccum.
int64_t prev_tm; — Время предыдущего значения. Используется для усреднения.
string prev_val; — Предыдущее значение. Используется для усреднения.
Защищённые методы:
virtual TVariant getValProc( int64_t *tm, bool up_ord ); — Функция обработки запроса одного значения из архива.
virtual void getValsProc( TValBuf &buf, int64_t beg, int64_t end ); — Функция обработки запроса модулем на получение данных.
virtual void setValsProc( TValBuf &buf, int64_t beg, int64_t end, bool toAccum ); — Функция обработки запроса модулем на установку данных, через аккумуляцию toAccum.
6. Подсистема "Транспорты" (TTransportS)
Подсистема "Транспорты" представлена объектом TTransportS, который содержит на уровне подсистемы модульные объекты типов транспортов TTypeTransport. Каждый тип транспорта содержит объекты входящих TTransportIn и исходящих TTransportOut транспортов. Общая структура подсистемы приведена на рис. 6.
Рис. 6. Слоистая структура подсистемы транспортов.
Корневой объект модуля подсистемы "Транспорты" содержит информацию о конкретно взятом типе модуля и внешних OpenSCADA хостах/станциях. В рамках отдельно взятого модуля может быть реализована собственная общемодульная функциональность. В общем, для всех модулей, содержатся методы доступа к входящим и исходящим транспортам конкретно взятого модуля.
Объект входящего транспорта TTransportIn предоставляет интерфейс к реализации модульного метода входящего транспорта.
Объект исходящего транспорта TTransportOut предоставляет интерфейс к реализации модульного метода исходящего транспорта.
6.1. Объект подсистемы "Транспорты" (TTransportS)
Наследует:
TSubSYS.
Данные:
Режимы внешних хостов (enum — ExtHost::Mode):
User (0) — Пользовательский.
System (1) — Системный.
UserSystem (2) — Пользовательский и Системный.
Структура внешних OpenSCADA хостов/станций (class TTransportS::ExtHost):
uint8_t upRiseLev; — Уровень/глубина поднятия внешних станций самого этого хоста/станции.
int8_t mode; — Режим хоста.
time_t mdf; — Время модификации.
Публичные методы:
int subVer( ); — Версия подсистемы.
void inTrList( vector<string> &ls ); — Полный список входящих транспортов.
void outTrList( vector<string> &ls ); — Полный список исходящих транспортов.
string extHostsDB( ); — БД хранения перечня внешних хостов.
void extHostList( const string &user, vector<ExtHost> &list, bool andSYS = false, int upRiseLev = -1 ); — Список внешних хостов list для пользователя user, включая системные andSYS и уровня поднятия upRiseLev (-1 - начинать с уровня в записи хоста).
ExtHost extHostGet( const string &user, const string &id, bool andSYS = false ); — Получение информационного объекта внешнего хоста id от имени пользователя user, включая системный andSYS ("*" — строго для системных хостов).
AutoHD<TTransportOut> extHost( TTransportS::ExtHost host, const string &pref = "" ); — Создание - запрос исходящего транспорта для обслуживания внешнего хоста host с префиксом идентификации узла системы pref.
void extHostSet( const ExtHost &host, bool andSYS = false ); — Установка внешнего хоста/станции host, включая системный andSYS.
void extHostDel( const string &user, const string &id, bool andSYS = false ); — Удаление внешнего хоста/станции id от имени пользователя user, включая системный andSYS ("*" — для системных хостов).
int cntrIfCmd( XMLNode &node, const string &senderPref, const string &user = "" ); — Передача запроса интерфейса управления OpenSCADA node к удалённой станции.
void subStart( ); — Запуск подсистемы.
void subStop( ); — Останов подсистемы.
TElem &inEl( ); — Структура БД входящих транспортов.
TElem &outEl( ); — Структура БД исходящих транспортов.
AutoHD<TTypeTransport> at( const string &id ) const; — Обращение/подключение к типу транспорта id.
6.2. Модульный объект типа транспортов (TTypeTransport)
void inDel( const string &name, bool complete = false ); — Удаление входящего транспорта. Возможно полное удаление, включающее и БД, путём установки признака complete.
void outDel( const string &name, bool complete = false ); — Удаление исходящего транспорта. Возможно полное удаление, включающее и БД, путём установки признака complete.
virtual int writeTo( const string &sender, const string &data ); — Отправка данных data назад отправителю sender.
vector<AutoHD<TTransportOut> > assTrs( bool checkForCleanDisabled = false ); — Массив связанных исходящих транспортов, созданных входящим транспортом для типовых запросов к инициатору подключения. Установить checkForCleanDisabled для предварительной проверки и очистки отключенных.
int logLen( ); — длина лога ВВ.
void setLogLen( int vl ); — установка длины лога ВВ.
void pushLogMess( const string &vl ); — поместить сообщение vl в лог в формате "{Message}\n{BinData}".
TTypeTransport &owner( ) const; — Тип транспорта – владелец входящим транспортом.
Защищённые методы:
string assTrO( const string &addr ); — Создание связанного исходящего транспорта с адресом addr.
virtual void start( int time = 0 ); — Запуск транспорта с временем подключения time.
virtual void stop( ); — Останов транспорта.
virtual int messIO( const char *oBuf, int oLen, char *iBuf = NULL, int iLen = 0, int time = 0 ); — Отправка данных через транспорт. Время ожидания time соединения (в миллисекундах). Отрицательное время time отключает работу транспорта в режиме запрос/ответ и позволяет независимо читать/писать в буфер ВВ, с таймаутом чтения time в абсолютном значении.
void messProtIO( XMLNode &io, const string &prot ); — Отправка данных в дереве XML in через транспорт, используя транспортный протокол prot.
int logLen( ); — длина лога ВВ.
void setLogLen( int vl ); — установка длины лога ВВ.
void pushLogMess( const string &vl ); — поместить сообщение vl в лог в формате "{Message}\n{BinData}".
TTypeTransport &owner( ) const; — Тип транспорта – владелец исходящим транспортом.
ResMtx &reqRes( ); — Запросный ресурс, который должен быть глобально захватываем в протоколах с получением фрагментов.
Подсистема "Протоколы коммуникационных интерфейсов" представлена объектом TProtocolS, который содержит на уровне подсистемы модульные объекты отдельных протоколов TProtocol. Каждый протокол содержит объекты открытых сеансов входящих протоколов TProtocolIn.
Объект TProtocolS предоставляет доступ к входящим и исходящим протоколам отдельно взятых типов транспортных протоколов. Внутренняя сторона исходящего протокола строится по потоковому принципу с индивидуальной структурой потока для каждой реализации протокола.
7.1. Объект подсистемы "Протоколы коммуникационных интерфейсов" (TProtocolS)
AutoHD<TTransportIn> &srcTr( ); — Транспорт-источник, открывший данный сеанс входящего протокола.
const string &srcAddr( ) — Адрес отправителя; во второй строке служебная часть адреса для для обратных сообщений.
virtual unsigned waitReqTm( ); — Время ожидания запросов на входящем транспорте (в миллисекундах), после которого обращаться к протоколу с пустым сообщением — режим пула. Установка в ноль отключает режим пула.
virtual void setSrcTr( TTransportIn *vl ); — Установка транспорта-источника открытия данного сеанса входящего протокола.
Подсистема "Пользовательские интерфейсы" представлена объектом TUIS, который содержит на уровне подсистемы модульные объекты пользовательских интерфейсов TUI.
8.1. Объект подсистемы "Пользовательские интерфейсы" (TUIS)
Наследует:
TSubSYS.
Данные:
Параметры запроса (enum — GetOpts):
GetPathURL (1) — Получение пути.
GetContent (2) — Получение команды открытия документа.
static string icoGet( const string &inm, string *tp = NULL, bool retPath = false ); — Загрузка изображения иконки inm из стандартных директорий или возврат пути, при retPath, к доступной иконке. Обнаруживаются иконки для расширений "png", "gif", "jpg", "jpeg", которое возвращается в tp.
static string docGet( const string &inm, string *tp = NULL, unsigned opt = 0 ); — Загрузка документа inm из стандартных директорий или возврат пути, при retPath, к доступному документу. Обнаруживаются документы для расширений "pdf", "html", "odt", которое возвращается в tp.
static string mimeGet( const string &inm, const string &fDt, const string &orig = "" ); — Получение mime типа файла в виде {группа}/{тип} для файла с именем inm, его содержимого fDt и исходного намёка orig.
8.2. Модульный объект пользовательского интерфейса (TUI)
Подсистема безопасности представлена объектом который содержит объекты групп TGroup и пользователей TUser.
Объект пользователя TUser содержит пользовательскую информацию и выполняет проверку аутентичности пользователя в соответствии с указанным паролем.
Объект пользователя TGroup содержит информацию о группе пользователей и выполняет проверку на принадлежность пользователя к группе.
10.1. Объект подсистемы "Безопасность" (TSeсurity)
Наследует:
TSubSYS.
Публичные данные:
static const string pHashMagic; — Строка-указатель (префикс) пароля в хеше.
Публичные методы:
bool access( const string &user, char mode, int owner, int groups, int access ); — Проверка доступа для пользователя user в режиме mode к ресурсу с владельцем owner, группами groups (разделитель ',') и правами access.
void usrList( vector<string> &list ) const; — Список пользователей list.
void usrGrpList( const string &name, vector<string> &list ); — Список групп пользователей list, в которые пользователь name включён.
bool usrPresent( const string &name ) const; — Проверка на наличие указанного пользователя 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 &id, const char *grp = "root", const string &stor = "" ); — Инициализирующий конструктор функции с идентификатором id, группой пользователей grp и хранилищем stor.
virtual void preIOCfgChange( ); — Вызывается перед изменением конфигурации.
virtual void postIOCfgChange( ); — Вызывается после изменения конфигурации.
TValFunc *ctxGet( int key ); — Получение контекста для ключа key.
void ctxSet( int key, TValFunc *val ); — Установка контекста для ключа key.
void ctxClear( ); — Очистка контекста вызовов внешних функций.
Публичные атрибуты:
void *exCtx; — Контекст исполнения функции.
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 ) const; — Получение указателя на элемент 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( ) const; — Признак - "Использовать ключ", для запросов dataSeek() и dataDel().
bool noTransl( ) const; — Признак "Отключить перевод" предназначен для отключения механизма перевода текстовых переменных для данной записи.
bool reqKey( ) const; — Признак "Ключ запроса", для выполнения групповых операций по данному полю, как ключу.
bool isKey( ) const; — Сборный признак поля как ключ, в зависимости от режима "Ключ запроса" для группы.
bool extVal( ) const; — Признак "Расширенное значение", для указания совмещения полем роли поиска по ключу и обновления самого ключа и перевода.
void setView( bool vw ); — Установка признака "Ячейка видима" в vw.
void setKeyUse( bool vl ); — Установка признака "Использовать ключ" в vl.
void setNoTransl( bool vl ); — Установка признака "Отключить перевод".
void setReqKey( bool vl ); — Установка признака "Ключ запроса".
void setExtVal( bool vw ); — Установка признака "Расширенное значение".
TFld &fld( ) const; — Конфигурация ячейки.
string getSEL( ); — Получить значение выборочного типа.
string getS( ) const; string getS( uint8_t RqFlg ); — Получить значение строкового типа с флагами запроса RqFlg.
const char *getSd( ); — Получить прямой доступ к значению строкового типа, только для чтения.
double &getRd( ); — Получить прямой доступ к значению вещественного типа.
int64_t &getId( ); — Получить прямой доступ к значению целого типа.
char &getBd( ); — Получить прямой доступ к значению логического типа.
void setSEL( const string &val, uint8_t RqFlg = 0 ); — Установить значение выборочного типа в val с флагами запроса RqFlg.
void setS( const string &val ); TCfg &operator=( const string &vl ); TCfg &operator=( const char *vl ); void setS( const string &val, uint8_t RqFlg ); — Установить значение строкового типа в val с флагами запроса RqFlg.
void setR( double val ); TCfg &operator=( double vl ); void setR( double val, uint8_t RqFlg ); — Установить значение вещественного типа в val с флагами запроса RqFlg.
void setI( int64_t val ); TCfg &operator=( int64_t vl ); void setI( int64_t val, uint8_t RqFlg ); — Установить значение целого типа в val с флагами запроса RqFlg.
void setB( char val ); TCfg &operator=( bool vl ); void setB( char val, uint8_t RqFlg ); — Установить значение логического типа в val с флагами запроса RqFlg.
TConfig &owner( ) const; — Объект контейнера-владельца.
13.3. Объект структуры данных (TElem)
Наследуется:
TTypeParam, TControllerS, TTypeDAQ, а также модульными объектами, совмещающими функции хранения структуры.
Публичные методы:
TElem( const string &name = "" ); — Инициализация структуры с указанным именем name.
TElem &operator=( const TElem &src ); — Копирование из src
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 fldClear( ); — Удаление всех ячеек.
void valAtt( TValElem *cnt ); — Вызывается автоматически в случае подключения структуры к хранилищу данных cnt.
void valDet( TValElem *cnt ); — Вызывается автоматически в случае отключения структуры от хранилища данных cnt.
ResMtx &resEl( ); — Мютекс для доступа к контейнерам полей.
13.4. Ячейка структуры данных (TFld)
Данные:
Тип ячейки (enum – TFld::Type):
TFld::Boolean(0) — логический тип;
TFld::Integer(1) — целочисленный тип;
TFld::Real(4) — вещественный тип;
TFld::String(5) — строковый тип;
TFld::Object(6) — объектный тип;
TFld::GenMask(0x0F) — маска основных типов;
TFld::Int16(0x11) — целое знаковое 16 разрядов;
TFld::Int32(0x01) — целое знаковое 32 разрядов;
TFld::Int64(0x21) — целое знаковое 64 разрядов;
TFld::Float(0x14) — float (4 байта);
TFld::Double(0x04) — double (8 байт).
Флаги ячейки (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) — полнотекстовый, многострочный, режим тестового типа;
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; — Список вариантов значений для строкового типа.
const vector<int> &selValI() const; — Список вариантов значений для целого типа.
const vector<double> &selValR() const; — Список вариантов значений для вещественного типа.
const vector<bool> &selValB() const; — Список вариантов значений для логического типа.
const vector<string> &selNm() const; — Список имён вариантов значений.
string selVl2Nm( const string &val ); — Получить выбранное имя по значению val строкового типа.
string selVl2Nm( int64_t val ); — Получить выбранное имя по значению целого val типа.
string selVl2Nm( double val ); — Получить выбранное имя по значению val вещественного типа.
string selVl2Nm( bool val ); string selVl2Nm( char val ); — Получить выбранное имя по значению val логического типа.
string selNm2VlS( const string &name ); — Получить значение строкового типа по выбранному имени name.
int64_t 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>");
EVAL_INT16 — Значение ошибки целого 16 (-32767);
EVAL_INT32 — Значение ошибки целого 32 (-2147483647);
EVAL_INT64 — Значение ошибки целого 64 (-9223372036854775807ll);
EVAL_RFlt — Значение ошибки вещественного Float (-3.29E38);
EVAL_RDbl — Значение ошибки вещественного Double (-1.79E308).
Типы данных (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( bool ivl ); — Конструктор для логического типа.
TVariant( int64_t ivl ); TVariant( int ivl ); — Конструктор для целого типа.
TVariant( double ivl ); — Конструктор для вещественного типа.
TVariant( string ivl ); — Конструктор для строки.
TVariant( const char *var ); — Конструктор для строки.
bool isNull( ) const; — Признак того, что объект не инициирован.
bool isEVal( ) const; — Признак того, что содержится ошибочное значение.
Type type( ) const; — Тип значения.
void setType( Type tp, bool fix = false, bool stdStringOmit = false ); — Установка типа tp для его фисации fix и возможности использования как постоянная stdStringOmit.
bool isModify( ); — Флаг модификации. Служит в объектных функциях для индикации модификации переменных.
void setModify( bool vl = true ); — Установка флага модификации.
virtual char getB( ) const; operator char( ); — Получение значения как логическое.
virtual int64_t getI( ) const; operator int64_t( ); operator int( ); — Получение значения как целого.
virtual double getR( ) const; operator double( ); — Получение значения как вещественного.
virtual string getS( ) const; operator string( ); — Получение значения как строки.
virtual TVariant funcCall( const string &id, vector<TVariant> &prms ); — Вызов функции объекта с идентификатором id и параметрами prms.
14. Интерфейс управления системой и динамическое дерево объектов системы (TCntrNode)
Для полного покрытия ключевых компонентов системы сетью объектов единой структуры предназначен объект узла динамического дерева TCntrNode. На этот объект возлагаются следующие функции:
единообразного доступа к компонентам системы, включая блокировки динамического доступа;
построение распределённого интерфейса управления.
Любой объект, имеющий потребность в предоставлении динамического доступа к себе или своим компонентам должен наследоваться от объекта узла динамического дерева TCntrNode. Данное родство автоматически включает узел в динамическое дерево объектов, охваченное как прямой, так и обратной связью, а также предоставляет возможность создания контейнеров под собственные дочерние узлы. В дополнении к этому узел получает возможность упреждения про включение и исключение/удаление узла из дерева с возможностью отказа от исключения/удаления.
Интерфейс управления системы включён в состав объекта TCntrNode и, соответственно, охватывает все узлы динамического дерева системы, позволяя единообразно управлять системой вне зависимости от используемого клиентского инструмента. Интерфейс управления системой выполнен на основе языка разметки XML. Можно придумать множество способов использования интерфейса управления системой, в качестве примера отметим следующие наиболее яркие решения:
Web интерфейс конфигурации;
GUI интерфейс конфигурации (QT, GTK+, ...);
отражение конфигурации в сеть для распределённого управления множеством из единой среды администрирования;
использование в роли протокола для доступа к данным объектов из сети;
предоставление сервисных функций для доступа третьих приложений и отдельных компонентов 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 ); — Команда работы с интерфейсом управления системы. Поддерживаются транспортные переходы по полному пути вида: где %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, ... ); static XMLNode *ctrMkNode2( 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", ... );
— Добавление элемента управления на страницу. Возможно указание множества дополнительных атрибутов в количестве 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 и наличие прав на её исполнение.
ResMtx &dataRes( ); — Мютекс использования ресурсов узла общего назначения.
virtual const char *nodeName( ) const; — Имя узла.
virtual const char *nodeNameSYSM( ) const; — Имя элемента расположения системного сообщения, для помещения его в текст системного сообщения функцией "mess_sys" и "err_sys". Пустое значение, по умолчанию, для пропуска данного узла.
string nodePath( char sep = 0, bool from_root = true ) const; — Получение полного пути к узлу, начиная с корня 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 ); — Удаление узла по его полному пути.
void setNodeFlg( char flg ); — Установка флагов TCntrNode::SelfModify, TCntrNode::SelfModifyS и TCntrNode::SelfSaveForceOnChild.
char nodeMode( ) const; — Состояние узла.
unsigned nodeUse( bool selfOnly ); — Количество подключений к узлу. selfOnly — только собственных подключений, без дочерних.
unsigned nodePos( ); — Положение данного узла в контейнере узла-владельца. Достоверно только для упорядоченных контейнеров.
int isModify( int mflg = TCntrNode::All ); — Проверка факта модификации узла или ветви узлов.
void modif( bool save = false ); — Установка признака модифицированности узла, с признаком сохранения save.
void modifG( ); — Установка признака модифицированности ветви узлов.
void modifClr( bool save = false ); — Очистка признака модифицированности узла или признака сохранения save.
void modifGClr( ); — Очистка признака модифицированности ветви узлов.
void load( TConfig *cfg = NULL, string *errs = NULL ); — Загрузка узла динамического дерева для готовой конфигурации cfg. Ошибки загрузки помещаются строками в errs.
void save( unsigned lev = 0, string *errs = NULL ); — Сохранение узла динамического дерева, на уровне вложенности lev (служебный). Ошибки сохранения помещаются строками в errs.
virtual void AHDConnect( ); — Подключение к узлу (захват ресурса).
virtual bool AHDDisConnect( ); — Отключение от узла (освобождение ресурса). Удаление при нулевом результате.
void mess_sys( int8_t level, const char *fmt, ... ); — Формирование системного сообщения для пути узла в качестве категории, уровня level, форматированного сообщения fmt, дополненного расположением узла, и следующими аргументами.
TError err_sys( const char *fmt, ... ) const; TError err_sys( int cod, const char *fmt, ... ) const; — Формирование объекта ошибки для пути узла в качестве категории, кода cod, форматированного сообщения fmt, дополненного расположением узла, и следующими аргументами.
virtual TVariant objPropGet( const string &id ); — Запрос свойства узла как пользовательского объекта.
virtual void objPropSet( const string &id, TVariant val ); — Установка свойства узла как пользовательского объекта.
virtual TVariant objFuncCall( const string &id, vector<TVariant> &prms ); — Вызов функции узла как пользовательского объекта.
int8_t grpSize( ); — Количество контейнеров с дочерними узлами.
int8_t grpId( const string &sid ); — Получение индекса группы по её идентификатору.
virtual AutoHD<TCntrNode> chldAt( int8_t igr, const string &name, const string &user = "" ) const; — Подключение к дочернему узлу name контейнера gr пользователя user.
void chldList( int8_t igr, vector<string> &list, bool noex = false ) const; — Список дочерних узлов list в указанном контейнере gr.
bool chldPresent( int8_t igr, const string &name ) const; — Проверка на присутствие указанного дочернего узла name в контейнере gr.
Защищённые методы:
virtual void cntrCmdProc( XMLNode *req ); — Функция обслуживания запросов интерфейса управления. Должна переопределяться у потомка.
void nodeEn( int flag = 0 ); — Включение узла.
void nodeDis( long tm = 0, int flag = 0 ); — Отключение узла с передачей флага.
void nodeDelAll( ); — Очистка всех контейнеров с дочерними узлами.
void setNodePrev( TCntrNode *node ); — Установка родительского узла в node.
void setNodeMode( char mode ); — Установка состояния узла.
GrpEl &grpAt( int8_t id ); — Доступ к структуре группы.
unsigned grpAdd( const string &id, bool ordered = false ); — Добавление контейнера дочерних узлов с префиксом id и возможностью упорядоченного хранения ordered. Возвращает идентификатор нового контейнера.
XMLNode* childGet( const string &name, const int numb = 0, bool noex = false ) const; — Получение вложенного numb порядкового тега по имени тега name. noex указывает на запрет генерации исключения в случае отсутствия тега.
XMLNode* childGet( const string &attr, const string &vl, bool noex = false ) const; — Получение вложенного numb порядкового тега по значению vl атрибута attr. noex указывает на запрет генерации исключения в случае отсутствия тега.
XMLNode* getElementBy( const string &attr, const string &val ); — Поиск вложенного узла по значению val атрибута attr.
void getElementsBy( const string &tag, const string &attr, const string &val, TArrayObj *rez ); — получение массива элементов в rez из дерева по тегу tag (пустой для всех) и атрибуту attr со значением val (пустые для пропуска).
XMLNode* parent( ); — Родительский тег данного тега.
XMLNode* root( ); — Корневой тег данного тега.
16. Ресурсы в системе OpenSCADA (Res, ResAlloc, ResMtx, MtxAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах "Res" и "ResAlloc". Объект "Res" предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте "ResAlloc" реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта "TCntrNode", который содержит механизм подключения через шаблон "AutoHD". Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от "TCntrNode" шаблон "AutoHD" поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект R/W ресурса (ResRW)
Публичные методы:
ResRW( ); — Инициализация ресурса.
static void resRequestW( long tm = 0 ); — Запрос ресурса на запись/модификацию с таймаутом ожидания tm (в миллисекундах).
bool resTryW( ); — Попытка захвата ресурса на запись/модификацию. При успешном захвате возвращает "true" иначе "false".
static void resRequestR( long tm = 0 ); — Запрос ресурса на чтение с таймаутом ожидания tm (в миллисекундах).
bool resTryR( ); — Попытка захвата ресурса на чтение. При успешном захвате возвращает "true" иначе "false".
16.2. Объект автоматического освобождения R/W ресурса (ResAlloc)
Публичные методы:
ResAlloc( ResRW &rid ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid.
ResAlloc( ResRW &rid, bool write, long tm = 0 ); — Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора rid. С указанием типа ресурса write (чтение/запись).
void request( bool write = false, long tm = 0 ); void lock( bool write = false, unsigned short tm = 0 ); — Запрос ресурса в указанном режиме write (чтение/запись).
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. Ресурс игнорируется в случае использования этой функции!
16.6. Объект условной переменной, по мютексу (CondVar)
Публичные методы:
CondVar( ); — Инициализация условной переменной.
int wait( ResMtx &mtx, unsigned short tm = 0 ); — ожидание пробуждения по условной переменной с таймаутом tm и мютексом mtx.
int wakeOne( ); — пробуждение одного потока.
int wakeAll( ); — пробуждение всех потоков.
16.7. Объект автоматического освобождения POSIX мютекса (MtxAlloc)
Публичные методы:
MtxAlloc( ResMtx &iM, bool lock = false ); — Инициализация автоматически освобождающегося мютекса для ранее выделенного идентификатора iM. С указанием блокировки lock при создании.
int lock( ); — Захват ресурса. Возврат нуля при успешном выполнении.
int unlock( ); — Освобождение ресурса. Возврат нуля при успешном выполнении.
int tryLock( ); — Проба захвата ресурса, без ожидания освобождения. Возврат нуля при успешном выполнении.
16.8. Объект строки с доступом, разделённым глобальным ресурсом(мютексом) данных (MtxString)
Публичные методы:
MtxString( ResMtx &iM ); — Инициализация строки с разделением доступа ресурсом iM.
MtxString &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"/> и <set path="/sub_Archive/%2fserv%2fmess"/> для запроса информации об архиве, значений архива и установки значений в архив, соответственно. В объекте контроллера подсистемы "Сбор данных" предусмотрен похожий сервисный запрос сообщений генерированных источником данных <get path="/sub_DAQ/{DAQ_TP}/{DAQ_CNTR}/%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, utime
Время сообщения (секунды, микросекунды)
Время отдельно взятого сообщения.
cat
Категория сообщения
Категория отдельно взятого сообщения.
lev
Уровень сообщения
Уровень отдельно взятого сообщения.
Команда установки архивных данных:<set path="/sub_Archive/%2fserv%2fmess"/>
<el>{mess}</el>
Сообщения
В отдельных тегах указываются сообщения для установки.
time, utime
Время сообщения (секунды, микросекунды)
Время отдельно взятого сообщения.
cat
Категория сообщения
Категория отдельно взятого сообщения.
lev
Уровень сообщения
Уровень отдельно взятого сообщения.
Команда запроса архивных и/или текущих данных источника данных:<get path="/sub_DAQ/{DAQ_TP}/{DAQ_CNTR}/%2fserv%2fmess"/>
tm
Установка времени
Время вершины блока архива сообщений. Если значение нулевое то запрос осуществляется от текущего времени и это время возвращается.
tm_grnd
Установка времени основания/начала архива
Указывает основание/начало архива.
lev
Установка уровня важности
Указывает уровень важности сообщений, для которого и выше получать сообщения.
<el>{mess}</el>
Сообщения
В отдельных тегах возвращаются сообщения.
time, utime
Время сообщения (секунды, микросекунды)
Время отдельно взятого сообщения.
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".
Команда запроса имени архивного параметра или самого архива:<name path="{a_p_addr}/%2fserv%2fval"/>
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 ); — Отправка данных через транспорт. Время ожидания time соединения указывается в миллисекундах.
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 символа;
размер табуляции: 8 символов;
фигурные скобки открытия располагается на уровне предыдущей команды, если она короче 80 символов
фигурные скобки закрытия располагается в отдельных строках;
возможно написание вложений в одной строке с предыдущим уровнем вложения, в случае повышения читабельности кода;
расстояние между описаниями функций не менее одного символа;
расстояние между определением переменных и текстом программы не менее одного символа;
допускается определение переменных в тексте при сохранении читабельности;
избегать длины строки более 100 символов;
команды препроцессора располагать на первом уровне вне зависимости от текущего уровня текста;
для форматирования исходного текста, наследованного у других свободных приложений и примеров, рекомендуется использовать утилиту: