Selaa lähdekoodia

代码整合与优化

oldwine 4 kuukautta sitten
vanhempi
sitoutus
46864150b7
7 muutettua tiedostoa jossa 175 lisäystä ja 18 poistoa
  1. 1 0
      conf/5#nodes.csv
  2. 6 0
      conf/6#nodes.csv
  3. 12 1
      main.py
  4. 17 17
      models/data_checker.py
  5. 121 0
      models/data_forward.py
  6. 14 0
      models/data_sender.py
  7. 4 0
      utils/s7data.py

+ 1 - 0
conf/5#nodes.csv

@@ -114,3 +114,4 @@ L6
 L7短尺,int,102,14,0,2,TRUE,FALSE,500,6
 L8短尺,int,102,16,0,2,TRUE,FALSE,500,6
 车1车厢夹数,int,306,28,0,2,TRUE,FALSE,500,7
+爬坡监测点,boollist,105,38,0,1,TRUE,FALSE,500,7

+ 6 - 0
conf/6#nodes.csv

@@ -56,3 +56,9 @@ L5
 L6短尺,int,201,22,0,2,TRUE,FALSE,500,3
 L7短尺,int,201,24,0,2,TRUE,FALSE,500,3
 L8短尺,int,201,26,0,2,TRUE,FALSE,500,3
+步进冷床堆垛高度,int,302,2,0,2,TRUE,FALSE,500,4
+步进冷床顶层组数,int,302,4,0,2,TRUE,FALSE,500,4
+步进冷床各组数量,int_list,302,6,0,24,TRUE,FALSE,500,4
+步进冷床摆放方式,int,302,30,0,2,TRUE,FALSE,500,4
+步进冷床行车状态,int,302,32,0,2,TRUE,FALSE,500,4
+步进冷床更新信号,bool,302,34,0,1,TRUE,FALSE,500,4

+ 12 - 1
main.py

@@ -4,6 +4,7 @@ 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.data_forward import *
 from models.parking import Parking
 from models.overhead_crane import Crane
 from models.data_checker import Checker
@@ -132,4 +133,14 @@ checker.async_start_check()
 # 自动交班服务
 
 banci_5 = Banci(data_5, sender, logger_5, '5')
-banci_6 = Banci(data_6, sender, logger_6, '6')
+banci_6 = Banci(data_6, sender, logger_6, '6')
+
+
+##############################################################
+# 数据转发服务
+
+forward_5 = Forward(data_5, sender, True, '5')
+forward_5.start_auto_forward()
+
+forward_6 = Forward(data_6, sender, False, '6')
+forward_6.start_auto_forward()

+ 17 - 17
models/data_checker.py

