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); }
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; } }
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; } }
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; }
protected override void InnerPopulateRowFromReader(SoDataReader reader, ArchiveRow row) { }
protected override void InnerPopulateRowFromReader(SoDataReader reader, ArchiveRow row) { // use this overload to add columns to archiverow / output }