overhead_crane.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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#小冷床(左)": [35000, 38500],
  32. "6#小冷床(右)": [22000, 24000],
  33. "车位3": [2000, 4000],
  34. "高线辊道": [60300, 62300],
  35. "601堆垛": [10000, 14000]
  36. }
  37. self.threads_poor = [
  38. threading.Thread(target=self.area_producer, args=("6#小冷床(左)",)),
  39. threading.Thread(target=self.area_producer, args=("6#小冷床(右)",)),
  40. threading.Thread(target=self.area_consumer, args=("车位3",)),
  41. threading.Thread(target=self.area_consumer, args=("高线辊道",)),
  42. threading.Thread(target=self.area_consumer, args=("601堆垛",))
  43. ]
  44. for i in self.threads_poor:
  45. i.start()
  46. def scan_crane(self, areaNo):
  47. start = self.areas[areaNo][0]
  48. end = self.areas[areaNo][1]
  49. while True:
  50. for key, value in self.cranes.items():
  51. if start <= value.data <= end:
  52. return key
  53. time.sleep(0.5)
  54. def crane_leave(self, craneNo, areaNo):
  55. start = self.areas[areaNo][0]
  56. end = self.areas[areaNo][1]
  57. wait_time = 0
  58. while True:
  59. if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
  60. return True
  61. if wait_time >= 10:
  62. return False
  63. time.sleep(0.5)
  64. wait_time += 0.5
  65. def area_producer(self, areaNo):
  66. while True:
  67. craneNo = self.scan_crane(areaNo)
  68. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  69. if self.crane_leave(craneNo, areaNo):
  70. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  71. continue
  72. if self.billetsNo[craneNo] == "":
  73. self.logger.debug(f"天车{craneNo}正在等待或尝试夹起钢坯")
  74. if self.get_billet(craneNo, areaNo):
  75. self.logger.debug(f"天车{craneNo}获取到钢坯")
  76. else:
  77. self.logger.debug(f"天车{craneNo}未获取到钢坯直接离开")
  78. else:
  79. self.logger.debug(f"天车{craneNo}有未卸下的钢坯")
  80. while not self.crane_leave(craneNo, areaNo):
  81. pass
  82. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  83. time.sleep(1)
  84. def area_consumer(self, areaNo):
  85. while True:
  86. craneNo = self.scan_crane(areaNo)
  87. self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
  88. if self.crane_leave(craneNo, areaNo):
  89. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  90. continue
  91. if self.billetsNo[craneNo] == "":
  92. self.logger.debug(f"天车{craneNo}未携带钢坯")
  93. else:
  94. self.logger.debug(f"天车{craneNo}正在等待或尝试卸下钢坯")
  95. self.unload_billet(craneNo, areaNo)
  96. while not self.crane_leave(craneNo, areaNo):
  97. pass
  98. self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
  99. time.sleep(1)
  100. def get_billet(self, craneNo, areaNo):
  101. # 阻塞获取
  102. start = self.areas[areaNo][0]
  103. end = self.areas[areaNo][1]
  104. tmp = []
  105. while not bool(tmp):
  106. if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
  107. return False
  108. if areaNo == "6#小冷床(左)":
  109. tmp = self.tracer_6.get_billet("left")
  110. elif areaNo == "6#小冷床(右)":
  111. tmp = self.tracer_6.get_billet("right")
  112. self.billetsNo[craneNo] = ','.join(tmp)
  113. self.billets_from[craneNo] = areaNo
  114. return tmp
  115. def unload_billet(self, craneNo, areaNo):
  116. # 直接放下
  117. tmp = self.billetsNo[craneNo]
  118. self.billetsNo[craneNo] = ""
  119. self.billets_from[craneNo] = ""
  120. if areaNo == "车位3":
  121. self.logger.info(f"有一夹子钢坯放置进了车位3")
  122. 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()), self.billets_from[craneNo], areaNo)
  123. elif areaNo == "高线辊道":
  124. self.logger.info(f"有一夹子钢坯放置进了高线辊道")
  125. self.sender.host_send("6", tmp, "高线", craneNo, self.billets_from[craneNo])
  126. elif areaNo == "601堆垛":
  127. self.logger.info(f"有一夹子钢坯放置进了601堆垛")