コード例 #1
0
ファイル: KvintArcClient.cs プロジェクト: vmarvin/FRQR
        /// <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); // прекратить приём данных
        }
コード例 #2
0
ファイル: KvintArcClient.cs プロジェクト: vmarvin/FRQR
        /// <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 - готов продолжать приём данных по текущему запросу
        }