alarm.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import time
  2. from event_storage import EventStorage
  3. from log import OutPutLog
  4. from datetime import datetime, timedelta
  5. class Alarm:
  6. def __init__(self):
  7. self._storage = EventStorage()
  8. self._save_frequency = 5
  9. self._last_save_time = 0
  10. self._log = OutPutLog()
  11. def get_real_time_data(self):
  12. """
  13. :return: data_dict {'c1': '064', 'c2': '0.1', 'c3': '20.3', 'c4': '43.2', 'c5': '1025.1', 'c6': '0.25', 'c81': '29.823', 'c82': '104.507', 'c83': '253.153'...}
  14. """
  15. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  16. # print(point_info)
  17. keys_list = []
  18. for index in point_info:
  19. keys_list.append('c' + str(index['serial_number']))
  20. data_dict = self._storage.memoryStorage.get_value(keys_list)
  21. # print(data_dict)
  22. return data_dict
  23. def get_point_table(self):
  24. """
  25. 获取所有点的点表,并增加alarm_status属性
  26. :return: point_info 字典组成的列表
  27. """
  28. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  29. for obj in point_info:
  30. obj['alarm_status'] = 0
  31. return point_info
  32. def update_point_table(self, point_info):
  33. """
  34. 更新点表,主要更新报警上限和报警下限
  35. :param point_info: 更新前的点表
  36. :return: 更新后的点表
  37. """
  38. new = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  39. for i in range(0, len(new)):
  40. point_info[i]['alarm_low_limit'] = new[i]['alarm_low_limit']
  41. point_info[i]['alarm_up_limit'] = new[i]['alarm_up_limit']
  42. # 越限报警
  43. def overrun_alarm(self):
  44. self._log.info('[overrun_alarm] - Over run alarm module is running!')
  45. try:
  46. point_info = self.get_point_table()
  47. while 1:
  48. self.update_point_table(point_info)
  49. # print(time.time(), point_info[0]['alarm_low_limit'], point_info[0]['alarm_up_limit'])
  50. data_dict = self.get_real_time_data()
  51. # print(data_dict['c1'])
  52. for index in point_info:
  53. key = 'c' + str(index['serial_number'])
  54. # print('addr = ', addr, 'addr type = ', type(addr))
  55. if data_dict[key]: # 数据不为空且报警状态为零
  56. data_dict[key] = float(data_dict[key])
  57. if index['alarm_low_limit'] is None or index['alarm_up_limit'] is None: # 未设置报警限值
  58. continue
  59. elif index['alarm_low_limit'] <= data_dict[key] <= index['alarm_up_limit']: # 在合理范围内
  60. index['alarm_status'] = 0
  61. else: # 数据越限
  62. if index['alarm_status'] == 0: # alarm_status == 0:表示第一次报警,存储报警信息
  63. alarm_unit = {'name': "'" + key + "'", 'data': data_dict[key]}
  64. table_name = "alarm_data_tbl" # 报警存储表名,可以通过配置文件配置
  65. alarm_time = time.strftime("%Y-%m-%d %H:%M:%S")
  66. self._log.debug('[overrun_alarm] - ' + repr(alarm_unit))
  67. self._storage.hardDiskStorage.insert_column_many(table_name, alarm_time, alarm_unit)
  68. index['alarm_status'] = 1
  69. elif index['alarm_status'] == 1: # alarm_status == 1:表示本次报警期间非第一次检测的越限
  70. continue
  71. time.sleep(1)
  72. except Exception as e:
  73. msg = str(time.strftime("%Y-%m-%d %H:%M:%M"))
  74. print(f'{msg}: error in overrun_alarm: {e}')
  75. def overrun_alarm_storage(self, table_name, save_time, item):
  76. pass
  77. # 变位报警
  78. def displacement_alarm(self):
  79. self._log.info('[displacement_alarm] - Displacement alarm module is running!')
  80. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  81. keys_list = []
  82. for index in point_info:
  83. keys_list.append('c' + str(index['serial_number']))
  84. last_data_dict = self._storage.memoryStorage.get_value(keys_list)
  85. while 1:
  86. now_data_dict = self._storage.memoryStorage.get_value(keys_list)
  87. # print(now_data_dict)
  88. for index in point_info:
  89. key = 'c' + str(index['serial_number'])
  90. if index['signal_type'] == 'Switch' and now_data_dict[key]:
  91. if now_data_dict[key] != last_data_dict[key]:
  92. self._log.info(repr(now_data_dict[key]) + repr(last_data_dict[key]))
  93. else:
  94. pass
  95. last_data_dict = now_data_dict
  96. self._log.info(last_data_dict)
  97. time.sleep(1)
  98. def displacement_alarm_storage(self):
  99. pass
  100. def moxa_e1210_alarm(self):
  101. """开关量综合报警的提示"""
  102. point_list = ["c365", "c367", "c368", "c371", "c372", "c373", "c374", "c375", "c376", "c377"]
  103. real_data_dict = self._storage.get_real_data(point_list)
  104. # real_data_dict = {'c365': '0', 'c367': '0', 'c368': '1', 'c371': '0', 'c372': '0', 'c373': '0', 'c374': '0', 'c375': '0', 'c376': '1', 'c377': '0'}
  105. alarm_time = datetime.now()
  106. alarm_time_limit = (alarm_time+timedelta(minutes=-30)).strftime("%Y-%m-%d %H:%M:%S")
  107. for serial_number,value in real_data_dict.items():
  108. if value and int(value) == 1:
  109. select_sql = f"SELECT serial_number FROM alarm_moxa_e1210 WHERE serial_number=\'{serial_number}\' AND update_time>\'{alarm_time_limit}\';"
  110. if not self._storage.execute_sql(select_sql):
  111. insert_sql = f"INSERT INTO alarm_moxa_e1210 (`create_time`, `update_time`, `serial_number`) VALUES (\'{alarm_time}\', \'{alarm_time}\', \'{serial_number}\');"
  112. self._storage.execute_update_sql(insert_sql)
  113. else:
  114. update_sql = f"UPDATE alarm_moxa_e1210 SET update_time=\'{alarm_time}\' WHERE serial_number=\'{serial_number}\' AND update_time>\'{alarm_time_limit}\';"
  115. self._storage.execute_update_sql(update_sql)
  116. if __name__ == '__main__':
  117. alarm = Alarm()
  118. alarm.overrun_alarm()