public static DateTime DateTimeFromCounter(byte[] DateCurr, byte[] TimeCurr) { CultureInfo provider = CultureInfo.InvariantCulture; string sDate = DriverHelper.Parsing("DATE_", DateCurr)[0].Substring(3).Replace(".", "/"); sDate = sDate.Substring(0, 6) + "20" + sDate.Substring(6, 2); string sTime = DriverHelper.Parsing("TIME_", TimeCurr)[0].Substring(0, 8); DateTime dt = DateTime.ParseExact(sDate + " " + sTime, "dd/MM/yyyy HH:mm:ss", provider); //return "!"+sDate+"!"+sTime+"!"; return(dt); }
dynamic GetCurrent(bool onlyTime = false) { dynamic current = new ExpandoObject(); current.success = true; current.error = string.Empty; current.errorcode = DeviceError.NO_ERROR; var recs = new List <dynamic>(); // //Считывание данных по протоколу МЭК var cdate = ParseResponse(Send(MakeDataRequest("DATE_()"))); //строка ответа счетчика на запрос DATE_ без парсинга if (!cdate.success) { return(cdate); //здесь только ошибка } var ctime = ParseResponse(Send(MakeDataRequest("TIME_()"))); //строка ответа счетчика на запрос TIME_ без парсинга if (!ctime.success) { return(ctime); //здесь только ошибка } current.date = DriverHelper.DateTimeFromCounter(cdate.rsp, ctime.rsp); if (!onlyTime) { //log(string.Format("Текущее время на счетчике {0:dd.MM.yyyy HH:mm:ss}", current.date)); //Энергия от сброса суммарное var et0pe = ParseResponse(Send(MakeDataRequest("ET0PE()"))); if (!et0pe.success) { return(et0pe); } var sEnergyFromReset = DriverHelper.Parsing("ET0PE", et0pe.rsp)[0].Replace(".", ","); current.energy = System.Double.Parse(sEnergyFromReset); recs.Add(MakeCurrentRecord("Энергия от сброса", current.energy, "кВт", current.date)); setIndicationForRowCache(current.energy, "кВт", current.date); //log(string.Format("Показание счетчика на {0:dd.MM.yyyy HH:mm:ss} => {1:0.000}", current.date, current.energy)); } current.records = recs; return(current); }
dynamic GetHours(DateTime start, DateTime end, DateTime dtcounter) { dynamic archive = new ExpandoObject(); archive.success = true; archive.error = string.Empty; archive.errorcode = DeviceError.NO_ERROR; archive.records = new List <dynamic>(); var dtcounterH = dtcounter.Date.AddHours(dtcounter.Hour); //Модель var model = ParseResponse(Send(MakeDataRequest("MODEL()"))); if (!model.success) { return(model); } //диапазон усреднения в минутах var taver = ParseResponse(Send(MakeDataRequest("TAVER()"))); if (!taver.success) { return(taver); } archive.tAver = System.Int32.Parse(DriverHelper.Parsing("TAVER", taver.rsp)[0]); //Разрешение перехода на летнее время var trsum = ParseResponse(Send(MakeDataRequest("TRSUM()"))); if (!trsum.success) { return(trsum); } //Состояние счетчика var stat = ParseResponse(Send(MakeDataRequest("STAT_()"))); if (!stat.success) { return(stat); } //Дата создания профиля нагрузки 25 го часа (переходного при переходе на зимнее время) var dat25 = ParseResponse(Send(MakeDataRequest("DAT25()"))); if (!dat25.success) { return(dat25); } //Считывание мощности //Каждый час опрашиваем отдельно, ориентируясь на диапазон усреднения мощности tAver, // то есть суммируя диапазоны int nDiapasone = 60 / archive.tAver; // число дипазонов внутри часа и он же коээфициент на который надо разделить мощности по диапазонам //Считывание мощностей var date = start.Date.AddHours(start.Hour); while (date < end) { if (cancel()) { archive.success = false; archive.error = "опрос отменен"; archive.errorcode = DeviceError.NO_ERROR; break; } if (date >= dtcounterH) { log(string.Format("данные за {0:dd.MM.yyyy HH:mm} еще не собраны", date)); break; } var recs = new List <dynamic>(); //log(string.Format("чтение часовых данных за {0:dd.MM.yyyy HH:mm} ", date)); var grape = ParseGraxxResponse(Send(MakeDataRequest(string.Format("GRAPE({0:dd.MM.yy}.{1}.{2})", date, (date.Hour * nDiapasone + 1), nDiapasone))), "GRAPE", date, archive.tAver); if ((!grape.success) && (grape.errorcode != DeviceError.UNSUPPORTED_PARAMETER)) { return(grape); } if (grape.success) { recs.AddRange(grape.records); } var grapi = ParseGraxxResponse(Send(MakeDataRequest(string.Format("GRAPI({0:dd.MM.yy}.{1}.{2})", date, (date.Hour * nDiapasone + 1), nDiapasone))), "GRAPI", date, archive.tAver); if ((!grapi.success) && (grapi.errorcode != DeviceError.UNSUPPORTED_PARAMETER)) { return(grapi); } if (grapi.success) { recs.AddRange(grapi.records); } var graqe = ParseGraxxResponse(Send(MakeDataRequest(string.Format("GRAQE({0:dd.MM.yy}.{1}.{2})", date, (date.Hour * nDiapasone + 1), nDiapasone))), "GRAQE", date, archive.tAver); if ((!graqe.success) && (graqe.errorcode != DeviceError.UNSUPPORTED_PARAMETER)) { return(graqe); } if (graqe.success) { recs.AddRange(graqe.records); } var graqi = ParseGraxxResponse(Send(MakeDataRequest(string.Format("GRAQI({0:dd.MM.yy}.{1}.{2})", date, (date.Hour * nDiapasone + 1), nDiapasone))), "GRAQI", date, archive.tAver); if ((!graqi.success) && (graqi.errorcode != DeviceError.UNSUPPORTED_PARAMETER)) { return(graqi); } if (graqi.success) { recs.AddRange(graqi.records); } int count = recs.Count; //log(string.Format("часовые данные за {0:dd.MM.yyyy HH:mm} P+={1:0.000} P-={2:0.000} Q+={3:0.000} Q-={4:0.000}", date, recs[count - 4].d1, recs[count - 3].d1, recs[count - 2].d1, recs[count - 1].d1)); log(string.Format("часовые данные за {0:dd.MM.yyyy HH:mm} прочитаны", date)); records(recs); archive.records.AddRange(recs); date = date.AddHours(1); } //log(string.Format("Часовые Q+ ({0}):", hours.Count)); //foreach (var data in hours) //{ // if (data.s1 == "Q+") // { // log(string.Format("{0:dd.MM.yyyy HH:mm} {1} = {2} {3}", data.date, data.s1, data.d1, data.s2)); // } //} return(archive); }