Beispiel #1
0
        private Result Wrap(Func <Status, Result> func)
        {
            //try
            //{
            //    Send(MakeRequest.DeviceUnselect(), 2000, 1);
            //}
            //catch (Exception ex)
            //{

            //}

            Status s;

            try
            {
                s = Parser.ParseDeviceSelectResponse(Send(MakeRequest.DeviceSelect(NetworkAddress)), ver.verHw);
                log("Прибор обнаружен");
            }
            catch (Exception ex)
            {
                log("Прибор НЕ обнаружен", level: 1);
                return(MakeResult(100, DeviceError.NO_ERROR, ex.Message));
            }

            Result result = func(s);

            try
            {
                Send(MakeRequest.DeviceUnselect(), 2000, 1);
            }
            catch (Exception ex)
            {
            }
            return(result);
        }
Beispiel #2
0
        public ParsedParameter[] ReadAndParseArchiveCached(Segment segment, int blockN, Version ver)
        {
            byte[]            block;
            ParsedParameter[] ppars;

            switch (segment)
            {
            case Segment.Hourly1:
            case Segment.Hourly2:
            {
                int cacheBlockN = ((segment == Segment.Hourly2) ? 1024 : 0) + blockN;
                if (blockCacheHour.ContainsKey(cacheBlockN))
                {
                    block = blockCacheHour[cacheBlockN];
                }
                else
                {
                    block = Send(MakeRequest.ReadStatisticsBlockByVer(segment, blockN, ver.isExtended)).Body;
                    blockCacheHour[cacheBlockN] = block;
                }
                ppars = Parser.ParseHourlyBlock(block, 0, ver);
            }
            break;

            case Segment.Daily1:
            case Segment.Daily2:
            {
                int cacheBlockN = ((segment == Segment.Daily2) ? 1024 : 0) + blockN;
                if (blockCacheDay.ContainsKey(cacheBlockN))
                {
                    block = blockCacheDay[cacheBlockN];
                }
                else
                {
                    block = Send(MakeRequest.ReadStatisticsBlockByVer(segment, blockN, ver.isExtended)).Body;
                    blockCacheDay[cacheBlockN] = block;
                }
                ppars = Parser.ParseDailyBlock(block, 0, ver, null);
            }
            break;

            default:
                throw new Exception("необходимо выбрать сегмент с архивом");
            }

            return(ppars);
        }
