main.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import pandas as pd
  2. import numpy as np
  3. import pymysql
  4. from LIB.BACKEND import DBManager, Log
  5. from apscheduler.schedulers.blocking import BlockingScheduler
  6. import datetime
  7. from USER.SPF.alibaba.Common import DBDownload
  8. from USER.SPF.alibaba.Common import log
  9. import CBMSBatInterShort
  10. import CBMSBatUniform
  11. import VoltStray
  12. import CBMSSafetyWarning
  13. #电池热安全预警核心算法函数......................................................................................................................
  14. def saftywarning_cal():
  15. global SNnums
  16. global df_warning_ram
  17. global df_warning_ram1
  18. global df_warning_ram2
  19. global df_warning_ram3
  20. global df_lfp_ram
  21. global df_lfp_ram1
  22. global df_data,now_time
  23. start_time=now_time-datetime.timedelta(hours=6)
  24. start_time1=now_time-datetime.timedelta(days=7)
  25. start_time2=now_time-datetime.timedelta(days=3)
  26. start_time3=now_time-datetime.timedelta(days=1)
  27. start_time=start_time.strftime('%Y-%m-%d %H:%M:%S')
  28. start_time1=start_time1.strftime('%Y-%m-%d %H:%M:%S')
  29. start_time2=start_time2.strftime('%Y-%m-%d %H:%M:%S')
  30. start_time3=start_time3.strftime('%Y-%m-%d %H:%M:%S')
  31. end_time=now_time.strftime('%Y-%m-%d %H:%M:%S')
  32. now_time=now_time+datetime.timedelta(hours=6)
  33. #数据库配置
  34. host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
  35. port=3306
  36. user='qx_read'
  37. password='Qx@123456'
  38. #读取故障结果库中faultcode==110且time_sp='0000-00-00 00:00:00'...............................
  39. # db='safety_platform'
  40. # mysql = pymysql.connect (host=host, user=user, password=password, port=port, database=db)
  41. # cursor = mysql.cursor()
  42. # param='time_st,time_sp,sn,faultcode,faultlv,faultinfo,faultadvice'
  43. # tablename='all_fault_info'
  44. # sql = "select %s from %s where faultcode=110 and time_sp='0000-00-00 00:00:00'" %(param,tablename)
  45. # cursor.execute(sql)
  46. # res = cursor.fetchall()
  47. # df_fault_ram= pd.DataFrame(res,columns=param.split(','))
  48. # cursor.close()
  49. # mysql.close()
  50. df_fault_ram=pd.DataFrame(columns=['time_st','time_sp','sn','faultcode','faultlv','faultinfo','faultadvice'])
  51. for sn in SNnums:
  52. if 'PK500' in sn:
  53. celltype=1 #6040三元电芯
  54. elif 'PK502' in sn:
  55. celltype=2 #4840三元电芯
  56. elif 'K504B' in sn:
  57. celltype=99 #60ah林磷酸铁锂电芯
  58. elif 'MGMLXN750' in sn:
  59. celltype=3 #力信50ah三元电芯
  60. elif 'MGMCLN750' or 'UD' in sn:
  61. celltype=4 #CATL 50ah三元电芯
  62. else:
  63. print('SN:{},未找到对应电池类型!!!'.format(sn))
  64. continue
  65. # sys.exit()
  66. celltype=1
  67. #读取原始数据库数据........................................................................................................................................................
  68. df_bms= df_data[(df_data['time']>=start_time) & (df_data['time']<end_time)]
  69. df_bms=df_bms.reset_index(drop=True)
  70. cellvolt_name=['CellVolt'+str(x) for x in range(1,121)]
  71. celltemp_name=['CellTemp'+str(x) for x in range(1,41)]
  72. df_volt=pd.DataFrame([x[0].split(",") for x in np.array(df_bms[['cell_volt']])])
  73. df_volt.columns = cellvolt_name
  74. df_volt=df_volt.astype('float')
  75. df_temp=pd.DataFrame([x[0].split(",") for x in np.array(df_bms[['cell_temp']])])
  76. df_temp.columns = celltemp_name
  77. df_temp=df_temp.astype('float')
  78. df_bms=pd.concat([df_bms,df_volt,df_temp],axis=1)
  79. df_bms.dropna(axis=0, inplace=True)
  80. df_bms=df_bms.reset_index(drop=True)
  81. #读取结果数据库数据........................................................................................................................................................
  82. df_soh=pd.DataFrame()
  83. df_uniform=pd.DataFrame()
  84. if not df_bms.empty:
  85. #ram处理...............................................................................................................
  86. df_warning_ram_sn=df_warning_ram[df_warning_ram['sn']==sn]
  87. df_warning_ram_sn1=df_warning_ram1[df_warning_ram1['sn']==sn]
  88. df_warning_ram_sn2=df_warning_ram2[df_warning_ram2['sn']==sn]
  89. df_warning_ram_sn3=df_warning_ram3[df_warning_ram3['sn']==sn]
  90. df_warning_ram_sn.reset_index(inplace=True,drop=True) #重置索引
  91. df_warning_ram_sn1.reset_index(inplace=True,drop=True) #重置索引
  92. df_warning_ram_sn2.reset_index(inplace=True,drop=True) #重置索引
  93. df_warning_ram_sn3.reset_index(inplace=True,drop=True) #重置索引
  94. if celltype>50 and (not df_lfp_ram.empty):
  95. df_lfp_ram_sn=df_lfp_ram[df_lfp_ram['sn']==sn]
  96. df_lfp_ram_sn.reset_index(inplace=True,drop=True) #重置索引
  97. else:
  98. df_lfp_ram_sn=pd.DataFrame()
  99. df_lfp_ram=pd.DataFrame(columns=df_bms.columns.tolist()+['sn'])
  100. if celltype>50 and (not df_lfp_ram1.empty):
  101. df_lfp_ram_sn1=df_lfp_ram1[df_lfp_ram1['sn']==sn]
  102. df_lfp_ram_sn1.reset_index(inplace=True,drop=True) #重置索引
  103. else:
  104. df_lfp_ram_sn1=pd.DataFrame()
  105. df_lfp_ram1=pd.DataFrame(columns=df_bms.columns.tolist()+['sn'])
  106. #内短路计算..................................................................................................................................................
  107. BatShort=CBMSBatInterShort.BatInterShort(sn,celltype,df_bms,df_soh,df_warning_ram_sn,df_warning_ram_sn1,df_warning_ram_sn2,df_warning_ram_sn3,df_lfp_ram_sn)
  108. df_short_res, df_ram_res, df_ram_res1, df_ram_res2, df_ram_res3, df_ram_res4=BatShort.intershort()
  109. if not df_short_res.empty:
  110. with open(r'D:\01WorkSpace\python\data_analyze_platform\USER\SPF\alibaba\07BatSafetyWarning\内短路.txt','a') as file:
  111. file.write(str(df_short_res)+'\n')
  112. #静置电压排名..................................................................................................................................................
  113. BatUniform=CBMSBatUniform.BatUniform(sn,celltype,df_bms,df_uniform,df_ram_res3,df_lfp_ram_sn1)
  114. df_rank_res, df_ram_res3, df_ram_res5=BatUniform.batuniform()
  115. if not df_rank_res.empty:
  116. df_uniform=df_rank_res
  117. with open(r'D:\01WorkSpace\python\data_analyze_platform\USER\SPF\alibaba\07BatSafetyWarning\电压排名.txt','a') as file:
  118. file.write(str(df_rank_res)+'\n')
  119. #电压离群.....................................................................................................................................................
  120. df_voltsigma=VoltStray.main(sn,df_bms,celltype)
  121. if not df_voltsigma.empty:
  122. with open(r'D:\01WorkSpace\python\data_analyze_platform\USER\SPF\alibaba\07BatSafetyWarning\电压离群.txt','a') as file:
  123. file.write(str(df_voltsigma)+'\n')
  124. #ram处理................................................................................................................
  125. df_warning_ram=df_warning_ram.drop(df_warning_ram[df_warning_ram.sn==sn].index)
  126. df_warning_ram1=df_warning_ram1.drop(df_warning_ram1[df_warning_ram1.sn==sn].index)
  127. df_warning_ram2=df_warning_ram2.drop(df_warning_ram2[df_warning_ram2.sn==sn].index)
  128. df_warning_ram3=df_warning_ram3.drop(df_warning_ram3[df_warning_ram3.sn==sn].index)
  129. df_warning_ram=pd.concat([df_warning_ram,df_ram_res],ignore_index=True)
  130. df_warning_ram1=pd.concat([df_warning_ram1,df_ram_res1],ignore_index=True)
  131. df_warning_ram2=pd.concat([df_warning_ram2,df_ram_res2],ignore_index=True)
  132. df_warning_ram3=pd.concat([df_warning_ram3,df_ram_res3],ignore_index=True)
  133. if celltype>50:
  134. df_lfp_ram=df_lfp_ram.drop(df_lfp_ram[df_lfp_ram.sn==sn].index)
  135. df_lfp_ram=pd.concat([df_lfp_ram,df_ram_res4],ignore_index=True)
  136. df_lfp_ram1=df_lfp_ram1.drop(df_lfp_ram1[df_lfp_ram1.sn==sn].index)
  137. df_lfp_ram1=pd.concat([df_lfp_ram1,df_ram_res5],ignore_index=True)
  138. #电池热安全预警..............................................................................................................................................................
  139. #读取内短路、析锂和一致性结果数据库数据
  140. db='qx_cas'
  141. mode=2
  142. tablename1='cellstateestimation_intershort'
  143. tablename3='cellstateestimation_uniform_socvoltdiff'
  144. tablename4='outlier_voltchangeratio' #电压离群表单
  145. DBRead=DBDownload.DBDownload(host, port, db, user, password,mode)
  146. with DBRead as DBRead:
  147. df_short=DBRead.getdata('time_sp,sn,short_current', tablename=tablename1, sn=sn, timename='time_sp', st=start_time1, sp=end_time)
  148. # df_liplated=DBRead.getdata('time,sn,liplated,liplated_amount', tablename=tablename2, sn=sn, timename='time', st=start_time2, sp=end_time)
  149. df_uniform=DBRead.getdata('time,sn,cellsoc_diff,cellvolt_diff,cellmin_num,cellmax_num,cellvolt_rank', tablename=tablename3, sn=sn, timename='time', st=start_time2, sp=end_time)
  150. df_voltsigma=DBRead.getdata('time,sn,VolOl_Uni,VolChng_Uni', tablename=tablename4, sn=sn, timename='time', st=start_time3, sp=end_time)
  151. df_uniform=df_uniform.dropna(axis=0,how='any')
  152. #获取sn的故障RAM
  153. df_fault_ram_sn=df_fault_ram[df_fault_ram['sn']==sn]
  154. #热安全预警
  155. if df_fault_ram_sn.empty:
  156. BatWarning=CBMSSafetyWarning.SafetyWarning(sn,celltype,df_short,df_uniform,df_voltsigma,df_soh)
  157. df_warning_res=BatWarning.diag()
  158. #当前热失控故障写入数据库
  159. if not df_warning_res.empty:
  160. with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\07BatSafetyWarning\热失控预警.txt','a',encoding="utf-8") as file:
  161. file.write(str(tuple(df_warning_res.iloc[-1]))+'\n')
  162. else:
  163. fault_time=df_fault_ram_sn.iloc[-1]['time_st']
  164. if (now_time-fault_time).total_seconds()>7*24*3600: #df_warning_end历史故障筛选并更改数据库故障结束时间
  165. df_fault_ram_sn['time_st']=end_time
  166. with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\07BatSafetyWarning\热失控预警.txt','a',encoding="utf-8") as file:
  167. file.write(str(tuple(df_warning_res.iloc[-1]))+'\n')
  168. #...............................................主函数起定时作用.......................................................................................................................
  169. if __name__ == "__main__":
  170. # excelpath=r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\sn-20210903.xlsx'
  171. # SNdata_6060 = pd.read_excel(excelpath, sheet_name='科易6060')
  172. # SNdata_6040 = pd.read_excel(excelpath, sheet_name='科易6040')
  173. # SNdata_4840 = pd.read_excel(excelpath, sheet_name='科易4840')
  174. # SNdata_L7255 = pd.read_excel(excelpath, sheet_name='格林美-力信7255')
  175. # SNdata_C7255 = pd.read_excel(excelpath, sheet_name='格林美-CATL7255')
  176. # SNdata_U7255 = pd.read_excel(excelpath, sheet_name='优旦7255')
  177. # SNnums_6060=SNdata_6060['SN号'].tolist()
  178. # SNnums_6040=SNdata_6040['SN号'].tolist()
  179. # SNnums_4840=SNdata_4840['SN号'].tolist()
  180. # SNnums_L7255=SNdata_L7255['SN号'].tolist()
  181. # SNnums_C7255=SNdata_C7255['SN号'].tolist()
  182. # SNnums_U7255=SNdata_U7255['SN号'].tolist()
  183. # SNnums=SNnums_L7255 + SNnums_C7255 + SNnums_U7255 + SNnums_6040 + SNnums_4840 + SNnums_6060
  184. SNnums=['KPD001']
  185. mylog=log.Mylog('log_warning.txt','error')
  186. mylog.logcfg()
  187. #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取...................................
  188. df_warning_ram=pd.DataFrame(columns=['sn','time','deltsoc','cellsoc'])
  189. df_warning_ram1=pd.DataFrame(columns=['sn','time1','deltsoc1'])
  190. df_warning_ram2=pd.DataFrame(columns=['sn','time2','deltAs2'])
  191. df_warning_ram3=pd.DataFrame(columns=['sn','time3','standingtime','standingtime1','standingtime2'])
  192. df_lfp_ram=pd.DataFrame()
  193. df_lfp_ram1=pd.DataFrame()
  194. df_data= pd.read_excel(r'D:\01WorkSpace\项目\Alibaba\data\原始数据_2022-01-10_2022-02-10\康普盾_KPD001.xlsx')
  195. now_time='2022-1-10 00:00:00'
  196. now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
  197. #定时任务.......................................................................................................................................................................
  198. scheduler = BlockingScheduler()
  199. scheduler.add_job(saftywarning_cal, 'interval', seconds=5)
  200. try:
  201. scheduler.start()
  202. except Exception as e:
  203. scheduler.shutdown()
  204. print(repr(e))
  205. mylog.logopt(e)