예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        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);
        }