Bläddra i källkod

组坯逻辑、s7的string更新,新增天车和车位跟踪

oldwine 4 månader sedan
förälder
incheckning
e934716416
6 ändrade filer med 254 tillägg och 50 borttagningar
  1. 16 0
      conf/5#nodes.csv
  2. 20 3
      main.py
  3. 58 46
      models/billet_trace_pusher.py
  4. 115 0
      models/overhead_crane.py
  5. 44 0
      models/parking.py
  6. 1 1
      utils/s7data.py

+ 16 - 0
conf/5#nodes.csv

@@ -48,3 +48,19 @@ L8
 天车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
+车1自动触发信号,bool,310,46,0,1,TRUE,FALSE,500
+车1手动触发信号,bool,310,46,1,1,TRUE,FALSE,500
+车1自动触发结果,string,310,2,0,22,TRUE,FALSE,500
+车1手动触发结果,string,310,24,0,22,TRUE,FALSE,500
+车2自动触发信号,bool,311,46,0,1,TRUE,FALSE,500
+车2手动触发信号,bool,311,46,1,1,TRUE,FALSE,500
+车2自动触发结果,string,311,2,0,22,TRUE,FALSE,500
+车2手动触发结果,string,311,24,0,22,TRUE,FALSE,500
+车3自动触发信号,bool,312,46,0,1,TRUE,FALSE,500
+车3手动触发信号,bool,312,46,1,1,TRUE,FALSE,500
+车3自动触发结果,string,312,2,0,22,TRUE,FALSE,500
+车3手动触发结果,string,312,24,0,22,TRUE,FALSE,500
+车4自动触发信号,bool,313,46,0,1,TRUE,FALSE,500
+车4手动触发信号,bool,313,46,1,1,TRUE,FALSE,500
+车4自动触发结果,string,313,2,0,22,TRUE,FALSE,500
+车4手动触发结果,string,313,24,0,22,TRUE,FALSE,500

+ 20 - 3
main.py

@@ -4,7 +4,8 @@ from models.billet_trace_pusher import Trace_pusher
 from utils.s7data import S7data, S7Client
 from utils.mqttdata import Mqttdata, MqttClient
 from utils.logger import Logger
-
+from models.parking import Parking
+from models.overhead_crane import Crane
 
 ##############################################################
 # 日志配置
@@ -21,6 +22,10 @@ logger_sender = Logger('sender')
 logger_sender.file_on('logs/sender_log.log')
 logger_sender.screen_on()
 
+logger_trace = Logger('trace')
+logger_trace.file_on('logs/trace_log.log')
+logger_trace.screen_on()
+
 
 ##############################################################
 # S7数据源配置
@@ -45,7 +50,7 @@ logger_6.info('[PREPARE]6#机PLC连接成功')
 ##############################################################
 # MQTT数据源配置
 
-mqtt_mes = MqttClient('python-mqtt-biller_digitalization_test3', 'readonly', '1qazxsw@')
+mqtt_mes = MqttClient('python-mqtt-biller_digitalization_test333', 'readonly', '1qazxsw@')
 mqtt_mes.connect('192.168.12.201', 1883)
 mqtt_mes.loop_start()
 data_mes = Mqttdata()
@@ -53,7 +58,7 @@ data_mes.set_mqtt_client(mqtt_mes)
 logger_5.info('[PREPARE]与MES使用MQTT连接成功')
 logger_6.info('[PREPARE]与MES使用MQTT连接成功')
 
-mqtt_web = MqttClient('python-mqtt-992_test3')
+mqtt_web = MqttClient('python-mqtt-992_test333')
 mqtt_web.connect('192.168.0.119', 1883)
 mqtt_web.loop_start()
 data_web = Mqttdata()
@@ -82,3 +87,15 @@ pusher_6 = Trace_pusher(data_6, logger_6, sender, position_6)
 
 flfp_5 = Counter(data_mes, data_5, 5, logger_5, sender, pusher_5)
 flfp_6 = Counter(data_mes, data_6, 6, logger_6, sender, pusher_6)
