Sfoglia il codice sorgente

数据转发功能测试版

oldwine 5 mesi fa
parent
commit
a4e2b58070
6 ha cambiato i file con 180 aggiunte e 11 eliminazioni
  1. 20 0
      conf/5#nodes.csv
  2. 17 0
      conf/6#nodes.csv
  3. 21 10
      main.py
  4. 105 0
      models/data_forward.py
  5. 15 1
      models/data_sender.py
  6. 2 0
      utils/s7data.py

+ 20 - 0
conf/5#nodes.csv

@@ -27,3 +27,23 @@ L5
 L6拉速,real,136,20,0,4,TRUE,FALSE,500
 L6拉速,real,136,20,0,4,TRUE,FALSE,500
 L7拉速,real,137,20,0,4,TRUE,FALSE,500
 L7拉速,real,137,20,0,4,TRUE,FALSE,500
 L8拉速,real,138,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
 L6À­ËÙ,real,236,20,0,4,TRUE,FALSE,500
 L7À­ËÙ,real,237,20,0,4,TRUE,FALSE,500
 L7À­ËÙ,real,237,20,0,4,TRUE,FALSE,500
 L8À­ËÙ,real,238,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.s7data import S7data, S7Client
 from utils.mqttdata import Mqttdata, MqttClient
 from utils.mqttdata import Mqttdata, MqttClient
 from utils.logger import Logger
 from utils.logger import Logger
+from models.data_forward import *
 
 
 
 
 ##############################################################
 ##############################################################
@@ -44,15 +45,15 @@ logger_6.info('[PREPARE]6#机PLC连接成功')
 ##############################################################
 ##############################################################
 # MQTT数据源配置
 # 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.connect('192.168.0.119', 1883)
 mqtt_web.loop_start()
 mqtt_web.loop_start()
 data_web = Mqttdata()
 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}")
         self.logger.debug(f"[SENDER]{purpose}:{payload}")
         
         
         if self.mqtt_cli:
         if self.mqtt_cli:
-            if not self.mqtt_cli.is_connected:
+            if not self.mqtt_cli.is_connected():
                 self.logger.error('[SENDER]MQTT:发送失败,MQTT未连接')
                 self.logger.error('[SENDER]MQTT:发送失败,MQTT未连接')
 
 
             if self.mqtt_cli.publish(self.topic[purpose], json.dumps(payload), qos)[0]:
             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._billet[heat_data.get('heatNo', '')+str(heatnoIndex)] = tmp
         self.send('billet_add', 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__':
 if __name__ == '__main__':
     mqttcli = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, 'python-mqtt-992-sender_test')
     mqttcli = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, 'python-mqtt-992-sender_test')
     mqttcli.username_pw_set('admin', '123456')
     mqttcli.username_pw_set('admin', '123456')

+ 2 - 0
utils/s7data.py

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