billet_trace_pusher.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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):
  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.billets_wait = []
  14. for i in range(8):
  15. tmp = self.data_s7.make_point('推钢机激光')
  16. tmp.allow_update(False)
  17. tmp.set_state(False)
  18. self.billets_wait.append(tmp)
  19. self.old_heatNo = "00000000"
  20. self.current_heatNo = "00000000"
  21. self.old_heatData = {}
  22. self.current_heatData = {}
  23. self.total = 0
  24. self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
  25. self.count_lock = threading.Lock()
  26. self.pusher_left_list = []
  27. self.pusher_right_list = []
  28. self.bed_left = []
  29. self.bed_right = []
  30. self.pusher_left = data_s7.make_point('推钢机激光')
  31. self.pusher_right = data_s7.make_point('推钢机激光')
  32. self.pusher_left.set_convertor(lambda data: data < min(self.strand_position))
  33. self.pusher_right.set_convertor(lambda data: data > max(self.strand_position))
  34. self.pusher_left.set_excite_action(lambda: self.arrive_cooling_bed('left'))
  35. self.pusher_right.set_excite_action(lambda: self.arrive_cooling_bed('right'))
  36. self.barrier = [
  37. self.data_s7.make_point('L1挡板'),
  38. self.data_s7.make_point('L2挡板'),
  39. self.data_s7.make_point('L3挡板'),
  40. self.data_s7.make_point('L4挡板'),
  41. self.data_s7.make_point('L5挡板'),
  42. self.data_s7.make_point('L6挡板'),
  43. self.data_s7.make_point('L7挡板'),
  44. self.data_s7.make_point('L8挡板')
  45. ]
  46. for i in range(8):
  47. self.barrier[i].allow_update(False)
  48. self.barrier[i].set_state(False)
  49. self.barrier[i].set_convertor(lambda data: not bool(data))
  50. self.barrier[i].set_excite_action(lambda i=i: self.barrier_up_action(i))
  51. self.barrier[i].set_reset_action(lambda i=i: self.logger.debug(f"{i+1}流挡板关闭"))
  52. self.barrier[i].allow_update()
  53. def barrier_up_action(self, i):
  54. with self.locks[i]:
  55. if self.strands[i]:
  56. billetData = self.strands[i]
  57. self.strands[i] = []
  58. if self.strand_position[i] <= self.pusher_left.data:
  59. self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机左侧")
  60. self.pusher_left_list.append(billetData)
  61. else:
  62. self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机右侧")
  63. self.pusher_right_list.append(billetData)
  64. else:
  65. self.logger.error(f"[TRACE]{i+1}流挡板打开但挡板后无已计入系统的钢坯")
  66. return None
  67. def arrive_cooling_bed(self, direc):
  68. with self.count_lock:
  69. if direc == 'left':
  70. if len(self.pusher_left_list) >= 4:
  71. if len(self.bed_left):
  72. self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
  73. self.bed_left = []
  74. self.bed_left.extend(self.pusher_left_list)
  75. self.pusher_left_list = []
  76. if len(self.bed_left) >= 4:
  77. for i in self.bed_left:
  78. if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
  79. # 换炉代码
  80. self.old_heatNo = self.current_heatNo
  81. self.old_heatData = self.current_heatData
  82. self.current_heatNo = i[0][:8]
  83. self.current_heatData = i[1]
  84. # 上一炉终止信号在这里发
  85. self.total = 0
  86. self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
  87. break
  88. tmp = self.bed_left
  89. self.bed_left = []
  90. self.billet_union(tmp)
  91. elif direc == 'right':
  92. if len(self.pusher_right_list) >= 4:
  93. if len(self.bed_right):
  94. self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
  95. self.bed_right = []
  96. self.bed_right.extend(self.pusher_right_list)
  97. self.pusher_right_list = []
  98. if len(self.bed_right) >= 4:
  99. for i in self.bed_right:
  100. if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
  101. # 换炉代码
  102. self.old_heatNo = self.current_heatNo
  103. self.old_heatData = self.current_heatData
  104. self.current_heatNo = i[0][:8]
  105. self.current_heatData = i[1]
  106. # 上一炉终止信号在这里发
  107. self.total = 0
  108. self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
  109. break
  110. tmp = self.bed_right
  111. self.bed_right = []
  112. self.billet_union(tmp)
  113. def billet_union(self, billets):
  114. billetsNo = []
  115. ccmNo = self.current_heatData['ccmNo']
  116. for i in billets:
  117. strandNo = i[0][9]
  118. self.total += 1
  119. self.strand[int(strandNo)] += 1
  120. billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)])
  121. billetsNo.append(billetNo)
  122. self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5])
  123. self.logger.info(f"{self.current_heatNo}炉{len(billets)}根钢坯组成了一夹子:{'、'.join(billetsNo)}")
  124. def data_from_casting(self, i, data):
  125. with self.locks[i]:
  126. if self.strands[i]:
  127. self.logger.warning(f"{i+1}流有未经过挡板的钢坯被后坯顶出系统")
  128. self.strands[i] = data
  129. else:
  130. self.logger.info(f"{i+1}流新增钢坯存储")
  131. self.strands[i] = data
  132. # [坯号, 炉次信息, 定尺, 拉速, 开浇时间, 停浇时间]