@@ -12,28 +12,28 @@ class Checker:
 
         self.policy_5 = {
             # 信号: [无响应报警间隔, 信号描述, 信号名称, 处理方法]
-            '定尺看门狗1': [60, '5#机1-4流定尺数据', '定尺信号', '立刻排查通信'],
-            '定尺看门狗2': [60, '5#机5-8流定尺数据', '定尺信号', '立刻排查通信'],
+            '定尺看门狗1': [120, '5#机1-4流定尺数据', '定尺信号', '立刻排查通信'],
+            '定尺看门狗2': [120, '5#机5-8流定尺数据', '定尺信号', '立刻排查通信'],
             '推钢机激光': [1800, '5#机组坯、装运等除直轧外所有数据', '推钢机信号', '排查停机、plc内信号响应'],
             ('天车A1位置', '天车A2位置', '天车A3位置'): [600, '所有天车吊运钢坯数据', '天车位置信号', '立刻排查plc内信号,小概率是停机导致'],
-            '车位1视觉看门狗': [60, '5#机车位1到站离站信号、车厢数据', '车位1信号', '立刻排查通信、识别软件是否启动'],
-            '车位2视觉看门狗': [60, '5#机车位2到站离站信号、车厢数据', '车位2信号', '立刻排查通信、识别软件是否启动'],
-            '车位3视觉看门狗': [60, '5#机车位3到站离站信号、车厢数据', '车位3信号', '立刻排查通信、识别软件是否启动'],
-            '车位4视觉看门狗': [60, '5#机车位4到站离站信号、车厢数据', '车位4信号', '立刻排查通信、识别软件是否启动'],
-            '车位1车牌看门狗': [60, '5#机车位1车牌识别', '车位1车牌识别', '立刻排查通信、识别软件是否启动'],
-            '车位2车牌看门狗': [60, '6#机车位2车牌识别', '车位2车牌识别', '立刻排查通信、识别软件是否启动'],
-            '车位3车牌看门狗': [60, '6#机车位3车牌识别', '车位3车牌识别', '立刻排查通信、识别软件是否启动'],
-            '车位4车牌看门狗': [60, '6#机车位4车牌识别', '车位4车牌识别', '立刻排查通信、识别软件是否启动'],
-            ('L1切割信号[1]', 'L2切割信号[1]', 'L3切割信号[1]', 'L4切割信号[1]'): [600, '5#机1-4流切割数据', '液压剪信号', '立刻排查停机/通信异常'],
-            ('L5切割信号[1]', 'L6切割信号[1]', 'L7切割信号[1]', 'L8切割信号[1]'): [600, '5#机5-8流切割数据', '液压剪信号', '立刻排查停机/通信异常']
+            '车位1视觉看门狗': [120, '5#机车位1到站离站信号、车厢数据', '车位1信号', '立刻排查通信、识别软件是否启动'],
+            '车位2视觉看门狗': [120, '5#机车位2到站离站信号、车厢数据', '车位2信号', '立刻排查通信、识别软件是否启动'],
+            '车位3视觉看门狗': [120, '5#机车位3到站离站信号、车厢数据', '车位3信号', '立刻排查通信、识别软件是否启动'],
+            '车位4视觉看门狗': [120, '5#机车位4到站离站信号、车厢数据', '车位4信号', '立刻排查通信、识别软件是否启动'],
+            '车位1车牌看门狗': [120, '5#机车位1车牌识别', '车位1车牌识别', '立刻排查通信、识别软件是否启动'],
+            '车位2车牌看门狗': [120, '6#机车位2车牌识别', '车位2车牌识别', '立刻排查通信、识别软件是否启动'],
+            '车位3车牌看门狗': [120, '6#机车位3车牌识别', '车位3车牌识别', '立刻排查通信、识别软件是否启动'],
+            '车位4车牌看门狗': [120, '6#机车位4车牌识别', '车位4车牌识别', '立刻排查通信、识别软件是否启动'],
+            ('L1切割信号[1]', 'L2切割信号[1]', 'L3切割信号[1]', 'L4切割信号[1]'): [1200, '5#机1-4流切割数据', '液压剪信号', '立刻排查停机/通信异常'],
+            ('L5切割信号[1]', 'L6切割信号[1]', 'L7切割信号[1]', 'L8切割信号[1]'): [1200, '5#机5-8流切割数据', '液压剪信号', '立刻排查停机/通信异常']
         }
 
         self.policy_6 = {
-            '定尺看门狗1': [60, '6#机1-4流定尺数据', '定尺信号', '立刻排查通信'],
-            '定尺看门狗2': [60, '6#机5-8流定尺数据', '定尺信号', '立刻排查通信'],
-            '推钢机激光': [300, '6#机钢坯基础信息、组坯等所有数据', '推钢机信号', '排查停机、plc内信号响应'],
-            ('L1切割信号[1]', 'L2切割信号[1]', 'L3切割信号[1]', 'L4切割信号[1]'): [600, '6#机1-4流切割数据', '液压剪信号', '立刻排查停机/通信异常'],
-            ('L5切割信号[1]', 'L6切割信号[1]', 'L7切割信号[1]', 'L8切割信号[1]'): [600, '6#机5-8流切割数据', '液压剪信号', '立刻排查停机/通信异常']
+            '定尺看门狗1': [120, '6#机1-4流定尺数据', '定尺信号', '立刻排查通信'],
+            '定尺看门狗2': [120, '6#机5-8流定尺数据', '定尺信号', '立刻排查通信'],
+            '推钢机激光': [1200, '6#机钢坯基础信息、组坯等所有数据', '推钢机信号', '排查停机、plc内信号响应'],
+            ('L1切割信号[1]', 'L2切割信号[1]', 'L3切割信号[1]', 'L4切割信号[1]'): [1200, '6#机1-4流切割数据', '液压剪信号', '立刻排查停机/通信异常'],
+            ('L5切割信号[1]', 'L6切割信号[1]', 'L7切割信号[1]', 'L8切割信号[1]'): [1200, '6#机5-8流切割数据', '液压剪信号', '立刻排查停机/通信异常']
         }
 
         self.time_5 = {}

