auto_feeding.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. """
  2. @Date :2021/6/16/14:47
  3. @Author:zz
  4. @Desc :投喂数据统计
  5. """
  6. import time
  7. import json
  8. import threading
  9. from event_storage import EventStorage
  10. from utility import Utility
  11. from log import OutPutLog
  12. from apis.get_feeding_advise import GetFeedingAdvise
  13. class AutoFeeding:
  14. def __init__(self):
  15. self._storage = EventStorage()
  16. self._log = OutPutLog()
  17. self._run_time = None
  18. self._run_timing = 0
  19. self._feed_diameter = 0
  20. self._error = 0
  21. def t2s(self, t):
  22. h, m = t.strip().split(":")
  23. return int(h) * 3600 + int(m) * 60
  24. # 历史存储主函数
  25. def run(self):
  26. self._log.info('[AutoFeeding] - AutoFeeding module is running!')
  27. # c741功能选择,1:投喂功能
  28. # 1号供料器频率:c659,2号供料器频率:c663,3号供料器频率:c667
  29. # c737状态显示 0:无状态 1:手动模式 2:投喂模式 3:冲刷模式 4:烘干模式
  30. list = ["c659", "c663", "c667", "c737", "c741"]
  31. # 获取配置信息
  32. while 1:
  33. time.sleep(1)
  34. # thread_num = len(threading.enumerate())
  35. # print("线程数量是%d" % thread_num)
  36. # print(str(threading.enumerate()))
  37. self._error = 0
  38. real_data_dict = self._storage.get_real_data(list)
  39. feeding_connectors = Utility.available_connectors["touwei"]
  40. try:
  41. for k, v in real_data_dict.items():
  42. if v is None:
  43. real_data_dict[k] = -9999
  44. system_status = int(real_data_dict["c737"])
  45. system_mode = int(real_data_dict["c741"])
  46. # 自动投饵逻辑
  47. feeder_frequency = 0
  48. tank_number = 1
  49. # 获取供料器频率及料罐信息
  50. if float(real_data_dict['c659']) > 1:
  51. feeder_frequency = float(real_data_dict['c659'])
  52. tank_number = 1
  53. elif float(real_data_dict['c663']) > 1:
  54. feeder_frequency = float(real_data_dict['c663'])
  55. tank_number = 2
  56. elif float(real_data_dict['c667']) > 1:
  57. feeder_frequency = float(real_data_dict['c667'])
  58. tank_number = 3
  59. sql_get_task_info = "SELECT * FROM touer_set;"
  60. task_info = self._storage.execute_sql(sql_get_task_info)
  61. task_info = task_info[0]
  62. task_mode = int(task_info['feed_mode'])
  63. # bait_name = tank_number_info['name']
  64. # feed_weight = int(tank_number_info['weight'])
  65. # shelf_life = tank_number_info['shelf_life']
  66. tank_number_info = eval(task_info["tank" + str(tank_number)])
  67. feed_diameter = int(tank_number_info['diameter'])
  68. if feeder_frequency > 1:
  69. if self._run_time == None:
  70. self._run_time = time.time()
  71. feeding_speed = 1440 / 67 * feeder_frequency / 50 * (8 - 0.5 * feed_diameter) * 1 / 60
  72. now_time = time.time()
  73. self._run_timing = self._run_timing + (now_time - self._run_time)
  74. self._feed_diameter = self._feed_diameter + feeding_speed * (now_time - self._run_time)
  75. self._run_time = now_time
  76. else:
  77. self._run_time = None
  78. self._run_timing = 0
  79. self._feed_diameter = 0
  80. print("累计运行时间"+str(self._run_timing))
  81. except Exception as e:
  82. self._error = 1
  83. print("get tank_number_info in AutoFeeding [ERROR]:" + str(e))
  84. self._log.error("get tank_number_info in AutoFeeding [ERROR]:" + str(e))
  85. # 通讯保护逻辑
  86. if int(time.time()) % 10 == 0:
  87. if int(time.time() / 10) % 2 == 0:
  88. print("1")
  89. feeding_connectors.send_command([{"addr_data": "DB5.DBX66.0", "data_type": "BOOL", "data": 1}]) # 保护置1
  90. else:
  91. print("2")
  92. feeding_connectors.send_command([{"addr_data": "DB5.DBX66.0", "data_type": "BOOL", "data": 0}]) # 保护置0
  93. if self._error == 0 and task_mode == 1:
  94. # 获取投喂配置参数
  95. sql_get_automatic_feeding_configuration = "SELECT * FROM automatic_feeding_configuration WHERE activation = 1;"
  96. automatic_feeding_configuration = self._storage.execute_sql(sql_get_automatic_feeding_configuration)
  97. # print(self._error)
  98. # 自动投饵逻辑
  99. if len(automatic_feeding_configuration) > 0:
  100. weekday = int(time.strftime('%w', time.localtime(time.time())))
  101. feedingAdvise = GetFeedingAdvise()
  102. feeding_port = feedingAdvise.operation(None)['port']
  103. if feeding_port > 0:
  104. # print(feeding_port)
  105. for task in automatic_feeding_configuration:
  106. try:
  107. time_begin = self.t2s(task['time_begin'])
  108. time_end = int(task['time_end'])
  109. feeding_port_select = int(task['feeding_port'])
  110. feeding_port = int(task['feeding_port'])
  111. feeding_line = int(task['feeding_line'])
  112. task_info = eval(task['phase_frequency'])
  113. feeder_frequency_set_stage1 = int(task_info['stage1']['frequency'])
  114. feeder_frequency_set_stage2 = int(task_info['stage2']['frequency'])
  115. feeder_frequency_set_stage3 = int(task_info['stage3']['frequency'])
  116. time_stage1 = int(task_info['stage1']['time'])
  117. time_stage2 = int(task_info['stage2']['time'])
  118. time_stage3 = int(task_info['stage3']['time'])
  119. feeding_amount_end = float(task['feeding_amount'])
  120. weekday_task = eval(task['date_bait'])
  121. except Exception as e:
  122. self._error = 1
  123. print(e)
  124. self._log.error("get tank_number_info in AutoFeeding [ERROR]:" + str(e))
  125. if self._error == 0:
  126. # 判断当日是否进行投饵
  127. if weekday_task.count(weekday) > 0:
  128. # 判断是否到达开启时间,系统未运行,模式为投喂模式
  129. time_now = time.strftime('%H:%M', time.localtime(time.time()))
  130. time_now = self.t2s(time_now)
  131. # 自动投饵操作
  132. print("准备自动投饵")
  133. # # 调试代码
  134. # if time_begin == time_now:
  135. # # 开始投饵
  136. # print("开始投饵")
  137. #
  138. # if task['mode'] == "timing":
  139. # # 变频逻辑
  140. # if self._run_timing > time_stage1*60 and self._run_timing< time_stage2*60:
  141. # print("开始变频1")
  142. # elif self._run_timing > time_stage2*60 and self._run_timing < time_stage3*60:
  143. # print("开始变频2")
  144. # # 停止逻辑
  145. # if time_now == time_end:
  146. # print("停止")
  147. if time_begin == time_now and system_status == 0 and system_mode == 1:
  148. # 开始投饵
  149. print("开始投饵")
  150. if feeding_port_select > 0 :
  151. feeding_port = feeding_port_select
  152. feeding_connectors.send_command([{"addr_data": "DB14.DBB1",
  153. "data_type": "UINT8",
  154. "data": feeding_port}]) # 设置投饵口
  155. feeding_connectors.send_command([{"addr_data": "DB14.DBB0",
  156. "data_type": "UINT8",
  157. "data": feeding_line}]) # 设置投饵线路
  158. feeding_connectors.send_command([{"addr_data": "DB14.DBD4",
  159. "data_type": "FLOAT32",
  160. "data": feeder_frequency_set_stage1}]) # 设置频率
  161. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 1}]) # 启动置1
  162. time.sleep(1)
  163. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 0}]) # 启动置0
  164. if task['mode'] == "timing" and system_status == 2 and system_mode == 1:
  165. # 变频逻辑
  166. if self._run_timing > time_stage1*60 and self._run_timing< time_stage2*60 and feeder_frequency_set_stage2 != int(feeder_frequency):
  167. print("开始变频1")
  168. feeding_connectors.send_command([{"addr_data": "DB14.DBD4",
  169. "data_type": "FLOAT32",
  170. "data": feeder_frequency_set_stage2}]) # 设置频率
  171. elif self._run_timing > time_stage2*60 and self._run_timing < time_stage3*60 and feeder_frequency_set_stage3 != int(feeder_frequency):
  172. print("开始变频2")
  173. feeding_connectors.send_command([{"addr_data": "DB14.DBD4",
  174. "data_type": "FLOAT32",
  175. "data": feeder_frequency_set_stage3}]) # 设置频率
  176. # 停止逻辑
  177. if self._run_timing > time_end*60:
  178. print("停止")
  179. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 2}])
  180. time.sleep(1)
  181. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 0}])
  182. elif task['mode'] == "ration" and system_status == 2 and system_mode == 1:
  183. # 变频逻辑
  184. if self._feed_diameter > time_stage1 and self._feed_diameter < time_stage2 and feeder_frequency_set_stage2 != int(feeder_frequency):
  185. feeding_connectors.send_command([{"addr_data": "DB14.DBD4",
  186. "data_type": "FLOAT32",
  187. "data": feeder_frequency_set_stage2}]) # 设置频率
  188. elif self._feed_diameter > time_stage2 and self._feed_diameter < time_stage3 and feeder_frequency_set_stage3 != int(feeder_frequency):
  189. feeding_connectors.send_command([{"addr_data": "DB14.DBD4",
  190. "data_type": "FLOAT32",
  191. "data": feeder_frequency_set_stage3}]) # 设置频率
  192. # 停止逻辑
  193. if self._feed_diameter > feeding_amount_end:
  194. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 2}])
  195. time.sleep(1)
  196. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 0}])
  197. else:
  198. if system_status == 2:
  199. print("停止")
  200. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 2}])
  201. time.sleep(1)
  202. feeding_connectors.send_command([{"addr_data": "DB14.DBB3", "data_type": "UINT8", "data": 0}])
  203. self._log.info('[AutoFeeding]—自然环境恶劣或系统存在异常,自动停止投饵!')
  204. else:
  205. self._log.info('[AutoFeeding]—自然环境恶劣或系统存在异常,无法执行自动投饵!')