CBMSBatInterShort.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from pymysql import paramstyle
  5. from LIB.MIDDLE.CellStateEstimation.Common import BatParam
  6. class BatInterShort:
  7. def __init__(self,sn,celltype,df_bms,df_soh): #参数初始化
  8. self.sn=sn
  9. self.celltype=celltype
  10. self.param=BatParam.BatParam(celltype)
  11. self.df_bms=df_bms
  12. self.packcrnt=df_bms['总电流[A]']*self.param.PackCrntDec
  13. self.packvolt=df_bms['总电压[V]']
  14. self.bms_soc=df_bms['SOC[%]']
  15. self.bmstime= pd.to_datetime(df_bms['时间戳'], format='%Y-%m-%d %H:%M:%S')
  16. self.df_soh=df_soh
  17. def intershort(self):
  18. if self.celltype==1 or self.celltype==2 or self.celltype==3 or self.celltype==4:
  19. df_res=self._ncm_intershort()
  20. return df_res
  21. elif self.celltype==99:
  22. df_res=self._lfp_intershort()
  23. return df_res
  24. else:
  25. return pd.DataFrame()
  26. #定义滑动滤波函数....................................................................................
  27. def _np_move_avg(self,a, n, mode="same"):
  28. return (np.convolve(a, np.ones((n,)) / n, mode=mode))
  29. #寻找当前行数据的最小温度值.............................................................................
  30. def _celltemp_weight(self,num):
  31. celltemp = []
  32. for j in range(1, self.param.CellTempNums+1):
  33. s = str(j)
  34. celltemp.append(self.df_bms.loc[num,'单体温度' + s])
  35. celltemp=np.mean(celltemp)
  36. self.celltemp=celltemp
  37. if self.celltype==99:
  38. if celltemp>=20:
  39. self.tempweight=1
  40. self.StandardStandingTime=3600
  41. elif celltemp>=10:
  42. self.tempweight=0.6
  43. self.StandardStandingTime=7200
  44. elif celltemp>=5:
  45. self.tempweight=0.
  46. self.StandardStandingTime=7200
  47. else:
  48. self.tempweight=0.1
  49. self.StandardStandingTime=10800
  50. else:
  51. if celltemp>=20:
  52. self.tempweight=1
  53. self.StandardStandingTime=3600
  54. elif celltemp>=10:
  55. self.tempweight=0.8
  56. self.StandardStandingTime=3600
  57. elif celltemp>=5:
  58. self.tempweight=0.6
  59. self.StandardStandingTime=7200
  60. else:
  61. self.tempweight=0.2
  62. self.StandardStandingTime=10800
  63. #获取当前行所有电压数据........................................................................................
  64. def _cellvolt_get(self,num):
  65. cellvolt=[]
  66. for j in range(1, self.param.CellVoltNums+1):
  67. s = str(j)
  68. cellvolt.append(self.df_bms.loc[num,'单体电压' + s]/1000)
  69. return cellvolt
  70. #获取当前行所有soc差...........................................................................................
  71. def _celldeltsoc_get(self,num,dict_baltime,capacity):
  72. cellsoc=[]
  73. celldeltsoc=[]
  74. for j in range(1, self.param.CellVoltNums+1): #获取每个电芯电压对应的SOC值
  75. cellvolt=self.df_bms.loc[num,'单体电压' + str(j)]/1000
  76. ocv_soc=np.interp(cellvolt,self.param.LookTab_OCV,self.param.LookTab_SOC)
  77. if j in dict_baltime.keys():
  78. ocv_soc=ocv_soc+dict_baltime[j]*self.param.BalCurrent/(capacity*3600) #补偿均衡电流
  79. else:
  80. pass
  81. cellsoc.append(ocv_soc)
  82. if self.celltype==1 or self.celltype==2:
  83. consum_num=7
  84. cellsoc1=cellsoc[:self.param.CellVoltNums-consum_num] #切片,将bms耗电的电芯和非耗电的电芯分离开
  85. cellsocmean1=(sum(cellsoc1)-max(cellsoc1)-min(cellsoc1))/(len(cellsoc1)-2)
  86. cellsoc2=cellsoc[self.param.CellVoltNums-consum_num:]
  87. cellsocmean2=(sum(cellsoc2)-max(cellsoc2)-min(cellsoc2))/(len(cellsoc2)-2)
  88. for j in range(len(cellsoc)): #计算每个电芯的soc差
  89. if j<self.param.CellVoltNums-consum_num:
  90. celldeltsoc.append(cellsoc[j]-cellsocmean1)
  91. else:
  92. celldeltsoc.append(cellsoc[j]-cellsocmean2)
  93. return celldeltsoc
  94. else:
  95. cellsocmean=(sum(cellsoc)-max(cellsoc)-min(cellsoc))/(len(cellsoc)-2)
  96. for j in range(len(cellsoc)): #计算每个电芯的soc差
  97. celldeltsoc.append(cellsoc[j]-cellsocmean)
  98. return celldeltsoc
  99. #获取所有电芯的As差
  100. def _cellDeltAs_get(self,chrg_st,chrg_end,dict_baltime):
  101. cellAs=[]
  102. celldeltAs=[]
  103. for j in range(1, self.param.CellVoltNums+1): #获取每个电芯电压>峰值电压的充入As数
  104. if j in dict_baltime.keys(): #补偿均衡电流
  105. As=-self.param.BalCurrent*dict_baltime[j]
  106. else:
  107. As=0
  108. As_tatol=0
  109. symbol=0
  110. for m in range(chrg_st+1,chrg_end):
  111. As=As-self.packcrnt[m]*(self.bmstime[m]-self.bmstime[m-1]).total_seconds()
  112. if symbol<5:
  113. if self.df_bms.loc[m,'单体电压'+str(j)]/1000>self.param.PeakCellVolt[symbol]:
  114. As_tatol=As_tatol+As
  115. symbol=symbol+1
  116. else:
  117. continue
  118. else:
  119. cellAs.append(As_tatol/5)
  120. break
  121. if self.celltype==99:
  122. consum_num=10
  123. cellAs1=cellAs[:self.param.CellVoltNums-consum_num] #切片,将bms耗电的电芯和非耗电的电芯分离开
  124. cellAsmean1=(sum(cellAs1)-max(cellAs1)-min(cellAs1))/(len(cellAs1)-2)
  125. cellAs2=cellAs[self.param.CellVoltNums-consum_num:]
  126. cellAsmean2=(sum(cellAs2)-max(cellAs2)-min(cellAs2))/(len(cellAs2)-2)
  127. for j in range(len(cellAs)): #计算每个电芯的soc差
  128. if j<self.param.CellVoltNums-consum_num:
  129. celldeltAs.append(cellAs[j]-cellAsmean1)
  130. else:
  131. celldeltAs.append(cellAs[j]-cellAsmean2)
  132. else:
  133. cellAsmean=(sum(cellAs)-max(cellAs)-min(cellAs))/(len(cellAs)-2)
  134. for j in range(len(cellAs)): #计算每个电芯的soc差
  135. celldeltAs.append(cellAs[j]-cellAsmean)
  136. return celldeltAs
  137. #计算每个电芯的均衡时长..........................................................................................................................
  138. def _bal_time(self,dict_bal):
  139. dict_baltime={}
  140. dict_baltime1={}
  141. for key in dict_bal:
  142. count=1
  143. x=eval(key)
  144. while x>0:
  145. if x & 1==1: #判断最后一位是否为1
  146. if count in dict_baltime.keys():
  147. dict_baltime[count] = dict_baltime[count] + dict_bal[key]
  148. else:
  149. dict_baltime[count] = dict_bal[key]
  150. else:
  151. pass
  152. count += 1
  153. x >>= 1 #右移一位
  154. dict_baltime=dict(sorted(dict_baltime.items(),key=lambda dict_baltime:dict_baltime[0]))
  155. for key in dict_baltime: #解析均衡的电芯编号
  156. if self.celltype==1: #科易6040
  157. if key<14:
  158. dict_baltime1[key]=dict_baltime[key]
  159. elif key<18:
  160. dict_baltime1[key-1]=dict_baltime[key]
  161. else:
  162. dict_baltime1[key-3]=dict_baltime[key]
  163. elif self.celltype==1: #科易4840
  164. if key<4:
  165. dict_baltime1[key-1]=dict_baltime[key]
  166. elif key<8:
  167. dict_baltime1[key-1]=dict_baltime[key]
  168. elif key<14:
  169. dict_baltime1[key-3]=dict_baltime[key]
  170. elif key<18:
  171. dict_baltime1[key-4]=dict_baltime[key]
  172. else:
  173. dict_baltime1[key-6]=dict_baltime[key]
  174. else:
  175. dict_baltime1=dict_baltime
  176. return dict_baltime1
  177. #三元电池的内短路电流计算...........................................................................................................................................................
  178. def _ncm_intershort(self):
  179. column_name=['time_st', 'time_sp', 'sn', 'method','short_current','baltime']
  180. df_res=pd.DataFrame(columns=column_name)
  181. if not self.df_bms.empty:
  182. if self.df_soh.empty:
  183. batsoh=self.df_bms.loc[0,'SOH[%]']
  184. capacity=self.param.Capacity*batsoh/100
  185. else:
  186. batsoh=self.df_soh.loc[len(self.df_soh)-1,'soh']
  187. capacity=self.param.Capacity*batsoh/100
  188. standingtime=0
  189. standingtime1=0
  190. firsttime=1
  191. firsttime1=1
  192. dict_bal={}
  193. dict_bal1={}
  194. for i in range(2,len(self.df_bms)-2):
  195. if firsttime1==0: #满电静置算法--计算均衡状态对应的均衡时间
  196. try:
  197. balstat=int(self.df_bms.loc[i,'单体均衡状态'])
  198. if balstat>0.5:
  199. bal_step=(self.bmstime[i+1]-self.bmstime[i]).total_seconds() #均衡步长
  200. bal_step=int(bal_step)
  201. if str(balstat) in dict_bal1.keys():
  202. dict_bal1[str(balstat)]=dict_bal1[str(balstat)]+bal_step
  203. else:
  204. dict_bal1[str(balstat)]=bal_step
  205. else:
  206. pass
  207. except:
  208. dict_bal1={}
  209. else:
  210. pass
  211. if abs(self.packcrnt[i]) < 0.1 and abs(self.packcrnt[i-1]) < 0.1 and abs(self.packcrnt[i+1]) < 0.1:
  212. delttime=(self.bmstime[i]-self.bmstime[i-1]).total_seconds()
  213. standingtime=standingtime+delttime
  214. standingtime1=standingtime1+delttime
  215. self._celltemp_weight(i)
  216. #静置法计算内短路-开始.....................................................................................................................................
  217. if firsttime==1:
  218. if standingtime>self.StandardStandingTime: #静置时间满足要求
  219. dict_baltime=self._bal_time(dict_bal) #获取每个电芯的均衡时间
  220. deltsoc_last=self._celldeltsoc_get(i,dict_baltime,capacity)
  221. time_last=self.bmstime[i]
  222. firsttime=0
  223. standingtime=0
  224. else:
  225. pass
  226. elif standingtime>3600*12:
  227. standingtime=0
  228. dict_baltime=self._bal_time(dict_bal) #获取每个电芯的均衡时间
  229. deltsoc_now=self._celldeltsoc_get(i,dict_baltime,capacity)
  230. time_now=self.bmstime[i]
  231. list_sub=[a-b for a, b in zip(deltsoc_now, deltsoc_last)]
  232. list_pud=[0.01*capacity*3600*1000/(time_now-time_last).total_seconds()]*self.param.CellVoltNums
  233. leak_current=[a*b for a,b in zip(list_sub,list_pud)]
  234. leak_current=np.array(leak_current)
  235. leak_current=np.round(leak_current,3)
  236. leak_current=list(leak_current)
  237. df_res.loc[len(df_res)]=[time_last,time_now,self.sn,1,str(leak_current),str(dict_baltime)] #计算结果存入Dataframe
  238. time_last=time_now #更新时间
  239. deltsoc_last=deltsoc_now #更新soc差
  240. dict_bal={}
  241. else:
  242. try:
  243. balstat=int(self.df_bms.loc[i,'单体均衡状态'])
  244. if balstat>0.5:
  245. bal_step=(self.bmstime[i+1]-self.bmstime[i]).total_seconds() #均衡步长
  246. bal_step=int(bal_step)
  247. if str(balstat) in dict_bal.keys():
  248. dict_bal[str(balstat)]=dict_bal[str(balstat)]+bal_step
  249. else:
  250. dict_bal[str(balstat)]=bal_step
  251. else:
  252. pass
  253. except:
  254. dict_bal={}
  255. #满电静置法计算内短路-开始.....................................................................................................................................................
  256. if standingtime1>self.StandardStandingTime:
  257. if abs(self.packcrnt[i+2]) >= 0.1:
  258. standingtime1=0
  259. cellvolt_now1=self._cellvolt_get(i)
  260. cellsoc_now1=np.interp(max(cellvolt_now1),self.param.LookTab_OCV,self.param.LookTab_SOC)
  261. if cellsoc_now1>=self.param.FullChrgSoc-3:
  262. if firsttime1==1:
  263. dict_baltime1=self._bal_time(dict_bal1) #获取每个电芯的均衡时间
  264. deltsoc_last1=self._celldeltsoc_get(i,dict_baltime1,capacity)
  265. time_last1=self.bmstime[i]
  266. firsttime1=0
  267. else:
  268. dict_baltime1=self._bal_time(dict_bal1) #获取每个电芯的均衡时间
  269. time_now1=self.bmstime[i]
  270. if (time_now1-time_last1).total_seconds()>3600*24:
  271. deltsoc_now1=self._celldeltsoc_get(i,dict_baltime1,capacity)
  272. list_sub1=[a-b for a, b in zip(deltsoc_now1, deltsoc_last1)]
  273. list_pud1=[0.01*capacity*3600*1000/(time_now1-time_last1).total_seconds()]*self.param.CellVoltNums
  274. leak_current1=[a*b for a,b in zip(list_sub1,list_pud1)]
  275. leak_current1=np.array(leak_current1)
  276. leak_current1=np.round(leak_current1,3)
  277. leak_current1=list(leak_current1)
  278. df_res.loc[len(df_res)]=[time_last1,time_now1,self.sn,2,str(leak_current1),str(dict_baltime1)] #计算结果存入Dataframe
  279. time_last1=time_now1 #更新时间
  280. deltsoc_last1=deltsoc_now1 #更新soc差
  281. dict_bal1={}
  282. else:
  283. pass
  284. else:
  285. pass
  286. else:
  287. pass
  288. else:
  289. pass
  290. else:
  291. dict_bal={}
  292. firsttime=1
  293. standingtime=0
  294. standingtime1=0
  295. pass
  296. if df_res.empty: #返回计算结果
  297. return pd.DataFrame()
  298. else:
  299. return df_res
  300. #磷酸铁锂电池内短路计算程序.............................................................................................................................
  301. def _lfp_intershort(self):
  302. column_name=['time_st', 'time_sp', 'sn', 'method','short_current','baltime']
  303. df_res=pd.DataFrame(columns=column_name)
  304. if not self.df_bms.empty:
  305. if self.df_soh.empty:
  306. batsoh=self.df_bms.loc[0,'SOH[%]']
  307. capacity=self.param.Capacity*batsoh/100
  308. else:
  309. batsoh=self.df_soh.loc[len(self.df_soh)-1,'soh']
  310. capacity=self.param.Capacity*batsoh/100
  311. standingtime=0
  312. standingtime1=0
  313. firsttime=1
  314. firsttime1=1
  315. dict_bal={}
  316. dict_bal1={}
  317. chrg_start=[]
  318. chrg_end=[]
  319. dict_bal_list=[]
  320. charging=0
  321. dict_bal3={}
  322. for i in range(3,len(self.df_bms)-3):
  323. #静置法计算内短路..........................................................................................................................
  324. if firsttime1==0: #满电静置算法--计算均衡状态对应的均衡时间
  325. try:
  326. balstat=int(self.df_bms.loc[i,'单体均衡状态'])
  327. if balstat>0.5:
  328. bal_step=(self.bmstime[i+1]-self.bmstime[i]).total_seconds() #均衡步长
  329. bal_step=int(bal_step)
  330. if str(balstat) in dict_bal1.keys():
  331. dict_bal1[str(balstat)]=dict_bal1[str(balstat)]+bal_step
  332. else:
  333. dict_bal1[str(balstat)]=bal_step
  334. else:
  335. pass
  336. except:
  337. dict_bal1={}
  338. else:
  339. pass
  340. if abs(self.packcrnt[i]) < 0.1 and abs(self.packcrnt[i-1]) < 0.1 and abs(self.packcrnt[i+1]) < 0.1:
  341. delttime=(self.bmstime[i]-self.bmstime[i-1]).total_seconds()
  342. standingtime=standingtime+delttime
  343. standingtime1=standingtime1+delttime
  344. self._celltemp_weight(i)
  345. #静置法计算内短路-开始.....................................................................................................................................
  346. if firsttime==1:
  347. if standingtime>self.StandardStandingTime: #静置时间满足要求
  348. cellvolt=self._cellvolt_get(i)
  349. if max(cellvolt)<self.param.OcvInflexionBelow-0.002:
  350. dict_baltime=self._bal_time(dict_bal) #获取每个电芯的均衡时间
  351. deltsoc_last=self._celldeltsoc_get(i,dict_baltime,capacity)
  352. time_last=self.bmstime[i]
  353. firsttime=0
  354. standingtime=0
  355. else:
  356. pass
  357. else:
  358. pass
  359. elif standingtime>3600*12:
  360. cellvolt=self._cellvolt_get(i)
  361. if max(cellvolt)<self.param.OcvInflexionBelow-0.002:
  362. standingtime=0
  363. dict_baltime=self._bal_time(dict_bal) #获取每个电芯的均衡时间
  364. deltsoc_now=self._celldeltsoc_get(i, dict_baltime,capacity) #获取每个电芯的SOC差
  365. time_now=self.bmstime[i]
  366. list_sub=[a-b for a, b in zip(deltsoc_now, deltsoc_last)]
  367. list_pud=[0.01*capacity*3600*1000/(time_now-time_last).total_seconds()]*self.param.CellVoltNums
  368. leak_current=[a*b for a,b in zip(list_sub,list_pud)]
  369. leak_current=np.array(leak_current)
  370. leak_current=np.round(leak_current,3)
  371. leak_current=list(leak_current)
  372. df_res.loc[len(df_res)]=[time_last,time_now,self.sn,1,str(leak_current),str(dict_baltime)] #计算结果存入Dataframe
  373. time_last=time_now #更新时间
  374. deltsoc_last=deltsoc_now #更新soc差
  375. dict_bal={}
  376. else:
  377. pass
  378. else:
  379. try:
  380. balstat=int(self.df_bms.loc[i,'单体均衡状态'])
  381. if balstat>0.5:
  382. bal_step=(self.bmstime[i+1]-self.bmstime[i]).total_seconds() #均衡步长
  383. bal_step=int(bal_step)
  384. if str(balstat) in dict_bal.keys():
  385. dict_bal[str(balstat)]=dict_bal[str(balstat)]+bal_step
  386. else:
  387. dict_bal[str(balstat)]=bal_step
  388. else:
  389. pass
  390. except:
  391. dict_bal={}
  392. #非平台区间静置法计算内短路-开始.....................................................................................................................................................
  393. if standingtime1>self.StandardStandingTime:
  394. if abs(self.packcrnt[i+2]) >= 0.1:
  395. standingtime1=0
  396. cellvolt_now1=self._cellvolt_get(i)
  397. if max(cellvolt_now1)<self.param.OcvInflexionBelow-0.002:
  398. if firsttime1==1:
  399. dict_baltime1=self._bal_time(dict_bal1) #获取每个电芯的均衡时间
  400. deltsoc_last1=self._celldeltsoc_get(i,dict_baltime1,capacity)
  401. time_last1=self.bmstime[i]
  402. firsttime1=0
  403. else:
  404. dict_baltime1=self._bal_time(dict_bal1) #获取每个电芯的均衡时间
  405. deltsoc_now1=self._celldeltsoc_get(i,dict_baltime1,capacity)
  406. time_now1=self.bmstime[i]
  407. time_now1=self.bmstime[i]
  408. if abs(max(deltsoc_now1)-max(deltsoc_last1))<10 and (time_now1-time_last1).total_seconds()>3600*24:
  409. list_sub1=[a-b for a, b in zip(deltsoc_now1, deltsoc_last1)]
  410. list_pud1=[0.01*capacity*3600*1000/(time_now1-time_last1).total_seconds()]*self.param.CellVoltNums
  411. leak_current1=[a*b for a,b in zip(list_sub1,list_pud1)]
  412. leak_current1=np.array(leak_current1)
  413. leak_current1=np.round(leak_current1,3)
  414. leak_current1=list(leak_current1)
  415. df_res.loc[len(df_res)]=[time_last1,time_now1,self.sn,2,str(leak_current1),str(dict_baltime1)] #计算结果存入Dataframe
  416. time_last1=time_now1 #更新时间
  417. deltsoc_last1=deltsoc_now1 #更新soc差
  418. dict_bal1={}
  419. else:
  420. pass
  421. else:
  422. pass
  423. else:
  424. pass
  425. else:
  426. pass
  427. else:
  428. dict_bal={}
  429. firsttime=1
  430. standingtime=0
  431. standingtime1=0
  432. pass
  433. #获取充电数据——开始..............................................................................................................
  434. try:
  435. balstat=int(self.df_bms.loc[i,'单体均衡状态']) #统计均衡状态
  436. if balstat>0.5:
  437. bal_step=(self.bmstime[i+1]-self.bmstime[i]).total_seconds() #均衡步长
  438. bal_step=int(bal_step)
  439. if str(balstat) in dict_bal3.keys():
  440. dict_bal3[str(balstat)]=dict_bal3[str(balstat)]+bal_step
  441. else:
  442. dict_bal3[str(balstat)]=bal_step
  443. else:
  444. pass
  445. except:
  446. dict_bal3={}
  447. if charging==0:
  448. if self.packcrnt[i]<=-1 and self.packcrnt[i+1]<=-1 and self.packcrnt[i+2]<=-1 and self.bms_soc[i]<40: #判断充电开始
  449. cellvolt_now=self._cellvolt_get(i)
  450. if min(cellvolt_now)<self.param.CellFullChrgVolt-0.15:
  451. charging=1
  452. if len(chrg_start)>len(chrg_end):
  453. chrg_start[-1]=i
  454. else:
  455. chrg_start.append(i)
  456. else:
  457. pass
  458. else:
  459. pass
  460. else: #充电中
  461. if (self.bmstime[i+1]-self.bmstime[i]).total_seconds()>180: #如果充电过程中时间间隔>180s,则舍弃该次充电
  462. chrg_start.remove(chrg_start[-1])
  463. charging=0
  464. continue
  465. elif self.packcrnt[i]<=-1 and self.packcrnt[i+1]<=-1 and self.packcrnt[i+2]<-1:
  466. cellvolt_now=self._cellvolt_get(i)
  467. if min(cellvolt_now)>self.param.CellFullChrgVolt-0.13: #电压>满充电压-0.13V,即3.37V
  468. self._celltemp_weight(i)
  469. if i-chrg_start[-1]>10 and self.celltemp>10:
  470. chrg_end.append(i+1)
  471. dict_bal_list.append(dict_bal3)
  472. dict_bal3={}
  473. charging=0
  474. continue
  475. else:
  476. chrg_start.remove(chrg_start[-1])
  477. charging=0
  478. continue
  479. else:
  480. pass
  481. else:
  482. pass
  483. #基于充电数据计算单体电芯的漏电流..........................................................................................................
  484. if len(chrg_end)>1:
  485. for i in range(len(chrg_end)):
  486. if i<1:
  487. dict_baltime={}
  488. deltAs_last=self._cellDeltAs_get(chrg_start[i],chrg_end[i],dict_baltime)
  489. time_last=self.bmstime[chrg_end[i]]
  490. else:
  491. dict_baltime=self._bal_time(dict_bal_list[i]) #获取每个电芯的均衡时间
  492. deltAs_now=self._cellDeltAs_get(chrg_start[i],chrg_end[i],dict_baltime) #获取每个电芯的As差
  493. time_now=self.bmstime[chrg_end[i]]
  494. list_sub=[a-b for a, b in zip(deltAs_now, deltAs_last)]
  495. list_pud=[-1000/(time_now-time_last).total_seconds()]*self.param.CellVoltNums
  496. leak_current=[a*b for a,b in zip(list_sub,list_pud)]
  497. leak_current=np.array(leak_current)
  498. leak_current=np.round(leak_current,3)
  499. leak_current=list(leak_current)
  500. df_res.loc[len(df_res)]=[time_last,time_now,self.sn,3,str(leak_current),str(dict_baltime)] #计算结果存入Dataframe
  501. deltAs_last=deltAs_now
  502. time_last=time_now
  503. else:
  504. pass
  505. if df_res.empty:
  506. return pd.DataFrame()
  507. else:
  508. return df_res