|
@@ -0,0 +1,160 @@
|
|
|
+
|
|
|
+from LIB.BACKEND import DBManager
|
|
|
+
|
|
|
+import os
|
|
|
+import pandas as pd
|
|
|
+import numpy as np
|
|
|
+import bisect
|
|
|
+import datetime
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Capacity = 53.6
|
|
|
+PackFullChrgVolt=69.99
|
|
|
+CellFullChrgVolt=3.37
|
|
|
+CellVoltNums=20
|
|
|
+CellTempNums=4
|
|
|
+FullChrgSoc=98
|
|
|
+CellVoltPort=[3.357,3.358,3.359,3.36,3.361]
|
|
|
+PeakSoc=57
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+LookTab_SOC = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
|
|
|
+LookTab_OCV = [3.1820, 3.2250, 3.2730, 3.2840, 3.2860, 3.2920, 3.3210, 3.3260, 3.3270, 3.3270, 3.3640]
|
|
|
+
|
|
|
+
|
|
|
+def cal_LFPLeakCurrent(sn, end_time, start_time):
|
|
|
+ end_time = end_time
|
|
|
+ strat_time = start_time
|
|
|
+
|
|
|
+ sn = sn
|
|
|
+ st = strat_time
|
|
|
+ et = end_time
|
|
|
+
|
|
|
+ dbManager = DBManager.DBManager()
|
|
|
+ df_data = dbManager.get_data(sn=sn, start_time=st, end_time=et, data_groups=['bms'])
|
|
|
+ df_bms = df_data['bms']
|
|
|
+
|
|
|
+
|
|
|
+ packcrnt=df_bms['总电流[A]']
|
|
|
+ SOC=df_bms['SOC[%]']
|
|
|
+ bmsstat=df_bms['充电状态']
|
|
|
+ time= pd.to_datetime(df_bms['时间戳'], format='%Y-%m-%d %H:%M:%S')
|
|
|
+
|
|
|
+
|
|
|
+ ChgStart=[]
|
|
|
+ ChgEnd=[]
|
|
|
+ for i in range(3, len(time) - 3):
|
|
|
+ if i==3 and bmsstat[i]==2 and bmsstat[i+1]==2 and bmsstat[i+2]==2:
|
|
|
+ ChgStart.append(i)
|
|
|
+ elif bmsstat[i-2]!=2 and bmsstat[i-1]!=2 and bmsstat[i]==2:
|
|
|
+ ChgStart.append(i)
|
|
|
+ elif bmsstat[i-1]==2 and bmsstat[i]!=2 and bmsstat[i+1]!=2:
|
|
|
+ ChgEnd.append(i)
|
|
|
+ elif i == (len(time) - 4) and bmsstat[len(bmsstat)-1] == 2 and bmsstat[len(bmsstat)-2] == 2:
|
|
|
+ ChgEnd.append(len(time)-1)
|
|
|
+
|
|
|
+
|
|
|
+ ChgStartValid=[]
|
|
|
+ ChgEndValid=[]
|
|
|
+ if ChgStart:
|
|
|
+ for i in range(len(ChgEnd)):
|
|
|
+
|
|
|
+ cellvolt = []
|
|
|
+ for j in range(1, CellVoltNums+1):
|
|
|
+ s = str(j)
|
|
|
+ volt = df_bms['单体电压' + s]/1000
|
|
|
+ cellvolt.append(max(volt[ChgStart[i]:ChgEnd[i]]))
|
|
|
+ if min(cellvolt)>CellFullChrgVolt and SOC[ChgStart[i]]<40 and (ChgEnd[i]-ChgStart[i])>10:
|
|
|
+ if ((time[ChgEnd[i]]-time[ChgStart[i]]).total_seconds())/(ChgEnd[i]-ChgStart[i])<30:
|
|
|
+ ChgStartValid.append(ChgStart[i])
|
|
|
+ ChgEndValid.append(ChgEnd[i])
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ def data_search(data1,data2,data3,data4):
|
|
|
+ Soc=0
|
|
|
+ for m in range(1,len(data1)):
|
|
|
+ t=(data2[m]-data2[m-1]).total_seconds()
|
|
|
+ Soc=Soc-data3[m]*t/(3600*Capacity)
|
|
|
+ if data1[m]>data4:
|
|
|
+ DetaT=(data2[m]-data2[0]).total_seconds()
|
|
|
+ return Soc,m
|
|
|
+ break
|
|
|
+
|
|
|
+ if ChgStartValid:
|
|
|
+ df_DetaTime=pd.DataFrame()
|
|
|
+ df_DetaTime1=pd.DataFrame()
|
|
|
+ df_detatime=pd.DataFrame()
|
|
|
+ for i in range(len(ChgStartValid)):
|
|
|
+ DetaSoc1=[]
|
|
|
+ DetaSoc2 = []
|
|
|
+ DetaSoc=[]
|
|
|
+ a=list(range(5))
|
|
|
+ b=list(range(5))
|
|
|
+
|
|
|
+ for j in range(1, CellVoltNums-9):
|
|
|
+ s = str(j)
|
|
|
+ cellvolt = df_bms['单体电压' + s]/1000
|
|
|
+ cellvolt=list(cellvolt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Time=list(time[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Packcrnt=list(packcrnt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ for k in range(len(CellVoltPort)):
|
|
|
+ a[k],b[k]=data_search(cellvolt,Time,Packcrnt,CellVoltPort[k])
|
|
|
+ DetaSoc1.append(np.mean(a))
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Socmean1=(sum(DetaSoc1)-max(DetaSoc1)-min(DetaSoc1))/(len(DetaSoc1)-2)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for j in range(11, CellVoltNums+1):
|
|
|
+ s = str(j)
|
|
|
+ cellvolt = df_bms['单体电压' + s]/1000
|
|
|
+ cellvolt=list(cellvolt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Time=list(time[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ Packcrnt=list(packcrnt[ChgStartValid[i]:ChgEndValid[i]])
|
|
|
+ for k in range(len(CellVoltPort)):
|
|
|
+ a[k],b[k]=data_search(cellvolt,Time,Packcrnt,CellVoltPort[k])
|
|
|
+ DetaSoc2.append(np.mean(a))
|
|
|
+
|
|
|
+
|
|
|
+ Socmean2=(sum(DetaSoc2)-max(DetaSoc2)-min(DetaSoc2))/(len(DetaSoc2)-2)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ DetaSoc3=DetaSoc1+DetaSoc2
|
|
|
+ for j in range(len(DetaSoc3)):
|
|
|
+ if j<10:
|
|
|
+ Socmean=Socmean1
|
|
|
+ else:
|
|
|
+ Socmean=Socmean2
|
|
|
+ DetaSoc.append(DetaSoc3[j]-Socmean)
|
|
|
+
|
|
|
+ df_DetaTime[time[ChgStartValid[i]]]=DetaSoc
|
|
|
+
|
|
|
+ column=[]
|
|
|
+ time1=[]
|
|
|
+ sn1=[]
|
|
|
+
|
|
|
+ for index, row in df_DetaTime.iteritems():
|
|
|
+ column.append(index)
|
|
|
+
|
|
|
+ for i in range(1,len(column)):
|
|
|
+ df_DetaTime1[column[i]] = df_DetaTime.apply(lambda x: (x[column[i-1]] - x[column[i]])*1000*Capacity*3600/((column[i]-column[i-1]).total_seconds()), axis=1)
|
|
|
+ time1.append(column[i])
|
|
|
+ sn1.append(sn)
|
|
|
+ df_detatime['time']=time1
|
|
|
+ df_detatime['sn']=sn1
|
|
|
+
|
|
|
+ for i in range(CellVoltNums):
|
|
|
+ cell=[]
|
|
|
+ for j in range(1,len(column)):
|
|
|
+ cell.append(df_DetaTime1[column[j]][i])
|
|
|
+ df_detatime['cell'+str(i+1)]=cell
|
|
|
+ return df_detatime
|
|
|
+ return pd.DataFrame()
|