Эх сурвалжийг харах

数据转发功能测试版

oldwine 5 сар өмнө
parent
commit
a4e2b58070

+ 20 - 0
conf/5#nodes.csv

@@ -27,3 +27,23 @@ L5
 L6拉速,real,136,20,0,4,TRUE,FALSE,500
 L7拉速,real,137,20,0,4,TRUE,FALSE,500
 L8拉速,real,138,20,0,4,TRUE,FALSE,500
+推钢机激光,real,360,56,0,4,TRUE,FALSE,500
+L1挡板,bool,131,40,0,1,TRUE,FALSE,500
+L2挡板,bool,132,40,0,1,TRUE,FALSE,500
+L3挡板,bool,133,40,0,1,TRUE,FALSE,500
+L4挡板,bool,134,40,0,1,TRUE,FALSE,500
+L5挡板,bool,135,40,0,1,TRUE,FALSE,500
+L6挡板,bool,136,40,0,1,TRUE,FALSE,500
+L7挡板,bool,137,40,0,1,TRUE,FALSE,500
+L8挡板,bool,138,40,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

+ 17 - 0
conf/6#nodes.csv

@@ -27,3 +27,20 @@ L5
 L6À­ËÙ,real,236,20,0,4,TRUE,FALSE,500
 L7À­ËÙ,real,237,20,0,4,TRUE,FALSE,500
 L8À­ËÙ,real,238,20,0,4,TRUE,FALSE,500
+ÍÆ¸Ö»ú¼¤¹â,real,205,38,0,4,TRUE,FALSE,500
+L1µ²°å,bool,231,40,0,1,TRUE,FALSE,500
+L2µ²°å,bool,232,40,0,1,TRUE,FALSE,500
+L3µ²°å,bool,233,40,0,1,TRUE,FALSE,500
+L4µ²°å,bool,234,40,0,1,TRUE,FALSE,500
+L5µ²°å,bool,235,40,0,1,TRUE,FALSE,500
+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

+ 21 - 10
main.py

@@ -3,6 +3,7 @@ from models.data_sender import Sender
 from utils.s7data import S7data, S7Client
 from utils.mqttdata import Mqttdata, MqttClient
 from utils.logger import Logger
+from models.data_forward import *
 
 
 ##############################################################
@@ -44,15 +45,15 @@ logger_6.info('[PREPARE]6#机PLC连接成功')
 ##############################################################
 # MQTT数据源配置
 
-mqtt_mes = MqttClient('python-mqtt-biller_digitalization', 'readonly', '1qazxsw@')
-mqtt_mes.connect('192.168.12.201', 1883)
-mqtt_mes.loop_start()
-data_mes = Mqttdata()
-data_mes.set_mqtt_client(mqtt_mes)
-logger_5.info('[PREPARE]与MES使用MQTT连接成功')
-logger_6.info('[PREPARE]与MES使用MQTT连接成功')
+# mqtt_mes = MqttClient('python-mqtt-biller_digitalization', 'readonly', '1qazxsw@')
+# mqtt_mes.connect('192.168.12.201', 1883)
+# mqtt_mes.loop_start()
+# data_mes = Mqttdata()
+# 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')
+mqtt_web = MqttClient('python-mqtt-992_test')
 mqtt_web.connect('192.168.0.119', 1883)
 mqtt_web.loop_start()
 data_web = Mqttdata()
@@ -73,6 +74,16 @@ sender.set_mqtt_client(mqtt_web)
 ##############################################################
 # 分炉分坯服务
 
-flfp_5 = Counter(data_mes, data_5, 5, logger_5, sender)
+# flfp_5 = Counter(data_mes, data_5, 5, logger_5, sender)
 
-flfp_6 = Counter(data_mes, data_6, 6, logger_6, sender)
+# flfp_6 = Counter(data_mes, data_6, 6, logger_6, sender)
+
+
+##############################################################
+# 数据转发服务
+
+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()

+ 105 - 0
models/data_forward.py

@@ -0,0 +1,105 @@
+from utils.s7data import *
+from models.data_sender 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.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 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
+        self.task_thread = threading.Thread(target=self.auto_forward)
+        self.task_thread.start()

+ 15 - 1
models/data_sender.py

@@ -73,7 +73,7 @@ class Sender:
         self.logger.debug(f"[SENDER]{purpose}:{payload}")
         
         if self.mqtt_cli:
-            if not self.mqtt_cli.is_connected:
+            if not self.mqtt_cli.is_connected():
                 self.logger.error('[SENDER]MQTT:发送失败,MQTT未连接')
 
             if self.mqtt_cli.publish(self.topic[purpose], json.dumps(payload), qos)[0]:
@@ -176,6 +176,20 @@ class Sender:
         self._billet[heat_data.get('heatNo', '')+str(heatnoIndex)] = tmp
         self.send('billet_add', 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__':
     mqttcli = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, 'python-mqtt-992-sender_test')
     mqttcli.username_pw_set('admin', '123456')

+ 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':