Jelajahi Sumber

Merge remote-tracking branch 'origin/dev' into pro

lmstack 3 tahun lalu
induk
melakukan
07c95235c9

+ 71 - 34
LIB/BACKEND/DBManager.py

@@ -103,26 +103,45 @@ class DBManager():
         return data
 
     @staticmethod
-    def _convert_to_dataframe_bms(data, mode=0):
+    def _convert_to_dataframe_bms(data, mode=0, CellUNum=0, CellTNum=0, OtherTNum=0):
         CellU = []
         CellT = []
         OtherT = []
-        CellU_Num = 0
-        CellT_Num = 0
-        OtherT_Num = 0
-        CellU_Num = len(data['ffBatteryStatus']['cellVoltageList'])
-        CellT_Num = len(data['ffBatteryStatus']['cellTempList'])
+        CellU_Num = CellUNum
+        CellT_Num = CellTNum
+        OtherT_Num = OtherTNum
+        # try:
+        #     CellU_Num = len(data['ffBatteryStatus']['cellVoltageList'])
+        #     CellU = np.array(data['ffBatteryStatus']['cellVoltageList']) * 1000
+        #     CellU = CellU.tolist()
+        # except:
+        #     CellU_Num = 0
+        # try:
+        #     CellT_Num = len(data['ffBatteryStatus']['cellTempList'])
+        #     CellU.extend(data['ffBatteryStatus']['cellTempList'])
+        # except:
+        #     CellT_Num = 0
 
-        try:
-            OtherT_Num = len(data['ffBatteryStatus']['otherTempList'])
-        except:
-            OtherT_Num = 0
-        for i in range(CellU_Num):
-            CellU.append(data['ffBatteryStatus']['cellVoltageList'][i]*1000)
-        for i in range(CellT_Num):
-            CellU.append(data['ffBatteryStatus']['cellTempList'][i])
-        for i in range(OtherT_Num):
-            CellU.append(data['ffBatteryStatus']['otherTempList'][i])
+        # try:
+        #     OtherT_Num = len(data['ffBatteryStatus']['otherTempList'])
+        #     CellU.extend(data['ffBatteryStatus']['otherTempList'])
+        # except:
+        #     OtherT_Num = 0
+   
+        CellU = np.array(data['ffBatteryStatus'].get('cellVoltageList',[]))
+        CellT = data['ffBatteryStatus'].get('cellTempList',[])
+        OtherT = data['ffBatteryStatus'].get('otherTempList',[])
+        if (len(CellU) != CellU_Num or len(CellT) != CellT_Num or len(OtherT) != OtherT_Num):
+            return pd.DataFrame()
+        CellU = CellU * 1000
+
+
+        # for i in range(CellU_Num):
+        #     CellU.append(data['ffBatteryStatus']['cellVoltageList'][i]*1000)
+        # for i in range(CellT_Num):
+        #     CellU.append(data['ffBatteryStatus']['cellTempList'][i])
+        # for i in range(OtherT_Num):
+        #     CellU.append(data['ffBatteryStatus']['otherTempList'][i])
         if mode == 0:
             data_len = 16
             
@@ -147,7 +166,7 @@ class DBManager():
         data_block = np.append(data_block,CellT)
         data_block = np.append(data_block,OtherT)
         data_block = data_block.reshape(1,len(data_block))
-        return data_block,CellU_Num,CellT_Num,OtherT_Num
+        return data_block
 
     @staticmethod
     def _convert_to_dataframe_gps(data, mode=0):
@@ -204,6 +223,8 @@ class DBManager():
                     columns=['时间戳','累计充电电量','累计充电能量','累计放电电量','累计放电能量', '累积里程'],data=data_block)
         return df
     
+    
+    
     @staticmethod
     def _get_data(urls,type_name,mode=0):
         data = DBManager._download_json_data(urls)
@@ -214,46 +235,61 @@ class DBManager():
             elif mode == 1:
                 name_const = ['时间戳','GSM信号','故障等级', '故障代码','开关状态', '总电流[A]','总电压[V]','充电状态', '单体压差', 'SOC[%]','SOH[%]', '绝缘电阻']
             i=0
+            st = time.time()
+            
+            # 计算本次最大电芯数量
             CellUNum = 0
             CellTNum = 0
