Пример #1
0
 /// <summary>Отправляет запрос к АС на выполнение</summary>
 private void _execute_query(ref Services.QAQuery query)
 {
     try
     {
         Services.ArcClntQuery(ref query); // исполняет запрос
     }
     catch (Exception ex)
     {
         Logger.Log(0, String.Format(" ERROR: [{0}] ошибка при выполнении запроса: {1}", _station, ex.Message));
     }
 }
Пример #2
0
        /// <summary>Запрос списка цепочек</summary>
        protected void query_chains()
        {
            lock (_stor_chains) _stor_chains.Clear(); // очищаем список цепочек

            Services.QAQuery query = new Services.QAQuery();
            query.LinkId           = _link_id;                                       // идентификатор сессии
            query.Callback         = _receiver;                                      // указатель на метод-приёмник
            query.ParamId.Category = 2;                                              // категория параметра: хранилище информации о цепочках томов архива
            query.Flags            = Services.QF_STORINFO | Services.QF_MULTIPARAMS; // флаги синхронного многопараметрического запроса информации о структуре хранилища

            Logger.Log(4, String.Format("  INFO4: [{0}] запрос списка цепочек", _station));

            _execute_query(ref query);
        }
Пример #3
0
        /// <summary>Проверка доступности архивной станции</summary>
        internal void get_status()
        {
            Services.QAQuery query = new Services.QAQuery();
            query.LinkId           = _link_id;            // идентификатор сессии
            query.Callback         = _receiver;           // указатель на метод-приёмник
            query.ParamId.Category = 2;                   // категория параметра: хранилище информации о цепочках томов архива
            query.Flags            = Services.QF_NETINFO; // флаг запроса доступности архивной станции по сети (фактически, ping)

            try
            {
                _execute_query(ref query);
            }
            catch (Exception ex)
            {
                Logger.Log(0, String.Format(" ERROR: [{0}] ошибка при получении статуса сервера: {1}", _station, ex.Message));
            }
        }
Пример #4
0
        /// <summary>Запрос списка переменных в томе</summary>
        protected void query_parameters(int volume)
        {
            lock (_stor_parameters) _stor_parameters.Clear(); // очищаем список параметров

            if ((_stor_chains.Count > 0) && (_stor_volumes.Count > 0))
            {
                Services.QAQuery query = new Services.QAQuery();
                query.LinkId           = _link_id;                                       // идентификатор сессии
                query.Callback         = _receiver;                                      // указатель на метод-приёмник
                query.ParamId.Category = 4;                                              // категория параметра: хранилище информации о списке параметров в томе
                query.ParamId.CardId   = _stor_chains[0].id;                             // идентификатор цепочки
                query.Flags            = Services.QF_STORINFO | Services.QF_MULTIPARAMS; // флаги синхронного многопараметрического запроса информации о структуре хранилища
                query.BeginTime        = _stor_volumes[volume].properties.beginTime;     // идентификатор тома в виде целочисленного unixtimestamp времени его начала

                Logger.Log(4, String.Format("  INFO4: [{0}] запрос списка параметров", _station));

                _execute_query(ref query);
            }
        }
Пример #5
0
        /// <summary>Получает часовой набор значений указанного параметра за указанный период</summary>
        /// <param name="start_time">Начало интервала</param>
        /// <param name="parameter_index">Индекс параметра</param>
        /// <param name="station_parameter_name">Локальное название параметра архивной станции</param>
        /// <param name="table">Ссылка на таблицу в памяти для приёма истории значений параметра</param>
        /// <returns>Запрос успешен: параметр существует и получены данные с хорошим качеством</returns>
        internal bool get_hour_interval(DateTime start_time, ushort parameter_index, string station_parameter_name, ref MemoryTable table)
        {
            user_data_reference _user_data_ref = new user_data_reference();                   // структура для передачи ссылки на дополнительные параметры через неуправляемый код
            UserData            _user_data     = new UserData();                              // структура для транзита дополнительных параметров через неуправляемый код

            _user_data_ref.data = _user_data;                                                 // вставляем в структуру UserData ссылку на класс с дополнительными полями данных
            _user_data_ref.data.parameter_index = parameter_index;                            // индекс параметра
            _user_data_ref.data.count           = 0;                                          // счётчик принятых значений параметров с хорошим качеством
            _user_data_ref.data.table           = table;                                      // указательно на таблицу в памяти для приёма сырых значений

            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(_user_data_ref));            // распределяем память в куче для копирования туда индекса кэша

            Marshal.StructureToPtr(_user_data_ref, pointer, false);                           // копируем индекс кэша в кучу

            Services.QAQuery query = new Services.QAQuery();                                  // структура, описывающая запрос к АС
            query.LinkId    = _link_id;                                                       // дескриптор подключения к архивной станции
            query.Callback  = new Services.QACallback(_get_historical_data);                  // процедура для приёма данных от АС
            query.BeginTime = new Services.QATime(start_time);                                // начало запрашиваемого интервала
            query.EndTime   = new Services.QATime(start_time.AddHours(1));                    // конец запрашиваемого интервала
            query.Flags     = Services.QF_BEGINOUTSIDE | Services.QF_FILTLAST;                // флаги запроса
            query.Accuracy  = 1;                                                              // шаг времени для просеивания
            query.UserData  = pointer;                                                        // указатель на буфер в неуправляемой памяти с дополнительными параметрами запроса

            bool parameter_exist = load_parameter(station_parameter_name, out query.ParamId); // проверка наличия параметра на АС и получение его атрибутов

            if (parameter_exist)
            {
                Logger.Log(4, String.Format(" INFO4: [{0}] запрос значений параметра {1}", _station, station_parameter_name));

                _execute_query(ref query);
            }

            Marshal.FreeHGlobal(pointer);          // освобождаем выделенную в куче память

            return(_user_data_ref.data.count > 0); // признак успешности запроса
        }