Beispiel #3
0
        private Result All(string components, List <DateTimeRange> hourRanges, List <DateTimeRange> dayRanges, Version ver, Status status)
        {
            DateTime currentDate;

            try
            {
                currentDate = Parser.ParseDate(Send(MakeRequest.ReadCurrentParameters(currentParameter.Where(cp => cp.Value.type == CurrentParameterType.Date).FirstOrDefault().Value.P)).Body, 0)
                              .Add(Parser.ParseTime(Send(MakeRequest.ReadCurrentParameters(currentParameter.Where(cp => cp.Value.type == CurrentParameterType.Time).FirstOrDefault().Value.P)).Body, 0));
            }
            catch (DriverException ex)
            {
                return(MakeResult(201, ex.DeviceError, $"Не удалось получить дату/время: {ex.Message}"));
            }
            catch (Exception ex)
            {
                return(MakeResult(201, DeviceError.NO_ERROR, $"Не удалось получить дату/время: {ex.Message}"));
            }

            setTimeDifference(DateTime.Now - currentDate);
            log(string.Format("Дата/время на вычислителе: {0:dd.MM.yy HH:mm:ss}", currentDate));

            if (getEndDate == null)
            {
                getEndDate = (type) => currentDate;
            }

            if (components.Contains("Current"))
            {
                try
                {
                    List <dynamic>   current = new List <dynamic>();
                    CurrentParameter par;
                    foreach (var cp in currentParameter.Where(c => c.Value.type == CurrentParameterType.Float && c.Value.name != "tw"))
                    {
                        par = cp.Value;
                        if (((par.vmask == VersionMask.No_SA94_1) && (ver.verHw == VersionHardware.SA94_1)) ||
                            ((par.vmask == VersionMask.No_SA94_100_200_300_M100_M200_M300) && (
                                 ver.verSw == VersionSoftware.ver100 ||
                                 ver.verSw == VersionSoftware.ver200 ||
                                 ver.verSw == VersionSoftware.ver300 ||
                                 ver.verSw == VersionSoftware.verM100 ||
                                 ver.verSw == VersionSoftware.verM200 ||
                                 ver.verSw == VersionSoftware.verM300)))
                        {
                            continue;
                        }
                        current.Add(MakeRecord.Current(par.name, Parser.ParseFloat(Send(MakeRequest.ReadCurrentParameters(par.P)).Body, 0), par.unit, currentDate));
                    }

                    par = currentParameter.Where(c => c.Value.name == "tw").FirstOrDefault().Value;
                    if (par.unit == "с")
                    {
                        current.Add(MakeRecord.Current(par.name, Parser.ParseFloat(Send(MakeRequest.ReadCurrentParameters(par.P)).Body, 0) / 3600.0, "ч", currentDate));
                    }
                    else if (par.unit == "мин")
                    {
                        current.Add(MakeRecord.Current(par.name, Parser.ParseFloat(Send(MakeRequest.ReadCurrentParameters(par.P)).Body, 0) / 60.0, "ч", currentDate));
                    }
                    else
                    {
                        current.Add(MakeRecord.Current(par.name, Parser.ParseFloat(Send(MakeRequest.ReadCurrentParameters(par.P)).Body, 0), par.unit, currentDate));
                    }

                    records(current);
                    log(string.Format("Текущие на {0} прочитаны: всего {1}", currentDate, current.Count), level: 1);
                }
                catch (DriverException ex)
                {
                    log($"Не удалось получить текущие: {ex.Message}", level: 1);
                    return(MakeResult(201, ex.DeviceError, $"Не удалось получить текущие: {ex.Message}"));
                }
                catch (Exception ex)
                {
                    log($"Не удалось получить текущие: {ex.Message}", level: 1);
                    return(MakeResult(201, DeviceError.NO_ERROR, $"Не удалось получить текущие: {ex.Message}"));
                }
            }


            if (components.Contains("Constant"))
            {
                try
                {
                    byte[] sets1;
                    byte[] sets2;
                    if (ver.verSw == VersionSoftware.ver100 || ver.verSw == VersionSoftware.ver200 || ver.verSw == VersionSoftware.ver300 || ver.verSw == VersionSoftware.verM100 || ver.verSw == VersionSoftware.verM300) //двухбайтовая команда
                    {
                        sets1 = Send(MakeRequest.ReadStatistics(Segment.Service1, 0)).Body;
                        sets2 = Send(MakeRequest.ReadStatistics(Segment.Service1, 0x100)).Body;
                    }
                    else if (ver.verSw == VersionSoftware.ver101 || ver.verSw == VersionSoftware.ver201 || ver.verSw == VersionSoftware.verMTE1 || ver.verSw == VersionSoftware.ver301 || ver.verSw == VersionSoftware.verM101 || ver.verSw == VersionSoftware.verM301) //трехбайтовая команда
                    {
                        sets1 = Send(MakeRequest.ReadStatisticsExt(Segment.Service1, 0)).Body;
                        sets2 = Send(MakeRequest.ReadStatisticsExt(Segment.Service1, 0x100)).Body;
                    }
                    else
                    {
                        throw new Exception($"драйвер не рассчитан на считывание констант у версии {ver.verHw} {ver.verSw}");
                    }
                    Version testver = Parser.ParseVersion(sets2, 0, log);
                    if (testver.verSw != ver.verSw)
                    {
                        log($"Обнаружена версия прибора, которая отличается от выбранной: {testver.verText} ({testver.verHw} {testver.verSw})", level: 1);
                        ver = testver;
                    }
                    double Tprog = Helper.ToInt16Reverse(sets1, 0x09) / 100.0;

                    List <dynamic> constants = new List <dynamic>();
                    constants.Add(MakeRecord.Constant("Тип прибора", testver.GetVerHwText(), currentDate));
                    constants.Add(MakeRecord.Constant("Версия программы", testver.verText, currentDate));
                    constants.Add(MakeRecord.Constant("Расширенная статистика", testver.isExtended? "Да" : "Нет", currentDate));
                    constants.Add(MakeRecord.Constant("Модифицированный", testver.isM ? "Да" : "Нет", currentDate));
                    constants.Add(MakeRecord.Constant("Режим", status.b4_isModeCount ? "Счет" : "Стоп", currentDate));
                    if (ver.verHw == VersionHardware.SA94_1)
                    {
                        constants.Add(MakeRecord.Constant("Температура (T2)", status.b1_SA94_1_isT2Programmed ? "Программируется" : "Измеряется", currentDate));
                        if (status.b1_SA94_1_isT2Programmed)
                        {
                            constants.Add(MakeRecord.Constant("Значение Т2прог, °C", $"{Tprog:0.00}", currentDate));
                        }
                    }
                    else if ((ver.verHw == VersionHardware.SA94_2) || (ver.verHw == VersionHardware.SA94_2M))
                    {
                        constants.Add(MakeRecord.Constant("Температура (Т3)", status.b1_SA94_2_2M_isT3Measured ? "Измеряется" : "Программируется", currentDate));
                        if (!status.b1_SA94_2_2M_isT3Measured)
                        {
                            constants.Add(MakeRecord.Constant("Значение Т3прог, °C", $"{Tprog:0.00}", currentDate));
                        }
                    }
                    constants.Add(MakeRecord.Constant("Заводской номер", $"{(sets1[3] | ((UInt32)sets1[2] << 8) | ((UInt32)sets1[1] << 16)):000000}", currentDate));
                    constants.Add(MakeRecord.Constant("Разность dTmin, °C", $"{(Helper.ToInt16Reverse(sets1, 0x0D) / 100.0):0.00}", currentDate));
                    constants.Add(MakeRecord.Constant("Количество токов", Helper.GetNumOfCurrentsFromByte(sets1[0x18]), currentDate));
                    constants.Add(MakeRecord.Constant("Параметр для Iвых1", Helper.GetParamIoutFromByte(sets1[0x1A], ver.verHw), currentDate));
                    constants.Add(MakeRecord.Constant("Параметр для Iвых2", Helper.GetParamIoutFromByte(sets1[0x1B], ver.verHw), currentDate));
                    constants.Add(MakeRecord.Constant("Диапазон тока Iвых1, мА", Helper.GetRangeIoutFromByte(sets1[0x1E]), currentDate));
                    constants.Add(MakeRecord.Constant("Диапазон тока Iвых2, мА", Helper.GetRangeIoutFromByte(sets1[0x1F]), currentDate));
                    constants.Add(MakeRecord.Constant("Тип термодатчика", Helper.GetTermosensorTypeFromByte(sets1[0x1C]), currentDate));

                    constants.Add(MakeRecord.Constant("№ ЭМ датчика 1", $"{(sets1[0x23] | ((UInt32)sets1[0x22] << 8) | ((UInt32)sets1[0x21] << 16)):000000}", currentDate));
                    int    Du1mm    = Helper.GetDummFromByte(sets1[0x24], ver);
                    double Q1max    = Helper.GetQmaxByDumm(sets1[0x25], Du1mm);
                    int    Q1minPrc = Helper.GetQminFromByte(sets1[0x26]);
                    constants.Add(MakeRecord.Constant("Ду1, мм", Du1mm, currentDate));
                    constants.Add(MakeRecord.Constant("Q1max, м/ч", Q1max, currentDate));
                    constants.Add(MakeRecord.Constant("Q1min, %", Q1minPrc, currentDate));
                    constants.Add(MakeRecord.Constant("Q1min, м/ч", Q1max * Q1minPrc / 100.0, currentDate));

                    if (ver.isExtended)
                    {
                        constants.Add(MakeRecord.Constant("Давление p1max, МПа", Helper.GetpmaxFromByte(sets1[0x19]), currentDate));
                        constants.Add(MakeRecord.Constant("Давление p2max, МПа", Helper.GetpmaxFromByte(sets1[0x1D]), currentDate));
                        constants.Add(MakeRecord.Constant("Диапазон тока Iвх1, мА", Helper.GetRangeIinFromByte(sets1[0x27]), currentDate));
                    }

                    if (ver.verHw != VersionHardware.SA94_1)
                    {
                        constants.Add(MakeRecord.Constant("№ ЭМ датчика 2", $"{(sets1[0x2B] | ((UInt32)sets1[0x2A] << 8) | ((UInt32)sets1[0x29] << 16)):000000}", currentDate));

                        int    Du2mm    = Helper.GetDummFromByte(sets1[0x2C], ver);
                        double Q2max    = Helper.GetQmaxByDumm(sets1[0x2D], Du2mm);
                        int    Q2minPrc = Helper.GetQminFromByte(sets1[0x2E]);
                        constants.Add(MakeRecord.Constant("Ду2, мм", Du2mm, currentDate));
                        constants.Add(MakeRecord.Constant("Q2max, м/ч", Q2max, currentDate));
                        constants.Add(MakeRecord.Constant("Q2min, %", Q2minPrc, currentDate));
                        constants.Add(MakeRecord.Constant("Q2min, м/ч", Q2max * Q2minPrc / 100.0, currentDate));

                        if (ver.isExtended)
                        {
                            constants.Add(MakeRecord.Constant("Диапазон тока Iвх2, мА", Helper.GetRangeIinFromByte(sets1[0x2F]), currentDate));
                        }
                    }

                    records(constants);
                    log(string.Format("Константы на {0} прочитаны: всего {1}", currentDate, constants.Count), level: 1);
                }
                catch (DriverException ex)
                {
                    log($"Не удалось получить константы: {ex.Message}", level: 1);
                    return(MakeResult(201, ex.DeviceError, $"Не удалось получить константы: {ex.Message}"));
                }
                catch (Exception ex)
                {
                    log($"Не удалось получить константы: {ex.Message}", level: 1);
                    return(MakeResult(201, DeviceError.NO_ERROR, $"Не удалось получить константы: {ex.Message}"));
                }
            }

            if (components.Contains("Hour"))
            {
                try
                {
                    List <dynamic> hours = new List <dynamic>();
                    if (hourRanges != null)
                    {
                        foreach (var range in hourRanges)
                        {
                            var startH = range.start;
                            var endH   = range.end;

                            if (startH > currentDate)
                            {
                                continue;
                            }
                            if (endH > currentDate)
                            {
                                endH = currentDate;
                            }

                            var hour = GetHourly(startH, endH, currentDate, ver);
                            hours.AddRange(hour);

                            log(string.Format("Прочитаны часовые с {0:dd.MM.yyyy HH:mm} по {1:dd.MM.yyyy HH:mm}: {2} записей", startH, endH, hours.Count), level: 1);
                        }
                    }
                    else
                    {
                        //чтение часовых
                        var startH = getStartDate("Hour");
                        var endH   = getEndDate("Hour");

                        var hour = GetHourly(startH, endH, currentDate, ver);
                        hours.AddRange(hour);

                        log(string.Format("Прочитаны часовые с {0:dd.MM.yyyy HH:mm} по {1:dd.MM.yyyy HH:mm}: {2} записей", startH, endH, hours.Count), level: 1);
                    }
                }
                catch (DriverException ex)
                {
                    log(string.Format("Ошибка при считывании часовых: {0}", ex.Message), level: 1);
                    return(MakeResult(105, ex.DeviceError, ex.Message));
                }
                catch (Exception ex)
                {
                    log(string.Format("Ошибка при считывании часовых: {0}", ex.Message), level: 1);
                    return(MakeResult(105, DeviceError.NO_ERROR, ex.Message));
                }
            }

            if (components.Contains("Day"))
            {
                try
                {
                    List <dynamic> days = new List <dynamic>();
                    if (dayRanges != null)
                    {
                        foreach (var range in dayRanges)
                        {
                            var startD = range.start;
                            var endD   = range.end;

                            if (startD > currentDate)
                            {
                                continue;
                            }
                            if (endD > currentDate)
                            {
                                endD = currentDate;
                            }

                            var day = GetDaily(startD.Date, endD, currentDate, ver);
                            days.AddRange(day);

                            log(string.Format("Прочитаны суточные с {0:dd.MM.yyyy} по {1:dd.MM.yyyy}: {2} записей", startD, endD, days.Count), level: 1);
                        }
                    }
                    else
                    {
                        //чтение суточных
                        var startD = getStartDate("Day");
                        var endD   = getEndDate("Day");

                        var day = GetDaily(startD.Date, endD, currentDate, ver);
                        days.AddRange(day);

                        log(string.Format("Прочитаны суточные с {0:dd.MM.yyyy} по {1:dd.MM.yyyy}: {2} записей", startD, endD, days.Count), level: 1);
                    }
                }
                catch (DriverException ex)
                {
                    log(string.Format("Ошибка при считывании суточных: {0}", ex.Message), level: 1);
                    return(MakeResult(104, ex.DeviceError, ex.Message));
                }
                catch (Exception ex)
                {
                    log(string.Format("Ошибка при считывании суточных: {0}", ex.Message), level: 1);
                    return(MakeResult(104, DeviceError.NO_ERROR, ex.Message));
                }
            }

            return(MakeResult(0, DeviceError.NO_ERROR, "опрос успешно завершен"));
        }