-            OtherTNumm = 0
-            st = time.time()
+            OtherTNum = 0
+            for line in data:
+                temp = len(line['ffBatteryStatus'].get('cellVoltageList', []))
+                if (temp > CellUNum):
+                    CellUNum = temp
+                temp = len(line['ffBatteryStatus'].get('cellTempList', []))
+                if (temp > CellTNum):
+                    CellTNum = temp
+                temp = len(line['ffBatteryStatus'].get('otherTempList', []))
+                if (temp > OtherTNum):
+                    OtherTNum = temp
             
+            data_blocks = pd.DataFrame()
             for line in data:
                 et = time.time()
                 try:
                     if i==0:
-                        data_blocks,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe_bms(line, mode)
-                        i+=1
+                        data_blocks = DBManager._convert_to_dataframe_bms(line, mode, CellUNum, CellTNum, OtherTNum)
+                        if (len(data_blocks)>0):
+                            i+=1
                         continue
                 except Exception as e:
-                    print(str(e))
-                    i = 0
+                    continue
+                    
                 try:
-                    data_block,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe_bms(line, mode)
+                    data_block = DBManager._convert_to_dataframe_bms(line, mode, CellUNum, CellTNum, OtherTNum)
                 except Exception as e:
-                    print(str(e))
                     continue
+           
                 try:
-                    data_blocks = np.concatenate((data_blocks,data_block),axis=0)
-                except Exception as e: 
+                    if (len(data_block)>0):
+                        data_blocks = np.concatenate((data_blocks,data_block),axis=0)
+                except Exception as e:
+                    print(e)
                     if 'all the input array dimensions for the concatenation axis must match exactly' in str(e) or \
                     'all the input array dimensions except for the concatenation axis must match exactly'  in str(e):
                         pass
                     else:
                         raise e
-  
-                # print('\r'+str(i),end=" ")
-                # print(data_block)
-                # print(urls)
-                # print(time.time()-et)
                 i+=1
-            name_var = DBManager._get_var_name(CellUNum,CellTNum,OtherTNumm)
+  
+            name_var = DBManager._get_var_name(CellUNum,CellTNum,OtherTNum)
             name_const.extend(name_var)
             columns_name = name_const
             if i==0:
                 data_blocks = []
+
             df_all = pd.DataFrame(columns=columns_name,data=data_blocks)
+
+                
             if not df_all.empty:
                 df_all.loc[:,'时间戳'] = df_all.loc[:,'时间戳'].apply(lambda x:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(x)/1000)))
             return df_all
@@ -363,6 +399,8 @@ class DBManager():
                 except Exception as e:
                     if 'Connection broken' in str(e):
                         continue
+                    elif 'Number of manager items must equal union of block items' in str(e):
+                        break
                     else:
                         raise Exception
                 else:
@@ -370,7 +408,6 @@ class DBManager():
                     gps_all_data = pd.concat([gps_all_data, gps_data], ignore_index=True)
                     system_all_data = pd.concat([system_all_data, system_data], ignore_index=True)
                     accum_all_data = pd.concat([accum_all_data, accum_data], ignore_index=True)
-
                     break
 
         bms_all_data = bms_all_data.reset_index(drop=True)

+ 77 - 13
LIB/MIDDLE/CellStateEstimation/Common/V1_0_1/BatParam.py

@@ -6,12 +6,6 @@ class BatParam:
         #公用参数................................................................................................................................................
         self.CellTempUpLmt=119
         self.CellTempLwLmt=-39
-        self.CellTempHighLv1=45
-        self.CellTempHighLv2=50
-        self.CellTempLowLv1=-20
-        self.CellTempLowLv2=-25
-        self.CellTempDiffLv1=10
-        self.CellTempDiffLv2=15
         self.CellTempRate=5
 
        #热失控参数
@@ -75,7 +69,12 @@ class BatParam:
             self.LeakCurrentLv1=-10
             self.LeakCurrentLv2=-20
             self.LeakCurrentLv3=-50
-
+            self.CellTempHighLv1=45
+            self.CellTempHighLv2=50
+            self.CellTempLowLv1=-20
+            self.CellTempLowLv2=-25
+            self.CellTempDiffLv1=10
+            self.CellTempDiffLv2=15
         elif celltype==2: #4840
             self.Capacity = 41
             self.PackFullChrgVolt=69.99
@@ -107,7 +106,12 @@ class BatParam:
             self.LeakCurrentLv1=-10
             self.LeakCurrentLv2=-20
             self.LeakCurrentLv3=-50
-
+            self.CellTempHighLv1=45
+            self.CellTempHighLv2=50
+            self.CellTempLowLv1=-20
+            self.CellTempLowLv2=-25
+            self.CellTempDiffLv1=10
+            self.CellTempDiffLv2=15
         elif celltype==3:   #力信50ah三元电芯
             self.Capacity = 51
             self.PackFullChrgVolt=80
