/// <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)); } }
/// <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); }
/// <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)); } }
/// <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); } }
/// <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); // признак успешности запроса }