private dynamic GetHours4(DateTime start, DateTime end, DateTime current, byte counters, UInt16 devid, MessageConfig mc, MessageConfig2 mc2, MessageInput mi) { dynamic archive = new ExpandoObject(); archive.success = false; archive.error = string.Empty; archive.errorcode = DeviceError.NO_ERROR; var hours = new List <dynamic>(); { UInt16 sInx = 0; DateTime lastHour; var response = GetHourlyInx4(sInx); if (!response.success) { archive.errorcode = response.errorcode; archive.error = $"часовая запись {sInx} не прочитана - {response.error}"; return(archive); } // последняя запись в архиве lastHour = response.Date; ArchiveRecord lastRecord = response.Record; //if (lastData == null) //{ // archive.error = string.Format("Не удалось прочитать запись {0}", sInx); // archive.errorcode = DeviceError.NO_ERROR; // return archive; //} if (lastHour == DateTime.MinValue) { archive.errorcode = DeviceError.NO_ERROR; archive.error = "Нет записей в архиве"; return(archive); } var startHour = start.Date.AddHours(start.Hour); var offset = (int)(lastHour - startHour).TotalHours; //сбор часов for (var i = offset; i >= 0; i--) { if (cancel()) { archive.errorcode = DeviceError.NO_ERROR; archive.error = "опрос отменен"; break; } if (i > 5842) { continue; //capacity } response = GetHourlyInx4((UInt16)i); if (!response.success) { archive.errorcode = response.errorcode; archive.error = $"часовая запись {i} не прочитана - {response.error}"; return(archive); } DateTime reqDate = lastHour.AddHours(-i); DateTime rspDate = response.Date; ArchiveRecord record = response.Record; if (rspDate == DateTime.MinValue) { log(string.Format("Записи #{0} от {1:dd.MM.yyyy HH:00:00} нет в архиве", i, reqDate)); continue; } //if (record == null) //{ // archive.errorcode = DeviceError.NO_ERROR; // archive.error = string.Format("Не удалось прочитать запись {0}", i); // break; //} if (rspDate < new DateTime(2015, 10, 1))//past { log(string.Format("Запись #{0}: слишком ранняя дата", i)); continue; } //if (date > sDate)//future //{ // log(string.Format("данные за {0:dd.MM.yyyy HH:mm} еще не собраны", date)); // continue; //} if (rspDate > end)//start-end { log(string.Format("Запись #{0}: прочтённая дата {1:dd.MM.yyyy HH:mm} за пределами установленного периода опроса", i, rspDate)); break; } if (rspDate < start)//start-end { log(string.Format("Запись #{0}: прочтённая дата {1:dd.MM.yyyy HH:mm} за пределами установленного периода опроса", i, rspDate)); continue; } var hour = new List <dynamic>(); foreach (var counter in record.Counter) { if (counter.IsEnabled) { string unit = ((mi != null) && (mi.success) && (counter.Unit < mi.units.Count)) ? $"{mi.units[counter.Unit],-10}" : $"[{counter.Unit:000000}] "; double value = counter.Value * Math.Pow(10, counter.Point); hour.Add(MakeHourRecord($"{counter.Param}", value, $"{unit}", rspDate)); hour.Add(MakeHourRecord($"{counter.Param} - ошибка", counter.IsError ? 1 : 0, "", rspDate)); hour.Add(MakeHourRecord($"{counter.Param} - состояние входа", counter.PinState ? 1 : 0, "", rspDate)); hour.Add(MakeHourRecord($"{counter.Param} - магнитное воздействие", counter.PinMagState ? 1 : 0, "", rspDate)); } } if (hour.Any()) { records(hour); hours.AddRange(hour); log(string.Format("Запись #{0} за {1:dd.MM.yyyy HH:mm} успешно прочтена{2}", i, rspDate, rspDate == reqDate ? "" : " (дыра в архиве?)")); } else { log(string.Format("Запись #{0} за {1:dd.MM.yyyy HH:mm} - нет активных каналов{2}", i, rspDate, rspDate == reqDate ? "" : " (дыра в архиве?)")); } } } archive.success = true; archive.records = hours; return(archive); }
private dynamic All4(string components, dynamic flashver, string cmd, byte[] password, string objectId, Guid idWls, float max, float min)//, Dictionary<int, Parameter> parameterConfiguration, DateTime startDate, bool isRtcEnabled, DateTime rtcResetDate { byte counters = 16; byte digitals = 16; var devid = (UInt16)flashver.devid; var device = (string)flashver.device; var ver = (int)flashver.ver; //приборное время DateTime date; if (components.Contains("Constant") && ver == 2 && devid == 6) { List <byte> tmpBytes = new List <byte>() { 0x00, 0x00, 0x00 }; var result1 = Send(MakeBaseRequest(96, tmpBytes)); if (!result1.success) { log(string.Format("Config (96 команда) не введён: {0}", result1.error), level: 1); } if (result1.Function != 0x60) { log(string.Format("Получен ответ {0} не на 96 команду ", result1.Function), level: 1); } else { dynamic control = new ExpandoObject(); control.lightV2Config = BitConverter.ToString(result1.Body); setModbusControl(control); log(string.Format("update"), level: 1); } } if (components.Contains("Constant") && ver == 1 && devid == 9) { List <byte> tmpBytes = new List <byte>() { 0x00, 0x00 }; var result1 = Send(MakeBaseRequest(79, tmpBytes)); if (!result1.success) { log(string.Format("Config (79 команда) не введён: {0}", result1.error), level: 1); } if (result1.Function != 0x4F) { log(string.Format("Получен ответ {0} не на 79 команду ", result1.Function), level: 1); } else { if (result1.Body[0] == 0x00) { log(string.Format("Контроллер включен"), level: 1); } else if (result1.Body[0] == 0x01) { log(string.Format("Контроллер выключен"), level: 1); } } } if (components.Contains("Constant") && ver == 1 && devid == 8) { //dynamic current = WTAGetConfig();// (flashver, objectId, idWls, max, min); dynamic current = SwitchCtrlMaster();// (flashver, objectId, idWls, max, min); } else if ((devid == 8) && (ver == 1)) { //dynamic current = WTA50CommandNew(flashver, objectId, idWls, max, min); dynamic current = WTA50Command(flashver, objectId, idWls, max, min); if (!current.success) { log(string.Format("Ошибка при считывании текущих: {0}", current.error), level: 1); return(MakeResult(102, current.errorcode, current.error)); } records(current.records); //запись в базу данных } if (((devid == 14) && (ver == 6)) || ((devid == 6) && (ver == 2))) { dynamic current = lightControlSetSoftConfig(0xFF, 0xFF, flashver, objectId); if (!current.success) { log(string.Format("Ошибка при считывании текущих: {0}", current.error), level: 1); return(MakeResult(102, current.errorcode, current.error)); } records(current.records); //запись в базу данных if (((devid == 14) && (ver == 6)) || ((devid == 6) && (ver == 2))) { List <byte> byteLight1 = new List <byte>(); for (int i = 0; i < 11; i++) { byteLight1.Add(0xFF); } dynamic currentAstron = SetAstronTimer(byteLight1, flashver); if (!current.success) { log(string.Format("Ошибка при считывании текущих: {0}", current.error), level: 1); return(MakeResult(102, current.errorcode, current.error)); } } records(current.records); //запись в базу данных /* //не используем * if (components.Contains("Current")) * { * dynamic current = new ExpandoObject(); * current = GetCurrent4_7(DateTime.Now); * * if (!current.success) * { * log(string.Format("Ошибка при считывании текущих: {0}", current.error), level: 1); * return MakeResult(102, current.errorcode, current.error); * } * records(current.records); //запись в базу данных * }*/ } if (ver < 6 && (devid != 8)) //TODO { { var time = ParseTimeResponse(Send(MakeTimeRequest(devid))); if (!time.success) { return(MakeResult(101, time.errorcode, time.error)); } date = time.date; setTimeDifference(DateTime.Now - time.date); } //// if (getEndDate == null) { getEndDate = (type) => date; } // MessageInput mi = null; MessageConfig mc = null; MessageConfig2 mc2 = null; UInt32[] chipid = null; // #region Коррекция времени прибора if ((isRtcEnabled) && (cmd.Contains("correcttime"))) { var time = ParseTimeResponse(Send(MakeTimeRequest(devid))); if (!time.success) { return(MakeResult(101, time.errorcode, time.error)); } date = time.date; DateTime now = DateTime.Now; var timeOffset = ((date > now) ? (date - now).TotalSeconds : (now - date).TotalSeconds); bool isSetTime = timeOffset > 5; // коррекция времени (елси отличается больше, чем на 5 секунд и если время опроса соответствует HH:04-HH:56) if (isSetTime) { var bkp = Send(MakeWriteBkpRequest(DateTime.Now, devid)); if (bkp.success) { time = ParseTimeResponse(Send(MakeTimeRequest(devid))); if (!time.success) { return(time); } //log(string.Format("время на счётчике {0} на сервере {1}", time.date, DateTime.Now), level: 1); } var timeOffsetNew = ((time.date > DateTime.Now) ? (time.date - DateTime.Now).TotalSeconds : (DateTime.Now - time.date).TotalSeconds); if (bkp.success && time.success && (timeOffsetNew < 5)) { date = time.date; log(string.Format(isSetTime ? "Время установлено" : "Произведена корректировка времени на {0:0.###} секунд", timeOffset), level: 1); } else { log(string.Format("Время НЕ {0}: {1}", isSetTime ? "установлено" : "скорректировано", bkp.success ? time.error : bkp.error), level: 1); } } else { log(string.Format("Корректировка времени не требуется"), level: 1); } } #endregion { var input = ParseRegisterResponse(Send(MakeRegisterRequest(0x45000, 0x80))); if (!input.success) { return(input); } mi = new MessageInput(); mi.success = true; mi.pinState0 = Helper.ToUInt16(input.Register, 0); // BitConverter.ToUInt16(rcv.Skip(3 + 0).Take(2).Reverse().ToArray(), 0); mi.pinState1 = Helper.ToUInt16(input.Register, 2); // BitConverter.ToUInt16(rcv.Skip(3 + 2).Take(2).Reverse().ToArray(), 0); mi.temp = (double)Helper.ToInt16(input.Register, 4) / 100.0; // //BitConverter.ToInt16(rcv.Skip(3 + 4).Take(2).Reverse().ToArray(), 0) / 100; mi.volt = (double)Helper.ToUInt16(input.Register, 6) / 1000.0; // BitConverter.ToUInt16(rcv.Skip(3 + 6).Take(2).Reverse().ToArray(), 0) / 1000; mi.pin = new bool[32]; for (int i = 0; i < 16; i++) { mi.pin[i] = (mi.pinState0 & (1 << i)) > 0; } for (int i = 0; i < 16; i++) { mi.pin[i + 16] = (mi.pinState1 & (1 << i)) > 0; } //for (int i = 0; i < 10; i++) //{ // bkp[i] = BitConverter.ToUInt16(rcv, 3 + 16 + i * 2); //} mi.rtcCheck = input.Register[16]; mi.bkpFlags = Helper.ToUInt16(input.Register, 16 + 6); byte unitsTotal = input.Register[0x1E]; byte unitsMaxlen = input.Register[0x1F]; List <string> units = new List <string>(); for (int i = 0x20; i < input.Register.Length; i += unitsMaxlen) { string unit = Encoding.UTF8.GetString(input.Register, i, unitsMaxlen).TrimEnd(new char[] { '\0' }); units.Add(unit); } mi.units = units; } { var input = ParseRegisterResponse(Send(MakeRegisterRequest(0x30000, 0xA0))); if (!input.success) { return(input); } mc = new MessageConfig(); mc.success = true; mc.flashVer = BitConverter.ToUInt16(input.Register, 0x00); mc.NA = input.Register[0x02]; mc.mode = input.Register[0x03]; mc.uart1Baud = BitConverter.ToUInt32(input.Register, 0x04); mc.uart1Wl = input.Register[0x08]; mc.uart1Sb = input.Register[0x09]; mc.uart1Par = input.Register[0x0A]; List <CntConfig> countersCfg = new List <CntConfig>(); for (int i = 0; i < 16; i++) { int offset = i * 8; CntConfig cnt = new CntConfig(); cnt.IsEnabled = input.Register[0x0C + offset] > 0; cnt.IsError = input.Register[0x0D + offset] > 0; UInt16 par = BitConverter.ToUInt16(input.Register, 0x0E + offset); cnt.Param = GetParameterName4(par, i + 1); cnt.KDiv = BitConverter.ToUInt16(input.Register, 0x10 + offset); cnt.point = (sbyte)input.Register[0x12 + offset]; cnt.unit = input.Register[0x13 + offset]; cnt.filterPDiv = input.Register[0x8C + i]; //cnt.releaseTs = BitConverter.ToUInt32(body, 0x84 + i * 4); countersCfg.Add(cnt); } mc.cntConfig = countersCfg.ToArray(); mc.filterPeriod = BitConverter.ToUInt16(input.Register, 0x9C); mc.isRtcError = input.Register[0x9E] > 0; } { var input = ParseRegisterResponse(Send(MakeRegisterRequest(0x300A0, 0x50))); if (!input.success) { return(input); } mc2 = new MessageConfig2(); mc2.success = true; mc2.releaseTs = BitConverter.ToUInt32(input.Register, 0); mc2.releaseDt = (mc2.releaseTs == 0xFFFFFFFF || mc2.releaseTs == 0x00000000) ? DateTime.MinValue : new DateTime(1970, 1, 1).AddSeconds(mc2.releaseTs); List <UInt32> cntReleaseTs = new List <UInt32>(); for (int i = 0; i < 16; i++) { cntReleaseTs.Add(BitConverter.ToUInt32(input.Register, 4 + i * 4)); } mc2.cntReleaseTs = cntReleaseTs.ToArray(); mc2.cntReleaseDt = cntReleaseTs.Select(ts => (ts == 0xFFFFFFFF || ts == 0x00000000) ? DateTime.MinValue : new DateTime(1970, 1, 1).AddSeconds(ts)).ToArray(); } { var input = ParseRegisterResponse(Send(MakeRegisterRequest(0x46000, 0x0C))); if (!input.success) { return(input); } chipid = new UInt32[3]; chipid[0] = BitConverter.ToUInt32(input.Register, 0); chipid[1] = BitConverter.ToUInt32(input.Register, 4); chipid[2] = BitConverter.ToUInt32(input.Register, 8); } DateTime startDate = mc2.releaseDt; // if (components.Contains("Current")) { dynamic current = new ExpandoObject(); current = GetCurrent4(date, mi); if (!current.success) { log(string.Format("Ошибка при считывании текущих: {0}", current.error), level: 1); return(MakeResult(102, current.errorcode, current.error)); } records(current.records); //запись в базу данных List <dynamic> currents = current.records; log(string.Format("Текущие на {0} прочитаны: {1}; {2}; {3}", current.date, current.values != "" ? string.Format("показания - {0}", current.values) : string.Format("количество импульсов - {0}", current.counters), current.inputs, current.adc != "" ? string.Format("значения АЦП - {0}", current.adc) : ""), level: 1); } ////// if (components.Contains("Constant")) { var constant = GetConstant4(date, mc, mc2, chipid, device, ver); if (!constant.success) { log(string.Format("Ошибка при считывании констант: {0}", constant.error), level: 1); return(MakeResult(103, constant.errorcode, constant.error)); } records(constant.records); List <dynamic> constants = constant.records; log(string.Format("Константы прочитаны: всего {0}; {1}", constants.Count, constant.text), level: 1); } //////чтение часовых if (components.Contains("Hour")) { var endH = getEndDate("Hour"); var startH = getStartDate("Hour"); if (DateTime.Compare(endH, startDate) < 0) { log(string.Format("Внимание: дата пусконаладки установлена {0:dd.MM.yyyy}, часовые за период {1:dd.MM.yyyy HH:mm}-{2:dd.MM.yyyy HH:mm} опрошены не будут", startDate, startH, endH), level: 1); } else { if (DateTime.Compare(startH, startDate) < 0) { startH = startDate.Date.AddHours(startDate.Hour + 1); log(string.Format("Внимание: дата пусконаладки установлена {0:dd.MM.yyyy}, новый период опроса часовых {1:dd.MM.yyyy HH:mm}-{2:dd.MM.yyyy HH:mm}", startDate, startH, endH), level: 1); } var hours = new List <dynamic>(); var hour = GetHours4(startH, endH, date, counters, devid, mc, mc2, mi); if (!hour.success) { log(string.Format("Ошибка при считывании часовых: {0}", hour.error), level: 1); } else { hours = hour.records; log(string.Format("Прочитаны часовые с {0:dd.MM.yyyy HH:mm} по {1:dd.MM.yyyy HH:mm}: {2} записей", startH, endH, hours.Count), level: 1); } } } if (components.Contains("Day")) { dynamic day = new ExpandoObject(); day = GetDay(date, mi); if (!day.success) { log(string.Format("Ошибка при считывании текущих: {0}", day.error), level: 1); return(MakeResult(102, day.errorcode, day.error)); } records(day.records); //запись в базу данных log(string.Format("Суточные на {0} прочитаны: {1}; {2}; {3}", day.date, day.values != "" ? string.Format("показания - {0}", day.values) : string.Format("количество импульсов - {0}", day.counters), day.inputs, day.adc != "" ? string.Format("значения АЦП - {0}", day.adc) : ""), level: 1); } } //if (components.Contains("Abnormal")) //{ // var startAe = DateTime.Compare(getStartDate("Abnormal"), startDate) > 0 ? getStartDate("Abnormal") : startDate; // var endAe = getEndDate("Abnormal"); // var abnormal = GetAbnormals(10, startAe);//startAbnormal, endAbnormal); // if (!abnormal.success) // { // log(string.Format("ошибка при считывании НС: {0}", abnormal.error), level: 1); // return MakeResult(106, abnormal.errorcode, abnormal.error); // } //} return(MakeResult(0, DeviceError.NO_ERROR, "")); }