|
@@ -17,6 +17,7 @@ class BatSoh:
|
|
|
self.packvolt=df_bms['总电压[V]']
|
|
|
self.bms_soc=df_bms['SOC[%]']
|
|
|
self.bms_soh=df_bms['SOH[%]']
|
|
|
+ self.bmsstat=df_bms['充电状态']
|
|
|
self.bmstime= pd.to_datetime(df_bms['时间戳'], format='%Y-%m-%d %H:%M:%S')
|
|
|
|
|
|
self.df_accum=df_accum
|
|
@@ -41,15 +42,18 @@ class BatSoh:
|
|
|
else:
|
|
|
return pd.DataFrame()
|
|
|
|
|
|
- def getdata(self): #获取预算结果库的结果
|
|
|
+ #获取预算结果库的结果....................................................................................................................
|
|
|
+ def getdata(self):
|
|
|
DBManager=DBDownload.DBDownload(self.host, self.port, self.db, self.user, self.password)
|
|
|
with DBManager as DBManager:
|
|
|
self.df_soh=DBManager.getdata('time_st','time_sp','sn','method','soh','cellsoh', tablename='soh_result', sn=self.sn)
|
|
|
|
|
|
- def _np_move_avg(self,a, n, mode="same"): #定义滑动滤波函数
|
|
|
+ #定义滑动滤波函数.........................................................................................................................
|
|
|
+ def _np_move_avg(self,a, n, mode="same"):
|
|
|
return (np.convolve(a, np.ones((n,)) / n, mode=mode))
|
|
|
|
|
|
- def _chrgdata(self): #筛选充电数据
|
|
|
+ #筛选充电数据..............................................................................................................................
|
|
|
+ def _chrgdata(self):
|
|
|
self.ChgStart=[]
|
|
|
self.ChgEnd=[]
|
|
|
if len(self.packvolt)>100:
|
|
@@ -63,7 +67,8 @@ class BatSoh:
|
|
|
elif i == (len(self.bmstime) - 4) and self.bmsstat[len(self.bmsstat)-1] == 2 and self.bmsstat[len(self.bmsstat)-2] == 2:
|
|
|
self.ChgEnd.append(len(self.bmstime)-2)
|
|
|
|
|
|
- def _celltemp_weight(self,num): #寻找当前行数据的最小温度值
|
|
|
+ #寻找当前行数据的最小温度值.................................................................................................................
|
|
|
+ def _celltemp_weight(self,num):
|
|
|
celltemp = []
|
|
|
for j in range(1, self.param.CellTempNums+1):
|
|
|
s = str(j)
|
|
@@ -96,7 +101,8 @@ class BatSoh:
|
|
|
self.tempweight=0.1
|
|
|
self.StandardStandingTime=3600
|
|
|
|
|
|
- def _deltsoc_weight(self,deltsoc): #获取SOC差对应的SOH权重值
|
|
|
+ #获取SOC差对应的SOH权重值...................................................................................................................
|
|
|
+ def _deltsoc_weight(self,deltsoc):
|
|
|
if deltsoc>60:
|
|
|
deltsoc_weight=1
|
|
|
elif deltsoc>50:
|
|
@@ -111,14 +117,16 @@ class BatSoh:
|
|
|
deltsoc_weight=0
|
|
|
return deltsoc_weight
|
|
|
|
|
|
- def _cellvolt_get(self,num): #获取当前行所有电压数据
|
|
|
+ #获取当前行所有电压数据......................................................................................................................
|
|
|
+ def _cellvolt_get(self,num):
|
|
|
cellvolt=[]
|
|
|
for j in range(1, self.param.CellVoltNums+1):
|
|
|
s = str(j)
|
|
|
cellvolt.append(self.df_bms.loc[num,'单体电压' + s]/1000)
|
|
|
return cellvolt
|
|
|
|
|
|
- def _dvdq_soh(self, chrg_st, chrg_end,cellvolt): #dvdq方法计算soh
|
|
|
+ #dvdq方法计算soh...........................................................................................................................
|
|
|
+ def _dvdq_soh(self, chrg_st, chrg_end,cellvolt):
|
|
|
Ah = 0 #参数赋初始值
|
|
|
Volt = cellvolt[chrg_st]
|
|
|
DV_Volt=[]
|
|
@@ -219,7 +227,8 @@ class BatSoh:
|
|
|
else:
|
|
|
return 0
|
|
|
|
|
|
- def _ncmsoh_chrg(self): #NCM充电数据soh计算
|
|
|
+ #NCM充电数据soh计算.........................................................................................................................
|
|
|
+ def _ncmsoh_chrg(self):
|
|
|
self._chrgdata()
|
|
|
self.getdata()
|
|
|
ChgStartValid=[]
|
|
@@ -282,6 +291,7 @@ class BatSoh:
|
|
|
return df_res
|
|
|
return pd.DataFrame()
|
|
|
|
|
|
+ #两点法计算三元SOH.........................................................................................................................
|
|
|
def _ncmsoh_twopoint(self):
|
|
|
standingpoint_st=[]
|
|
|
standingpoint_sp=[]
|
|
@@ -345,6 +355,7 @@ class BatSoh:
|
|
|
standingtime=0
|
|
|
continue
|
|
|
|
|
|
+ #计算SOH......................................................................................................................
|
|
|
if standingpoint_sp:
|
|
|
self.getdata() #获取已计算的soh
|
|
|
column_name=['time_st','time_sp','sn','method','soh','cellsoh']
|
|
@@ -450,6 +461,7 @@ class BatSoh:
|
|
|
return df_res
|
|
|
return pd.DataFrame()
|
|
|
|
|
|
+ #两点法和DVDQ法计算磷酸铁锂电池SOH..................................................................................................................
|
|
|
def _lfpsoh(self):
|
|
|
standingpoint_st=[]
|
|
|
standingpoint_sp=[]
|
|
@@ -464,7 +476,7 @@ class BatSoh:
|
|
|
|
|
|
for i in range(3,len(self.df_bms)-3):
|
|
|
|
|
|
- #获取两点法法所需数据-开始
|
|
|
+ #获取两点法法所需数据-开始.................................................................................................................
|
|
|
if abs(self.packcrnt[i]) < 0.2: #判断非平台区静置状态
|
|
|
delttime=(self.bmstime[i]-self.bmstime[i-1]).total_seconds()
|
|
|
standingtime=standingtime+delttime
|
|
@@ -521,9 +533,8 @@ class BatSoh:
|
|
|
else:
|
|
|
standingtime=0
|
|
|
pass
|
|
|
- #获取两点法所需数据-结束
|
|
|
|
|
|
- #获取DVDQ算法所需数据——开始
|
|
|
+ #获取DVDQ算法所需数据——开始.............................................................................................................
|
|
|
if i==3 and self.packcrnt[1]<=-1 and self.packcrnt[2]<=-1 and self.packcrnt[3]<=-1:
|
|
|
self._celltemp_weight(i)
|
|
|
chrg_start.append(i)
|
|
@@ -583,14 +594,15 @@ class BatSoh:
|
|
|
continue
|
|
|
else:
|
|
|
pass
|
|
|
- #获取DVDQ算法所需数据——结束
|
|
|
|
|
|
- if standingpoint_sp or chrg_end: #开始计算SOH
|
|
|
+ #开始计算SOH.............................................................................................................................................
|
|
|
+ if standingpoint_sp or chrg_end:
|
|
|
self.getdata() #获取已计算的soh
|
|
|
column_name=['time_st','time_sp','sn','method','soh','cellsoh']
|
|
|
df_res=pd.DataFrame(columns=column_name)
|
|
|
|
|
|
- if standingpoint_sp: #两点法计算SOH
|
|
|
+ #两点法计算SOH........................................................................................................................................
|
|
|
+ if standingpoint_sp:
|
|
|
for i in range(len(standingpoint_sp)): #判断为满充点或者下拐点
|
|
|
if self.packcrnt[standingpoint_sp[i]]<=-1:
|
|
|
cellocv_st=self._cellvolt_get(standingpoint_st[i])
|
|
@@ -682,6 +694,7 @@ class BatSoh:
|
|
|
else:
|
|
|
pass
|
|
|
|
|
|
+ #DVDQ法计算SOH.......................................................................................................................................
|
|
|
if chrg_end:
|
|
|
for i in range(len(chrg_end)):
|
|
|
cellvolt_max = self.df_bms['单体电压' + str(cellmaxvolt_number2[i]+1)] / 1000 #获取最大电压
|
|
@@ -724,12 +737,3 @@ class BatSoh:
|
|
|
return pd.DataFrame()
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|