+ 121 - 0
models/data_forward.py

@@ -0,0 +1,121 @@
+from utils.s7data import *
+from models.data_sender import *
+from utils.statepoint import *
+import copy
+
+class Forward:
+    def __init__(self, data_s7: S7data, sender: Sender, crane_flag: bool, ccmNo: str):
+        self.data_s7 = data_s7
+        self.sender = sender
+        self.crane_flag = crane_flag
+        self.ccmNo = ccmNo
+
+        self.billet_position_list = []
+        self.barrier_state_list = []
+        for i in range(8):
+            self.billet_position_list.append(data_s7.make_point(f"L{i+1}坯头位置"))
+            self.barrier_state_list.append(data_s7.make_point(f"L{i+1}挡板"))
+        self.pusher = data_s7.make_point("推钢机激光")
+
+        if self.crane_flag:
+            self.crane_A1 = data_s7.make_point("天车A1位置")
+            self.crane_A2 = data_s7.make_point("天车A2位置")
+            self.crane_A3 = data_s7.make_point("天车A3位置")
+
+            self.roller_one_sig = Through_state_continues3(data_s7.make_point("爬坡监测点[1]"), data_s7.make_point("爬坡监测点[2]"), data_s7.make_point("爬坡监测点[3]"))
+            self.roller_one_sig.set_excite_action(self.roller_one_hostsend)
+
+        self.topic = 'trace/performance/billet/monitor'
+        self.qos = 0
+        self.template = {
+            "type": "",                 # string 钢坯流道,行车,推钢机,辊道,车辆,堆垛
+            "data": {
+                "machine": 0,           # number 如果是流道的话,哪个铸机
+                "channel": 0,           # number 如果是流道的话,第几流
+                "direction": "",        # string 运行方向 up, down, left, right
+                "distance": 0,          # number 运行距离 ,(应该是毫米)
+                "has_billet": False,    # boolean 是否夹起钢坯
+                "position": 0,          # number 车辆位置 , 从上到下,从左到右, 1 | 2 | 3 | 4, 行车位置 , 按图中位置,从左到右, A1 | A2 | A3 | B1 | B2
+                "car_num": "",          # string 车牌号
+                "car_running": "",      # string 车辆运行, in 表示车辆到站, out 车辆离开
+                "billet_stacking": "",  # string 堆垛 501  601  602  604  coolbed(步进冷床)
+                "layers": 0,            # number 堆垛层数
+                "amount": 0             # number 堆垛夹数
+            }
+        }
+
+        self.task_thread = None
+        self.run_flag = False
+
+    def billet_position(self, strandNo, position):
+        tmp = copy.deepcopy(self.template)
+        tmp['type'] = 'channel'
+        tmp['data']['machine'] = self.ccmNo
+        tmp['data']['channel'] = strandNo
+        tmp['data']['direction'] = 'down'
+        tmp['data']['distance'] = position
+        
+        self.sender.mqtt_publish(self.topic, tmp, self.qos)
+
+    def barrier_state(self, strandNo, state):
+        tmp = copy.deepcopy(self.template)
+        tmp['type'] = 'channel_barrier'
+        tmp['data']['machine'] = self.ccmNo
+        tmp['data']['channel'] = strandNo
+        if state:
+            tmp['data']['direction'] = 'down'
+        else:
+            tmp['data']['direction'] = 'up'
+        
+        self.sender.mqtt_publish(self.topic, tmp, self.qos)
+
+    def pusher_position(self, position):
+        tmp = copy.deepcopy(self.template)
+        tmp['type'] = 'steel_pusher'
+        tmp['data']['machine'] = self.ccmNo
+        tmp['data']['distance'] = position
+        
+        self.sender.mqtt_publish(self.topic, tmp, self.qos)
+
+    def overhead_crane_position(self, craneNo, position):
+        tmp = copy.deepcopy(self.template)
+        tmp['type'] = 'train_working'
+        tmp['data']['position'] = craneNo
+        tmp['data']['direction'] = 'left'
+        tmp['data']['distance'] = position
+        tmp['data']['has_billet'] = False
+        
+        self.sender.mqtt_publish(self.topic, tmp, self.qos)
+
+    def roller_one_hostsend(self):
+        tmp = copy.deepcopy(self.template)
+        tmp['type'] = 'roller_one'
+        tmp['data']['has_billet'] = True
+        
+        if self.sender.mqtt_publish(self.topic, tmp, self.qos)[0]:
+            print("发送失败")
+        else:
+            print('发送成功')
+
+    def auto_forward(self):
+        while self.run_flag:
+            for i in range(8):
+                self.billet_position(i+1, self.billet_position_list[i].data)
+                self.barrier_state(i+1, self.barrier_state_list[i].data)
+            self.pusher_position(self.pusher.data)
+            if self.crane_flag:
+                self.overhead_crane_position('A1', self.crane_A1.data)
+                self.overhead_crane_position('A2', self.crane_A2.data)
+                self.overhead_crane_position('A3', self.crane_A3.data)
+            
+            time.sleep(0.5)
+
+    def start_auto_forward(self):
+        if self.task_thread:
+            self.run_flag = False
+            self.task_thread.join()
+        self.run_flag = True
+        if self.crane_flag:
+            self.roller_one_sig.allow_update()
+        self.task_thread = threading.Thread(target=self.auto_forward)
+        self.task_thread.start()

