Exemple #1
0
        public H5DidiRecordInfo UpdateDidiRecord(List <byte> rdBuf)
        {
            try
            {
                int offset = 0;
                if (rdBuf[0] != 0x03)
                {
                    if (rdBuf[0] != 0xCC || rdBuf[1] != 0xA4)
                    {
                        return(null);
                    }
                    if (rdBuf.Count < (rdBuf[2] << 8 | rdBuf[3]))
                    {
                        return(null);
                    }
                    offset += 6;
                }
                else
                {
                    if (rdBuf.Count < 0x48)
                    {
                        return(null);
                    }
                    offset += 2;
                }

                H5DidiRecordInfo recordInfo = new H5DidiRecordInfo();
                if (rdBuf[0] == 0xCC || rdBuf[1] == 0xA4)
                {
                    if (rdBuf[4] == 0x00 && rdBuf[5] == 0x05)
                    {
                        recordInfo.EventType  = "错误历史故障";
                        recordInfo.RecordType = "读取数据记录的校验不通过";
                    }
                    else if (rdBuf[4] == 0x00 && rdBuf[5] == 0x06)
                    {
                        recordInfo.EventType  = "错误历史故障";
                        recordInfo.RecordType = "与外挂FLASH通讯失败";
                    }
                    else
                    {
                        string value = (rdBuf[offset] & 0xFF).ToString("X2");
                        if (recordEventTypeDic.Keys.Contains(value))
                        {
                            recordInfo.RecordType = recordEventTypeDic[value].Item1;
                            if (recordEventTypeDic[value].Item2 == "operation")
                            {
                                recordInfo.EventType = "操作事件";
                            }
                            else if (recordEventTypeDic[value].Item2 == "status")
                            {
                                recordInfo.EventType = "状态事件";
                            }
                            else
                            {
                                recordInfo.EventType = "未知事件";
                            }
                        }
                        else
                        {
                            recordInfo.RecordType = value;
                            recordInfo.EventType  = "未知事件";
                        }
                    }

                    offset += 2;
                    StringBuilder sb = new StringBuilder();
                    sb.Append("curr__addr:");
                    sb.Append(rdBuf[offset + 1].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 3].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 2].ToString("X2"));
                    sb.Append("   ");
                    sb.Append("read__start:");
                    sb.Append(rdBuf[offset + 5].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 4].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 7].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 6].ToString("X2"));
                    sb.Append("   ");
                    sb.Append("recodenums:");
                    sb.Append(rdBuf[offset + 9].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 8].ToString("X2"));
                    sb.Append("   ");
                    sb.Append("cycle__flag:");
                    sb.Append(rdBuf[offset + 11].ToString("X2"));
                    sb.Append(" ");
                    sb.Append(rdBuf[offset + 10].ToString("X2"));
                    offset           += 12;//6个uint数组的保留
                    LabStatus.Content = sb.ToString();

                    recordInfo.FCC        = (int)(rdBuf[offset] | rdBuf[offset + 1] << 8 | rdBuf[offset + 2] << 16 | rdBuf[offset + 3] << 24); offset += 4;
                    recordInfo.LoopNumber = (int)(rdBuf[offset] | rdBuf[offset + 1] << 8); offset += 2;
                    offset += 12;//6个uint数组的保留
                    recordInfo.PackStatus          = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.MosStatus           = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.VoltageStatus       = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.CurrentStatus       = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.TemperatureStatus   = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.HumidityStatus      = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.ConfigStatus        = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.CommunicationStatus = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.ModeStatus          = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                    recordInfo.LogicStatus         = string.Format("{0} {1}", rdBuf[offset + 1].ToString("X2"), rdBuf[offset].ToString("X2")); offset += 2;
                }
                string year   = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                string month  = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                string day    = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                string hour   = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                string minute = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                string second = rdBuf[offset].ToString().PadLeft(2, '0'); offset += 1;
                recordInfo.RecordTime   = string.Format("{0}年{1}月{2}日 {3}时{4}分{5}秒", "20" + year, month, day, hour, minute, second);
                recordInfo.TotalVoltage = (double)(rdBuf[offset + 3] | rdBuf[offset + 2] << 8 | rdBuf[offset + 1] << 16 | rdBuf[offset] << 24); offset += 4;
                recordInfo.Current      = (rdBuf[offset + 3] | rdBuf[offset + 2] << 8 | rdBuf[offset + 1] << 16 | rdBuf[offset] << 24).ToString(); offset += 4;
                recordInfo.Cell1Temp    = ((rdBuf[offset + 1] | rdBuf[offset] << 8) - 2731) / 10.0; offset += 2;
                recordInfo.Cell2Temp    = ((rdBuf[offset + 1] | rdBuf[offset] << 8) - 2731) / 10.0; offset += 2;
                recordInfo.Cell3Temp    = ((rdBuf[offset + 1] | rdBuf[offset] << 8) - 2731) / 10.0; offset += 2;
                recordInfo.Cell4Temp    = ((rdBuf[offset + 1] | rdBuf[offset] << 8) - 2731) / 10.0; offset += 2;
                recordInfo.Cell5Temp    = ((rdBuf[offset + 1] | rdBuf[offset] << 8) - 2731) / 10.0; offset += 2;
                recordInfo.Humidity     = (rdBuf[offset + 1] | rdBuf[offset] << 8); offset += 2;
                byte[] bytes = new byte[2]; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell1Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell2Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell3Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell4Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell5Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell6Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell7Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell8Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell9Voltage  = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell10Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell11Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell12Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell13Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell14Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell15Voltage = BitConverter.ToInt16(bytes, 0); offset += 2; Buffer.BlockCopy(rdBuf.ToArray(), offset, bytes, 0, bytes.Length); Array.Reverse(bytes);
                recordInfo.Cell16Voltage = BitConverter.ToInt16(bytes, 0); offset += 2;
                offset += 4;
                offset += 1;
                recordInfo.DischargeEnableStatus = (rdBuf[offset] & 0x08) == 0x08 ? "闭合" : "断开";
                recordInfo.DetStatus             = (rdBuf[offset] & 0x04) == 0x04 ? "闭合" : "断开";
                recordInfo.DischargeMOSStatus    = (rdBuf[offset] & 0x02) == 0x02 ? "闭合" : "断开";
                recordInfo.ChargeMOSStatus       = (rdBuf[offset] & 0x01) == 0x01 ? "闭合" : "断开";
                offset        += 1;
                recordInfo.SOC = (uint)rdBuf[offset]; offset += 2;
                //string val = (rdBuf[offset] << 24 | rdBuf[offset + 1] << 16 | rdBuf[offset + 2] << 8 | rdBuf[offset + 3]).ToString("X8"); offset += 4;
                //if (recordTypeDic.Keys.Contains(val))
                //    recordInfo.BatteryStatus = recordTypeDic[val];
                //else
                //    recordInfo.BatteryStatus = "0x" +  val;
                byte[] _bytes = new byte[4] {
                    rdBuf[offset], rdBuf[offset + 1], rdBuf[offset + 2], rdBuf[offset + 3]
                };
                offset += 4;
                recordInfo.BatteryStatus = GetDidiRecordType(_bytes);
                recordInfo.Balance       = "0x" + (rdBuf[offset] << 8 | rdBuf[offset + 1]).ToString("X4"); offset += 2;
                return(recordInfo);
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
Exemple #2
0
 public void HandleReadRecordInfoDataEvent(object sender, CustomRecvDataEventArgs e)
 {
     try
     {
         if (isStopRead)
         {
             isRead = false;
             DdProtocol.DdInstance.m_bIsStopCommunication = false;
             return;
         }
         if (isRead)
         {
             if (isReadAll)
             {
                 timer.Stop();
                 if (e.RecvMsg[5] == 0x00)
                 {
                     isRead = false;
                     btnStopRead.IsEnabled    = false;
                     btnReadData.IsEnabled    = true;
                     btnReadAllData.IsEnabled = true;
                     MessageBox.Show("没有备份数据!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                 }
                 else if (e.RecvMsg[5] == 0x01 || e.RecvMsg[5] == 0x02)
                 {
                     H5DidiRecordInfo info = UpdateDidiRecord(e.RecvMsg);
                     if (info == null)
                     {
                         timer.Start();
                         DdProtocol.DdInstance.ReadDidiCurrentRecordData();
                         return;
                     }
                     info.Index = m_ListRecordsInfo.Count + 1;
                     m_ListRecordsInfo.Add(info);
                     DdProtocol.bReadDdBmsResp = true;
                     timer.Start();
                     DdProtocol.DdInstance.ReadDidiNextRecordData();
                 }
                 else if (e.RecvMsg[5] == 0x03)
                 {
                     H5DidiRecordInfo info = UpdateDidiRecord(e.RecvMsg);
                     if (info == null)
                     {
                         timer.Start();
                         DdProtocol.DdInstance.ReadDidiCurrentRecordData();
                         return;
                     }
                     info.Index = m_ListRecordsInfo.Count + 1;
                     m_ListRecordsInfo.Add(info);
                     isRead = false;
                     MessageBox.Show("备份数据读取完成!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                     DdProtocol.DdInstance.m_bIsStopCommunication = false;
                     btnStopRead.IsEnabled    = false;
                     btnReadData.IsEnabled    = true;
                     btnReadAllData.IsEnabled = true;
                     btnClear.IsEnabled       = true;
                     btnSave.IsEnabled        = true;
                 }
                 else if (e.RecvMsg[5] == 0x05 || e.RecvMsg[5] == 0x06)
                 {
                     H5DidiRecordInfo info = UpdateDidiRecord(e.RecvMsg);
                     if (info == null)
                     {
                         timer.Start();
                         DdProtocol.DdInstance.ReadDidiCurrentRecordData();
                         return;
                     }
                     info.Index = m_ListRecordsInfo.Count + 1;
                     m_ListRecordsInfo.Add(info);
                     DdProtocol.bReadDdBmsResp = true;
                     if (faultCount == 10)
                     {
                         MessageBox.Show("多次读取到错误数据,请查找原因!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                         DdProtocol.DdInstance.m_bIsStopCommunication = false;
                         isRead = false;
                         btnReadAllData.IsEnabled = true;
                         btnReadData.IsEnabled    = true;
                         btnStopRead.IsEnabled    = false;
                         btnClear.IsEnabled       = true;
                         btnSave.IsEnabled        = true;
                         return;
                     }
                     faultCount++;
                     timer.Start();
                     DdProtocol.DdInstance.ReadDidiNextRecordData();
                 }
                 else
                 {
                     if (errorCount == 3)
                     {
                         MessageBox.Show("多次读取到异常数据,请查找原因!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
                         DdProtocol.DdInstance.m_bIsStopCommunication = false;
                         isRead = false;
                         btnReadAllData.IsEnabled = true;
                         btnReadData.IsEnabled    = true;
                         btnStopRead.IsEnabled    = false;
                         return;
                     }
                     errorNum++;
                     if (errorNum == 3)
                     {
                         errorNum = 0;
                         errorCount++;
                         timer.Start();
                         DdProtocol.DdInstance.ReadDidiNextRecordData();
                     }
                     else
                     {
                         timer.Start();
                         DdProtocol.DdInstance.ReadDidiCurrentRecordData();
                     }
                 }
             }
             else
             {
                 timer.Stop();
                 H5DidiRecordInfo info = UpdateDidiRecord(e.RecvMsg);
                 if (info != null)
                 {
                     info.Index = m_ListRecordsInfo.Count + 1;
                     m_ListRecordsInfo.Add(info);
                 }
                 DdProtocol.bReadDdBmsResp = true;
                 Thread.Sleep(100);
                 timer.Start();
                 DdProtocol.DdInstance.ReadDidiRecordCount();
             }
         }
     }
     catch (Exception ex)
     {
         btnReadData.IsEnabled    = true;
         btnReadAllData.IsEnabled = true;
         btnStopRead.IsEnabled    = false;
         btnClear.IsEnabled       = true;
         btnSave.IsEnabled        = true;
         MessageBox.Show(ex.Message);
     }
 }