示例#1
0
文件: PulsarM.cs 项目: Prizmer/ps
        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;
        }
示例#2
0
文件: Pulsar10.cs 项目: Prizmer/ps
        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;
        }
示例#3
0
        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);
        }