+
+
+##############################################################
+# 停车位检测服务
+
+parking = Parking(data_5, sender)
+
+
+##############################################################
+# 天车跟踪服务
+
+crane = Crane(data_5, pusher_5, pusher_6, parking, sender, logger_trace)

+ 58 - 46
models/billet_trace_pusher.py

@@ -28,8 +28,8 @@ class Trace_pusher:
         self.pusher_left_list = []
         self.pusher_right_list = []
 
-        self.bed_left = [[], []]
-        self.bed_right = [[], []]
+        self.bed_left = [[], [], []]
+        self.bed_right = [[], [], []]
 
         self.pusher_left = data_s7.make_point('推钢机激光')
         self.pusher_right = data_s7.make_point('推钢机激光')
@@ -213,51 +213,47 @@ class Trace_pusher:
 
     def billet_to_bed(self, billets, direc):
         if direc == 'left':
-            if self.bed_left[0]:
-                if len(billets) >= 4:
-                    if self.bed_left[1]:
-                        self.logger.error(f"组坯冲突!")
-                    self.billet_to_bed_impl(billets, self.bed_left, 1)
-                else:
-                    if len(self.bed_left[1]) == 0 and len(self.bed_left[0]) + len(billets) <= 4:
-                        self.billet_to_bed_impl(billets, self.bed_left, 0)
-                    elif len(self.bed_left[1]) + len(billets) <= 4:
-                        self.billet_to_bed_impl(billets, self.bed_left, 1)
-                    else:
-                        self.logger.error(f"组坯冲突!")
-                        self.billet_to_bed_impl(billets, self.bed_left, 1)
-            else:
-                self.billet_to_bed_impl(billets, self.bed_left, 0)
-
-            self.logger.debug(f"左侧冷床目前情况:{len(self.bed_left[0])}根|{len(self.bed_left[1])}根")
+            self.billet_to_bed_impl(billets, self.bed_left)
+            self.logger.debug(f"左侧冷床目前情况:{len(self.bed_left[0])}根|{len(self.bed_left[1])}根|{len(self.bed_left[2])}根")
         elif direc == 'right':
-            if self.bed_right[0]:
-                if len(billets) >= 4:
-                    if self.bed_right[1]:
-                        self.logger.error(f"组坯冲突!")
-                    self.billet_to_bed_impl(billets, self.bed_right, 1)
-                else:
-                    if len(self.bed_right[1]) == 0 and len(self.bed_right[0]) + len(billets) <= 4:
-                        self.billet_to_bed_impl(billets, self.bed_right, 0)
-                    elif len(self.bed_right[1]) + len(billets) <= 4:
-                        self.billet_to_bed_impl(billets, self.bed_right, 1)
-                    else:
-                        self.logger.error(f"组坯冲突!")
-                        self.billet_to_bed_impl(billets, self.bed_right, 1)
+            self.billet_to_bed_impl(billets, self.bed_right)
+            self.logger.debug(f"右侧冷床目前情况:{len(self.bed_right[2])}根|{len(self.bed_right[1])}根|{len(self.bed_right[0])}根")
+
+
+    def billet_to_bed_impl(self, billets: list, dst: list):
+        i = 0
+        count = 0
+        while i < len(dst) and dst[i]:
+            count += 1
+
+        if count == 0:
+            dst[0].extend(billets)
+        elif count == 3 and len(billets) >= 4:
+            self.logger.error(f"组坯异常!")
+            flag = False
+            for j in dst:
+                if len(j) < 4:
+                    flag = True
+                    dst.remove(j)
+                    break
+            if flag:
+                dst.append(billets)
             else:
-                self.billet_to_bed_impl(billets, self.bed_right, 0)
-            self.logger.debug(f"右侧冷床目前情况:{len(self.bed_right[1])}根|{len(self.bed_right[0])}根")
-
+                dst.remove(dst[0])
+                dst.append(billets)
+            count -= 1
+        elif count == 3 and len(dst[count-1]) + len(billets) > 4:
+            self.logger.error(f"组坯异常!")
+            dst[count-1].extend(billets)
+            count -= 1
+        elif len(billets) >= 4:
+            dst[count].extend(billets)
+        else:
+            dst[count-1].extend(billets)
+            count -= 1
 
