main.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. from LIB.MIDDLE.CellStateEstimation.BatSafetyAlarm.V1_0_1 import CBMSSafetyAlarm
  2. import datetime
  3. import pandas as pd
  4. import multiprocessing
  5. from LIB.BACKEND import DBManager, Log
  6. import time, datetime
  7. from apscheduler.schedulers.blocking import BlockingScheduler
  8. from LIB.MIDDLE.CellStateEstimation.Common.V1_0_1 import log
  9. #...................................电池包电芯安全诊断函数......................................................................................................................
  10. def diag_cal(sn_list, df_diag_ram, df_bms_ram):
  11. start=time.time()
  12. now_time=datetime.datetime.now()
  13. start_time=now_time-datetime.timedelta(seconds=70)
  14. start_time=start_time.strftime('%Y-%m-%d %H:%M:%S')
  15. end_time=now_time.strftime('%Y-%m-%d %H:%M:%S')
  16. sst=time.time()
  17. for sn in sn_list:
  18. if 'PK500' in sn:
  19. celltype=1 #6040三元电芯
  20. elif 'PK502' in sn:
  21. celltype=2 #4840三元电芯
  22. elif 'K504B' in sn:
  23. celltype=99 #60ah林磷酸铁锂电芯
  24. elif 'MGMLXN750' in sn:
  25. celltype=3 #力信50ah三元电芯
  26. elif 'MGMCLN750' or 'UD' in sn:
  27. celltype=4 #CATL 50ah三元电芯
  28. else:
  29. print('SN:{},未找到对应电池类型!!!'.format(sn))
  30. continue
  31. # sys.exit()
  32. #读取原始数据库数据........................................................................................................................................................
  33. dbManager = DBManager.DBManager()
  34. df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms'])
  35. df_bms = df_data['bms']
  36. # print(df_bms)
  37. #电池诊断................................................................................................................................................................
  38. if not df_bms.empty:
  39. df_diag_ram_sn=df_diag_ram[df_diag_ram['product_id']==sn]
  40. df_bms_ram_sn=df_bms_ram[df_bms_ram['sn']==sn]
  41. if df_diag_ram_sn.empty:
  42. SafetyAlarm=CBMSSafetyAlarm.SafetyAlarm(sn,celltype,df_bms, df_bms_ram_sn)
  43. df_diag_res, df_bms_res=SafetyAlarm.diag()
  44. #更新bms的ram数据 和 diag的Ram数据
  45. sn_index=df_bms_ram.loc[df_bms_ram['sn']==sn].index
  46. df_bms_ram=df_bms_ram.drop(index=sn_index)
  47. df_bms_ram=df_bms_ram.append(df_bms_res)
  48. sn_index=df_diag_ram.loc[df_diag_ram['product_id']==sn].index
  49. df_diag_ram=df_diag_ram.drop(index=sn_index)
  50. df_diag_ram=df_diag_ram.append(df_diag_res)
  51. df_diag_ram.reset_index(inplace=True,drop=True) #重置索引
  52. #当前热失控故障写入数据库
  53. if not df_diag_res.empty:
  54. #with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\06BatSafetyAlarm\热失控.txt','a') as file:
  55. #file.write(str(tuple(df_diag_res.iloc[-1]))+'\n')
  56. pass
  57. #当前热失控已超过三天变为历史故障并写入数据库,并删除原有数据库中的当前故障和ram中的当前故障
  58. elif (now_time-df_bms_ram_sn.iloc[-1]['time']).total_seconds()>3*24*3600:
  59. df_diag_ram=df_diag_ram.drop(df_diag_ram['sn']==sn) #删除ram中的当前故障
  60. df_bms_ram_sn.iloc[-1]['end_time']=now_time
  61. #with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\06BatSafetyAlarm\热失控.txt','a') as file:
  62. #file.write(str(tuple(df_diag_res.iloc[-1]))+'\n')
  63. #故障处理........................................................................................................................................................
  64. end=time.time()
  65. print(end-start)
  66. # print(df_soh)
  67. #...................................................主进程...........................................................................................................
  68. def mainprocess():
  69. global SNnums
  70. global df_diag_ram
  71. global df_bms_ram
  72. process = 2
  73. pool = multiprocessing.Pool(processes = process)
  74. for i in range(process):
  75. sn_list = SNnums[i]
  76. pool.apply_async(diag_cal, (sn_list,df_diag_ram,df_bms_ram))
  77. pool.close()
  78. pool.join()
  79. #...............................................主函数起定时作用.......................................................................................................................
  80. if __name__ == "__main__":
  81. excelpath=r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\sn-20210903.xlsx'
  82. SNdata_6060 = pd.read_excel(excelpath, sheet_name='科易6060')
  83. SNdata_6040 = pd.read_excel(excelpath, sheet_name='科易6040')
  84. SNdata_4840 = pd.read_excel(excelpath, sheet_name='科易4840')
  85. SNdata_L7255 = pd.read_excel(excelpath, sheet_name='格林美-力信7255')
  86. SNdata_C7255 = pd.read_excel(excelpath, sheet_name='格林美-CATL7255')
  87. SNdata_U7255 = pd.read_excel(excelpath, sheet_name='优旦7255')
  88. SNnums_6060=SNdata_6060['SN号'].tolist()
  89. SNnums_6040=SNdata_6040['SN号'].tolist()
  90. SNnums_4840=SNdata_4840['SN号'].tolist()
  91. SNnums_L7255=SNdata_L7255['SN号'].tolist()
  92. SNnums_C7255=SNdata_C7255['SN号'].tolist()
  93. SNnums_U7255=SNdata_U7255['SN号'].tolist()
  94. SNnums=[SNnums_L7255 + SNnums_C7255 + SNnums_U7255, SNnums_6040 + SNnums_4840 + SNnums_6060]
  95. # SNnums=['PK50201A000002201']
  96. mylog=log.Mylog('log_diag.txt','error')
  97. mylog.logcfg()
  98. #............................模块运行前,先读取数据库中所有结束时间为0的数据,需要从数据库中读取...................................
  99. result=pd.read_excel(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\06BatSafetyAlarm\result.xlsx')
  100. df_diag_ram=result[(result['end_time']=='0000-00-00 00:00:00') & (result['code']==119)]
  101. df_bms_ram=pd.DataFrame(columns=['time', 'sn', 'packvolt', 'cellvolt', 'celltemp'])
  102. #定时任务.......................................................................................................................................................................
  103. scheduler = BlockingScheduler()
  104. scheduler.add_job(mainprocess, 'interval', seconds=60, id='diag_job')
  105. try:
  106. scheduler.start()
  107. except Exception as e:
  108. scheduler.shutdown()
  109. print(repr(e))
  110. mylog.logopt(e)