/// <summary>Приёмник сообщений архивной станции</summary> /// <param name="Response">Единичный элемент данных архивной станции</param> /// <returns>Признак готовности к приёму следующего сообщения</returns> private int _get_historical_data(ref Services.QAResponse Response) { try { user_data_reference _user_data_ref = (user_data_reference)Marshal.PtrToStructure(Response.UserData, typeof(user_data_reference)); // копирует локальную копию индекса кэша в управляемую память if (Response.Status == Services.RS_OK) { _pipe_active = true; // приём любого ответа со статусом RS_OK означает рабочее состояние канала связи с архивной станцией if (Response.ParamId.CardId != 0 && Response.ParamId.ParamNo != 0) { if (Response.ParamId.Category == 7) { if (Response.ValueFormat == (int)Services.QAValueFormat.VF_QR8) { KvintArchive.VT_QR8 vt_f = (KvintArchive.VT_QR8)Marshal.PtrToStructure(Response.Value, typeof(KvintArchive.VT_QR8)); _user_data_ref.data.table.write_value(_user_data_ref.data.parameter_index, Response.Time.AsDateTime, vt_f.value, vt_f.quality < 64); if (vt_f.quality < 64) { _user_data_ref.data.count++; } } if (Response.ValueFormat == (int)Services.QAValueFormat.VF_QUI4) { KvintArchive.VT_QUI4 vt_i = (KvintArchive.VT_QUI4)Marshal.PtrToStructure(Response.Value, typeof(KvintArchive.VT_QUI4)); _user_data_ref.data.table.write_value(_user_data_ref.data.parameter_index, Response.Time.AsDateTime, (double)vt_i.value, vt_i.quality < 64); if (vt_i.quality < 64) { _user_data_ref.data.count++; } } if (Response.ValueFormat == (int)Services.QAValueFormat.VF_QUI2) { KvintArchive.VT_QUI2 vt_i = (KvintArchive.VT_QUI2)Marshal.PtrToStructure(Response.Value, typeof(KvintArchive.VT_QUI2)); _user_data_ref.data.table.write_value(_user_data_ref.data.parameter_index, Response.Time.AsDateTime, (double)vt_i.value, vt_i.quality < 64); if (vt_i.quality < 64) { _user_data_ref.data.count++; } } } } return(1); // продолжать приём данных } if (Response.Status == Services.RS_PIPEERROR) { _pipe_active = false; // ошибка программного канала - связь с АС потеряна } if (Response.Status == Services.RS_OPENPIPEFAILED) { _pipe_active = false; // ошибка открытия программного канала - связь с АС не установлена } if (_pipe_active == false) { return(0); // 0 - прекращает приём данных, завершая текущий запрос } } catch (Exception ex) { Logger.Log(0, String.Format(" ERROR: [{0}] ошибка при приёме данных: {1}", _station, ex.Message)); } return(0); // прекратить приём данных }
/// <summary>Приёмник сообщений архивной станции</summary> /// <param name="Response">Единичный элемент данных архивной станции</param> /// <returns>Признак готовности к приёму следующего сообщения</returns> private int _get_response(ref Services.QAResponse Response) { try { if (Response.Status == Services.RS_OK) { _pipe_active = true; // приём любого ответа со статусом RS_OK означает рабочее состояние канала связи с архивной станцией #region заполнение словаря цепочек if (Response.ParamId.Category == 2) { KvintArchive.VT_CHAIN chain = new KvintArchive.VT_CHAIN(); chain.id = Response.ParamId.CardId; chain.desc = Marshal.PtrToStringAnsi(Response.Value + 241); chain.path = Marshal.PtrToStringAnsi(Response.Value + 241 + Marshal.PtrToStringAnsi(Response.Value + 241).Length + 1); _stor_chains[Response.ParamId.ParamNo] = chain; } #endregion #region заполнение словаря томов в основной цепочке if (Response.ParamId.Category == 3) { KvintArchive.VT_VOLUME volume = new KvintArchive.VT_VOLUME(); volume.properties = (KvintArchive.VT_VOLINFO)Marshal.PtrToStructure(Response.Value, typeof(KvintArchive.VT_VOLINFO)); volume.full_name = Marshal.PtrToStringAnsi(Response.Value + 192); string[] parts = Regex.Split(volume.full_name, @"\\"); volume.name = parts[parts.Length - 1].Trim(null); _stor_volumes.Add(volume); } #endregion #region заполнение списка параметров if (Response.ParamId.Category == 4) { KvintArchive.VT_PARAMETER parameter = new KvintArchive.VT_PARAMETER(); KvintArchive.VT_PARAMINFO paraminfo = (KvintArchive.VT_PARAMINFO)Marshal.PtrToStructure(Response.Value, typeof(KvintArchive.VT_PARAMINFO)); if (paraminfo.param_type == 7) { parameter.paramInfo = paraminfo; parameter.long_name = Marshal.PtrToStringAnsi(Response.Value + 64); string[] parts = Regex.Split(parameter.long_name, @"\."); parameter.card_name = parts[0]; parameter.param_name = parts[1]; _stor_parameters[(ulong)parameter.paramInfo.card_id + ((ulong)parameter.paramInfo.param_no << 32)] = parameter; } } #endregion } if (Response.Status == Services.RS_PIPEERROR) { _pipe_active = false; // ошибка программного канала - связь с АС потеряна } if (Response.Status == Services.RS_OPENPIPEFAILED) { _pipe_active = false; // ошибка открытия программного канала - связь с АС не установлена } if (_pipe_active == false) { return(0); // 0 - прекращает приём данных, завершая текущий запрос } } catch (Exception ex) { Logger.Log(0, String.Format(" ERROR: [{0}] ошибка при приёме данных: {1}", _station, ex.Message)); } return(1); // 1 - готов продолжать приём данных по текущему запросу }