-    def billet_to_bed_impl(self, billets: list, dst: list, index):
-        dst[index].extend(billets)
-        if len(dst[index]) >= 4:
-            self.billet_union(dst[index])
-            # 此处加入天车模块时删掉
-            dst[index].clear()
-            if index == 0:
-                dst[0] = dst[1]
-                dst[1] = []
+        if len(dst[count]) >= 4:
+            self.billet_union(dst[count])
 
 
     def billet_union(self, billets):
@@ -326,8 +322,24 @@ class Trace_pusher:
         with self.count_lock:
             self.pusher_left_list = []
             self.pusher_right_list = []
-            self.bed_left = [[], []]
-            self.bed_right = [[], []]
+            self.bed_left = [[], [], []]
+            self.bed_right = [[], [], []]
+
+    def get_billet(self, direc):
+        if direc == "left":
+            return self.get_billet_action(self.bed_left)
+        if direc == "right":
+            return self.get_billet_action(self.bed_right)
+        
+    def get_billet_action(self, src):
+        for i in range(len(src)-1, -1, -1):
+            if len(src[i]) >= 4:
+                tmp = [j[0] for j in src[i]]
+                src[i] = []
+                return tmp
+        
+        return []
+
 
 
 # [坯号, 炉次信息, 定尺, 拉速, 开切时间, 停切时间]

+ 115 - 0
models/overhead_crane.py

@@ -0,0 +1,115 @@
+import time, threading
+from utils.s7data import S7data
+from utils.logger import Logger
+from models.billet_trace_pusher import Trace_pusher
+from models.parking import Parking
+from models.data_sender import Sender
+
+class Crane:
+    def __init__(self, data_s7: S7data, tracer_5: Trace_pusher, tracer_6: Trace_pusher, parking: Parking, sender: Sender, logger: Logger):
+        self.data = data_s7
+        self.tracer_5 = tracer_5
+        self.tracer_6 = tracer_6
+        self.parking = parking
+        self.sender = sender
+        self.logger = logger
+
+        self.cranes = {
+            "A1": self.data.make_point("天车A1位置"),
+            "A2": self.data.make_point("天车A2位置"),
+            "A3": self.data.make_point("天车A3位置")
+        }
+
+        self.billetsNo = {
+            "A1": "",
+            "A2": "",
+            "A3": ""
+        }
+
+        self.areas = {
+            "6#coolbed1": [35000, 38500],
+            "6#coolbed2": [22000, 24000],
+            "car3": [2000, 4000],
+            "highline": [60300, 62300]
+        }
+
+        self.threads_poor = [
+            threading.Thread(target=self.area_producer, args=("6#coolbed1",)),
+            threading.Thread(target=self.area_producer, args=("6#coolbed2",)),
+            threading.Thread(target=self.area_consumer, args=("car3",)),
+            threading.Thread(target=self.area_consumer, args=("highline",))
+        ]
+
+        for i in self.threads_poor:
+            i.start()
+
+    def scan_crane(self, areaNo):
+        start = self.areas[areaNo][0]
+        end = self.areas[areaNo][1]
+        while True:
+            for key, value in self.cranes.items():
+                if start <= value.data <= end:
+                    return key
+            time.sleep(0.5)
+
+    def crane_leave(self, craneNo, areaNo):
+        start = self.areas[areaNo][0]
+        end = self.areas[areaNo][1]
+        while True:
+            if self.cranes[craneNo].data < start or self.cranes[craneNo].data > end:
+                return True
+            time.sleep(0.5)
+            
+    def area_producer(self, areaNo):
+        while True:
+            craneNo = self.scan_crane(areaNo)
+            self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
+
+            if self.billetsNo[craneNo] == "":
+                self.logger.debug(f"天车{craneNo}正在等待或尝试夹起钢坯")
+                self.get_billet(craneNo, areaNo)
+                self.logger.debug(f"天车{craneNo}获取到钢坯")
+            else:
+                self.logger.debug(f"天车{craneNo}有未卸下的钢坯")
+
+            self.crane_leave(craneNo, areaNo)
+            self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
+            time.sleep(1)
+
+    def area_consumer(self, areaNo):
+        while True:
+            craneNo = self.scan_crane(areaNo)
+            self.logger.debug(f"天车{craneNo}进入区域{areaNo}")
+
+            if self.billetsNo[craneNo] == "":
+                self.logger.debug(f"天车{craneNo}未携带钢坯")
+            else:
+                self.logger.debug(f"天车{craneNo}正在等待或尝试卸下钢坯")
+                self.unload_billet(craneNo, areaNo)
+
+            self.crane_leave(craneNo, areaNo)
+            self.logger.debug(f"天车{craneNo}离开区域{areaNo}")
+            time.sleep(1)
+
+    def get_billet(self, craneNo, areaNo):
+        # 阻塞获取
+        tmp = []
+        while not bool(tmp):
+            if areaNo == "6#coolbed1":
+                tmp = self.tracer_6.get_billet("left")
+            elif areaNo == "6#coolbed2":
+                tmp = self.tracer_6.get_billet("right")
+        
+        self.billetsNo[craneNo] = ','.join(tmp)
+        return tmp
+
+    def unload_billet(self, craneNo, areaNo):
+        # 直接放下
+        tmp = self.billetsNo[craneNo]
+        self.billetsNo[craneNo] = ""
+        if areaNo == "car3":
+            self.logger.info(f"有一夹子钢坯放置进了车位3")
+            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()))
+        elif areaNo == "highline":
+            self.logger.info(f"有一夹子钢坯放置进了高线辊道")
+            self.sender.host_send("6", tmp, "高线", craneNo)

