Просмотр исходного кода

修改判断逻辑为坯头位置,修bug(稳定)

oldwine 5 месяцев назад
Родитель
Сommit
9809a34a2a
4 измененных файлов с 114 добавлено и 25 удалено
  1. 11 0
      conf/5#nodes.csv
  2. 8 0
      conf/6#nodes.csv
  3. 93 25
      models/billet_trace_pusher.py
  4. 2 0
      utils/s7data.py

+ 11 - 0
conf/5#nodes.csv

@@ -37,3 +37,14 @@ L6
 L7挡板,bool,137,40,0,1,TRUE,FALSE,500
 L8挡板,bool,138,40,0,1,TRUE,FALSE,500
 热送挡板,boollist,130,72,0,1,TRUE,FALSE,500
+L1坯头位置,int,100,2,0,2,TRUE,FALSE,500
+L2坯头位置,int,100,4,0,2,TRUE,FALSE,500
+L3坯头位置,int,100,6,0,2,TRUE,FALSE,500
+L4坯头位置,int,100,8,0,2,TRUE,FALSE,500
+L5坯头位置,int,101,2,0,2,TRUE,FALSE,500
+L6坯头位置,int,101,4,0,2,TRUE,FALSE,500
+L7坯头位置,int,101,6,0,2,TRUE,FALSE,500
+L8坯头位置,int,101,8,0,2,TRUE,FALSE,500
+天车A1位置,dint,360,100,0,4,TRUE,FALSE,500
+天车A2位置,dint,360,104,0,4,TRUE,FALSE,500
+天车A3位置,dint,360,108,0,4,TRUE,FALSE,500

+ 8 - 0
conf/6#nodes.csv

@@ -36,3 +36,11 @@ L5
 L6µ²°å,bool,236,40,0,1,TRUE,FALSE,500
 L7µ²°å,bool,237,40,0,1,TRUE,FALSE,500
 L8µ²°å,bool,238,40,0,1,TRUE,FALSE,500
+L1Å÷ͷλÖÃ,int,200,2,0,2,TRUE,FALSE,500
+L2Å÷ͷλÖÃ,int,200,4,0,2,TRUE,FALSE,500
+L3Å÷ͷλÖÃ,int,200,6,0,2,TRUE,FALSE,500
+L4Å÷ͷλÖÃ,int,200,8,0,2,TRUE,FALSE,500
+L5Å÷ͷλÖÃ,int,201,2,0,2,TRUE,FALSE,500
+L6Å÷ͷλÖÃ,int,201,4,0,2,TRUE,FALSE,500
+L7Å÷ͷλÖÃ,int,201,6,0,2,TRUE,FALSE,500
+L8Å÷ͷλÖÃ,int,201,8,0,2,TRUE,FALSE,500

+ 93 - 25
models/billet_trace_pusher.py

@@ -8,7 +8,8 @@ class Trace_pusher:
         self.data_s7 = data_s7
         self.logger = logger
         self.sender = sender
-        self.strands = [[], [], [], [], [], [], [], []]
+        self.strands_cutting = [[], [], [], [], [], [], [], []]
+        self.strands_buffer = [[], [], [], [], [], [], [], []]
         self.locks = [threading.Lock() for i in range(8)]
         self.strand_position = strand_position
         self.hostsend_flag = hostsend_flag
@@ -35,6 +36,27 @@ class Trace_pusher:
         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.billet_out = [[], [], [], [], [], [], [], []]
+
+        self.length_cutting = []
+        for i in range(8):
+            self.length_cutting.append(self.data_s7.make_point(f'L{i+1}定尺'))
+
+        self.drawing_speed = []
+        for i in range(8):
+            self.drawing_speed.append(self.data_s7.make_point(f'L{i+1}拉速'))
+
+        self.billet_position = [
+            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坯头位置')
+        ]
+
         self.barrier = [
             self.data_s7.make_point('L1挡板'),
             self.data_s7.make_point('L2挡板'),
@@ -46,6 +68,8 @@ class Trace_pusher:
             self.data_s7.make_point('L8挡板')
         ]
 
+        self.barrier_checker = [False, False, False, False, False, False, False, False]
+
         if self.hostsend_flag:
             self.hostsend_barrier = [
                 self.data_s7.make_point('热送挡板[0]'),
@@ -59,12 +83,21 @@ class Trace_pusher:
             ]
 
         for i in range(8):
+            # 坯子出现
+            self.billet_position[i].allow_update(False)
+            self.billet_position[i].set_state(False)
+            self.billet_position[i].set_convertor(lambda data: data > 12000)
+            self.billet_position[i].set_excite_action(lambda i=i: self.billet_out_action(i))
+            self.billet_position[i].set_reset_action(lambda i=i: self.billet_in_buffer_action(i))
+            self.billet_position[i].allow_update()
+            # 挡板抬起
             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].set_reset_action(lambda i=i: self.barrier_down_action(i))
             self.barrier[i].allow_update()
+            # 直轧挡板抬起
             if self.hostsend_flag:
                 self.hostsend_barrier[i].allow_update(False)
                 self.hostsend_barrier[i].set_state(False)
@@ -73,21 +106,47 @@ class Trace_pusher:
                 self.hostsend_barrier[i].set_reset_action(lambda i=i: self.logger.debug(f"{i+1}流热送挡板关闭"))
                 self.hostsend_barrier[i].allow_update()
 
