multi_comp_safety_verify.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import pandas as pd
  2. # from logs_conf.logger import *
  3. from logs.logger import *
  4. from CoolProp.CoolProp import PropsSI
  5. from chiller_safety_modify.pressure_diff_limit_multi_comp import PressureDiffLimitMultiComp
  6. from chiller_safety_modify.suction_with_liquid_multi_comp import SuctionWithLiquidMultiComp
  7. class MultiCompSafetyVerify(PressureDiffLimitMultiComp, SuctionWithLiquidMultiComp):
  8. def __init__(self, dict_chiller_inner, dict_upper_correct):
  9. super(PressureDiffLimitMultiComp, self).__init__(dict_chiller_inner, dict_upper_correct)
  10. def data_switch_array(self):
  11. """将不同压缩机数据提取出来,生成数据列表和负载率列表"""
  12. list_data_general = []
  13. list_load_ratio = []
  14. for circuit in self.dict_upper_correct['chillerParameter']['circuitParameter']:
  15. dict_circuit = {}
  16. dict_circuit['condPre'] = circuit['condPre']
  17. dict_circuit['evapPre'] = circuit['evapPre']
  18. for compressor in circuit['compParameter']:
  19. dict_comp = {}
  20. dict_comp['sucTemp'] = compressor['sucTemp']
  21. dict_comp['disTemp'] = compressor['disTemp']
  22. dict_general = dict(dict_circuit, **dict_comp)
  23. list_data_general.append(dict_general)
  24. list_load_ratio.append(compressor['loadPercent'])
  25. return list_data_general, list_load_ratio
  26. def thermodynamic_parameter_cal(self, data_frame_general):
  27. """中间参数计算:根据压力计算温度、计算焓值和熵值等"""
  28. enthalpy_suc = []
  29. entropy_suc = []
  30. enthalpy_dis = []
  31. data_frame_general['condPre'] += 101.325
  32. data_frame_general['evapPre'] += 101.325
  33. data_frame_general['evapTemp'] = data_frame_general.apply(
  34. lambda x: PropsSI('T', 'P', x['evapPre'] * 1000, 'Q', 1, self.dict_upper_correct['refriType']) - 273.15, axis=1)
  35. data_frame_general['condTemp'] = data_frame_general.apply(
  36. lambda x: PropsSI('T', 'P', x['condPre'] * 1000, 'Q', 1, self.dict_upper_correct['refriType']) - 273.15, axis=1)
  37. for index, row in data_frame_general.iterrows():
  38. if row['evapTemp'] - row['sucTemp'] > 0:
  39. enthalpy_suc_cal = PropsSI('H', 'T', row['evapTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType'])
  40. entropy_suc_cal = PropsSI('S', 'T', row['evapTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType'])
  41. else:
  42. enthalpy_suc_cal = PropsSI('H', 'T', row['sucTemp'] + 273.15, 'P', row['evapPre'] * 1000,
  43. self.dict_upper_correct['refriType'])
  44. entropy_suc_cal = PropsSI('S', 'T', row['sucTemp'] + 273.15, 'P', row['evapPre'] * 1000,
  45. self.dict_upper_correct['refriType'])
  46. if row['condTemp'] - row['disTemp'] > 0:
  47. enthalpy_dis_cal = PropsSI('H', 'T', row['condTemp'] + 273.15, 'Q', 1, self.dict_upper_correct['refriType'])
  48. else:
  49. enthalpy_dis_cal = PropsSI('H', 'T', row['disTemp'] + 273.15, 'P', row['condPre'] * 1000,
  50. self.dict_upper_correct['refriType'])
  51. enthalpy_suc.append(enthalpy_suc_cal)
  52. entropy_suc.append(entropy_suc_cal)
  53. enthalpy_dis.append(enthalpy_dis_cal)
  54. data_frame_general['enthalpySuc'] = enthalpy_suc
  55. data_frame_general['entropySuc'] = entropy_suc
  56. data_frame_general['enthalpyDis'] = enthalpy_dis
  57. return data_frame_general
  58. def isen_efficiency_cal(self):
  59. """计算等熵效率"""
  60. self.data_general['enthalpyDisIse'] = self.data_general.apply(
  61. lambda x: PropsSI('H', 'P', x['condPre'] * 1000, 'S', x['entropySuc'], self.dict_upper_correct['refriType']),
  62. axis=1)
  63. self.data_general['iseEfficiency'] = (self.data_general['enthalpyDisIse'] - self.data_general['enthalpySuc']) / (
  64. self.data_general['enthalpyDis'] - self.data_general['enthalpySuc'])
  65. ise_efficiency = self.data_general['iseEfficiency'].tolist()
  66. return ise_efficiency
  67. def circle_paramter_cal(self, list_load_ratio, list_data_general):
  68. """
  69. 针对每一个压缩机回路判断 安全压差 、 吸气带液
  70. :param list_load_ratio:
  71. :param list_data_general:
  72. :return:
  73. """
  74. list_chiller_temp = []
  75. list_suction_with_liquid = []
  76. list_ise_efficiency = []
  77. for i in range(len(list_load_ratio)):
  78. data_frame_general = pd.DataFrame(list_data_general[i])
  79. print(data_frame_general)
  80. data_frame_general = data_frame_general.dropna()
  81. print("%%%%%%%%%%%%%%%%%%%%")
  82. print(data_frame_general)
  83. self.data_general = self.thermodynamic_parameter_cal(data_frame_general)
  84. set_new_pres_fix = self.pressure_diff_limit(list_load_ratio[i]) # 根据安全压差调整的水温
  85. list_chiller_temp.append(set_new_pres_fix) if set_new_pres_fix else []
  86. ise_efficiency = self.isen_efficiency_cal()
  87. judge_suction_with_liquid = self.judge_suction_with_liquid(list_load_ratio[i]) # 判断是否吸气带液
  88. list_ise_efficiency.append(ise_efficiency)
  89. list_suction_with_liquid.append(judge_suction_with_liquid)
  90. return list_chiller_temp, list_suction_with_liquid, list_ise_efficiency
  91. @staticmethod
  92. def is_safety_issue(is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix):
  93. """满足安全压差、 吸气带液、 连续运行 任何一个则表示存在安全运行问题,即为1,否则不存在安全运行问题"""
  94. if is_lower_oil_pre or is_suction_with_liquid or is_continuous_run_fix:
  95. is_safety_issue = 1
  96. else:
  97. is_safety_issue = 0
  98. return is_safety_issue
  99. def water_temp_adjust_final(self, is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix,
  100. water_temp_set_pre_diff, water_temp_set_liquid, water_temp_set_run_continue):
  101. if is_lower_oil_pre or is_suction_with_liquid:
  102. # if self.dict_chiller_inner['runMode'] == 0:
  103. # if is_lower_oil_pre and is_suction_with_liquid:
  104. # water_temp_set_new = min(water_temp_set_pre_diff, water_temp_set_liquid) # 制冷模式取最小值
  105. # elif is_lower_oil_pre:
  106. # water_temp_set_new = water_temp_set_pre_diff
  107. # else:
  108. # water_temp_set_new = water_temp_set_liquid
  109. # else:
  110. # if is_lower_oil_pre and is_suction_with_liquid:
  111. # water_temp_set_new = max(water_temp_set_pre_diff, water_temp_set_liquid) # 制热模式取最大值,修改
  112. # elif is_lower_oil_pre:
  113. # water_temp_set_new = water_temp_set_pre_diff
  114. # else:
  115. # water_temp_set_new = water_temp_set_liquid
  116. if is_lower_oil_pre and is_suction_with_liquid:
  117. if self.dict_chiller_inner['runMode'] == 0:
  118. water_temp_set_new = min(water_temp_set_pre_diff, water_temp_set_liquid) # 制冷模式取最小值
  119. else:
  120. water_temp_set_new = max(water_temp_set_pre_diff, water_temp_set_liquid) # 制热模式取最大值,修改
  121. logger.critical("============存在安全运行问题3:主机同时存在安全压差与吸气带液风险,"
  122. "水温设定值从 %s ℃调整至 %s ℃============"
  123. % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1)))
  124. elif is_lower_oil_pre:
  125. water_temp_set_new = water_temp_set_pre_diff
  126. logger.critical("============存在安全运行问题1:主机存在安全压差问题,水温设定值从 %s ℃调整至 %s ℃============"
  127. % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1)))
  128. else:
  129. water_temp_set_new = water_temp_set_liquid
  130. logger.critical("============存在安全运行问题2:主机存在吸气带液风险,水温设定值从%s℃调整至%s℃============"
  131. % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1)))
  132. elif is_continuous_run_fix:
  133. water_temp_set_new = water_temp_set_run_continue
  134. logger.critical("============存在安全运行问题4:无法保障设备连续运行,水温设定值从%s℃调整至%s℃============"
  135. % (self.dict_chiller_inner["chillerWaterTempSet"], round(water_temp_set_new, 1)))
  136. else:
  137. water_temp_set_new = ''
  138. logger.critical("============不存在安全运行问题:经校验,设备不存在安全运行风险============")
  139. return water_temp_set_new
  140. def safety_verify(self):
  141. list_data_general, list_load_ratio = self.data_switch_array() # 参数格式转换
  142. list_chiller_temp, list_suction_with_liquid, list_ise_efficiency = \
  143. self.circle_paramter_cal(list_load_ratio, list_data_general) # 中间参数计算
  144. is_suction_with_liquid, ise_efficiency_liquid = \
  145. self.is_suction_with_liquid(list_ise_efficiency, list_suction_with_liquid) # 吸气带液校验
  146. water_temp_set_pre_diff, is_lower_oil_pre = self.water_temp_adjust_pre_diff(list_chiller_temp) # 安全压差校验
  147. water_temp_set_liquid = ''
  148. if is_suction_with_liquid:
  149. water_temp_set_liquid, results_depict_liquid = self.temp_set_adjust(ise_efficiency_liquid)
  150. water_temp_set_run_continue, is_continuous_run_fix = \
  151. self.water_temp_adjust_continuous_run(is_lower_oil_pre, is_suction_with_liquid, list_load_ratio) # 连续运行校验
  152. is_safety_issue = self.is_safety_issue(is_lower_oil_pre, is_suction_with_liquid, is_continuous_run_fix)
  153. 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)
  154. water_temp_set_new = self.water_temp_adjust_final(*parameter)
  155. return is_safety_issue, water_temp_set_new
  156. def safety_verify_main_process(self):
  157. try:
  158. if self.dict_chiller_inner['runStatus'][-1] == 0:
  159. logger.critical("============冷机处于关闭状态,无需进行安全校验============")
  160. is_safety_issue = 0
  161. water_temp_set_new = ''
  162. elif self.dict_chiller_inner['runStatus'][-1] == 1:
  163. last_hour_data = self.dict_chiller_inner['runStatus'][-int(60/3):] # 过去一个小时的运行数据
  164. if all(status == 1 for status in last_hour_data):
  165. logger.critical("============冷机稳定运行,正常进行安全校验============")
  166. is_safety_issue, water_temp_set_new = self.safety_verify()
  167. else:
  168. logger.critical("============冷机运行状态不稳定,无法进行安全校验============")
  169. is_safety_issue = 0
  170. water_temp_set_new = ''
  171. else:
  172. logger.critical("============冷机运行状态无法判断,无法进行安全校验============")
  173. is_safety_issue = 0
  174. water_temp_set_new = ''
  175. except Exception as e:
  176. logger.critical("============冷机运行状态无法判断,无法进行安全校验============")
  177. result_depict = '安全校验异常,无法完成校验,退出安全校验计算' + '(' + str(e) + ')'
  178. logger.critical('============{}============'.format(result_depict))
  179. logger.critical('============无法完成安全校验,视为无安全运行风险============')
  180. is_safety_issue = 0
  181. water_temp_set_new = ''
  182. return is_safety_issue, water_temp_set_new