overhead_crane.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import time, threading
  2. from utils.s7data import S7data
  3. from utils.logger import Logger
  4. from models.billet_trace_pusher import Trace_pusher
  5. from models.parking import Parking
  6. from models.data_sender import Sender
  7. class Crane:
  8. def __init__(self, data_s7: S7data, tracer_5: Trace_pusher, tracer_6: Trace_pusher, parking: Parking, sender: Sender, logger: Logger):
  9. self.data = data_s7
  10. self.tracer_5 = tracer_5
  11. self.tracer_6 = tracer_6
  12. self.parking = parking
  13. self.sender = sender
  14. self.logger = logger
  15. self.cranes = {
  16. "A1": self.data.make_point("天车A1位置"),
  17. "A2": self.data.make_point("天车A2位置"),
  18. "A3": self.data.make_point("天车A3位置")
  19. }
  20. self.billetsNo = {
  21. "A1": "",
  22. "A2": "",
  23. "A3": ""
  24. }
  25. self.areas = {
  26. "6#coolbed1": [35000, 38500],
  27. "6#coolbed2": [22000, 24000],
  28. "car3": [2000, 4000],
  29. "highline": [60300, 62300]
  30. }
  31. self.threads_poor = [
  32. threading.Thread(target=self.area_producer, args=("6#coolbed1",)),
  33. threading.Thread(target=self.area_producer, args=("6#coolbed2",)),
  34. threading.Thread(target=self.area_consumer, args=("car3",)),
  35. threading.Thread(target=self.area_consumer, args=("highline",))
  36. ]
  37. for i in self.threads_poor:
  38. i.start()
  39. def scan_crane(self, areaNo):
  40. start = self.areas[areaNo][0]
  41. end = self.areas[areaNo][1]
  42. while True:
  43. for key, value in self.cranes.items():
  44. if start <= value.data <= end:
  45. return key
  46. time.sleep(0.5)
  47. def crane_leave(self, craneNo, areaNo):
  48. start = self.areas[areaNo][0]
  49. end = self.areas[areaNo][1]
  50. while True:
  51. if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
  52. return True
  53. time.sleep(0.5)
  54. def area_producer(self, areaNo):
  55. while True:
  56. craneNo = self.scan_crane(areaNo)
  57. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  58. if self.billetsNo[craneNo] == "":
  59. self.logger.debug(f"天车{craneNo}正在等待或尝试夹起钢坯")
  60. self.get_billet(craneNo, areaNo)
  61. self.logger.debug(f"天车{craneNo}获取到钢坯")
  62. else:
  63. self.logger.debug(f"天车{craneNo}有未卸下的钢坯")
  64. self.crane_leave(craneNo, areaNo)
  65. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  66. time.sleep(1)
  67. def area_consumer(self, areaNo):
  68. while True:
  69. craneNo = self.scan_crane(areaNo)
  70. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  71. if self.billetsNo[craneNo] == "":
  72. self.logger.debug(f"天车{craneNo}未携带钢坯")
  73. else:
  74. self.logger.debug(f"天车{craneNo}正在等待或尝试卸下钢坯")
  75. self.unload_billet(craneNo, areaNo)
  76. self.crane_leave(craneNo, areaNo)
  77. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  78. time.sleep(1)
  79. def get_billet(self, craneNo, areaNo):
  80. # 阻塞获取
  81. tmp = []
  82. while not bool(tmp):
  83. if areaNo == "6#coolbed1":
  84. tmp = self.tracer_6.get_billet("left")
  85. elif areaNo == "6#coolbed2":
  86. tmp = self.tracer_6.get_billet("right")
  87. self.billetsNo[craneNo] = ','.join(tmp)
  88. return tmp
  89. def unload_billet(self, craneNo, areaNo):
  90. # 直接放下
  91. tmp = self.billetsNo[craneNo]
  92. self.billetsNo[craneNo] = ""
  93. if areaNo == "car3":
  94. self.logger.info(f"有一夹子钢坯放置进了车位3")
  95. self.sender.car_save(self.parking.ccmNo_list[2], tmp, self.parking.current_car[2], craneNo, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
  96. elif areaNo == "highline":
  97. self.logger.info(f"有一夹子钢坯放置进了高线辊道")
  98. self.sender.host_send("6", tmp, "高线", craneNo)