+ 14 - 0
models/data_sender.py

@@ -480,6 +480,20 @@ class Sender:
         self.send('plate_zhagang', tmp)
 
 
+    def mqtt_publish(self, topic, payload, qos=2):
+        if not isinstance(payload, dict):
+            self.logger.error('[SENDER]发送数据非dict类型')
+            raise TypeError(f"Need a dict type but {type(payload)} given.")
+            return False
+        
+        if self.mqtt_cli:
+            if not self.mqtt_cli.is_connected():
+                return False
+            
+            return self.mqtt_cli.publish(topic, json.dumps(payload), qos)
+        else:
+            return False
+
 if __name__ == '__main__':
     import logging
 

+ 4 - 0
utils/s7data.py

@@ -103,6 +103,10 @@ class S7data:
             data = self.node_data[name][2:2+int.from_bytes(self.node_data[name][1:2])].decode('gbk', errors='replace')
         elif self.nodes[name]['type'] == 'wstring':
             data = self.node_data[name][4:].decode(encoding='utf-16be', errors='replace')
+        elif self.nodes[name]['type'] == 'int_list':
+            data = []
+            for i in range(0, int(self.nodes[name]['size']), 2):
+                data.append(snap7.util.get_int(self.node_data[name], i))
         else:
             warnings.warn('暂不支持的类型:' + self.nodes[name]['type'])
             if self.logger: