import pandas as pd # from logs_conf.logger import * from logs.logger import * from CoolProp.CoolProp import PropsSI from chiller_safety_modify.pressure_diff_limit_multi_comp import PressureDiffLimitMultiComp from chiller_safety_modify.suction_with_liquid_multi_comp import SuctionWithLiquidMultiComp class MultiCompSafetyVerify(PressureDiffLimitMultiComp, SuctionWithLiquidMultiComp): def __init__(self, dict_chiller_inner, dict_upper_correct): super(PressureDiffLimitMultiComp, self).__init__(dict_chiller_inner, dict_upper_correct) def data_switch_array(self): """将不同压缩机数据提取出来,生成数据列表和负载率列表""" list_data_general = [] list_load_ratio = [] for circuit in self.dict_upper_correct['chillerParameter']['circuitParameter']: dict_circuit = {} dict_circuit['condPre'] = circuit['condPre'] dict_circuit['evapPre'] = circuit['evapPre'] for compressor in circuit['compParameter']: dict_comp = {} dict_comp['sucTemp'] = compressor['sucTemp'] dict_comp['disTemp'] = compressor['disTemp'] dict_general = dict(dict_circuit, **dict_comp) list_data_general.append(dict_general) list_load_ratio.append(compressor['loadPercent']) return list_data_general, list_load_ratio def thermodynamic_parameter_cal(self, data_frame_general): """中间参数计算:根据压力计算温度、计算焓值和熵值等""" enthalpy_suc = [] entropy_suc = [] enthalpy_dis = [] data_frame_general['condPre'] += 101.325 data_frame_general['evapPre'] += 101.325 data_frame_general['evapTemp'] = data_frame_general.apply( lambda x: PropsSI('T', 'P', x['evapPre'] * 1000, 'Q', 1, self.dict_upper_correct['refriType']) - 273.15, axis=1) data_frame_general['condTemp'] = data_frame_general.apply( lambda x: PropsSI('T', 'P', x['condPre'] * 1000, 'Q', 1, self.dict_upper_correct['refriType']) - 273.15, axis=1) for index, row in data_frame_general.iterrows(): if row['evapTemp'] - row['sucTemp'] > 0: enthalpy_suc_cal = PropsSI('H', 'T', row['evapTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType']) entropy_suc_cal = PropsSI('S', 'T', row['evapTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType']) else: enthalpy_suc_cal = PropsSI('H', 'T', row['sucTemp'] + 273.15, 'P', row['evapPre'] * 1000, self.dict_upper_correct['refriType']) entropy_suc_cal = PropsSI('S', 'T', row['sucTemp'] + 273.15, 'P', row['evapPre'] * 1000, self.dict_upper_correct['refriType']) if row['condTemp'] - row['disTemp'] > 0: enthalpy_dis_cal = PropsSI('H', 'T', row['condTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType']) else: enthalpy_dis_cal = PropsSI('H', 'T', row['disTemp'] + 273.15, 'P', row['condPre'] * 1000, self.dict_upper_correct['refriType']) enthalpy_suc.append(enthalpy_suc_cal) entropy_suc.append(entropy_suc_cal) enthalpy_dis.append(enthalpy_dis_cal) data_frame_general['enthalpySuc'] = enthalpy_suc data_frame_general['entropySuc'] = entropy_suc data_frame_general['enthalpyDis'] = enthalpy_dis return data_frame_general def isen_efficiency_cal(self): """计算等熵效率""" self.data_general['enthalpyDisIse'] = self.data_general.apply( lambda x: PropsSI('H', 'P', x['condPre'] * 1000, 'S', x['entropySuc'], self.dict_upper_correct['refriType']), axis=1) self.data_general['iseEfficiency'] = (self.data_general['enthalpyDisIse'] - self.data_general['enthalpySuc']) / ( self.data_general['enthalpyDis'] - self.data_general['enthalpySuc']) ise_efficiency = self.data_general['iseEfficiency'].tolist() return ise_efficiency def circle_paramter_cal(self, list_load_ratio, list_data_general): """ 针对每一个压缩机回路判断 安全压差 、 吸气带液 :param list_load_ratio: :param list_data_general: :return: """ list_chiller_temp = [] list_suction_with_liquid = [] list_ise_efficiency = [] for i in range(len(list_load_ratio)): data_frame_general = pd.DataFrame(list_data_general[i]) print(data_frame_general) data_frame_general = data_frame_general.dropna() print("%%%%%%%%%%%%%%%%%%%%") print(data_frame_general) self.data_general = self.thermodynamic_parameter_cal(data_frame_general) set_new_pres_fix = self.pressure_diff_limit(list_load_ratio[i]) # 根据安全压差调整的水温 list_chiller_temp.append(set_new_pres_fix) if set_new_pres_fix else [] ise_efficiency = self.isen_efficiency_cal() judge_suction_with_liquid = self.judge_suction_with_liquid(list_load_ratio[i]) # 判断是否吸气带液 list_ise_efficiency.append(ise_efficiency) list_suction_with_liquid.append(judge_suction_with_liquid) return list_chiller_temp, list_suction_with_liquid, list_ise_efficiency @staticmethod def is_safety_issue(is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix): """满足安全压差、 吸气带液、 连续运行 任何一个则表示存在安全运行问题,即为1,否则不存在安全运行问题""" if is_lower_oil_pre or is_suction_with_liquid or is_continuous_run_fix: is_safety_issue = 1 else: is_safety_issue = 0 return is_safety_issue def water_temp_adjust_final(self, is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix, water_temp_set_pre_diff, water_temp_set_liquid, water_temp_set_run_continue): if is_lower_oil_pre or is_suction_with_liquid: # if self.dict_chiller_inner['runMode'] == 0: # if is_lower_oil_pre and is_suction_with_liquid: # water_temp_set_new = min(water_temp_set_pre_diff, water_temp_set_liquid) # 制冷模式取最小值 # elif is_lower_oil_pre: # water_temp_set_new = water_temp_set_pre_diff # else: # water_temp_set_new = water_temp_set_liquid # else: # if is_lower_oil_pre and is_suction_with_liquid: # water_temp_set_new = max(water_temp_set_pre_diff, water_temp_set_liquid) # 制热模式取最大值,修改 # elif is_lower_oil_pre: # water_temp_set_new = water_temp_set_pre_diff # else: # water_temp_set_new = water_temp_set_liquid if is_lower_oil_pre and is_suction_with_liquid: if self.dict_chiller_inner['runMode'] == 0: water_temp_set_new = min(water_temp_set_pre_diff, water_temp_set_liquid) # 制冷模式取最小值 else: water_temp_set_new = max(water_temp_set_pre_diff, water_temp_set_liquid) # 制热模式取最大值,修改 logger.critical("============存在安全运行问题3:主机同时存在安全压差与吸气带液风险," "水温设定值从 %s ℃调整至 %s ℃============" % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1))) elif is_lower_oil_pre: water_temp_set_new = water_temp_set_pre_diff logger.critical("============存在安全运行问题1:主机存在安全压差问题,水温设定值从 %s ℃调整至 %s ℃============" % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1))) else: water_temp_set_new = water_temp_set_liquid logger.critical("============存在安全运行问题2:主机存在吸气带液风险,水温设定值从%s℃调整至%s℃============" % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1))) elif is_continuous_run_fix: water_temp_set_new = water_temp_set_run_continue logger.critical("============存在安全运行问题4:无法保障设备连续运行,水温设定值从%s℃调整至%s℃============" % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1))) else: water_temp_set_new = '' logger.critical("============不存在安全运行问题:经校验,设备不存在安全运行风险============") return water_temp_set_new def safety_verify(self): list_data_general, list_load_ratio = self.data_switch_array() # 参数格式转换 list_chiller_temp, list_suction_with_liquid, list_ise_efficiency = \ self.circle_paramter_cal(list_load_ratio, list_data_general) # 中间参数计算 is_suction_with_liquid, ise_efficiency_liquid = \ self.is_suction_with_liquid(list_ise_efficiency, list_suction_with_liquid) # 吸气带液校验 water_temp_set_pre_diff, is_lower_oil_pre = self.water_temp_adjust_pre_diff(list_chiller_temp) # 安全压差校验 water_temp_set_liquid = '' if is_suction_with_liquid: water_temp_set_liquid, results_depict_liquid = self.temp_set_adjust(ise_efficiency_liquid) water_temp_set_run_continue, is_continuous_run_fix = \ self.water_temp_adjust_continuous_run(is_lower_oil_pre, is_suction_with_liquid, list_load_ratio) # 连续运行校验 is_safety_issue = self.is_safety_issue(is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix) parameter = (is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix, water_temp_set_pre_diff, water_temp_set_liquid, water_temp_set_run_continue) water_temp_set_new = self.water_temp_adjust_final(*parameter) return is_safety_issue, water_temp_set_new def safety_verify_main_process(self): try: if self.dict_chiller_inner['runStatus'][-1] == 0: logger.critical("============冷机处于关闭状态,无需进行安全校验============") is_safety_issue = 0 water_temp_set_new = '' elif self.dict_chiller_inner['runStatus'][-1] == 1: last_hour_data = self.dict_chiller_inner['runStatus'][-int(60/3):] # 过去一个小时的运行数据 if all(status == 1 for status in last_hour_data): logger.critical("============冷机稳定运行,正常进行安全校验============") is_safety_issue, water_temp_set_new = self.safety_verify() else: logger.critical("============冷机运行状态不稳定,无法进行安全校验============") is_safety_issue = 0 water_temp_set_new = '' else: logger.critical("============冷机运行状态无法判断,无法进行安全校验============") is_safety_issue = 0 water_temp_set_new = '' except Exception as e: logger.critical("============冷机运行状态无法判断,无法进行安全校验============") result_depict = '安全校验异常,无法完成校验,退出安全校验计算' + '(' + str(e) + ')' logger.critical('============{}============'.format(result_depict)) logger.critical('============无法完成安全校验,视为无安全运行风险============') is_safety_issue = 0 water_temp_set_new = '' return is_safety_issue, water_temp_set_new