billet_trace_pusher.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import logging
  2. from utils.statepoint import *
  3. from utils.s7data import *
  4. from models.data_sender import *
  5. class Trace_pusher:
  6. def __init__(self, data_s7: S7data, logger: logging.Logger, sender: Sender, strand_position: list, hostsend_flag=False):
  7. self.data_s7 = data_s7
  8. self.logger = logger
  9. self.sender = sender
  10. self.strands = [[], [], [], [], [], [], [], []]
  11. self.locks = [threading.Lock() for i in range(8)]
  12. self.strand_position = strand_position
  13. self.hostsend_flag = hostsend_flag
  14. self.old_heatNo = "00000000"
  15. self.current_heatNo = "00000000"
  16. self.old_heatData = {}
  17. self.current_heatData = {}
  18. self.total = 0
  19. self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
  20. self.count_lock = threading.Lock()
  21. self.pusher_left_list = []
  22. self.pusher_right_list = []
  23. self.bed_left = []
  24. self.bed_right = []
  25. self.pusher_left = data_s7.make_point('推钢机激光')
  26. self.pusher_right = data_s7.make_point('推钢机激光')
  27. self.pusher_left.set_convertor(lambda data: data < min(self.strand_position))
  28. self.pusher_right.set_convertor(lambda data: data > max(self.strand_position))
  29. self.pusher_left.set_excite_action(lambda: self.arrive_cooling_bed('left'))
  30. self.pusher_right.set_excite_action(lambda: self.arrive_cooling_bed('right'))
  31. self.barrier = [
  32. self.data_s7.make_point('L1挡板'),
  33. self.data_s7.make_point('L2挡板'),
  34. self.data_s7.make_point('L3挡板'),
  35. self.data_s7.make_point('L4挡板'),
  36. self.data_s7.make_point('L5挡板'),
  37. self.data_s7.make_point('L6挡板'),
  38. self.data_s7.make_point('L7挡板'),
  39. self.data_s7.make_point('L8挡板')
  40. ]
  41. if self.hostsend_flag:
  42. self.hostsend_barrier = [
  43. self.data_s7.make_point('热送挡板[0]'),
  44. self.data_s7.make_point('热送挡板[1]'),
  45. self.data_s7.make_point('热送挡板[2]'),
  46. self.data_s7.make_point('热送挡板[3]'),
  47. self.data_s7.make_point('热送挡板[4]'),
  48. self.data_s7.make_point('热送挡板[5]'),
  49. self.data_s7.make_point('热送挡板[6]'),
  50. self.data_s7.make_point('热送挡板[7]'),
  51. ]
  52. for i in range(8):
  53. self.barrier[i].allow_update(False)
  54. self.barrier[i].set_state(False)
  55. self.barrier[i].set_convertor(lambda data: not bool(data))
  56. self.barrier[i].set_excite_action(lambda i=i: self.barrier_up_action(i))
  57. self.barrier[i].set_reset_action(lambda i=i: self.logger.debug(f"{i+1}流挡板关闭"))
  58. self.barrier[i].allow_update()
  59. if self.hostsend_flag:
  60. self.hostsend_barrier[i].allow_update(False)
  61. self.hostsend_barrier[i].set_state(False)
  62. self.hostsend_barrier[i].set_convertor(lambda data: not bool(data))
  63. self.hostsend_barrier[i].set_excite_action(lambda i=i: self.hostsend_barrier_up_action(i))
  64. self.hostsend_barrier[i].set_reset_action(lambda i=i: self.logger.debug(f"{i+1}流热送挡板关闭"))
  65. self.hostsend_barrier[i].allow_update()
  66. def barrier_up_action(self, i):
  67. with self.locks[i]:
  68. if self.strands[i]:
  69. billetData = self.strands[i]
  70. self.strands[i] = []
  71. if self.strand_position[i] <= self.pusher_left.data:
  72. self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机左侧")
  73. self.pusher_left_list.append(billetData)
  74. else:
  75. self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机右侧")
  76. self.pusher_right_list.append(billetData)
  77. else:
  78. self.logger.error(f"[TRACE]{i+1}流挡板打开但挡板后无已计入系统的钢坯")
  79. return None
  80. def hostsend_barrier_up_action(self, i):
  81. with self.count_lock:
  82. gp_tmp = []
  83. if self.strand_position[i] <= self.pusher_left.data:
  84. index = -1
  85. for j in range(len(self.pusher_left_list)-1, -1, -1):
  86. if self.pusher_left_list[j][0][-3] == str(i+1):
  87. index = j
  88. break
  89. if index == -1:
  90. self.logger.warning(f"[TRACE]推钢机左侧未找到{i+1}流的热送钢坯")
  91. else:
  92. gp_tmp = self.pusher_left_list[index]
  93. self.pusher_left_list = self.pusher_left_list[:index] + self.pusher_left_list[index+1:]
  94. else:
  95. index = -1
  96. for j in range(len(self.pusher_right_list)-1, -1, -1):
  97. if self.pusher_right_list[j][0][-3] == str(i+1):
  98. index = j
  99. break
  100. if index == -1:
  101. self.logger.warning(f"[TRACE]推钢机右侧未找到{i+1}流的热送钢坯")
  102. else:
  103. gp_tmp = self.pusher_right_list[index]
  104. self.pusher_right_list = self.pusher_right_list[:index] + self.pusher_right_list[index+1:]
  105. if gp_tmp:
  106. if not (gp_tmp[0].startswith(self.current_heatNo) or gp_tmp[0].startswith(self.old_heatNo)):
  107. self.change_heat(gp_tmp)
  108. self.hostsend(gp_tmp)
  109. def change_heat(self, data):
  110. # 换炉代码
  111. self.old_heatNo = self.current_heatNo
  112. self.old_heatData = self.current_heatData
  113. self.current_heatNo = data[0][:8]
  114. self.current_heatData = data[1]
  115. # 上一炉终止信号在这里发
  116. self.total = 0
  117. self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
  118. def arrive_cooling_bed(self, direc):
  119. with self.count_lock:
  120. if direc == 'left':
  121. if len(self.pusher_left_list) >= 4:
  122. if len(self.bed_left):
  123. self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
  124. self.bed_left = []
  125. self.bed_left.extend(self.pusher_left_list)
  126. self.pusher_left_list = []
  127. if len(self.bed_left) >= 4:
  128. for i in self.bed_left:
  129. if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
  130. self.change_heat(i)
  131. break
  132. tmp = self.bed_left
  133. self.bed_left = []
  134. self.billet_union(tmp)
  135. elif direc == 'right':
  136. if len(self.pusher_right_list) >= 4:
  137. if len(self.bed_right):
  138. self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
  139. self.bed_right = []
  140. self.bed_right.extend(self.pusher_right_list)
  141. self.pusher_right_list = []
  142. if len(self.bed_right) >= 4:
  143. for i in self.bed_right:
  144. if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
  145. self.change_heat(i)
  146. break
  147. tmp = self.bed_right
  148. self.bed_right = []
  149. self.billet_union(tmp)
  150. def billet_union(self, billets):
  151. billetsNo = []
  152. ccmNo = self.current_heatData['ccmNo']
  153. for i in billets:
  154. strandNo = i[0][9]
  155. self.total += 1
  156. self.strand[int(strandNo)-1] += 1
  157. billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)-1])
  158. billetsNo.append(billetNo)
  159. self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5])
  160. self.logger.info(f"{self.current_heatNo}炉{len(billets)}根钢坯组成了一夹子:{'、'.join(billetsNo)}")
  161. def data_from_casting(self, i, data, extend=False):
  162. with self.locks[i]:
  163. if self.strands[i] and self.strands[i][0] != data[0]:
  164. self.logger.warning(f"{i+1}流有未经过挡板的钢坯被后坯顶出系统")
  165. self.strands[i] = data
  166. elif self.strands[i] and self.strands[i][0] == data[0]:
  167. self.logger.info(f"{i+1}流补充了钢坯停切时间")
  168. elif extend:
  169. self.logger.warning(f"{i+1}流对已经离开的钢坯补充停切时间,无效")
  170. else:
  171. self.logger.info(f"{i+1}流新增钢坯存储")
  172. self.strands[i] = data
  173. def hostsend(self, i):
  174. ccmNo = self.current_heatData['ccmNo']
  175. strandNo = i[0][9]
  176. self.total += 1
  177. self.strand[int(strandNo)] += 1
  178. billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)])
  179. self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5])
  180. self.logger.info(f"{self.current_heatNo}炉钢坯热送:{billetNo}")
  181. # [坯号, 炉次信息, 定尺, 拉速, 开浇时间, 停浇时间]