+ 44 - 0
models/parking.py

@@ -0,0 +1,44 @@
+import threading
+from utils.s7data import S7data
+from models.data_sender import Sender
+
+class Parking:
+    def __init__(self, data_s7: S7data, sender: Sender):
+        self.sender = sender
+
+        self.ccmNo_list = ["5", "6", "6", "6"]
+
+        self.auto_trigger = []
+        self.manual_trigger = []
+        self.value_a = []
+        self.value_m = []
+
+        self.lock = threading.Lock()
+        self.current_car = ["", "", "", ""]
+
+        self.plate_set = {'厂内00664', '厂内00415', '厂内00687', '厂内00701', '厂内00700', '厂内00901', '厂内00699', '厂内00695', '厂内00694', '厂内00693', '厂内00692', '厂内00902', '厂内00690', '厂内00689', '陕E08582D', '陕E08515D', '陕E08000D', '陕E00298D'}
+
+        for name in range(4):
+            tmp = data_s7.make_point(f"车{name+1}自动触发信号")
+            tmp.set_excite_action(lambda i=name: self.signal_on(i, 0))
+            self.auto_trigger.append(tmp)
+
+            tmp = data_s7.make_point(f"车{name+1}手动触发信号")
+            tmp.set_excite_action(lambda i=name: self.signal_on(i, 1))
+            self.manual_trigger.append(tmp)
+
+            self.value_a.append(data_s7.make_point(f"车{name+1}自动触发结果"))
+            self.value_m.append(data_s7.make_point(f"车{name+1}手动触发结果"))
+
+
+    def signal_on(self, i, manual_flag):
+        if manual_flag:
+            valuedata = self.value_m[i]
+        else:
+            valuedata = self.value_a[i]
+
+        with self.lock:
+            if self.current_car[i] != valuedata.data:
+                self.current_car[i] = valuedata.data
+                self.sender.car_add(self.ccmNo_list[i], str(i+1), self.current_car[i])
+            

+ 1 - 1
utils/s7data.py

@@ -43,7 +43,7 @@ class S7data:
         elif self.nodes[name]['type'] == 'real':
             data = snap7.util.get_real(self.node_data[name], 0)
         elif self.nodes[name]['type'] == 'string':
-            data = name, snap7.util.get_string(self.node_data[name], 0)
+            data = self.node_data[name][2:2+int.from_bytes(self.node_data[name][1:2])].decode('gbk')
         elif self.nodes[name]['type'] == 'wstring':
             data = self.node_data[name][4:].decode(encoding='utf-16be')
         else: