Example #1
0
        public async Task Archive(Job job)
        {
            var archiveRow = new ArchiveRow {
                PartitionKey = "Archive",
                RowKey       = job.Id.ToString(),
                Timestamp    = DateTimeOffset.UtcNow
            };
            var path = await SaveAsync(job);

            archiveRow.Path = path;
            var insertOperation = TableOperation.Insert(archiveRow);
            await _archiveTable.ExecuteAsync(insertOperation);
        }
Example #2
0
        public bool ReadArchiveRow(ushort paramNumber, DateTime dt, List<ParamInfo> archStructure, ref ArchiveRow archRow)
        {
            //номер параметра, соответствующий часовым архивам
             //   ushort paramNumber = 65530;

            if (archStructure == null)
            {
                WriteToLog("ReadHourArchiveRow: не определена структура архива");
                return false;
            }

            int paramsInArchive = archStructure.Count;
            List<byte> msgBodyList = new List<byte>();

            //формируем указатель один
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes("0"));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes(paramNumber.ToString()));
            msgBodyList.Add(FF);

            //формируем указатель два состоящий из даты
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes(dt.Day.ToString()));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes(dt.Month.ToString()));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes(dt.Year.ToString()));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes(dt.Hour.ToString()));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes("0"));
            msgBodyList.Add(HT);
            msgBodyList.AddRange(stringToBytes("0"));
            msgBodyList.Add(FF);

            byte[] messageBodyArr = msgBodyList.ToArray();
            List<byte> answDataList = new List<byte>();
            if (!sendMessage(messageBodyArr, FNC, ref answDataList))
            {
                WriteToLog("ReadHourArchive: ошибка отправки сообщения");
                return false;
            }

            if (answDataList.Count < 2)
            {
                WriteToLog("ReadHourArchive: кол-во полученых данных меньше " +
                "минимально допустимого числа для данного запроса");
                return false;
            }

            List<byte[]> blocks = new List<byte[]>();
            splitInfoBlocks(answDataList.ToArray(), ref blocks);

            //если количество блоков ответ за вычетом 3х блоков даты не равно кол-ву параметров
            if ((blocks.Count - 3) != archStructure.Count)
            {
                WriteToLog("ReadHourArchive: кол-во распознаных блоков не соответствует " +
                    "кол-ву параметров структуры архива");
                return false;
            }

            int paramNumbInDate = 6;
            int paramNumbInVal = 1;

            //разберемся с датами (это первые 3 блока)
            DateTime[] dtArr = new DateTime[3];
            for (int i = 0; i < dtArr.Length; i++)
            {
                try
                {
                    byte[] curBlock = blocks[i];
                    List<byte>[] values = new List<byte>[paramNumbInDate];
                    getValueBytesFromInfoBlock(curBlock, values.Length, ref values);
                    int day = int.Parse(bytesToString(values[0].ToArray()));
                    int month = int.Parse(bytesToString(values[1].ToArray()));
                    int year = int.Parse(bytesToString(values[2].ToArray()))+2000;
                    int hour = int.Parse(bytesToString(values[3].ToArray()));
                    int minutes = int.Parse(bytesToString(values[4].ToArray()));
                    int seconds = int.Parse(bytesToString(values[5].ToArray()));

                    dtArr[i] = new DateTime(year, month, day, hour, minutes, seconds);

                }
                catch (Exception ex)
                {
                    WriteToLog("ReadHourArchive: ошибка разбора дат в ответе");
                    return false;
                }
            }

            int paramCnt = 0;
            //разберемся с блоками, содержащими значения
            for (int i = 3; i < blocks.Count; i++)
            {
                try
                {
                    if (i == 18)
                    {

                    }

                    byte[] curBlock = blocks[i];
                    ParamInfo pi = archStructure[paramCnt];
                    List<byte>[] values = new List<byte>[paramNumbInVal];
                    getValueBytesFromInfoBlock(curBlock, values.Length, ref values);
                    string replyInCP866 = bytesToString(values[0].ToArray());
                    float val = -1;
                    if (replyInCP866 != "Нет данных?"){
                        val = float.Parse(replyInCP866);
                    }

                    pi.val = val;
                    archStructure[paramCnt] = pi;

                    paramCnt++;

                }
                catch (Exception ex)
                {
                    WriteToLog("ReadHourArchive: ошибка разбора значений в ответе");
                    return false;
                }
            }

            try
            {
                ArchiveRow archiveRow = new ArchiveRow();
                archiveRow.Params = new List<ParamInfo>();
                archiveRow.Params.AddRange(archStructure);
                archiveRow.DateRequested = dtArr[0];
                archiveRow.DateNearest = dtArr[1];
                archiveRow.DateNearestInThePast = dtArr[2];
                archRow = archiveRow;

                return true;
            }
            catch (Exception ex)
            {
                WriteToLog("ReadHourArchive: ошибка разбора значений в ответе 2");
                return false;
            }
        }
Example #3
0
        public bool ReadPowerSlice(ref List<SliceDescriptor> sliceDesriptorList, DateTime dt_end, SlicePeriod period)
        {
            //определим внутренний адрес параметра в зависимости от периода
            ushort paramNumber;
            switch (period)
            {
                case SlicePeriod.Hour:
                    {
                        //номер параметра, соответствующий часовым архивам
                        paramNumber = 65530;
                        break;
                    }
                default:
                    {
                        WriteToLog("ReadPowerSlice: заданный период среза не поддерживается ");
                        return false;
                    }
            }

            //определим структуру архива
            List<ParamInfo> archStructure = null;
            if (!readArchivesStructure(paramNumber, ref archStructure))
            {
                WriteToLog("ReadPowerSlice: невозможно прочитать структуру архива");
                return false;
            }

            //лист дескрипторов со значениями
            List<SliceDescriptor> sdList = new List<SliceDescriptor>();
            foreach (SliceDescriptor sd in sliceDesriptorList)
            {
                //пусть дата начала - дата которая передана вместе с описанием среза
                DateTime dt_begin = new DateTime(sd.Date.Ticks);

                //определим дату, с которой будем читать (прочитаем )
                DateTime start_dt = new DateTime();
                ArchiveRow arch = new ArchiveRow();
                if (ReadArchiveRow(paramNumber, dt_begin.AddYears(-2000), archStructure, ref arch))
                {
                    DateTime dt_nearest = arch.DateNearest;

                    if (dt_nearest == dt_begin)
                        start_dt = dt_begin;
                    else if (dt_nearest < dt_begin)
                        start_dt = dt_begin.AddMinutes((double)period);
                    else
                        start_dt = dt_nearest;
                }
                else
                {
                    string msg = String.Format("ReadPowerSlice: ошибка получения дат: ук2 {0}, ук3 {1}, ук4 {2}",
                        dt_begin.ToString(), arch.DateNearest.ToString(), arch.DateNearestInThePast.ToString());
                    WriteToLog(msg);
                    return false;
                }

                DateTime tempDt = new DateTime(start_dt.Ticks);
                while (tempDt <= dt_end)
                {
                    SliceDescriptor localSD = new SliceDescriptor(tempDt);
                    ArchiveRow archR = new ArchiveRow();
                    if (ReadArchiveRow(paramNumber, tempDt.AddYears(-2000), archStructure, ref archR))
                    {
                        List<uint> addresses = sd.GetAddressList();
                        for (int i = 0; i < addresses.Count; i++)
                        {
                            uint addr = addresses[i];
                            ParamInfo pi = archR.Params[(int)addr];

                            uint ivalid = 0, ivalchannel = 0;
                            sd.GetValueId((uint)i, ref ivalid);
                            sd.GetValueChannel((uint)i, ref ivalchannel);
                            localSD.AddValueDescriptor(ivalid, addr, ivalchannel, sd.Period);
                            if (!localSD.InsertValue((uint)i, pi.val, true))
                            {
                                WriteToLog("ReadPowerSlice: неудалось вставить значение " + i);
                                continue;
                            }
                        }
                        sdList.Add(localSD);
                    }
                    else
                    {
                        string msg = String.Format("ReadPowerSlice: Строка архива за дату {0} не прочитана", tempDt);
                        WriteToLog(msg);
                    }

                    tempDt = tempDt.AddMinutes((double)period);
                }
            }

            if (sdList.Count > 0)
            {
                sliceDesriptorList = sdList;
                return true;
            }
            else
            {
                WriteToLog("В итоговый список не было добавлено элементов");
                return false;
            }
        }
