private bool ReadArchive(TypeDataPulsar type, DateTime date, ref Values values) { values.listRV = new List<RecordValue>(); m_length_cmd = 0; Byte[] in_buffer = new Byte[255]; ushort rnd = 0x50b9; byte func = 0; byte out_packet_length = 0; int bytes_to_read = -1; func = 6; out_packet_length = 28; // адрес byte[] adr = new byte[4]; Int2BCD((int)m_address, adr); m_cmd = new byte[out_packet_length]; for (int t = 0; t < m_listTypesForRead.Count; t++) { m_length_cmd = 0; // битовая маска каналов uint channel_mask = 0; uint tmp = 1; tmp = tmp << (m_listTypesForRead[t] - 1); channel_mask |= tmp; byte[] parameter = BitConverter.GetBytes(channel_mask); byte[] random = BitConverter.GetBytes(rnd); // формируем команду // адрес for (int i = 0; i < adr.Length; i++) { m_cmd[m_length_cmd++] = adr[i]; } // номер функции m_cmd[m_length_cmd++] = func; // общая длина пакета m_cmd[m_length_cmd++] = out_packet_length; // параметры for (int i = 0; i < parameter.Length; i++) { m_cmd[m_length_cmd++] = parameter[i]; } bytes_to_read = 10 + 2 + 2 + 6 + 4 * 1; // тип архива m_cmd[m_length_cmd++] = Convert.ToByte(type); m_cmd[m_length_cmd++] = 0; // дата - начало m_cmd[m_length_cmd++] = Convert.ToByte(date.Year - 2000); m_cmd[m_length_cmd++] = Convert.ToByte(date.Month); m_cmd[m_length_cmd++] = Convert.ToByte(date.Day); m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; // дата - конец m_cmd[m_length_cmd++] = Convert.ToByte(date.Year - 2000); m_cmd[m_length_cmd++] = Convert.ToByte(date.Month); m_cmd[m_length_cmd++] = Convert.ToByte(date.Day); m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; // ID for (int i = 0; i < random.Length; i++) { m_cmd[m_length_cmd++] = random[i]; } // CRC16 byte[] crc16 = CRC16(m_cmd, m_length_cmd); for (int i = 0; i < crc16.Length; i++) { m_cmd[m_length_cmd++] = crc16[i]; } if (m_vport.WriteReadData(FindPacketSignature, m_cmd, ref in_buffer, m_length_cmd, bytes_to_read) > 0) { bool find_header = true; // длина пакета byte packet_length = 0; // проверка заголовка пакета for (int i = 0; i < 5; i++) { if (m_cmd[i] != in_buffer[i]) { find_header = false; } } if (find_header) { packet_length = in_buffer[5]; // проверка CRC crc16 = CRC16(in_buffer, packet_length - 2); if (in_buffer[packet_length - 2] == crc16[0] && in_buffer[packet_length - 1] == crc16[1]) { // проверка ID if (m_cmd[out_packet_length - 4] == in_buffer[packet_length - 4] && m_cmd[out_packet_length - 3] == in_buffer[packet_length - 3]) { RecordValue recordValue; recordValue.type = m_listTypesForRead[t]; recordValue.fine_state = true; recordValue.value = 0; int data_elements_count = (packet_length - 10 - 4 - 6) / 4; //WriteToLog("type archive=" + type.ToString() + "; data_elements_count=" + data_elements_count.ToString() + "; Date=" + date.ToShortDateString()); if (data_elements_count > 0) { int iyear = in_buffer[6 + 4] + 2000; int imon = in_buffer[6 + 4 + 1]; int iday = in_buffer[6 + 4 + 2]; //WriteToLog("dt_begin=" + date.ToString() + "; idate=" + iday.ToString() + "." + imon.ToString() + "." + iyear.ToString()); if (date.Year == iyear && date.Month == imon && date.Day == iday) { data_elements_count = 1; for (int d = 0; d < data_elements_count; d++) { byte[] temp_buff = new byte[4]; for (int b = 0; b < 4; b++) { temp_buff[b] = in_buffer[6 + 4 + 6 + d * 4 + b]; } if ((temp_buff[0] == 0xF0 || temp_buff[0] == 0xF1) && temp_buff[1] == 0xFF && temp_buff[2] == 0xFF && temp_buff[3] == 0xFF) { recordValue.fine_state = true; recordValue.value = 0; } else { recordValue.fine_state = true; recordValue.value = Math.Round(BitConverter.ToSingle(temp_buff, 0), 4); } //WriteToLog("value=" + recordValue.value.ToString()); values.listRV.Add(recordValue); } } } } } } } } return true; }
private bool ReadArchive(TypeDataPulsar type, DateTime date, ushort channel, ref float values) { m_length_cmd = 0; Byte[] in_buffer = new Byte[255]; ///////чтение количества записей m_cmd = new byte[11]; // адрес byte[] adr = new byte[4]; Int2BCD((int)m_address, adr); for (int i = 0; i < adr.Length; i++) { m_cmd[m_length_cmd++] = adr[i]; } // номер функции m_cmd[m_length_cmd++] = 0x03; // адрес switch (type) { case TypeDataPulsar.Hourly: m_cmd[m_length_cmd++] = 0x02; m_cmd[m_length_cmd++] = 0x28; break; case TypeDataPulsar.Daily: m_cmd[m_length_cmd++] = 0x02; m_cmd[m_length_cmd++] = 0x2A; break; case TypeDataPulsar.Monthly: m_cmd[m_length_cmd++] = 0x02; m_cmd[m_length_cmd++] = 0x2C; break; default: return false; } // число регистров m_cmd[m_length_cmd++] = 0x00; m_cmd[m_length_cmd++] = 0x01; // CRC16 byte[] crc16 = CRC16(m_cmd, m_length_cmd); for (int i = 0; i < crc16.Length; i++) { m_cmd[m_length_cmd++] = crc16[i]; } //in_buffer = ReadData(m_cmd, 11); in_buffer = ReadData(m_cmd, 10); if (in_buffer.Length == 0) return false; int currentPos = in_buffer[6] << 8 | in_buffer[7];//позиция указателя в кольцевом архиве ///////чтение архива DateTime curdt = DateTime.Now; TimeSpan intervaldt = curdt - date; int maxLengArchive = 0; uint startaddress = 0; switch (type) { case TypeDataPulsar.Hourly: maxLengArchive = 1080; startaddress = 196; //если давность запроса превышает размер архива, то завершить опрос if ((int)intervaldt.TotalHours > maxLengArchive) return false; //если давность запроса превышает текущую позицию указателя, то переместить вычислить новый указатель в кольцевом буфере if ((int)intervaldt.TotalHours * 4 > currentPos) currentPos = maxLengArchive - (int)((int)intervaldt.TotalHours * 4 - currentPos); else currentPos = currentPos - (int)intervaldt.TotalHours * 4; break; case TypeDataPulsar.Daily: maxLengArchive = 180; startaddress = 43396; //если давность запроса превышает размер архива, то завершить опрос if ((int)intervaldt.TotalDays > maxLengArchive) return false; //если давность запроса превышает текущую позицию указателя, то переместить вычислить новый указатель в кольцевом буфере if ((int)intervaldt.TotalDays * 4 > currentPos) currentPos = maxLengArchive - (int)((int)intervaldt.TotalDays * 4 - currentPos); else currentPos = currentPos - (int)intervaldt.TotalDays * 4; break; case TypeDataPulsar.Monthly: maxLengArchive = 24; startaddress = 50596; //если давность запроса превышает размер архива, то завершить опрос if ((int)intervaldt.TotalDays * 30 > maxLengArchive) return false; //если давность запроса превышает текущую позицию указателя, то переместить вычислить новый указатель в кольцевом буфере if ((int)intervaldt.TotalDays * 30 * 4 > currentPos) currentPos = maxLengArchive - (int)((int)intervaldt.TotalDays * 30 * 4 - currentPos); else currentPos = currentPos - (int)intervaldt.TotalDays * 30 * 4; break; } m_cmd[4] = 0x65;//код функции //for (int channel = 0; channel < 10; channel++) { uint startaddr = (uint)(startaddress + 4 * maxLengArchive * channel + currentPos); //адрес m_cmd[5] = (byte)(startaddr >> 8); m_cmd[6] = (byte)(startaddr & 0xff); //количество байт m_cmd[7] = 0x00; m_cmd[8] = 0x02; //crc16 crc16 = CRC16(m_cmd, 9); m_cmd[9] = crc16[0]; m_cmd[10] = crc16[1]; in_buffer = ReadData(m_cmd, 12); if (in_buffer.Length == 0) return false; // byte[] valueArray = new byte[4]; Array.Copy(in_buffer, 6, valueArray, 0, 4); RecordValue recordValue; recordValue.type = (byte)(channel + 1); recordValue.fine_state = true; recordValue.value = (valueArray[3] << 24 | valueArray[2] << 16 | valueArray[1] << 8 | valueArray[0]); recordValue.fine_state = true; values = recordValue.value; } return true; }
private bool ReadArchive(TypeDataPulsar type, DateTime date, ref Values values) { values.listRV = new List <RecordValue>(); m_length_cmd = 0; Byte[] in_buffer = new Byte[255]; ushort rnd = 0x50b9; byte func = 0; byte out_packet_length = 0; int bytes_to_read = -1; func = 6; out_packet_length = 28; // адрес byte[] adr = new byte[4]; Int2BCD((int)m_address, adr); m_cmd = new byte[out_packet_length]; for (int t = 0; t < m_listTypesForRead.Count; t++) { m_length_cmd = 0; // битовая маска каналов uint channel_mask = 0; uint tmp = 1; tmp = tmp << (m_listTypesForRead[t] - 1); channel_mask |= tmp; byte[] parameter = BitConverter.GetBytes(channel_mask); byte[] random = BitConverter.GetBytes(rnd); // формируем команду // адрес for (int i = 0; i < adr.Length; i++) { m_cmd[m_length_cmd++] = adr[i]; } // номер функции m_cmd[m_length_cmd++] = func; // общая длина пакета m_cmd[m_length_cmd++] = out_packet_length; // параметры for (int i = 0; i < parameter.Length; i++) { m_cmd[m_length_cmd++] = parameter[i]; } bytes_to_read = 10 + 2 + 2 + 6 + 4 * 1; // тип архива m_cmd[m_length_cmd++] = Convert.ToByte(type); m_cmd[m_length_cmd++] = 0; // дата - начало m_cmd[m_length_cmd++] = Convert.ToByte(date.Year - 2000); m_cmd[m_length_cmd++] = Convert.ToByte(date.Month); m_cmd[m_length_cmd++] = Convert.ToByte(date.Day); m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; // дата - конец m_cmd[m_length_cmd++] = Convert.ToByte(date.Year - 2000); m_cmd[m_length_cmd++] = Convert.ToByte(date.Month); m_cmd[m_length_cmd++] = Convert.ToByte(date.Day); m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; m_cmd[m_length_cmd++] = 0; // ID for (int i = 0; i < random.Length; i++) { m_cmd[m_length_cmd++] = random[i]; } // CRC16 byte[] crc16 = CRC16(m_cmd, m_length_cmd); for (int i = 0; i < crc16.Length; i++) { m_cmd[m_length_cmd++] = crc16[i]; } if (m_vport.WriteReadData(FindPacketSignature, m_cmd, ref in_buffer, m_length_cmd, bytes_to_read) > 0) { bool find_header = true; // длина пакета byte packet_length = 0; // проверка заголовка пакета for (int i = 0; i < 5; i++) { if (m_cmd[i] != in_buffer[i]) { find_header = false; } } if (find_header) { packet_length = in_buffer[5]; // проверка CRC crc16 = CRC16(in_buffer, packet_length - 2); if (in_buffer[packet_length - 2] == crc16[0] && in_buffer[packet_length - 1] == crc16[1]) { // проверка ID if (m_cmd[out_packet_length - 4] == in_buffer[packet_length - 4] && m_cmd[out_packet_length - 3] == in_buffer[packet_length - 3]) { RecordValue recordValue; recordValue.type = m_listTypesForRead[t]; recordValue.fine_state = true; recordValue.value = 0; int data_elements_count = (packet_length - 10 - 4 - 6) / 4; //WriteToLog("type archive=" + type.ToString() + "; data_elements_count=" + data_elements_count.ToString() + "; Date=" + date.ToShortDateString()); if (data_elements_count > 0) { int iyear = in_buffer[6 + 4] + 2000; int imon = in_buffer[6 + 4 + 1]; int iday = in_buffer[6 + 4 + 2]; //WriteToLog("dt_begin=" + date.ToString() + "; idate=" + iday.ToString() + "." + imon.ToString() + "." + iyear.ToString()); if (date.Year == iyear && date.Month == imon && date.Day == iday) { data_elements_count = 1; for (int d = 0; d < data_elements_count; d++) { byte[] temp_buff = new byte[4]; for (int b = 0; b < 4; b++) { temp_buff[b] = in_buffer[6 + 4 + 6 + d * 4 + b]; } if ((temp_buff[0] == 0xF0 || temp_buff[0] == 0xF1) && temp_buff[1] == 0xFF && temp_buff[2] == 0xFF && temp_buff[3] == 0xFF) { recordValue.fine_state = true; recordValue.value = 0; } else { recordValue.fine_state = true; recordValue.value = Math.Round(BitConverter.ToSingle(temp_buff, 0), 4); } //WriteToLog("value=" + recordValue.value.ToString()); values.listRV.Add(recordValue); } } } } } } } } return(true); }