123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- import logging
- from utils.statepoint import *
- from utils.s7data import *
- from models.data_sender import *
- class Trace_pusher:
- def __init__(self, data_s7: S7data, logger: logging.Logger, sender: Sender, strand_position: list):
- self.data_s7 = data_s7
- self.logger = logger
- self.sender = sender
- self.strands = [[], [], [], [], [], [], [], []]
- self.locks = [threading.Lock() for i in range(8)]
- self.strand_position = strand_position
- self.billets_wait = []
- for i in range(8):
- tmp = self.data_s7.make_point('推钢机激光')
- tmp.allow_update(False)
- tmp.set_state(False)
- self.billets_wait.append(tmp)
-
- self.old_heatNo = "00000000"
- self.current_heatNo = "00000000"
- self.old_heatData = {}
- self.current_heatData = {}
- self.total = 0
- self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
- self.count_lock = threading.Lock()
- self.pusher_left_list = []
- self.pusher_right_list = []
- self.bed_left = []
- self.bed_right = []
- self.pusher_left = data_s7.make_point('推钢机激光')
- self.pusher_right = data_s7.make_point('推钢机激光')
- self.pusher_left.set_convertor(lambda data: data < min(self.strand_position))
- self.pusher_right.set_convertor(lambda data: data > max(self.strand_position))
- self.pusher_left.set_excite_action(lambda: self.arrive_cooling_bed('left'))
- self.pusher_right.set_excite_action(lambda: self.arrive_cooling_bed('right'))
- self.barrier = [
- self.data_s7.make_point('L1挡板'),
- self.data_s7.make_point('L2挡板'),
- self.data_s7.make_point('L3挡板'),
- self.data_s7.make_point('L4挡板'),
- self.data_s7.make_point('L5挡板'),
- self.data_s7.make_point('L6挡板'),
- self.data_s7.make_point('L7挡板'),
- self.data_s7.make_point('L8挡板')
- ]
- for i in range(8):
- self.barrier[i].allow_update(False)
- self.barrier[i].set_state(False)
- self.barrier[i].set_convertor(lambda data: not bool(data))
- self.barrier[i].set_excite_action(lambda i=i: self.barrier_up_action(i))
- self.barrier[i].set_reset_action(lambda i=i: self.logger.debug(f"{i+1}流挡板关闭"))
- self.barrier[i].allow_update()
- def barrier_up_action(self, i):
- with self.locks[i]:
- if self.strands[i]:
- billetData = self.strands[i]
- self.strands[i] = []
- if self.strand_position[i] <= self.pusher_left.data:
- self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机左侧")
- self.pusher_left_list.append(billetData)
- else:
- self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机右侧")
- self.pusher_right_list.append(billetData)
- else:
- self.logger.error(f"[TRACE]{i+1}流挡板打开但挡板后无已计入系统的钢坯")
- return None
-
- def arrive_cooling_bed(self, direc):
- with self.count_lock:
- if direc == 'left':
- if len(self.pusher_left_list) >= 4:
- if len(self.bed_left):
- self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
- self.bed_left = []
-
- self.bed_left.extend(self.pusher_left_list)
- self.pusher_left_list = []
- if len(self.bed_left) >= 4:
- for i in self.bed_left:
- if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
- # 换炉代码
- self.old_heatNo = self.current_heatNo
- self.old_heatData = self.current_heatData
- self.current_heatNo = i[0][:8]
- self.current_heatData = i[1]
- # 上一炉终止信号在这里发
- self.total = 0
- self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
- break
- tmp = self.bed_left
- self.bed_left = []
- self.billet_union(tmp)
- elif direc == 'right':
- if len(self.pusher_right_list) >= 4:
- if len(self.bed_right):
- self.logger.warning(f"有冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
- self.bed_right = []
-
- self.bed_right.extend(self.pusher_right_list)
- self.pusher_right_list = []
- if len(self.bed_right) >= 4:
- for i in self.bed_right:
- if not (i[0].startswith(self.current_heatNo) or i[0].startswith(self.old_heatNo)):
- # 换炉代码
- self.old_heatNo = self.current_heatNo
- self.old_heatData = self.current_heatData
- self.current_heatNo = i[0][:8]
- self.current_heatData = i[1]
- # 上一炉终止信号在这里发
- self.total = 0
- self.strand = [0, 0, 0, 0, 0, 0, 0, 0]
- break
- tmp = self.bed_right
- self.bed_right = []
- self.billet_union(tmp)
- def billet_union(self, billets):
- billetsNo = []
- ccmNo = self.current_heatData['ccmNo']
- for i in billets:
- strandNo = i[0][9]
- self.total += 1
- self.strand[int(strandNo)] += 1
- billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)])
- billetsNo.append(billetNo)
- self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5])
-
- self.logger.info(f"{self.current_heatNo}炉{len(billets)}根钢坯组成了一夹子:{'、'.join(billetsNo)}")
- def data_from_casting(self, i, data):
- with self.locks[i]:
- if self.strands[i]:
- self.logger.warning(f"{i+1}流有未经过挡板的钢坯被后坯顶出系统")
- self.strands[i] = data
- else:
- self.logger.info(f"{i+1}流新增钢坯存储")
- self.strands[i] = data
- # [坯号, 炉次信息, 定尺, 拉速, 开浇时间, 停浇时间]
|