Example #4
0
        public bool ReadDailyValues(DateTime dt, ushort param, ushort tarif, ref float recordValue)
        {
            if (param >= 160)
            {
                byte[] param866Bytes = this.stringToBytes(param.ToString());
                byte[] system866Bytes = this.stringToBytes(tarif.ToString());
                List<byte> requestBodyList = new List<byte>();
                List<byte> requestAnswerList = new List<byte>();

                requestBodyList.Add(HT);
                requestBodyList.AddRange(system866Bytes);
                requestBodyList.Add(HT);
                requestBodyList.AddRange(param866Bytes);
                requestBodyList.Add(FF);

                if (!sendMessage(requestBodyList.ToArray(), 0x1d, ref requestAnswerList))
                {
                    WriteToLog("Ошибка при чтении тотального параметра, sendMessage == false");
                    return false;
                }

                List<byte[]> infoBlocks = new List<byte[]>();
                if (!splitInfoBlocks(requestAnswerList.ToArray(), ref infoBlocks)) return false;

                List<byte>[] values = new List<byte>[2];
                if (!getValueBytesFromInfoBlock(infoBlocks[0], values.Length, ref values)) return false;
                string res = bytesToString(values[0].ToArray());

                bool success = float.TryParse(res, out recordValue);

                return success;

            }

            ushort paramNumber = 65532;
            //определим структуру архива
            List<ParamInfo> archStructure = null;
            if (!readArchivesStructure(paramNumber, ref archStructure))
            {
                WriteToLog("ReadPowerSlice: невозможно прочитать структуру архива");
                return false;
            }

            //пусть дата начала - дата которая передана вместе с описанием среза
            DateTime dt_begin = new DateTime(dt.Ticks);

            ArchiveRow arch = new ArchiveRow();

            if (!ReadArchiveRow(paramNumber, dt_begin.AddYears(-2000), archStructure, ref arch))
            {
                string msg = String.Format("ReadPowerSlice: ошибка получения дат: ук2 {0}, ук3 {1}, ук4 {2}",
                dt_begin.ToString(), arch.DateNearest.ToString(), arch.DateNearestInThePast.ToString());
                WriteToLog(msg);
                return false;
               }

            DateTime dt_nearest = arch.DateNearest;

            if (dt_nearest < dt_begin)
            {
                if (!ReadArchiveRow(paramNumber, dt_begin.AddYears(-2000), archStructure, ref arch))
                {
                    string msg = String.Format("ReadPowerSlice: ошибка получения дат: ук2 {0}, ук3 {1}, ук4 {2}",
                    dt_begin.ToString(), arch.DateNearest.ToString(), arch.DateNearestInThePast.ToString());
                    WriteToLog(msg);
                    return false;
                }
            }
            else if (dt_nearest > dt_begin)
            {
                if (!ReadArchiveRow(paramNumber, dt_nearest, archStructure, ref arch))
                {
                    string msg = String.Format("ReadPowerSlice: ошибка получения дат: ук2 {0}, ук3 {1}, ук4 {2}",
                    dt_begin.ToString(), arch.DateNearest.ToString(), arch.DateNearestInThePast.ToString());
                    WriteToLog(msg);
                    return false;
                }
            }

            try
            {
                recordValue = arch.Params[param].val;
            }
            catch (Exception ex)
            {
                WriteToLog("ReadDailyValues: параметр " + param.ToString() + " отсутствует в массиве значений");
            }

            return true;
        }
Example #5
0
 protected override void InnerPopulateRowFromReader(SoDataReader reader, ArchiveRow row)
 {
 }
Example #6
0
 protected override void InnerPopulateRowFromReader(SoDataReader reader, ArchiveRow row)
 {
     // use this overload to add columns to archiverow / output
 }