@@ -139,7 +143,12 @@ class BatParam:
             self.LeakCurrentLv1=-10
             self.LeakCurrentLv2=-20
             self.LeakCurrentLv3=-50
-
+            self.CellTempHighLv1=45
+            self.CellTempHighLv2=50
+            self.CellTempLowLv1=-20
+            self.CellTempLowLv2=-25
+            self.CellTempDiffLv1=10
+            self.CellTempDiffLv2=15            
         elif celltype==4:   #CATL 50ah三元电芯
             self.Capacity = 50
             self.PackFullChrgVolt=80
@@ -172,7 +181,12 @@ class BatParam:
             self.LeakCurrentLv1=-10
             self.LeakCurrentLv2=-20
             self.LeakCurrentLv3=-50
-
+            self.CellTempHighLv1=45
+            self.CellTempHighLv2=50
+            self.CellTempLowLv1=-20
+            self.CellTempLowLv2=-25
+            self.CellTempDiffLv1=10
+            self.CellTempDiffLv2=15            
         elif celltype==99:   #60ah磷酸铁锂电芯
             self.Capacity = 54
             self.PackFullChrgVolt=69.99
@@ -209,13 +223,63 @@ class BatParam:
             self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
             self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
 
-            self.PackChgOc=-40
-            self.PackDisOc=200
+            self.PackChgOc=-600
+            self.PackDisOc=600
 
             self.LeakCurrentLv1=-20
             self.LeakCurrentLv2=-50
             self.LeakCurrentLv3=-100
+            self.CellTempHighLv1=45
+            self.CellTempHighLv2=50
+            self.CellTempLowLv1=-20
+            self.CellTempLowLv2=-25
+            self.CellTempDiffLv1=10
+            self.CellTempDiffLv2=15                       
+        elif celltype==100:
+                self.Capacity = 228*2
+                self.PackFullChrgVolt=3.65*192
+                self.CellFullChrgVolt=3.5
+                self.OcvInflexionBelow=3.285
+                self.OcvInflexion2=3.296
+                self.OcvInflexion3=3.328
+                self.OcvInflexionAbove=3.4
+                self.CellVoltNums=384
+                self.CellTempNums=64
+                self.FullChrgSoc=98
+                self.PeakSoc=59
+                self.PeakVoltLowLmt=3.35
+                self.PeakVoltUpLmt=3.4
+                self.PeakCellVolt=[3.362,3.363,3.365,3.366,3.367]
+                self.PackCrntDec=1
+                self.BalCurrent=0.015
+                self.LookTab_SOC = [0.00, 	2.40, 	6.38, 	10.37, 	14.35, 	18.33, 	22.32, 	26.30, 	30.28, 	35.26, 	40.24, 	45.22, 	50.20, 	54.19, 	58.17, 	60.16, 	65.14, 	70.12, 	75.10, 	80.08, 	84.06, 	88.05, 	92.03, 	96.02, 	100.00]
+                self.LookTab_OCV = [2.7151,	3.0298,	3.1935,	3.2009,	3.2167,	3.2393,	3.2561,	3.2703,	3.2843,	3.2871,	3.2874,	3.2868,	3.2896,	3.2917,	3.2967,	3.3128,	3.3283,	3.3286,	3.3287,	3.3288,	3.3289,	3.3296,	3.3302,	3.3314,	3.3429]
+                
+                self.CellOvLv1=3.75
+                self.CellOvLv2=3.8
+                
+                self.CellUvLv1=2.3
+                self.CellUvLv2=2.2
+                self.CellVoltDiffLv1=0.6
+                self.CellVoltDiffLv2=1
+                self.PackVoltOvLv1=self.CellOvLv1*self.CellVoltNums
+                self.PackVoltOvLv2=self.CellOvLv2*self.CellVoltNums
+                self.PackVoltUvLv1=self.CellUvLv1*self.CellVoltNums
+                self.PackVoltUvLv2=self.CellUvLv2*self.CellVoltNums
+
+                self.PackChgOc=-600
+                self.PackDisOc=600
+
+                self.LeakCurrentLv1=-20
+                self.LeakCurrentLv2=-50
+                self.LeakCurrentLv3=-100
+                self.CellTempHighLv1=65
+                self.CellTempHighLv2=67
+                self.CellTempLowLv1=-30
+                self.CellTempLowLv2=-35
+                self.CellTempDiffLv1=28
+                self.CellTempDiffLv2=32                            
+            
         else:
             print('未找到对应电池编号!!!')
             # sys.exit()
