AlgoUtils.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import pandas as pd
  2. import numpy as np
  3. import json
  4. from sqlalchemy import text
  5. from collections import Counter
  6. class AlgoUtils:
  7. def __init__(self):
  8. pass
  9. def pack_param_identify(self, charge_ocv_v, charge_ocv_soc, capacity, df_origin_data):
  10. discharge_ocv_v = [3.3159,3.4384,3.4774,3.5156,3.5478,3.5748,3.6058,3.6238,3.638,3.6535,3.6715,3.6951,3.7279,3.7757,3.8126,3.8529,3.8969,3.9446,3.9946,4.0491,4.109,4.183,4.263]
  11. discharge_ocv_soc = [0,3.5348,8.3581,13.181,18.004,22.827,27.651,32.474,37.297,42.120,46.944,51.767,56.590,61.413,66.237,71.060,75.883,80.707,85.530,90.353,95.176,100,105]
  12. v = Counter(list(df_origin_data['cell_voltage'].apply(lambda x:len(x))))
  13. if 0 in v.keys():
  14. v.pop(0)
  15. c = sorted(v.items(),key=lambda x:x[1],reverse=True)
  16. CellVoltTotalCount = str(c[0][0])
  17. v = Counter(list(df_origin_data['cell_temp'].apply(lambda x:len(x))))
  18. if 0 in v.keys():
  19. v.pop(0)
  20. c = sorted(v.items(),key=lambda x:x[1],reverse=True)
  21. CellTempTotalCount = str(c[0][0])
  22. # 电池包并联数识别
  23. pack_parallel_count = 1
  24. def sum_vol(data):
  25. if data and len(data)>0:
  26. s = 0
  27. for d in data:
  28. s += float(d)
  29. return s
  30. divid = round(df_origin_data['cell_voltage'].apply(sum_vol) / df_origin_data['pack_volt'])
  31. v = Counter(list(divid))
  32. pack_parallel_count = sorted(v.items(),key=lambda x:x[1],reverse=True)[0][0] #电池包并联数
  33. soc_inflexion1 = "30"
  34. ocv_inflexion1 = "3.281"
  35. peak_soc = "60"
  36. fullchrg_soc = "100"
  37. bal_cur = "0.03"
  38. v = Counter(np.diff(np.array(pd.to_datetime(df_origin_data['time'])))/1e9)
  39. if 0 in v.keys():
  40. v.pop(0)
  41. c = sorted(v.items(),key=lambda x:x[1],reverse=True)
  42. sample_time = int(c[0][0]) # 采样时间 s
  43. sampling_period = str(sample_time)
  44. df_ocv = pd.DataFrame({'charge_ocv_v':charge_ocv_v, 'charge_ocv_soc':charge_ocv_soc})
  45. ocv_100 = df_ocv[df_ocv['charge_ocv_soc']==100]['charge_ocv_v'].values[0]
  46. cell_type = "L" if ocv_100 < 3.65 else "N" # L 磷酸铁锂, N 三元
  47. algo_pack_param = {
  48. 'charge_ocv_v':charge_ocv_v, 'charge_ocv_soc':charge_ocv_soc, 'capacity':capacity, 'discharge_ocv_v':discharge_ocv_v,
  49. 'discharge_ocv_soc':discharge_ocv_soc, 'CellVoltTotalCount':CellVoltTotalCount, 'CellTempTotalCount':CellTempTotalCount,
  50. 'soc_inflexion1':soc_inflexion1, 'ocv_inflexion1':ocv_inflexion1, 'peak_soc':peak_soc, 'fullchrg_soc':fullchrg_soc,
  51. 'bal_cur':bal_cur, 'sampling_period':sampling_period, 'pack_parallel_count':pack_parallel_count}
  52. return algo_pack_param, cell_type
  53. def algo_param_identify(self, algo_pack_param, cell_type, pack_code):
  54. # # 算法参数辨识
  55. pack_parallel_count = int(algo_pack_param['pack_parallel_count'])
  56. sampling_period = int(algo_pack_param['sampling_period'])
  57. confirm_time = str(max(sampling_period*5, 600))
  58. algo_id_1 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}})
  59. confirm_time = str(max(sampling_period*5, 60))
  60. df_ocv = pd.DataFrame({'charge_ocv_v':algo_pack_param['charge_ocv_v'], 'charge_ocv_soc':algo_pack_param['charge_ocv_soc']})
  61. ocv_100 = df_ocv[df_ocv['charge_ocv_soc']==100]['charge_ocv_v'].values[0]
  62. over_vol_lvl1 = ocv_100 + 0.02 if cell_type=="N" else 3.65
  63. over_vol_lvl2 = ocv_100 + 0.05 if cell_type=="N" else 3.68
  64. over_vol_lvl3 = ocv_100 + 0.1 if cell_type=="N" else 3.7
  65. algo_id_2 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl1)},
  66. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl2)},
  67. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl3)},
  68. })
  69. confirm_time = str(max(sampling_period*5, 60))
  70. under_vol_lvl1 = 2.8 if cell_type=="N" else 2.6
  71. under_vol_lvl2 = 2.6 if cell_type=="N" else 2.4
  72. under_vol_lvl3 = 2.4 if cell_type=="N" else 2.2
  73. algo_id_3 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl1)},
  74. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl2)},
  75. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl3)},
  76. })
  77. confirm_time = str(max(sampling_period*5, 600))
  78. algo_id_4 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'vol_uni': str(0.2 if cell_type=="N" else 0.1)},
  79. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'vol_uni': str(0.3 if cell_type=="N" else 0.3)},
  80. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'vol_uni': str(0.5 if cell_type=="N" else 0.5)},
  81. })
  82. confirm_time = str(max(sampling_period*5, 600))
  83. algo_id_5 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'threshold': str(0.1)},
  84. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'threshold': str(0.3)},
  85. })
  86. confirm_time = str(max(sampling_period*5, 600))
  87. algo_id_6 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}})
  88. confirm_time = str(max(sampling_period*5, 60))
  89. cell_volt_count = int(algo_pack_param['CellVoltTotalCount'])
  90. algo_id_7 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol': str(over_vol_lvl1*cell_volt_count/pack_parallel_count)},
  91. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol': str(over_vol_lvl2*cell_volt_count/pack_parallel_count)},
  92. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol': str(over_vol_lvl3*cell_volt_count/pack_parallel_count)},
  93. })
  94. confirm_time = str(max(sampling_period*5, 60))
  95. cell_volt_count = int(algo_pack_param['CellVoltTotalCount'])
  96. algo_id_8 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl1*cell_volt_count/pack_parallel_count)},
  97. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl2*cell_volt_count/pack_parallel_count)},
  98. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl3*cell_volt_count/pack_parallel_count)},
  99. })
  100. confirm_time = str(max(sampling_period*5, 600))
  101. algo_id_9 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uplmt': str(119), 'temp_lwlmt': str(-39)}
  102. })
  103. confirm_time = str(max(sampling_period*5, 60))
  104. algo_id_10 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(50)},
  105. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(55)},
  106. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(60)},
  107. })
  108. confirm_time = str(max(sampling_period*5, 60))
  109. algo_id_11 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-15)},
  110. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-20)},
  111. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-30)},
  112. })
  113. confirm_time = str(max(sampling_period*5, 600))
  114. algo_id_12 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(10)},
  115. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(15)},
  116. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(20)},
  117. })
  118. confirm_time = str(max(sampling_period*5, 600))
  119. algo_id_13 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}})
  120. confirm_time = str(max(sampling_period*5, 60))
  121. algo_id_14 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(5)},
  122. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(10)},
  123. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(20)},
  124. })
  125. confirm_time = str(max(sampling_period*5, 60))
  126. capacity = int(algo_pack_param['capacity'])
  127. algo_id_15 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)},
  128. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)},
  129. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)},
  130. })
  131. confirm_time = str(max(sampling_period*5, 60))
  132. capacity = int(algo_pack_param['capacity'])
  133. algo_id_16 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)},
  134. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)},
  135. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)},
  136. })
  137. confirm_time = str(max(sampling_period*5, 60))
  138. algo_id_17 = json.dumps({'lvl1':{'confirm_time':confirm_time,'jump_value':str(5)}
  139. })
  140. confirm_time = str(max(sampling_period*5, 60))
  141. algo_id_18 = json.dumps({'lvl1':{'confirm_time':confirm_time,'stack_value':str(5)}
  142. })
  143. confirm_time = str(max(sampling_period*5, 60))
  144. capacity = int(algo_pack_param['capacity'])
  145. algo_id_19 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(700)},
  146. 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(500)},
  147. 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(250)},
  148. })
  149. algo_id_20 = json.dumps({'lvl1':{'soh_low':str(70)}})
  150. algo_id_21 = json.dumps({'lvl1':{'soh_uni':str(10)}})
  151. algo_id_22 = json.dumps({'lvl1':{'inr_uni':10}})
  152. algo_id_23 = json.dumps({'lvl1':{'inr_sap':4}})
  153. algo_id_24 = json.dumps({'lvl1':{'innershrt_crnt':str(-25),'innershrt_volt':str(-10)},
  154. 'lvl2':{'innershrt_crnt':str(-40),'innershrt_volt':str(-15)},
  155. 'lvl3':{'innershrt_crnt':str(-50),'innershrt_volt':str(-20)},
  156. })
  157. algo_id_26 = json.dumps({"lipltd_time_total":"4000","lipltd_time_single":"60","lipltd_count":"6"})
  158. algo_id_29 = json.dumps({"lvl1":{"low_soc":"5"},"lvl2":{"low_soc":"3"},"lvl3":{"low_soc":"0"}})
  159. algo_id = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,29]
  160. df_algo_adjustable_param = pd.DataFrame({'algo_id':algo_id, 'pack_code':pack_code, 'param':[
  161. algo_id_1,algo_id_2,algo_id_3,algo_id_4,algo_id_5,algo_id_6,algo_id_7,algo_id_8,algo_id_9,algo_id_10,algo_id_11,
  162. algo_id_12,algo_id_13,algo_id_14,algo_id_15,algo_id_16,algo_id_17,algo_id_18,algo_id_19,algo_id_20,algo_id_21,algo_id_22,
  163. algo_id_23,algo_id_24,algo_id_26,algo_id_29
  164. ]})
  165. return df_algo_adjustable_param
  166. def get_cell_info(self, db_engine,rc):
  167. #获取SOH数据
  168. data = rc.get("algo_param_from_mysql:df_soh")
  169. if pd.isnull(data):
  170. df_soh = pd.read_sql(text("select * from `algo_soh`GROUP BY sn DESC"), db_engine)
  171. else:
  172. df_soh = pd.DataFrame(json.loads(data))
  173. if len(df_soh) > 0:
  174. df_soh['time'] = pd.to_datetime(df_soh['time'], unit='ms')
  175. #获取SOR数据
  176. data = rc.get("algo_param_from_mysql:sor_result")
  177. if pd.isnull(data):
  178. df_sor = pd.read_sql(text("select * from `algo_mid_sorout`GROUP BY sn DESC"), db_engine)
  179. else:
  180. df_sor = pd.DataFrame(json.loads(data))
  181. if len(df_sor) > 0:
  182. df_sor['time'] = pd.to_datetime(df_sor['time'], unit='ms')
  183. #获取一致性数据
  184. data = rc.get("Algo:FaultDiag:SafetyWarning:uniform_result:{}")
  185. if pd.isnull(data):
  186. df_uniform=pd.read_sql(text("select * from `algo_mid_uniform_result`GROUP BY sn DESC"), db_engine)
  187. else:
  188. df_uniform = pd.read_json(data)
  189. if len(df_uniform) > 0:
  190. df_uniform['time'] = pd.to_datetime(df_uniform['time'],unit='ms')
  191. return df_sor,df_uniform #df_soh,
  192. def get_fault_info(self, db_engine):
  193. df_diag_ram = pd.read_sql(text("select * from algo_all_fault_info_ing"), db_engine)
  194. df_diag_ram['end_flag'] = 0
  195. return df_diag_ram