From 21038521f93c26f3e7b6810d8ee8dfdd31c159e0 Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期一, 22 四月 2024 15:35:01 +0800
Subject: [PATCH] #Ext

---
 src/main/java/com/zy/core/properties/SlaveProperties.java |    7 
 src/main/java/com/zy/core/thread/MelsecExtThread.java     |  180 ++++++++++++++++++++++++++++++++++++
 src/main/java/com/zy/core/model/ExtSlave.java             |   22 ++++
 src/main/java/com/zy/core/enums/SlaveType.java            |    3 
 src/main/java/com/zy/core/cache/OutputQueue.java          |    2 
 src/main/java/com/zy/core/model/protocol/ExtProtocol.java |   16 +++
 src/main/resources/application-prod.yml                   |    8 +
 src/main/webapp/views/deviceOperate/rgvOperate.html       |   28 ++--
 src/main/java/com/zy/core/ServerBootstrap.java            |   17 ++
 9 files changed, 260 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index d67d829..c8fe405 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -3,10 +3,7 @@
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.SlaveType;
-import com.zy.core.model.CrnSlave;
-import com.zy.core.model.DevpSlave;
-import com.zy.core.model.LedSlave;
-import com.zy.core.model.RgvSlave;
+import com.zy.core.model.*;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.*;
 import lombok.extern.slf4j.Slf4j;
@@ -64,6 +61,11 @@
         for (Slave rgv : slaveProperties.getRgv()) {
             MessageQueue.init(SlaveType.Rgv, rgv);
         }
+
+        // 鍒濆鍖栨満姊拌噦mq
+        for (Slave ext : slaveProperties.getExt()) {
+            MessageQueue.init(SlaveType.Ext, ext);
+        }
 //        // 鍒濆鍖朙ed鐏痬q
 //        for (Slave led : slaveProperties.getLed()) {
 //            MessageQueue.init(SlaveType.Led, led);
@@ -107,6 +109,13 @@
             new Thread((Runnable) rgvThread).start();
             SlaveConnection.put(SlaveType.Rgv, rgv.getId(), rgvThread);
         }
+        // 鍒濆鍖栨満姊拌噦绾跨▼
+        log.info("鍒濆鍖朎xt绾跨▼...................................................");
+        for (ExtSlave ext : slaveProperties.getExt()) {
+            MelsecExtThread extThread = new MelsecExtThread(ext);
+            new Thread(extThread).start();
+            SlaveConnection.put(SlaveType.Ext, ext.getId(), extThread);
+        }
 //        // 鍒濆鍖朙ED绾跨▼
 //        log.info("鍒濆鍖朙ED绾跨▼...................................................");
 //        for (LedSlave led : slaveProperties.getLed()) {
diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java
index a5c050d..48bd3be 100644
--- a/src/main/java/com/zy/core/cache/OutputQueue.java
+++ b/src/main/java/com/zy/core/cache/OutputQueue.java
@@ -21,4 +21,6 @@
     // 鍫嗗灈鏈鸿緭鍑烘棩蹇�
     public static ArrayBlockingQueue<String> RGV = new ArrayBlockingQueue<>(32);
 
+    public static ArrayBlockingQueue<String> Ext = new ArrayBlockingQueue<>(32);
+
 }
diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java
index 7f64d13..14b192a 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -8,7 +8,8 @@
     Led,
     Scale,
     Car,
