SC_SamplingSafty.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. import sys
  2. import numpy as np
  3. import pandas as pd
  4. import string
  5. import os
  6. from pandas import Series
  7. from matplotlib import pyplot as plt
  8. from pandas.core.frame import DataFrame
  9. from pandas.core.indexes.base import Index
  10. from LIB.BACKEND import DBManager
  11. import datetime
  12. import time
  13. import string
  14. class SamplingSafty:
  15. def __init__(self):
  16. pass
  17. def main(sn,param,bms_info,df_Diag_Ram_in):
  18. df_Diag_Ram_Update_inside=DataFrame(columns=['start_time', 'end_time', 'product_id', 'code', 'level', 'info','advice'])
  19. df_Diag_Ram_Update_inside=df_Diag_Ram_Update_inside.append(df_Diag_Ram_in)
  20. global QuitErrCount
  21. FltInfo=DataFrame(columns=['start_time', 'end_time', 'product_id', 'code', 'level', 'info','advice'])
  22. VolStarkCount=[0 for i in range(param.CellVoltNums)]
  23. VolCount=[0 for i in range(param.CellVoltNums)]
  24. QuitErrCount=[0 for i in range(param.FaultCount)]
  25. #--------------该电池的所有当前故障-------------
  26. for i in range(0,len(bms_info)):
  27. if i==0:
  28. bms_infoP=bms_info.loc[i]
  29. elif len(bms_info)>=1:
  30. bms_infoP=bms_info.loc[i-1]
  31. df_Diag_Ram,VolStarkCount,VolCount=SamplingSafty.VoltSamplingDiag(sn,bms_info.loc[i],bms_infoP,param,VolStarkCount,VolCount,df_Diag_Ram_Update_inside)
  32. df_Diag_Ram=SamplingSafty.TempSamplingDiag(sn,bms_info.loc[i],bms_infoP,param,df_Diag_Ram)
  33. # FltInfo=SamplingSafty.CrntSamplingDiag(sn,bms_info.loc[i],FltInfo,param)
  34. return df_Diag_Ram
  35. def VoltSamplingDiag(sn,bms_infoN,bms_infoP,param,VolStarkCount,VolCount,df_Diag_Ram):
  36. InVMaxBatNo=[]
  37. InVMinBatNo=[]
  38. StackVolNo=[]
  39. OutlierVolNo=[]
  40. maxVolt=0
  41. minVolt=5
  42. ErrorFlg=0
  43. TotalVol=0
  44. #——————————————————————取最高最低电压————————————————————————————————
  45. for t in range(0,param.CellVoltNums):
  46. BatNo=['单体电压'+str(t+1)]
  47. maxVol=max(maxVolt,float(bms_infoN[BatNo])/1000)
  48. if maxVol>maxVolt:
  49. MaxBatNo=t+1
  50. maxVolt=maxVol
  51. if float(bms_infoN[BatNo])/1000>param.CellOVlmt:
  52. InVMaxBatNo.append(t+1)
  53. else:
  54. pass
  55. minVol=min(minVolt,float(bms_infoN[BatNo])/1000)
  56. if minVol<minVolt:
  57. MinBatNo=t+1
  58. minVolt=minVol
  59. if float(bms_infoN[BatNo])/1000<param.CellUVlmt:
  60. InVMinBatNo.append(t+1)
  61. else:
  62. pass
  63. TotalVol=TotalVol+float(bms_infoN[BatNo]/1000)
  64. AvgVol=(TotalVol-maxVol-minVol)/float(param.CellVoltNums-2)
  65. #—————————————————————————————电压无效和断线判断———————————————————————
  66. if maxVol>param.CellOVlmt:
  67. if minVol<param.CellUVlmt:
  68. QuitErrCount[10]=0
  69. if not 10 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  70. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,10,3,'电池电压采样断线,最高电压为{:.2f}V,电池编号为{},最低电压为{:.2f}V,电池编号为{}'.format(maxVol,MaxBatNo,minVol,MinBatNo),'返厂维修']
  71. ErrorFlg=1
  72. else:#如果故障发生当前故障中有该故障,则不进行操作
  73. pass
  74. else:#如果没有故障,并且当前故障表中有该故障,则判断故障是否结束
  75. QuitErrCount[50]=0
  76. if 10 in df_Diag_Ram['code'].values.tolist():
  77. QuitErrCount[10]=QuitErrCount[10]+1
  78. if QuitErrCount[10]>6:
  79. end_time=datetime.datetime.now()
  80. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  81. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==10].index,['end_time']]=end_time
  82. else:
  83. pass
  84. else:
  85. pass
  86. if not 50 in df_Diag_Ram['code'].values.tolist():
  87. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,50,3,str(InVMaxBatNo)+'号电压大于{:.2f}V,采样无效'.format(param.CellOVlmt),'返厂维修']
  88. ErrorFlg=1
  89. else:
  90. pass
  91. elif minVol<param.CellUVlmt:
  92. QuitErrCount[50]=0
  93. if not 50 in df_Diag_Ram['code'].values.tolist():
  94. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,50,3,str(InVMinBatNo)+'号电压小于{:.2f}V,采样无效'.format(param.CellUVlmt),'返厂维修']
  95. ErrorFlg=1
  96. else:
  97. pass
  98. else:
  99. if 50 in df_Diag_Ram['code'].values.tolist():
  100. QuitErrCount[50]=QuitErrCount[50]+1
  101. if QuitErrCount[50]>6:
  102. end_time=datetime.datetime.now()
  103. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  104. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==50].index,['end_time']]=end_time
  105. else:
  106. pass
  107. else:
  108. pass
  109. #——————————————————————————————————电压卡滞判断—————————————————————————
  110. if ErrorFlg==0:
  111. for t in range(0,param.CellVoltNums):
  112. BatNo=['单体电压'+str(t+1)]
  113. AvgVolGap=abs((float(bms_infoN[BatNo]/1000))-AvgVol)
  114. if AvgVolGap>param.AvgVolGap and float(bms_infoN[BatNo]/1000)>param.BLVol and float(bms_infoN[BatNo]/1000)<param.CellFullChrgVolt and not 51 in df_Diag_Ram['code']:
  115. if abs(bms_infoN['总电流[A]'])<2:
  116. VolCount[t]=VolCount[t]+1
  117. else:
  118. VolCount[t]=0
  119. if VolCount[t]>10:
  120. OutlierVolNo.append(t+1)
  121. else:
  122. pass
  123. if abs(float(bms_infoN[BatNo])-float(bms_infoP[BatNo]))<=0.0001 and not 52 in df_Diag_Ram['code']:
  124. if abs(float(bms_infoN['总电流[A]']))>=10 and not 'PK504' in sn:
  125. VolStarkCount[t]=VolStarkCount[t]+1
  126. elif abs(float(bms_infoN['总电流[A]']))>=15 and 'PK504' in sn:
  127. VolStarkCount[t]=VolStarkCount[t]+1
  128. else:
  129. VolStarkCount[t]=0
  130. if VolStarkCount[t]>10:
  131. StackVolNo.append(t+1)
  132. else:
  133. pass
  134. if len(OutlierVolNo)>0:
  135. QuitErrCount[51]=0
  136. if not 51 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  137. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,51,2,str(OutlierVolNo)+'号电池电压离群','技术介入诊断']
  138. ErrorFlg=1
  139. else:#如果故障发生当前故障中有该故障,则不进行操作
  140. pass
  141. else:
  142. if 51 in df_Diag_Ram['code'].values.tolist():
  143. QuitErrCount[51]=QuitErrCount[51]+1
  144. if QuitErrCount[51]>6:
  145. end_time=datetime.datetime.now()
  146. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  147. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==51].index,['end_time']]=end_time
  148. else:
  149. pass
  150. else:
  151. pass
  152. if len(StackVolNo)>0:
  153. QuitErrCount[52]=0
  154. if not 52 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  155. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,52,2,str(StackVolNo)+'号电池电压卡滞','技术介入诊断']
  156. ErrorFlg=1
  157. else:#如果故障发生当前故障中有该故障,则不进行操作
  158. pass
  159. else:
  160. if 51 in df_Diag_Ram['code'].values.tolist():
  161. QuitErrCount[52]=QuitErrCount[52]+1
  162. if QuitErrCount[52]>6:
  163. end_time=datetime.datetime.now()
  164. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  165. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==52].index,['end_time']]=end_time
  166. else:
  167. pass
  168. else:
  169. pass
  170. return df_Diag_Ram,VolStarkCount,VolCount
  171. def TempSamplingDiag(sn,bms_infoN,bms_infoP,param,df_Diag_Ram):
  172. #——————————————————————————————————CellTemp————————————————————————————————————
  173. InVMaxBatNo=[]
  174. InVMinBatNo=[]
  175. OutlierTempNo=[]
  176. maxCellTempt=-40
  177. minCellTempt=55
  178. ErrorFlg=0
  179. TotalCellTemp=0
  180. for t in range(0,param.CellTempNums):
  181. BatNo=['单体温度'+str(t+1)]
  182. maxCellTemp=max(maxCellTempt,float(bms_infoN[BatNo]))
  183. if maxCellTemp>maxCellTempt:
  184. MaxBatNo=t+1
  185. maxCellTempt=maxCellTemp
  186. if float(bms_infoN[BatNo])>param.PackOTlmt:
  187. InVMaxBatNo.append(t+1)
  188. else:
  189. pass
  190. minCellTemp=min(minCellTempt,float(bms_infoN[BatNo]))
  191. if minCellTemp<minCellTempt:
  192. MinBatNo=t+1
  193. minCellTempt=minCellTemp
  194. if float(bms_infoN[BatNo])<param.PackUTlmt:
  195. InVMinBatNo.append(t+1)
  196. else:
  197. pass
  198. TotalCellTemp=TotalCellTemp+float(bms_infoN[BatNo])
  199. if param.CellTempNums>2:
  200. AvgCellTemp=(TotalCellTemp-maxCellTemp-minCellTemp)/float(param.CellTempNums-2)
  201. else:
  202. AvgCellTemp=TotalCellTemp/float(param.CellTempNums)
  203. #——————————————————————————————————温度无效,离群和断线判断——————————————————————————————————
  204. if maxCellTemp>param.PackOTlmt:
  205. if minCellTemp<param.PackUTlmt:
  206. QuitErrCount[53]=0
  207. if not 53 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  208. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,53,3,'电池温度采样断线,最高温度为{}℃,电池编号为{},最低温度为{}℃,电池编号为{}'.format(maxCellTemp,MaxBatNo,minCellTemp,MinBatNo),'返厂维修']
  209. ErrorFlg=1
  210. else:#如果故障发生当前故障中有该故障,则不进行操作
  211. pass
  212. else:#如果没有故障,并且当前故障表中有该故障,则判断故障是否结束
  213. QuitErrCount[2]=0
  214. if 53 in df_Diag_Ram['code'].values.tolist():
  215. QuitErrCount[53]=QuitErrCount[53]+1
  216. if QuitErrCount[53]>6:
  217. end_time=datetime.datetime.now()
  218. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  219. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==53].index,['end_time']]=end_time
  220. else:
  221. pass
  222. else:
  223. pass
  224. if not 2 in df_Diag_Ram['code'].values.tolist():
  225. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,2,3,str(InVMaxBatNo)+'号温度大于{}℃,采样无效'.format(param.PackOTlmt),'返厂维修']
  226. ErrorFlg=1
  227. else:
  228. pass
  229. elif minCellTemp<param.PackUTlmt:
  230. QuitErrCount[2]=0
  231. if not 2 in df_Diag_Ram['code'].values.tolist():
  232. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,2,3,str(InVMinBatNo)+'号温度小于{}℃,采样无效'.format(param.PackUTlmt),'返厂维修']
  233. ErrorFlg=1
  234. else:
  235. pass
  236. else:
  237. if 2 in df_Diag_Ram['code'].values.tolist():
  238. QuitErrCount[2]=QuitErrCount[2]+1
  239. if QuitErrCount[2]>6:
  240. end_time=datetime.datetime.now()
  241. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  242. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==2].index,['end_time']]=end_time
  243. else:
  244. pass
  245. else:
  246. pass
  247. if ErrorFlg==0:
  248. if param.CellTempNums>2:
  249. for t in range(0,param.CellTempNums):
  250. BatNo=['单体温度'+str(t+1)]
  251. AvgCellTempGap=abs((float(bms_infoN[BatNo]))-AvgCellTemp)
  252. if AvgCellTempGap>param.AvgCellTempGap and float(bms_infoN[BatNo])>param.PackUTlmt and float(bms_infoN[BatNo])<param.PackOTlmt and not 8 in df_Diag_Ram['code']:
  253. OutlierTempNo.append(t+1)
  254. else:
  255. AvgCellTempGap=maxCellTemp-minCellTemp
  256. if AvgCellTempGap>param.AvgCellTempGap and minCellTemp>param.PackUTlmt and maxCellTemp<param.PackOTlmt and not 8 in df_Diag_Ram['code']:
  257. OutlierTempNo=[1,2]
  258. if len(OutlierTempNo)>0:
  259. QuitErrCount[8]=0
  260. if not 8 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  261. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,8,2,str(OutlierTempNo)+'号电池异常温度离群','技术介入诊断']
  262. ErrorFlg=1
  263. else:#如果故障发生当前故障中有该故障,则不进行操作
  264. pass
  265. else:
  266. if 8 in df_Diag_Ram['code'].values.tolist():
  267. QuitErrCount[8]=QuitErrCount[8]+1
  268. if QuitErrCount[8]>6:
  269. end_time=datetime.datetime.now()
  270. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  271. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==8].index,['end_time']]=end_time
  272. #df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['sn']==sn and df_Diag_Ram['code']==8].index,['end_time']]=end_time
  273. else:
  274. pass
  275. else:
  276. pass
  277. #——————————————————————————————————OtherTemp————————————————————————————————————
  278. InVMaxOtherTempBatNo=[]
  279. InVMinOtherTempBatNo=[]
  280. OutlierOtherTempNo=[]
  281. maxOtherTempt=-40
  282. minOtherTempt=91
  283. ErrorFlg=0
  284. TotalOtherTemp=0
  285. MaxOtherBatNo=0
  286. MinOtherBatNo=0
  287. if param.OtherTempNums>0:
  288. for t in range(0,param.OtherTempNums):
  289. BatNo=['其他温度'+str(t+1)]
  290. maxOtherTemp=max(maxOtherTempt,float(bms_infoN[BatNo]))
  291. if maxOtherTemp>maxOtherTempt:
  292. MaxOtherBatNo=t+1
  293. maxOtherTempt=maxOtherTemp
  294. if float(bms_infoN[BatNo])>param.OtherOTlmt:
  295. InVMaxOtherTempBatNo.append(t+1)
  296. else:
  297. pass
  298. minOtherTemp=min(minOtherTempt,float(bms_infoN[BatNo]))
  299. if minOtherTemp<minOtherTempt:
  300. MinOtherBatNo=t+1
  301. minOtherTempt=minOtherTemp
  302. if float(bms_infoN[BatNo])<param.OtherUTlmt:
  303. InVMinOtherTempBatNo.append(t+1)
  304. else:
  305. pass
  306. TotalOtherTemp=TotalOtherTemp+float(bms_infoN[BatNo])
  307. if param.OtherTempNums>2:
  308. AvgOtherTemp=(TotalOtherTemp-maxOtherTemp-minOtherTemp)/float(param.OtherTempNums-2)
  309. else:
  310. AvgOtherTemp=TotalOtherTemp/float(param.OtherTempNums)
  311. #——————————————————————————————————其他温度无效,离群和断线判断——————————————————————————————————
  312. if maxOtherTemp>param.OtherOTlmt:
  313. if minOtherTemp<param.OtherUTlmt:
  314. QuitErrCount[54]=0
  315. if not 54 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  316. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,54,3,'其他温度采样断线,最高温度为{}℃,传感器编号为{},最低温度为{}℃,传感器编号为{}'.format(maxOtherTemp,MaxOtherBatNo,minOtherTemp,MinOtherBatNo),'返厂维修']
  317. ErrorFlg=1
  318. else:#如果故障发生当前故障中有该故障,则不进行操作
  319. pass
  320. else:#如果没有故障,并且当前故障表中有该故障,则判断故障是否结束
  321. QuitErrCount[55]=0
  322. if 54 in df_Diag_Ram['code'].values.tolist():
  323. QuitErrCount[54]=QuitErrCount[54]+1
  324. if QuitErrCount[54]>6:
  325. end_time=datetime.datetime.now()
  326. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  327. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==54].index,['end_time']]=end_time
  328. else:
  329. pass
  330. else:
  331. pass
  332. if not 55 in df_Diag_Ram['code'].values.tolist():
  333. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,55,3,str(InVMaxOtherTempBatNo)+'号传感器温度大于{}℃,采样无效'.format(param.OtherOTlmt),'联系用户核实电池情况,并返厂维修']
  334. ErrorFlg=1
  335. else:
  336. pass
  337. elif minOtherTemp<param.OtherUTlmt:
  338. QuitErrCount[55]=0
  339. if not 55 in df_Diag_Ram['code'].values.tolist():
  340. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,55,3,str(InVMinOtherTempBatNo)+'号传感器温度小于{}℃,采样无效'.format(param.OtherUTlmt),'返厂维修']
  341. ErrorFlg=1
  342. else:
  343. pass
  344. else:
  345. if 55 in df_Diag_Ram['code'].values.tolist():
  346. QuitErrCount[55]=QuitErrCount[55]+1
  347. if QuitErrCount[55]>6:
  348. end_time=datetime.datetime.now()
  349. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  350. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==55].index,['end_time']]=end_time
  351. else:
  352. pass
  353. else:
  354. pass
  355. if ErrorFlg==0 and param.OtherTempNums>0:
  356. if param.OtherTempNums>2:
  357. for t in range(0,param.OtherTempNums):
  358. BatNo=['其他温度'+str(t+1)]
  359. AvgOtherTempGap=abs((float(bms_infoN[BatNo]))-AvgOtherTemp)
  360. if AvgOtherTempGap>param.AvgOtherTempGap and float(bms_infoN[BatNo])>param.OtherUTlmt and float(bms_infoN[BatNo])<param.OtherOTlmt and not 8 in df_Diag_Ram['code']:
  361. OutlierOtherTempNo.append(t+1)
  362. else:
  363. AvgOtherTempGap=maxOtherTemp-minOtherTemp
  364. if AvgOtherTempGap>param.AvgOtherTempGap and minOtherTemp>param.OtherUTlmt and maxOtherTemp<param.OtherOTlmt and not 8 in df_Diag_Ram['code']:
  365. OutlierOtherTempNo=[1,2]
  366. if len(OutlierOtherTempNo)>0:
  367. QuitErrCount[56]=0
  368. if not 56 in df_Diag_Ram['code'].values.tolist():#如果故障发生当前故障中没有该故障,则压入该故障
  369. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,56,2,str(OutlierOtherTempNo)+'号传感器温度异常离群','技术介入诊断']
  370. ErrorFlg=1
  371. else:#如果故障发生当前故障中有该故障,则不进行操作
  372. pass
  373. else:
  374. if 56 in df_Diag_Ram['code'].values.tolist():
  375. QuitErrCount[56]=QuitErrCount[56]+1
  376. if QuitErrCount[56]>6:
  377. end_time=datetime.datetime.now()
  378. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  379. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==56].index,['end_time']]=end_time
  380. if (maxOtherTemp-maxCellTemp)>param.AvgOtherTempGap and maxOtherTemp<param.OtherOTlmt and maxCellTemp<param.PackOTlmt:
  381. QuitErrCount[56]=0
  382. if not 56 in df_Diag_Ram['code'].values.tolist():
  383. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,56,2,str(OutlierOtherTempNo)+'号传感器温度异常离群','技术立即介入诊断']
  384. ErrorFlg=1
  385. else:
  386. if 56 in df_Diag_Ram['code'].values.tolist():
  387. QuitErrCount[56]=QuitErrCount[56]+1
  388. if QuitErrCount[56]>6:
  389. end_time=datetime.datetime.now()
  390. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  391. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==56].index,['end_time']]=end_time
  392. if (maxCellTemp-maxOtherTemp)>param.AvgOtherTempGap and maxOtherTemp<param.OtherOTlmt and maxCellTemp<param.PackOTlmt and not 8 in df_Diag_Ram['code']:
  393. QuitErrCount[8]=0
  394. if not 8 in df_Diag_Ram['code'].values.tolist():
  395. df_Diag_Ram.loc[len(df_Diag_Ram)]=[bms_infoN['时间戳'],'0000-00-00 00:00:00',sn,8,2,str(OutlierTempNo)+'号电芯温度异常离群','技术立即介入诊断']
  396. ErrorFlg=1
  397. else:
  398. if 8 in df_Diag_Ram['code'].values.tolist():
  399. QuitErrCount[8]=QuitErrCount[8]+1
  400. if QuitErrCount[8]>6:
  401. end_time=datetime.datetime.now()
  402. end_time=end_time.strftime('%Y-%m-%d %H:%M:%S')
  403. df_Diag_Ram.loc[df_Diag_Ram[df_Diag_Ram['code']==8].index,['end_time']]=end_time
  404. return df_Diag_Ram