/// <summary> /// Преобразует дату в идентификатор архивной записи и возвращает значение в соответствии с /// указанным param. Правильное преобразование не гарантируется. /// </summary> /// <param name="dt"></param> /// <param name="param"></param> /// <param name="tarif"></param> /// <param name="recordValue"></param> /// <returns></returns> public bool ReadDailyValuesPT(DateTime dt, ushort param, ushort tarif, ref float recordValue) { ArchiveValue resArchVal = new ArchiveValue(); ArchiveValue lastArchiveVal = new ArchiveValue(); lastArchiveVal.id = -1; int recCount = -1, lastRecId = -1; if (ReadArchiveValCountId(ref recCount, ref lastRecId)) { if (ReadArchiveValById((uint)lastRecId, ref lastArchiveVal)) goto SUCCESS; } /* if (ReadArchiveLastVal(ref lastArchiveVal)) { if (lastArchiveVal.dt.Date == dt.Date) goto SUCCESS; } if (dt.Date == DateTime.Now.Date && DateTime.Now.Hour >= 16) { if (ReadCurrentValues(param, tarif, ref recordValue)) return true; } * */ WriteToLog("ReadDailyValuesPT: fail..."); return false; SUCCESS: int lastid = lastArchiveVal.id; if (lastid == -1) return false; DateTime lastRecDt = lastArchiveVal.dt; if (dt.Date > lastRecDt.Date) { WriteToLog("ReadDailyValues: на указанную дату записей не обнаружено: " + dt.ToShortDateString()); return false; } WriteToLog("ReadDailyValues: lastRecDt: " + lastRecDt.ToShortDateString()); WriteToLog("ReadDailyValues: lastId: " + lastid.ToString()); WriteToLog("ReadDailyValues: requiredDt: " + dt.ToShortDateString()); //преобразуем dt в id TimeSpan ts = lastRecDt.Date - dt.Date; if (ts.TotalDays == 0) { resArchVal = lastArchiveVal; } else { uint resRecId = (uint)(lastid - ts.TotalDays); WriteToLog("ReadDailyValues: requiredId: " + resRecId.ToString()); try { if (!ReadArchiveValById(resRecId, ref resArchVal)) { string str = String.Format("ReadDailyValues: запись от числа {0} c id {1} не найдена", dt.ToShortDateString(), resRecId.ToString()); WriteToLog(str); return false; } } catch (Exception ex) { WriteToLog("ReadDailyValues: ReadArchiveValById ex: " + ex.Message); } } switch (param) { case 1: { recordValue = resArchVal.energy; break; } case 2: { recordValue = resArchVal.volume; break; } case 3: { recordValue = resArchVal.timeOn; break; } case 4: { recordValue = resArchVal.timeErr; break; } default: { WriteToLog("ReadDailyValues: для параметра " + param.ToString() + " нет обработчика"); return false; } } return true; }
bool ReadArchiveValById(uint id, ref ArchiveValue archVal) { byte[] cmd = { m_addr, 0x2f, 0x05, 0x00 }; byte[] cmd_data = new byte[0x05]; //преобразуем целочисленные id в посл.байт от младшему к старшему byte[] id_bytes = BitConverter.GetBytes(id); if (!BitConverter.IsLittleEndian) Array.Reverse(id_bytes); //сформируем команду, где первый байт 0х02 - на начало суток (С2) cmd_data[0] = 0x02; Array.Copy(id_bytes, 0, cmd_data, 1, id_bytes.Length); byte[] data_arr = null; if (!SendPT01_CMD(cmd, ref data_arr, cmd_data)) return false; byte crc_check = CRC8(data_arr, data_arr.Length); if (crc_check != 0x0) { WriteToLog("ReadArchiveValById: check sum error"); return false; } try { ArchiveValueParser avp = new ArchiveValueParser(data_arr, this.m_address, this.m_vport); return avp.GetArchiveValue(ref archVal); } catch(Exception ex) { WriteToLog("ReadArchiveValById: " + ex.Message); return false; } }
public bool GetArchiveValue(ref ArchiveValue archVal) { if (isOk) { archVal = this.archVal; return true; } else { return false; } }
bool ReadArchiveLastVal(ref ArchiveValue archVal) { byte[] cmd = { m_addr, 0x2e, 0x02, 0x00 }; byte[] cmd_data = { 0x02, 0x01 }; byte[] data_arr = null; if (!SendPT01_CMD(cmd, ref data_arr, cmd_data)) return false; byte crc_check = CRC8(data_arr, data_arr.Length); if (crc_check != 0x0) { WriteToLog("ReadLastArchiveVal: данные приняты неверно"); return false; } try { ArchiveValueParser avp = new ArchiveValueParser(data_arr, this.m_address, this.m_vport); avp.GetArchiveValue(ref archVal); } catch (Exception ex) { WriteToLog("ReadArchiveLastVal: " + ex.Message); return false; } return true; }