public bool ReadSerialNumber(ref string serial_number) { byte[] data = new byte[3]; byte[] answer = new byte[READSERIALNUMBER_CMD_ANSWER_SIZE]; byte length_data = 4; data[0] = 0; data[1] = 0x7C; data[2] = length_data; MakeCommand(data, (byte)data.Length, 0xF, 0x1); if (!SendCommand(ref answer, READSERIALNUMBER_CMD_ANSWER_SIZE, false)) { return(false); } byte[] right_order_bytes = CommonMeters.InverseBytesOrder(answer, m_header_length + 3, length_data); serial_number = BitConverter.ToUInt32(right_order_bytes, 0).ToString(); WriteToLog("Serial Number: " + serial_number); return(true); }
/// <summary> /// Чтение даты/времени счетчика /// </summary> /// <returns></returns> private bool ReadDateTime() { byte[] answer = new byte[14]; byte[] command = new byte[] { 0x21 }; if (!SendCommand(command, ref answer, 1, 14)) { return(false); } // конвертируем время из DEC в HEX int seconds = CommonMeters.DEC2HEX(answer[8]); int minute = CommonMeters.DEC2HEX(answer[7]); int hour = CommonMeters.DEC2HEX(answer[6]); int day = CommonMeters.DEC2HEX(answer[9]); int month = CommonMeters.DEC2HEX(answer[10]); int year = CommonMeters.DEC2HEX(answer[11]) + 2000; try { m_dt = new DateTime(year, month, day, hour, minute, seconds); } catch { return(false); } WriteToLog("DateTime=" + m_dt.ToString()); return(true); }
public bool ReadCurrentValues(ref Values values) { values = new Values(); values.listRV = new List <RecordValue>(); byte[] command = { 0x27 }; byte[] answer = new byte[23]; uint total = 0; /* * CMD = 27h * ADDR(4)-CMD(1)-CRC(2) ( формат ответа ADDR-CMD-count*4-CRC) * Count = 4 bytes = 0…99999999h * 4-х байтовое значение * потребленной эл.энергии * в десятках Вт.ч * Старшие разряды вперёд. * Возвращает сразу по всем тарифам. */ if (!SendCommand(command, ref answer, 1, 23)) { return(false); } //answer = new byte[] { 0x0, 0x0d, 0xfc, 0xe2, 0x27, 0x00, 0x10, 0x36, 0x67, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7b }; for (int t = 0; t < m_listTypesForRead.Count; t++) { RecordValue recordValue; recordValue.type = m_listTypesForRead[t]; recordValue.fine_state = true; recordValue.value = 0; for (int i = 0; i < 4; i++) { if (answer[5 + i + (m_listTypesForRead[t] - 1) * 4] == 0xFF) { recordValue.fine_state = false; break; } } if (recordValue.fine_state) { total = Convert.ToUInt32(CommonMeters.DEC2HEX(answer[5 + (m_listTypesForRead[t] - 1) * 4])) * 1000000 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[6 + (m_listTypesForRead[t] - 1) * 4])) * 10000 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[7 + (m_listTypesForRead[t] - 1) * 4])) * 100 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[8 + (m_listTypesForRead[t] - 1) * 4])); recordValue.value = Convert.ToSingle(total) / 100;// т.к. передаётся в десятках ватт } values.listRV.Add(recordValue); } return(true); }
public bool SyncTime(DateTime dt) { byte[] cmnd = new byte[8]; byte[] answer = new byte[23]; byte[] command = new byte[] { 0x02 }; cmnd[0] = command[0]; cmnd[1] = CommonMeters.HEX2DEC((byte)dt.DayOfWeek); cmnd[2] = CommonMeters.HEX2DEC((byte)dt.Hour); cmnd[3] = CommonMeters.HEX2DEC((byte)dt.Minute); cmnd[4] = CommonMeters.HEX2DEC((byte)dt.Second); cmnd[5] = CommonMeters.HEX2DEC((byte)dt.Day); cmnd[6] = CommonMeters.HEX2DEC((byte)dt.Month); cmnd[7] = CommonMeters.HEX2DEC((byte)(dt.Year - 2000)); return(SendCommand(cmnd, ref answer, 8, 7)); }
public bool ReadCurrentValues(ref Values values) { byte[] value_sizes = new byte[] { 4, 4, 4, 2, 1, 4 }; byte[] lengths = new byte[] { 52, 64, 16, 24, 12, 48 }; byte[] begin_address = new byte[] { 0x38, 0x6C, 0xAC, 0xC8, 0xE0, 0x08 }; byte[] answer_bytes; byte number_value = 1; try { for (int i = 0; i < lengths.Length & i < begin_address.Length & i < value_sizes.Length; i++) { answer_bytes = new byte[READVALUES_CMD_ANSWER_SIZE + lengths[i]]; if (ReadValuesFromAddress(TypesCommands.tc2K, lengths[i], begin_address, answer_bytes, i)) { List <double> temp_values = new List <double>(); switch (value_sizes[i]) { case 1: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte value = answer_bytes[m_header_length + n * value_sizes[i]]; temp_values.Add((double)value / 100f); } break; case 2: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte[] temp_buff = CommonMeters.InverseBytesOrder(answer_bytes, Convert.ToUInt32(m_header_length + n * value_sizes[i] + 1), value_sizes[i]); ushort integer_part = BitConverter.ToUInt16(temp_buff, 0); temp_values.Add((double)integer_part / 100f); } break; case 4: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte[] temp_buff = CommonMeters.InverseBytesOrder(answer_bytes, Convert.ToUInt32(m_header_length + n * value_sizes[i] + 3), value_sizes[i]); temp_values.Add((double)(begin_address[i] == 0x08 ? BitConverter.ToSingle(temp_buff, 0) : BitConverter.ToUInt32(temp_buff, 0))); } break; } if (begin_address[i] == 0x08) { for (byte k = 0; k < temp_values.Count; k++) { int index = values.listRV.FindIndex(x => x.type == (k + 1)); if (index >= 0) { // WriteToLog(temp_values[k].ToString()); RecordValue rv = values.listRV[index]; rv.value += temp_values[k]; values.listRV[index] = rv; } } } else { for (int j = 0; j < temp_values.Count; j++) { // WriteToLog(temp_values[j].ToString()); if (m_listTypesForRead.Contains(number_value)) { RecordValue rv; rv.fine_state = true; rv.type = number_value; rv.value = temp_values[j]; values.listRV.Add(rv); } number_value++; } } } else { number_value += (byte)(lengths[i] / value_sizes[i]); } } } catch (Exception ex) { WriteToLog("ReadCurrentValues: " + ex.Message); } return((values.listRV.Count == m_listTypesForRead.Count) ? true : false); }
private bool ReadDataFromFlash512KByAddress(byte[] address_buffer, ref Values values) { byte[] value_sizes = new byte[] { 4, 4, 4, 2, 1, 4 }; byte[] lengths = new byte[] { 52, 64, 16, 24, 12, 48 }; byte[] begin_address = new byte[] { 0x38, 0x6C, 0xAC, 0xC8, 0xE0, 0x08 }; byte number_value = 1; for (int i = 0; i < begin_address.Length; i++) { address_buffer[3] = begin_address[i]; byte[] answer_bytes = new byte[READVALUES_CMD_ANSWER_SIZE + lengths[i]]; if (ReadValuesFromAddress(TypesCommands.tc512K, lengths[i], address_buffer, answer_bytes)) { List <double> temp_values = new List <double>(); switch (value_sizes[i]) { case 1: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte value = answer_bytes[m_header_length + n * value_sizes[i]]; temp_values.Add((double)value / 100f); } break; case 2: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte[] temp_buff = CommonMeters.InverseBytesOrder(answer_bytes, Convert.ToUInt32(m_header_length + n * value_sizes[i] + 1), value_sizes[i]); ushort integer_part = BitConverter.ToUInt16(temp_buff, 0); temp_values.Add((double)integer_part / 100f); } break; case 4: for (int n = 0; n < lengths[i] / value_sizes[i]; n++) { byte[] temp_buff = CommonMeters.InverseBytesOrder(answer_bytes, Convert.ToUInt32(m_header_length + n * value_sizes[i] + 3), value_sizes[i]); temp_values.Add((double)(begin_address[i] == 0x08 ? BitConverter.ToSingle(temp_buff, 0) : BitConverter.ToUInt32(temp_buff, 0))); } break; } if (begin_address[i] == 0x08) { for (byte k = 0; k < temp_values.Count; k++) { int index = values.listRV.FindIndex(x => x.type == (k + 1)); if (index >= 0) { RecordValue rv = values.listRV[index]; rv.value += temp_values[k]; values.listRV[index] = rv; WriteToLog("temp_values type=" + k.ToString() + "; value = " + temp_values[k].ToString()); } } } else { for (int j = 0; j < temp_values.Count; j++) { if (m_listTypesForRead.Contains(number_value)) { RecordValue rv; rv.fine_state = true; rv.type = number_value; rv.value = temp_values[j]; values.listRV.Add(rv); WriteToLog("value type=" + rv.type.ToString() + "; value = " + rv.value.ToString()); } number_value++; } } } else { values.listRV.Clear(); break; } } WriteToLog("values.listRV.Count=" + values.listRV.Count.ToString() + "; m_listTypesForRead.Count=" + m_listTypesForRead.Count.ToString()); return((values.listRV.Count == m_listTypesForRead.Count) ? true : false); }
/// <summary> /// Чтение архивных данных /// </summary> /// <param name="day"></param> /// <param name="month"></param> /// <param name="year"></param> /// <param name="values"></param> /// <returns></returns> private bool ReadFromFlash512K(byte day, byte month, ushort year, ref Values values) { try { DateTime date_target = new DateTime(year, month, day, 0, 0, 0); if (Math.Round(DateTime.Now.Subtract(date_target).TotalDays, 0) >= 0) { byte[] address_buffer = new byte[4]; byte[] answer_bytes = new byte[READVALUES_CMD_ANSWER_SIZE + 4]; int ihour = 0; int iday = 0; int imonth = 0; int iyear = 0; Date date; date.day = day; date.month = month; date.year = year; WriteToLog("dict_address_by_date count=" + dict_address_by_date.Count.ToString()); // если требуемая дата, ранее была обнаружена, то читаем по обнаруженному адресу if (dict_address_by_date.ContainsKey(date)) { address_buffer = AddressToBytes(dict_address_by_date[date]); if (ReadValuesFromAddress(TypesCommands.tc512K, 4, address_buffer, answer_bytes)) { ihour = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 0]); iday = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 1]); imonth = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 2]); iyear = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 3]) + 2000; // проверка на совпадение прочитанной даты с искомой if (iday == day && imonth == month && iyear == year) { if (ReadDataFromFlash512KByAddress(address_buffer, ref values)) { WriteToLog("Readed data from early finded address : " + new DateTime(iyear, imonth, iday).ToShortDateString()); } } } } // в противном случае - ищем запись по архиву else { // чтение данных из первого адреса в архиве, если ранее не было прочитано if (!already_read_first_address) { address_buffer[0] = 0; address_buffer[1] = 6; address_buffer[2] = 0; address_buffer[3] = 0; if (ReadValuesFromAddress(TypesCommands.tc512K, 4, address_buffer, answer_bytes)) { already_read_first_address = true; ihour = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 0]); iday = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 1]); imonth = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 2]); iyear = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 3]) + 2000; date_first_readed = new DateTime(iyear, imonth, iday); date.day = iday; date.month = imonth; date.year = iyear; if (!dict_address_by_date.ContainsKey(date)) { dict_address_by_date.Add(date, BytesToAddress(address_buffer)); } // проверка на совпадение прочитанной даты с искомой if (iday == day && imonth == month && iyear == year) { if (ReadDataFromFlash512KByAddress(address_buffer, ref values)) { WriteToLog("Read from first address. Date=" + new DateTime(iyear, imonth, iday).ToShortDateString() + "; Values.Count = " + values.listRV.Count.ToString()); } } } } // поиск записи с нужной датой в архиве ПУ if (already_read_first_address) { TimeSpan diff_date = date_target - date_first_readed; int iexpected_number = (int)diff_date.TotalDays < m_max_day_records ? (int)diff_date.TotalDays : (m_max_day_records - 1); iexpected_number = iexpected_number < 0 ? m_max_day_records - iexpected_number : iexpected_number; WriteToLog("Difference days of target and first records=" + iexpected_number.ToString()); byte[] address_expected_bytes = BitConverter.GetBytes(Convert.ToInt32(iexpected_number * m_sys_int_size)); // Чтение искомой записи по предполагаемому адресу address_buffer[0] = 0; address_buffer[1] = Convert.ToByte(6 + address_expected_bytes[2]); address_buffer[2] = address_expected_bytes[1]; address_buffer[3] = address_expected_bytes[0]; if (ReadValuesFromAddress(TypesCommands.tc512K, 4, address_buffer, answer_bytes)) { ihour = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 0]); iday = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 1]); imonth = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 2]); iyear = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 3]) + 2000; date.day = iday; date.month = imonth; date.year = iyear; if (!dict_address_by_date.ContainsKey(date)) { dict_address_by_date.Add(date, BytesToAddress(address_buffer)); } // проверка на совпадение прочитанной даты с искомой if (iday == day && imonth == month && iyear == year) { if (ReadDataFromFlash512KByAddress(address_buffer, ref values)) { WriteToLog("Read expected. Date=" + new DateTime(iyear, imonth, iday).ToShortDateString() + "; Values.Count = " + values.listRV.Count.ToString()); } } else // последовательное чтение всех записей для поиска записи с нужной датой { bool finded = false; bool all_records_check = true; int iforward = 0; int ibackward = 0; for (int n = 0; n < m_max_day_records; n++) { int number_record_for_read = 0; if (n % 2 == 0) { number_record_for_read = iexpected_number + ++iforward; //if (number_record_for_read < m_max_day_records) //{ // WriteToLog("iforward=" + iforward.ToString()); //} } else { number_record_for_read = iexpected_number + --ibackward; //if (number_record_for_read > 0) //{ // WriteToLog("ibackward=" + ibackward.ToString()); //} } address_expected_bytes = BitConverter.GetBytes(number_record_for_read * m_sys_int_size); // искомый адрес address_buffer[0] = 0; address_buffer[1] = Convert.ToByte(6 + address_expected_bytes[2]); address_buffer[2] = address_expected_bytes[1]; address_buffer[3] = address_expected_bytes[0]; if (!dict_address_by_date.ContainsValue(BytesToAddress(address_buffer))) { //WriteToLog("Address=" + address_buffer[0].ToString("x") + "|" + address_buffer[1].ToString("x") + "|" + address_buffer[2].ToString("x") + "|" + address_buffer[3].ToString("x")); if (ReadValuesFromAddress(TypesCommands.tc512K, 4, address_buffer, answer_bytes)) { ihour = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 0]); iday = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 1]); imonth = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 2]); iyear = (int)CommonMeters.BCDToByte(answer_bytes[m_header_length + 3]) + 2000; date.day = iday; date.month = imonth; date.year = iyear; //WriteToLog("ReadValuesFromAddress Date=" + iday.ToString() + "." + imonth.ToString() + "." + iyear.ToString()); if (!dict_address_by_date.ContainsKey(date)) { dict_address_by_date.Add(date, BytesToAddress(address_buffer)); } if (iday == day && imonth == month && iyear == year) { finded = true; if (ReadDataFromFlash512KByAddress(address_buffer, ref values)) { WriteToLog("Find required. Date=" + new DateTime(iyear, imonth, iday).ToShortDateString() + "; Values.Count = " + values.listRV.Count.ToString()); } break; } } else { all_records_check = false; } } } // при не нахождении записи if (finded == false && all_records_check == true) { for (byte k = 0; k < m_listTypesForRead.Count; k++) { RecordValue rv; rv.fine_state = false; rv.type = m_listTypesForRead[k]; rv.value = 0; values.listRV.Add(rv); } } } } } } } } catch (Exception ex) { WriteToLog("ReadFromFlash512K: " + ex.Message); } return((values.listRV.Count == m_listTypesForRead.Count) ? true : false); }
public bool ReadMonthlyValues(byte month, ushort year, ref Values values) { values = new Values(); values.listRV = new List <RecordValue>(); if ((m_dt.Year < year) || (m_dt.Year == year && m_dt.Month < month)) { WriteToLog("ReadMonthlyValues datetime=" + m_dt.ToString() + "; month=" + month.ToString() + "; year=" + year.ToString()); return(false); } byte[] command = { 0x32, (byte)(month - 1) }; byte[] answer = new byte[23]; ulong total = 0; /* * CMD = 32h * ADDR-CMD-ii3-CRC ( формат ответа ADDR-CMD-count*4-CRC) * ii3 = 1 byte = 0…Bh Младшая тетрада - месяц 0h…Bh * (0 -январь … Bh - декабрь) * Count = 4 bytes = 0…99999999h * 4-х байтовое значение * потребленной эл.энергии * в десятках Вт.ч * Старшие разряды вперёд. */ if (!SendCommand(command, ref answer, 2, 23)) { return(false); } for (int t = 0; t < m_listTypesForRead.Count; t++) { RecordValue recordValue; recordValue.type = m_listTypesForRead[t]; recordValue.fine_state = true; recordValue.value = 0; for (int i = 0; i < 4; i++) { if (answer[5 + i + (m_listTypesForRead[t] - 1) * 4] == 0xFF) { recordValue.fine_state = false; break; } } if (recordValue.fine_state) { total = Convert.ToUInt32(CommonMeters.DEC2HEX(answer[5 + (m_listTypesForRead[t] - 1) * 4])) * 1000000 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[6 + (m_listTypesForRead[t] - 1) * 4])) * 10000 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[7 + (m_listTypesForRead[t] - 1) * 4])) * 100 + Convert.ToUInt32(CommonMeters.DEC2HEX(answer[8 + (m_listTypesForRead[t] - 1) * 4])); recordValue.value = Convert.ToSingle(total) / 100;// т.к. передаётся в десятках ватт } values.listRV.Add(recordValue); } return(true); }