-    Rgv
+    Rgv,
+    Ext
     ;
 
     public static SlaveType findInstance(String s){
diff --git a/src/main/java/com/zy/core/model/ExtSlave.java b/src/main/java/com/zy/core/model/ExtSlave.java
new file mode 100644
index 0000000..8b541b2
--- /dev/null
+++ b/src/main/java/com/zy/core/model/ExtSlave.java
@@ -0,0 +1,22 @@
+package com.zy.core.model;
+
+import com.zy.core.Slave;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ExtSlave extends Slave {
+
+    private Integer rack;
+
+    private Integer slot;
+
+    private Integer offset;
+
+    private Boolean demo;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/core/model/protocol/ExtProtocol.java b/src/main/java/com/zy/core/model/protocol/ExtProtocol.java
new file mode 100644
index 0000000..5de464b
--- /dev/null
+++ b/src/main/java/com/zy/core/model/protocol/ExtProtocol.java
@@ -0,0 +1,16 @@
+package com.zy.core.model.protocol;
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020/8/7
+ */
+@Data
+public class ExtProtocol {
+
+    private Integer extNo;
+
+    public boolean take;//鍏佽鍙栦俊鍙�
+
+    public boolean put;//鍏佽鏀句俊鍙�
+
+}
diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java
index 866ea67..0510d2e 100644
--- a/src/main/java/com/zy/core/properties/SlaveProperties.java
+++ b/src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -1,10 +1,7 @@
 package com.zy.core.properties;
 
 import com.zy.core.Slave;
-import com.zy.core.model.CrnSlave;
-import com.zy.core.model.DevpSlave;
-import com.zy.core.model.LedSlave;
-import com.zy.core.model.RgvSlave;
+import com.zy.core.model.*;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
@@ -44,4 +41,6 @@
     private List<Slave> car = new ArrayList<>();
 
     private List<RgvSlave> rgv = new ArrayList<>();
+
+    private List<ExtSlave> ext = new ArrayList<>();
 }
diff --git a/src/main/java/com/zy/core/thread/MelsecExtThread.java b/src/main/java/com/zy/core/thread/MelsecExtThread.java
new file mode 100644
index 0000000..3cab9ee
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/MelsecExtThread.java
@@ -0,0 +1,180 @@
+package com.zy.core.thread;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Melsec.MelsecMcNet;
+import com.core.common.DateUtils;
+import com.core.exception.CoolException;
+import com.zy.core.ThreadHandler;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.ExtSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.protocol.ExtProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.Date;
+
+/**
+ * 鏈烘鑷傜嚎绋�  //Extraman==>鏈烘鑷�
+ * Created by vincent on 2020/8/4
+ */
+@Data
+@Slf4j
+public class MelsecExtThread implements Runnable, ThreadHandler {
+
+    private MelsecMcNet melsecMcNet;
+    private ExtSlave slave;
+    private ExtProtocol extProtocol;
+    private short heartBeatVal = 1;
+    private boolean resetFlag = false;
+
+    public boolean isRunning = true;
+
+    public MelsecExtThread(ExtSlave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    @SuppressWarnings("InfiniteLoopStatement")
+    public void run() {
+        System.out.println("绾跨▼鍚姩");
+        System.out.println("extProtocol:"+extProtocol);
+        this.connect();
+//        try {
+//            Thread.sleep(2000);
+//        } catch (InterruptedException e) {
+//            e.printStackTrace();
+//        }
+        while (isRunning) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Ext, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        readStatus();
+                        break;
+                    default:
+                        break;
+                }
+                // 蹇冭烦
+//                heartbeat();
+                Thread.sleep(500);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鍒濆鍖栨満姊拌噦鐘舵��
+     */
+    private void initExt() {
+        if (null == extProtocol) {
+            extProtocol = new ExtProtocol();
+        }
+        extProtocol.setTake(false);
+        extProtocol.setPut(false);
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        melsecMcNet = new MelsecMcNet(slave.getIp(), slave.getPort());
+        OperateResult connect = melsecMcNet.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.Ext.offer(MessageFormat.format( "銆恵0}銆戞満姊拌噦plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.info("MelsecExt"+" - 1"+" - 鏈烘鑷俻lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        } else {
+            OutputQueue.Ext.offer(MessageFormat.format("銆恵0}銆戞満姊拌噦plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}] ", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("MelsecExt"+" - 2"+" - 鏈烘鑷俻lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            initExt();
+        }
+//        melsecMcNet.ConnectClose();
+        return result;
+    }
+
+    /**
+     * 璇诲彇鐘舵��
+     */
+    private void readStatus(){
+        try {
+            OperateResultExOne<byte[]> result = melsecMcNet.Read("D1035", (short) 56);
+            if (result.IsSuccess) {
+                if (null == extProtocol) {
+                    extProtocol = new ExtProtocol();
+                    extProtocol.setExtNo(slave.getId());
+                }
+                extProtocol.setTake(melsecMcNet.getByteTransform().TransBool(result.Content, 0));
+                extProtocol.setPut(melsecMcNet.getByteTransform().TransBool(result.Content, 0));
+//                extProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 0));
+//                extProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 2));
+
+                OutputQueue.Ext.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+
+
+            } else {
+                OutputQueue.Ext.offer(MessageFormat.format("銆恵0}銆憑1}鏈烘鑷俻lc鐘舵�佷俊鎭け璐�",DateUtils.convert(new Date()), slave.getId()));
+                throw new CoolException(MessageFormat.format( "鏈烘鑷俻lc鐘舵�佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            OutputQueue.Ext.offer(MessageFormat.format("銆恵0}銆戣鍙栨満姊拌噦plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            log.error("MelsecExt"+" - 5"+" - 璇诲彇鏈烘鑷俻lc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+            initExt();
+        } finally {
+//            sign = System.currentTimeMillis();
+        }
+
+    }
+
+    @Override
+    public void close() {
+        melsecMcNet.ConnectClose();
+    }
+
+    /**
+     * 蹇冭烦
+     */
+    private void heartbeat(){
+        if (heartBeatVal >= 30000) {
+            heartBeatVal = -30000;
+        } else {
+            heartBeatVal =(short) (heartBeatVal+1);
+        }
+        OperateResult write = melsecMcNet.Write("D1011", heartBeatVal);
+        if (!write.IsSuccess) {
+            log.error("MelsecExt"+" - 9"+" - 鏈烘鑷俻lc蹇冭烦閫氳澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        }
+    }
+
+
+    /******************************************************************************************/
+    /**************************************** 娴嬭瘯涓撶敤 *****************************************/
+    /*****************************************************************************************/
+    public static void main(String[] args) throws InterruptedException {
+
+    }
+
+    // 鎻愪緵涓�涓柟娉曟潵鍋滄绾跨▼
+    public void requestStop() {
+        isRunning = false;
+    }
+
+    // 鎻愪緵涓�涓柟娉曟潵閲嶅惎绾跨▼
+    public Thread restartThread() {
+        isRunning = true;
+        Thread newThread = new Thread(this);
+        newThread.start();
+        return newThread;
+    }
+
+}
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 833f539..46cbdcf 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -10,6 +10,14 @@
     rack: 0
     slot: 0
     demo: false
+  # EXT绌挎杞�1
+  ext[0]:
+    id: 1
+    ip: 10.10.10.200
+    port: 502
+    rack: 0
+    slot: 0
+    demo: false
   crn[0]: #鍫嗗灈鏈�1
     id: 1
     ip: 172.17.91.2
diff --git a/src/main/webapp/views/deviceOperate/rgvOperate.html b/src/main/webapp/views/deviceOperate/rgvOperate.html
index ab59e9f..dc6b8b2 100644
--- a/src/main/webapp/views/deviceOperate/rgvOperate.html
+++ b/src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -57,22 +57,22 @@
 							<el-button v-if="demo === 'N' " @click="demos('true')" type="info">婕旂ず</el-button>
 							<el-button v-if="demo === 'Y' " @click="demos('false')" type="info">鍙栨秷婕旂ず</el-button>
 						</div>
-						<div style="margin: 10px auto 10px auto">
-							<el-button v-if="demo === 'N' " @click="rgvStatus(8)" type="primary">鍚姩</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(9)" type="primary">鍋滄</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(14)" type="primary">鍗曟満</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(15)" type="primary">鑱旀満</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(11)" type="primary">澶嶄綅鎸夐挳</el-button>
+						<div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
+							<el-button @click="rgvStatus(8)" type="primary">鍚姩</el-button>
+							<el-button @click="rgvStatus(9)" type="primary">鍋滄</el-button>
+							<el-button @click="rgvStatus(14)" type="primary">鍗曟満</el-button>
+							<el-button @click="rgvStatus(15)" type="primary">鑱旀満</el-button>
+							<el-button @click="rgvStatus(11)" type="primary">澶嶄綅鎸夐挳</el-button>
 						</div>
-						<div style="margin: 10px auto 10px auto">
-							<el-button v-if="demo === 'N' " @click="rgvStatus(7)" type="warning">鎶ヨ娑堥煶</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(12)" type="warning">鎵嬪姩</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(13)" type="warning">鎵嬪姩瀹氫綅</el-button>
+						<div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
+							<el-button @click="rgvStatus(7)" type="warning">鎶ヨ娑堥煶</el-button>
+							<el-button @click="rgvStatus(12)" type="warning">鎵嬪姩</el-button>
+							<el-button @click="rgvStatus(13)" type="warning">鎵嬪姩瀹氫綅</el-button>
 						</div>
-						<div style="margin: 10px auto 10px auto">
-							<el-button v-if="demo === 'N' " :style="" @click="rgvStatus(5)" type="danger">寮哄埗鍚姩</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(10)" type="danger">鎬ュ仠</el-button>
-							<el-button v-if="demo === 'N' " @click="rgvStatus(16)" type="danger">璐у弶瀹氫綅鍥炰腑</el-button>
+						<div style="margin: 10px auto 10px auto" v-if="demo === 'N' ">
+							<el-button :style="" @click="rgvStatus(5)" type="danger">寮哄埗鍚姩</el-button>
+							<el-button @click="rgvStatus(10)" type="danger">鎬ュ仠</el-button>
+							<el-button @click="rgvStatus(16)" type="danger">璐у弶瀹氫綅鍥炰腑</el-button>
 						</div>
 						<div style="margin-top: 5px" v-if="demo === 'Y'">
 							<el-button  @click="staTova(2,1)" type="warning">杈撻��-缃崲1</el-button>

--
Gitblit v1.9.1