123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- 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
|