-

+ 6 - 4
LIB/MIDDLE/SaftyCenter/DataDiag_Static/main.py

@@ -39,8 +39,9 @@ def diag_cal():
     tablename2='all_fault_info'
     DBRead = DBDw.DBDownload(host, port, db, user, password,mode)
     with DBRead as DBRead:
-        df_Diag_Ram = DBRead.getdata('start_time','end_time','product_id','code','level','info','advice','Batpos',tablename=tablename2,factory='骑享',sn='',timename='',st='',sp='')
+        df_Diag_Ram = DBRead.getdata('start_time','end_time','product_id','code','level','info','advice','Batpos',tablename=tablename2,factory='',sn='',timename='',st='',sp='')
     df_Diag_Ram=df_Diag_Ram.dropna(how='any')
+    df_Diag_Ram=df_Diag_Ram.reset_index(drop=True)
     
     for sn in SNnums:#SN遍历
         print(sn)
@@ -104,13 +105,14 @@ def diag_cal():
         CellFltInfo = df_Diag_Ram_sn.drop('Batpos',axis=1)
         #获取当前故障电池的历史故障信息↑↑↑↑↑↑↑↑↑↑↑.......................................................................................................................................
         if not df_bms.empty:
-            df_Diag_Batdiag_update_xq=SamplingSafty.main(sn,param,df_bms,CellFltInfo)#学琦计算故障   
-            df_Diag_Batdiag_update_xq2=CtrlSafty.main(sn,param,df_bms,df_Diag_Batdiag_update_xq)
+            df_Diag_Batdiag_update_xq=SamplingSafty.main(sn,param,df_bms,CellFltInfo)#采样安全   
+            df_Diag_Batdiag_update_xq2=CtrlSafty.main(sn,param,df_bms,df_Diag_Batdiag_update_xq)#控制安全
             batDiag=CBMSBatDiag.BatDiag(sn,celltype,df_bms, df_soh, df_uniform, df_Diag_Batdiag_update_xq2)#鹏飞计算
             df_Diag_Batdiag_update=batDiag.diag()
             # df_Diag_Batdiag_update=BatDiag.diag() 
         else:
             df_Diag_Batdiag_update_xq=DataFrame(columns=['start_time','end_time','product_id','code','level','info','advice','Batpos'])
+            df_Diag_Batdiag_update_xq2=DataFrame(columns=['start_time','end_time','product_id','code','level','info','advice','Batpos'])
             df_Diag_Batdiag_update=DataFrame(columns=['start_time','end_time','product_id','code','level','info','advice','Batpos'])
         df_Diag_Ram_add,df_Diag_Ram_Update=DiagDataMerge.DetaMerge(df_Diag_Ram_sn,df_Diag_Batdiag_update,df_OprtnSta,df_Diag_Ram_sn_else)
     task_on=0
@@ -202,7 +204,6 @@ def DaTa_Sta_Minutes_Task():
         DBRead=DBDw.DBDownload(host, port, db, user, password,mode)
         with DBRead as DBRead:
             df_fltinfo=DBRead.getdata('product_id','level','code','start_time','batpos',tablename=tablename1,factory=factory_info[j],sn='',timename='',st='',sp='')#dbdownload经过了改编
-        print(df_fltinfo)
         FltAlarmInfo,Celltype=DataSta.SaftyWarningSta(df_fltinfo,start_time,end_time)
         SatftyCount=DataSta.SftyWrngClsfy(df_fltinfo)
         MaxAccumAh,TotalAccumAh,MaxCycle,MaxRunningHour,TotalRunHour=DataSta.AccumInfo(df_last_accum,df_FirstDataTime,end_time)
@@ -284,6 +285,7 @@ if __name__ == "__main__":
     with DBRead as DBRead:
         df_Diag_Ram = DBRead.getdata('start_time','end_time','product_id','code','level','info','advice','Batpos','factory',tablename=tablename2,factory='',sn='',timename='',st='',sp='')
     df_Diag_Ram=df_Diag_Ram.dropna(how='any')
+    df_Diag_Ram=df_Diag_Ram.reset_index(drop=True)
     # result=pd.read_csv(r'D:\Work\Code_write\data_analyze_platform\USER\01Screen_Problem\result.csv',encoding='gbk')
 
     #定时任务.......................................................................................................................................................................