overhead_crane.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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.billets_from = {
  26. "A1": "",
  27. "A2": "",
  28. "A3": ""
  29. }
  30. self.areas = {
  31. "6#小冷床(左)": [34000, 38500],
  32. "6#小冷床(右)": [22000, 24000],
  33. "车位3": [2000, 4000],
  34. "高线辊道": [60300, 62300],
  35. "601堆垛": [10000, 14000],
  36. "5#小冷床(左)": [86000, 95000],
  37. "5#小冷床(右)": [72140, 76140],
  38. "501堆垛": [105520, 117725],
  39. "车位1": [119370, 122395],
  40. "车位2": [41800, 43800]
  41. }
  42. self.threads_poor = [
  43. threading.Thread(target=self.area_producer, args=("6#小冷床(左)",)),
  44. threading.Thread(target=self.area_producer, args=("6#小冷床(右)",)),
  45. threading.Thread(target=self.area_producer, args=("5#小冷床(左)",)),
  46. threading.Thread(target=self.area_producer, args=("5#小冷床(右)",)),
  47. threading.Thread(target=self.area_consumer, args=("车位1",)),
  48. threading.Thread(target=self.area_consumer, args=("车位2",)),
  49. threading.Thread(target=self.area_consumer, args=("车位3",)),
  50. threading.Thread(target=self.area_consumer, args=("高线辊道",)),
  51. threading.Thread(target=self.area_consumer, args=("601堆垛",)),
  52. threading.Thread(target=self.area_consumer, args=("501堆垛",))
  53. ]
  54. for i in self.threads_poor:
  55. i.start()
  56. def scan_crane(self, areaNo):
  57. start = self.areas[areaNo][0]
  58. end = self.areas[areaNo][1]
  59. while True:
  60. for key, value in self.cranes.items():
  61. if start <= value.data <= end:
  62. return key
  63. time.sleep(0.5)
  64. def crane_leave(self, craneNo, areaNo):
  65. start = self.areas[areaNo][0]
  66. end = self.areas[areaNo][1]
  67. wait_time = 0
  68. while True:
  69. if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
  70. return True
  71. if wait_time >= 18:
  72. return False
  73. time.sleep(0.5)
  74. wait_time += 0.5
  75. def area_producer(self, areaNo):
  76. while True:
  77. craneNo = self.scan_crane(areaNo)
  78. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  79. if self.crane_leave(craneNo, areaNo):
  80. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  81. continue
  82. if self.billetsNo[craneNo] == "":
  83. self.logger.debug(f"天车{craneNo}正在等待或尝试夹起钢坯")
  84. if self.get_billet(craneNo, areaNo):
  85. self.logger.debug(f"天车{craneNo}获取到钢坯")
  86. #test
  87. if '5#' in areaNo:
  88. if '左' in areaNo:
  89. self.logger.debug(f"左侧冷床目前情况:{len(self.tracer_5.bed_left[0])}根|{len(self.tracer_5.bed_left[1])}根|{len(self.tracer_5.bed_left[2])}根")
  90. else:
  91. self.logger.debug(f"右侧冷床目前情况:{len(self.tracer_5.bed_right[2])}根|{len(self.tracer_5.bed_right[1])}根|{len(self.tracer_5.bed_right[0])}根")
  92. else:
  93. self.logger.debug(f"天车{craneNo}未获取到钢坯直接离开")
  94. else:
  95. self.logger.debug(f"天车{craneNo}有未卸下的钢坯")
  96. while not self.crane_leave(craneNo, areaNo):
  97. pass
  98. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  99. time.sleep(1)
  100. def area_consumer(self, areaNo):
  101. while True:
  102. craneNo = self.scan_crane(areaNo)
  103. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  104. if self.crane_leave(craneNo, areaNo):
  105. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  106. continue
  107. if self.billetsNo[craneNo] == "":
  108. self.logger.debug(f"天车{craneNo}未携带钢坯")
  109. else:
  110. self.logger.debug(f"天车{craneNo}正在等待或尝试卸下钢坯")
  111. self.unload_billet(craneNo, areaNo)
  112. while not self.crane_leave(craneNo, areaNo):
  113. pass
  114. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  115. time.sleep(1)
  116. def get_billet(self, craneNo, areaNo):
  117. # 阻塞获取
  118. start = self.areas[areaNo][0]
  119. end = self.areas[areaNo][1]
  120. tmp = []
  121. while not bool(tmp):
  122. if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
  123. return False
  124. if areaNo == "6#小冷床(左)":
  125. tmp = self.tracer_6.get_billet("left")
  126. elif areaNo == "6#小冷床(右)":
  127. tmp = self.tracer_6.get_billet("right")
  128. elif areaNo == "5#小冷床(左)":
  129. tmp = self.tracer_5.get_billet("left")
  130. elif areaNo == "5#小冷床(右)":
  131. tmp = self.tracer_5.get_billet("right")
  132. time.sleep(0.5)
  133. self.billetsNo[craneNo] = ','.join(tmp)
  134. self.billets_from[craneNo] = areaNo
  135. return tmp
  136. def unload_billet(self, craneNo, areaNo):
  137. # 直接放下
  138. tmp = self.billetsNo[craneNo]
  139. self.billetsNo[craneNo] = ""
  140. tmp_from = self.billets_from[craneNo]
  141. self.billets_from[craneNo] = ""
  142. if areaNo == "车位1":
  143. self.logger.info(f"有一夹子钢坯放置进了车位1")
  144. if not tmp.startswith("00"):
  145. self.sender.car_save(self.parking.ccmNo_list[0], tmp, self.parking.current_car[0], craneNo, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), tmp_from, areaNo)
  146. if areaNo == "车位2":
  147. self.logger.info(f"有一夹子钢坯放置进了车位2")
  148. if not tmp.startswith("00"):
  149. self.sender.car_save(self.parking.ccmNo_list[1], tmp, self.parking.current_car[1], craneNo, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), tmp_from, areaNo)
  150. if areaNo == "车位3":
  151. self.logger.info(f"有一夹子钢坯放置进了车位3")
  152. if not tmp.startswith("00"):
  153. 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()), tmp_from, areaNo)
  154. elif areaNo == "高线辊道":
  155. self.logger.info(f"有一夹子钢坯放置进了高线辊道")
  156. if not tmp.startswith("00"):
  157. self.sender.host_send("6", tmp, "高线", craneNo, tmp_from)
  158. elif areaNo == "601堆垛":
  159. self.logger.info(f"有一夹子钢坯放置进了601堆垛")
  160. self.sender.stack_add('6', tmp, craneNo, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), tmp_from, '601堆垛')
  161. elif areaNo == "501堆垛":
  162. self.logger.info(f"有一夹子钢坯放置进了501堆垛")
  163. self.sender.stack_add('5', tmp, craneNo, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), tmp_from, '501堆垛')