+    def billet_out_action(self, i):
+        # [坯号, 炉次信息, 定尺, 拉速, 开切时间, 停切时间]
+        billetNo = self.current_heatNo + '0' + str(i+1) + '99'
+        sizing = self.length_cutting[i].data
+        speed = self.drawing_speed[i].data
+        self.billet_out[i] = [billetNo, self.current_heatData, sizing, speed, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '']
+
+    def billet_in_buffer_action(self, i):
+        with self.locks[i]:
+            if self.strands_cutting[i]:
+                self.logger.info(f"[TRACE]{i+1}流新增钢坯存储")
+                self.strands_buffer[i] = self.strands_cutting[i]
+                self.strands_cutting[i] = []
+            else:
+                self.logger.info(f"[TRACE]{i+1}流开切漏钢,算法补入")
+                self.strands_buffer[i] = self.billet_out[i]
+            self.billet_out[i] = []
+
+        if self.barrier[i].state and self.barrier_checker[i] == False:
+            self.barrier_up_action(i)
 
     def barrier_up_action(self, i):
         with self.locks[i]:
-            if self.strands[i]:
-                billetData = self.strands[i]
-                self.strands[i] = []
+            if self.strands_buffer[i]:
+                billetData = self.strands_buffer[i]
+                self.strands_buffer[i] = []
                 if self.strand_position[i] <= self.pusher_left.data:
                     self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机左侧")
+                    self.barrier_checker[i] = True
                     self.pusher_left_list.append(billetData)
                 else:
                     self.logger.info(f"[TRACE]{i+1}流钢坯通过挡板进入推钢区域,在推钢机右侧")
+                    self.barrier_checker[i] = True
                     self.pusher_right_list.append(billetData)
-            else:
-                self.logger.error(f"[TRACE]{i+1}流挡板打开但挡板后无已计入系统的钢坯")
-                return None
+            
+    def barrier_down_action(self, i):
+        if self.barrier_checker[i]:
+            self.logger.debug(f"[TRACE]{i+1}流挡板关闭")
+        else:
+            self.logger.error(f"[TRACE]{i+1}流挡板关闭,期间无钢坯流出")
+        self.barrier_checker[i] = False
             
     def hostsend_barrier_up_action(self, i):
         with self.count_lock:
@@ -135,9 +194,10 @@ class Trace_pusher:
             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.logger.warning(f"有左侧冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_left])}")
                         self.bed_left = []
-                    
+                
+                self.logger.debug(f"左侧冷床上推入{len(self.pusher_left_list)}根钢坯")
                 self.bed_left.extend(self.pusher_left_list)
                 self.pusher_left_list = []
                 if len(self.bed_left) >= 4:
@@ -153,9 +213,10 @@ class Trace_pusher:
             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.logger.warning(f"有右侧冷床上的钢坯无法录入:{'、'.join([i[0] for i in self.bed_right])}")
                         self.bed_right = []
                     
+                self.logger.debug(f"右侧冷床上推入{len(self.pusher_right_list)}根钢坯")
                 self.bed_right.extend(self.pusher_right_list)
                 self.pusher_right_list = []
                 if len(self.bed_right) >= 4:
@@ -170,33 +231,40 @@ class Trace_pusher:
 
     def billet_union(self, billets):
         billetsNo = []
-        ccmNo = self.current_heatData['ccmNo']
+        ccmNo = self.current_heatData['ccmNo'] if self.current_heatData else '0'
         for i in billets:
             strandNo = i[0][9]
             self.total += 1
             self.strand[int(strandNo)-1] += 1
             billetNo = self.current_heatNo + ccmNo + strandNo + '{:0>2}'.format(self.strand[int(strandNo)-1])
             billetsNo.append(billetNo)
-            self.sender.billet_upload(self.current_heatData, billetNo, self.total, i[2], i[3], i[4], i[5])
+            if self.current_heatData:
+                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, extend=False):
         with self.locks[i]:
-            if self.strands[i] and self.strands[i][0] != data[0]:
-                self.logger.warning(f"{i+1}流有未经过挡板的钢坯被后坯顶出系统")
-                self.strands[i] = data
-                self.strands[i].append('')
-            elif self.strands[i] and self.strands[i][0] == data[0]:
-                self.logger.info(f"{i+1}流补充了钢坯停切时间")
-                self.strands[i] = data
-            elif extend:
-                self.logger.warning(f"{i+1}流对已经离开的钢坯补充停切时间,无效")
+            if extend:
+                if self.strands_cutting[i] and self.strands_cutting[i][0] == data[0]:
+                    self.logger.info(f"{i+1}流补充了钢坯停切时间")
+                    self.strands_cutting[i] = data
+                elif self.strands_buffer[i] and self.strands_buffer[i][0] == data[0]:
+                    self.logger.info(f"{i+1}流补充了钢坯停切时间")
+                    self.strands_buffer[i] = data
+                else:
+                    self.logger.warning(f"{i+1}流对已经离开的钢坯补充停切时间,无效")
+
             else:
-                self.logger.info(f"{i+1}流新增钢坯存储")
-                self.strands[i] = data
-                self.strands[i].append('')
+                if self.strands_cutting[i]:
+                    self.logger.warning(f"{i+1}流有钢坯开切冲突")
+                    self.strands_cutting[i] = data
+                    self.strands_cutting[i].append('')
+                else:
+                    self.logger.info(f"{i+1}流钢坯开切")
+                    self.strands_cutting[i] = data
+                    self.strands_cutting[i].append('')
 
     def hostsend(self, i):
         ccmNo = self.current_heatData['ccmNo']

+ 2 - 0
utils/s7data.py

@@ -34,6 +34,8 @@ class S7data:
     def send(self, name):
         if self.nodes[name]['type'] == 'int':
             data = snap7.util.get_int(self.node_data[name], 0)
+        elif self.nodes[name]['type'] == 'dint':
+            data = snap7.util.get_dint(self.node_data[name], 0)
         elif self.nodes[name]['type'] == 'bool':
             data = snap7.util.get_bool(self.node_data[name], 0, int(self.nodes[name]['offset']))
         elif self.nodes[name]['type'] == 'boollist':