private bool getArchiveRecord(DateTime dt, ArchiveTypeRegister archType, ref byte[] rawRecordBytes) { // запишем дату в регистр if (!this.setArchiveRequestDate(dt)) { return(false); } // запросим нужную запись ushort register = (ushort)archType; byte[] cmd = this.makeCmd(KaratFunctions.Read, register, new byte[0]); byte[] incommingData = new byte[1]; int resWriteRead = m_vport.WriteReadData(FindPacketSignature, cmd, ref incommingData, cmd.Length, -1); string errDescription = ""; if (!isAnswerDataOk(incommingData, ref errDescription)) { this.WriteToLog("getArchiveRecord: " + Enum.GetName(typeof(ArchiveTypeRegister), archType) + ": " + errDescription); return(false); } // проверим существует ли запись вообще перед тем как ее сохранять в кэш byte[] headerData = new byte[18]; byte[] recordDateIdBytes = new byte[5]; try { Array.Copy(incommingData, 3, headerData, 0, 18); Array.Copy(headerData, 13, recordDateIdBytes, 0, recordDateIdBytes.Length); } catch (Exception ex) { WriteToLog("getArchiveRecord, array.copy: " + ex.Message); return(false); } if (recordDateIdBytes[0] == 0xFF && recordDateIdBytes[recordDateIdBytes.Length - 1] == 0xFF) { // запись идентифицируется датой. Если поля даты 0xFF - запись не существует и не удалось // найти хотябы что-то по близости. Мануал стр. 38 string msg = String.Format("запись идентифицируется датой. Если поля даты 0xFF - запись не существует и не удалось найти хотябы что-то по близости. Байты: {0}", BitConverter.ToString(recordDateIdBytes)); WriteToLog("getArchiveRecord, array.copy: " + msg); return(false); } // кэшируем полностью вместе с доп-инфой this.archiveCash[(short)archType] = incommingData; rawRecordBytes = incommingData; return(true); }
private bool ReadArchiveValuesCommon(ArchiveTypeRegister archTypeReg, DateTime dt, ushort param, ushort tarif, ref float recordValue) { recordValue = -1f; if (this.archiveConfigurationCash.Length == 0) { bool res = this.getArchiveRecordConfiguration(out this.archiveConfigurationCash); if (!res) { WriteToLog("ReadArchiveValuesCommon: getArchiveRecordConfiguration вернул false"); return(res); } } // после получени конфигурации (реального или из кэша), запросим требуемый параметр short idxInCashArr = (short)archTypeReg; string archTypeRegStr = Enum.GetName(typeof(ArchiveTypeRegister), archTypeReg); byte[] cashedArr = this.archiveCash[idxInCashArr]; byte[] rawRecordBytes = new byte[0]; if (cashedArr.Length == 0) { if (!this.getArchiveRecord(dt, archTypeReg, ref rawRecordBytes)) { string msg = String.Format("ReadArchiveValuesCommon: getArchiveRecord вернул false: dt={0}, тип архива={1} , параметр={2}", dt.ToString(), archTypeRegStr, param); WriteToLog(msg); return(false); } } else { rawRecordBytes = cashedArr; } // распарсим и выдадим нужное значение if (!this.getArchiveRecordParamValue((byte)param, rawRecordBytes, this.archiveConfigurationCash, ref recordValue)) { WriteToLog("ReadArchiveValuesCommon: getArchiveRecordParamValue вернул false"); return(false); } return(true); }