alarm.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. """
  2. @Date :2021/5/21/00219:10:57
  3. @Desc :
  4. """
  5. import time
  6. from event_storage import EventStorage
  7. from log import Log
  8. class Alarm:
  9. def __init__(self):
  10. self._storage = EventStorage()
  11. self._save_frequency = 5
  12. self._last_save_time = 0
  13. self._log = Log()
  14. def get_real_time_data(self):
  15. """
  16. :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'...}
  17. """
  18. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  19. # print(point_info)
  20. keys_list = []
  21. for index in point_info:
  22. keys_list.append('c' + str(index['serial_number']))
  23. data_dict = self._storage.memoryStorage.get_value(keys_list)
  24. # print(data_dict)
  25. return data_dict
  26. def get_point_table(self):
  27. """
  28. 获取所有点的点表,并增加alarm_status属性
  29. :return: point_info 字典组成的列表
  30. """
  31. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  32. for obj in point_info:
  33. obj['alarm_status'] = 0
  34. return point_info
  35. def update_point_table(self, point_info):
  36. """
  37. 更新点表,主要更新报警上限和报警下限
  38. :param point_info: 更新前的点表
  39. :return: 更新后的点表
  40. """
  41. new = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  42. for i in range(0, len(new)):
  43. point_info[i]['alarm_low_limit'] = new[i]['alarm_low_limit']
  44. point_info[i]['alarm_up_limit'] = new[i]['alarm_up_limit']
  45. # 越限报警
  46. def overrun_alarm(self):
  47. self._log.info('[overrun_alarm] - Over run alarm module is running!')
  48. try:
  49. point_info = self.get_point_table()
  50. while 1:
  51. self.update_point_table(point_info)
  52. # print(time.time(), point_info[0]['alarm_low_limit'], point_info[0]['alarm_up_limit'])
  53. data_dict = self.get_real_time_data()
  54. # print(data_dict['c1'])
  55. for index in point_info:
  56. key = 'c' + str(index['serial_number'])
  57. # print('addr = ', addr, 'addr type = ', type(addr))
  58. if data_dict[key]: # 数据不为空且报警状态为零
  59. data_dict[key] = float(data_dict[key])
  60. if index['alarm_low_limit'] is None or index['alarm_up_limit'] is None: # 未设置报警限值
  61. continue
  62. elif index['alarm_low_limit'] <= data_dict[key] <= index['alarm_up_limit']: # 在合理范围内
  63. index['alarm_status'] = 0
  64. else: # 数据越限
  65. if index['alarm_status'] == 0: # alarm_status == 0:表示第一次报警,存储报警信息
  66. alarm_unit = {'name': "'" + key + "'", 'data': data_dict[key]}
  67. table_name = "alarm_data_tbl" # 报警存储表名,可以通过配置文件配置
  68. alarm_time = time.strftime("%Y-%m-%d %H:%M:%S")
  69. # print(alarm_unit)
  70. self._storage.hardDiskStorage.insert_column_many(table_name, alarm_time, alarm_unit)
  71. index['alarm_status'] = 1
  72. elif index['alarm_status'] == 1: # alarm_status == 1:表示本次报警期间非第一次检测的越限
  73. continue
  74. time.sleep(1)
  75. except Exception as e:
  76. msg = str(time.strftime("%Y-%m-%d %H:%M:%M"))
  77. print(f'{msg}: error in overrun_alarm: {e}')
  78. def overrun_alarm_storage(self, table_name, save_time, item):
  79. pass
  80. # 变位报警
  81. def displacement_alarm(self):
  82. self._log.info('[displacement_alarm] - Displacement alarm module is running!')
  83. point_info = self._storage.hardDiskStorage.get_point_info(point_tuple=None)
  84. keys_list = []
  85. for index in point_info:
  86. keys_list.append('c' + str(index['serial_number']))
  87. last_data_dict = self._storage.memoryStorage.get_value(keys_list)
  88. while 1:
  89. now_data_dict = self._storage.memoryStorage.get_value(keys_list)
  90. # print(now_data_dict)
  91. for index in point_info:
  92. key = 'c' + str(index['serial_number'])
  93. if index['signal_type'] == 'Switch' and now_data_dict[key]:
  94. if now_data_dict[key] != last_data_dict[key]:
  95. print(now_data_dict[key], last_data_dict[key])
  96. else:
  97. pass
  98. last_data_dict = now_data_dict
  99. print(last_data_dict)
  100. time.sleep(1)
  101. def displacement_alarm_storage(self):
  102. pass
  103. if __name__ == '__main__':
  104. alarm = Alarm()
  105. alarm.overrun_alarm()