import pandas as pd import numpy as np import json from sqlalchemy import text from collections import Counter class AlgoUtils: def __init__(self): pass def pack_param_identify(self, charge_ocv_v, charge_ocv_soc, capacity, df_origin_data): 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] 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] v = Counter(list(df_origin_data['cell_voltage'].apply(lambda x:len(x)))) if 0 in v.keys(): v.pop(0) c = sorted(v.items(),key=lambda x:x[1],reverse=True) CellVoltTotalCount = str(c[0][0]) v = Counter(list(df_origin_data['cell_temp'].apply(lambda x:len(x)))) if 0 in v.keys(): v.pop(0) c = sorted(v.items(),key=lambda x:x[1],reverse=True) CellTempTotalCount = str(c[0][0]) # 电池包并联数识别 pack_parallel_count = 1 def sum_vol(data): if data and len(data)>0: s = 0 for d in data: s += float(d) return s divid = round(df_origin_data['cell_voltage'].apply(sum_vol) / df_origin_data['pack_volt']) v = Counter(list(divid)) pack_parallel_count = sorted(v.items(),key=lambda x:x[1],reverse=True)[0][0] #电池包并联数 soc_inflexion1 = "30" ocv_inflexion1 = "3.281" peak_soc = "60" fullchrg_soc = "100" bal_cur = "0.03" v = Counter(np.diff(np.array(pd.to_datetime(df_origin_data['time'])))/1e9) if 0 in v.keys(): v.pop(0) c = sorted(v.items(),key=lambda x:x[1],reverse=True) sample_time = int(c[0][0]) # 采样时间 s sampling_period = str(sample_time) df_ocv = pd.DataFrame({'charge_ocv_v':charge_ocv_v, 'charge_ocv_soc':charge_ocv_soc}) ocv_100 = df_ocv[df_ocv['charge_ocv_soc']==100]['charge_ocv_v'].values[0] cell_type = "L" if ocv_100 < 3.65 else "N" # L 磷酸铁锂, N 三元 algo_pack_param = { 'charge_ocv_v':charge_ocv_v, 'charge_ocv_soc':charge_ocv_soc, 'capacity':capacity, 'discharge_ocv_v':discharge_ocv_v, 'discharge_ocv_soc':discharge_ocv_soc, 'CellVoltTotalCount':CellVoltTotalCount, 'CellTempTotalCount':CellTempTotalCount, 'soc_inflexion1':soc_inflexion1, 'ocv_inflexion1':ocv_inflexion1, 'peak_soc':peak_soc, 'fullchrg_soc':fullchrg_soc, 'bal_cur':bal_cur, 'sampling_period':sampling_period, 'pack_parallel_count':pack_parallel_count} return algo_pack_param, cell_type def algo_param_identify(self, algo_pack_param, cell_type, pack_code): # # 算法参数辨识 pack_parallel_count = int(algo_pack_param['pack_parallel_count']) sampling_period = int(algo_pack_param['sampling_period']) confirm_time = str(max(sampling_period*5, 600)) algo_id_1 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}}) confirm_time = str(max(sampling_period*5, 60)) df_ocv = pd.DataFrame({'charge_ocv_v':algo_pack_param['charge_ocv_v'], 'charge_ocv_soc':algo_pack_param['charge_ocv_soc']}) ocv_100 = df_ocv[df_ocv['charge_ocv_soc']==100]['charge_ocv_v'].values[0] over_vol_lvl1 = ocv_100 + 0.02 if cell_type=="N" else 3.65 over_vol_lvl2 = ocv_100 + 0.05 if cell_type=="N" else 3.68 over_vol_lvl3 = ocv_100 + 0.1 if cell_type=="N" else 3.7 algo_id_2 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl1)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl2)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol':str(over_vol_lvl3)}, }) confirm_time = str(max(sampling_period*5, 60)) under_vol_lvl1 = 2.8 if cell_type=="N" else 2.6 under_vol_lvl2 = 2.6 if cell_type=="N" else 2.4 under_vol_lvl3 = 2.4 if cell_type=="N" else 2.2 algo_id_3 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl1)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl2)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl3)}, }) confirm_time = str(max(sampling_period*5, 600)) 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)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'vol_uni': str(0.3 if cell_type=="N" else 0.3)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'vol_uni': str(0.5 if cell_type=="N" else 0.5)}, }) confirm_time = str(max(sampling_period*5, 600)) algo_id_5 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'threshold': str(0.1)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'threshold': str(0.3)}, }) confirm_time = str(max(sampling_period*5, 600)) algo_id_6 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}}) confirm_time = str(max(sampling_period*5, 60)) cell_volt_count = int(algo_pack_param['CellVoltTotalCount']) 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)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol': str(over_vol_lvl2*cell_volt_count/pack_parallel_count)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_vol': str(over_vol_lvl3*cell_volt_count/pack_parallel_count)}, }) confirm_time = str(max(sampling_period*5, 60)) cell_volt_count = int(algo_pack_param['CellVoltTotalCount']) 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)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl2*cell_volt_count/pack_parallel_count)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_vol': str(under_vol_lvl3*cell_volt_count/pack_parallel_count)}, }) confirm_time = str(max(sampling_period*5, 600)) algo_id_9 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uplmt': str(119), 'temp_lwlmt': str(-39)} }) confirm_time = str(max(sampling_period*5, 60)) algo_id_10 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(50)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(55)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_temp': str(60)}, }) confirm_time = str(max(sampling_period*5, 60)) algo_id_11 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-15)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-20)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'under_temp': str(-30)}, }) confirm_time = str(max(sampling_period*5, 600)) algo_id_12 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(10)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(15)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_uni': str(20)}, }) confirm_time = str(max(sampling_period*5, 600)) algo_id_13 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time}}) confirm_time = str(max(sampling_period*5, 60)) algo_id_14 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(5)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(10)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'temp_rate': str(20)}, }) confirm_time = str(max(sampling_period*5, 60)) capacity = int(algo_pack_param['capacity']) algo_id_15 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*-2*pack_parallel_count)}, }) confirm_time = str(max(sampling_period*5, 60)) capacity = int(algo_pack_param['capacity']) algo_id_16 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'over_crnt': str(capacity*5*pack_parallel_count)}, }) confirm_time = str(max(sampling_period*5, 60)) algo_id_17 = json.dumps({'lvl1':{'confirm_time':confirm_time,'jump_value':str(5)} }) confirm_time = str(max(sampling_period*5, 60)) algo_id_18 = json.dumps({'lvl1':{'confirm_time':confirm_time,'stack_value':str(5)} }) confirm_time = str(max(sampling_period*5, 60)) capacity = int(algo_pack_param['capacity']) algo_id_19 = json.dumps({'lvl1':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(700)}, 'lvl2':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(500)}, 'lvl3':{'confirm_time':confirm_time,'remove_time':confirm_time, 'low_ins': str(250)}, }) algo_id_20 = json.dumps({'lvl1':{'soh_low':str(70)}}) algo_id_21 = json.dumps({'lvl1':{'soh_uni':str(10)}}) algo_id_22 = json.dumps({'lvl1':{'inr_uni':10}}) algo_id_23 = json.dumps({'lvl1':{'inr_sap':4}}) algo_id_24 = json.dumps({'lvl1':{'innershrt_crnt':str(-25),'innershrt_volt':str(-10)}, 'lvl2':{'innershrt_crnt':str(-40),'innershrt_volt':str(-15)}, 'lvl3':{'innershrt_crnt':str(-50),'innershrt_volt':str(-20)}, }) algo_id_26 = json.dumps({"lipltd_time_total":"4000","lipltd_time_single":"60","lipltd_count":"6"}) algo_id_29 = json.dumps({"lvl1":{"low_soc":"5"},"lvl2":{"low_soc":"3"},"lvl3":{"low_soc":"0"}}) 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] df_algo_adjustable_param = pd.DataFrame({'algo_id':algo_id, 'pack_code':pack_code, 'param':[ 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, 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, algo_id_23,algo_id_24,algo_id_26,algo_id_29 ]}) return df_algo_adjustable_param def get_cell_info(self, db_engine,rc): #获取SOH数据 data = rc.get("algo_param_from_mysql:df_soh") if pd.isnull(data): df_soh = pd.read_sql(text("select * from `algo_soh`GROUP BY sn DESC"), db_engine) else: df_soh = pd.DataFrame(json.loads(data)) if len(df_soh) > 0: df_soh['time'] = pd.to_datetime(df_soh['time'], unit='ms') #获取SOR数据 data = rc.get("algo_param_from_mysql:sor_result") if pd.isnull(data): df_sor = pd.read_sql(text("select * from `algo_mid_sorout`GROUP BY sn DESC"), db_engine) else: df_sor = pd.DataFrame(json.loads(data)) if len(df_sor) > 0: df_sor['time'] = pd.to_datetime(df_sor['time'], unit='ms') #获取一致性数据 data = rc.get("Algo:FaultDiag:SafetyWarning:uniform_result:{}") if pd.isnull(data): df_uniform=pd.read_sql(text("select * from `algo_mid_uniform_result`GROUP BY sn DESC"), db_engine) else: df_uniform = pd.read_json(data) if len(df_uniform) > 0: df_uniform['time'] = pd.to_datetime(df_uniform['time'],unit='ms') return df_sor,df_uniform #df_soh, def get_fault_info(self, db_engine): df_diag_ram = pd.read_sql(text("select * from algo_all_fault_info_ing"), db_engine) df_diag_ram['end_flag'] = 0 return df_diag_ram