From 05e7ab5c6a01f793c19faac419a7095ba182959b Mon Sep 17 00:00:00 2001
From: zyx <zyx123456>
Date: 星期三, 07 二月 2024 09:12:53 +0800
Subject: [PATCH] #AGV 输送线扫码器扫描

---
 src/main/java/com/zy/core/properties/SlaveProperties.java |    2 
 src/main/java/com/zy/core/thread/SiemensDevpThread3.java  |  275 +++++++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/controller/AgvController.java   |   15 ++
 src/main/java/com/zy/core/enums/SlaveType.java            |    1 
 src/main/resources/application.yml                        |    7 +
 src/main/java/com/zy/core/ServerBootstrap.java            |    8 +
 6 files changed, 305 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/AgvController.java b/src/main/java/com/zy/asrs/controller/AgvController.java
index 68995d3..54a75e6 100644
--- a/src/main/java/com/zy/asrs/controller/AgvController.java
+++ b/src/main/java/com/zy/asrs/controller/AgvController.java
@@ -2,12 +2,14 @@
 
 import com.alibaba.fastjson.JSONObject;
 import com.core.common.R;
+import com.zy.core.thread.SiemensDevpThread3;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,9 +24,16 @@
     @PostMapping("/container/release")
     public R containerRelease(@RequestBody JSONObject jsonObject){
 
-        System.out.println(jsonObject.toString());
-        HashMap<String, String> map = new HashMap<>();
-        map.put("allow","true");
+        HashMap<String, Boolean> currentStationInfoMap = SiemensDevpThread3.currentStationInfoMap;
+        String slotCode = jsonObject.get("slotCode").toString();
+
+        Map<String,String> map = new HashMap<>();
+        if(currentStationInfoMap.get(slotCode)){
+            map.put("allow","true");
+        }else {
+            map.put("allow","false");
+        }
+
         R r = new R(0, "");
 
         return r.add(map);
diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java
index b419fc6..067bb30 100644
--- a/src/main/java/com/zy/core/ServerBootstrap.java
+++ b/src/main/java/com/zy/core/ServerBootstrap.java
@@ -52,6 +52,9 @@
         for (Slave devp2 : slaveProperties.getDevp2()) {
             MessageQueue.init(SlaveType.Devp2, devp2);
         }
+        for (Slave devp3 : slaveProperties.getDevp3()) {
+            MessageQueue.init(SlaveType.Devp3, devp3);
+        }
         // 鍒濆鍖栨潯鐮佹壂鎻忎华mq
         for (Slave barcode : slaveProperties.getBarcode()) {
             MessageQueue.init(SlaveType.Barcode, barcode);
@@ -91,6 +94,11 @@
             new Thread(siemensDevpThread2).start();
             SlaveConnection.put(SlaveType.Devp2, devp2.getId(), siemensDevpThread2);
         }
+        for (Devp2Slave devp3 : slaveProperties.getDevp3()) {
+            SiemensDevpThread3 siemensDevpThread3 = new SiemensDevpThread3(devp3);
+            new Thread(siemensDevpThread3).start();
+            SlaveConnection.put(SlaveType.Devp3, devp3.getId(), siemensDevpThread3);
+        }
         // 鍒濆鍖栨彁鍗囨満
         News.info("鍒濆鍖栨彁鍗囨満........................................................");
         for (LiftSlave liftSlave : slaveProperties.getLift()) {
diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java
index 7891af7..72c47c4 100644
--- a/src/main/java/com/zy/core/enums/SlaveType.java
+++ b/src/main/java/com/zy/core/enums/SlaveType.java
@@ -5,6 +5,7 @@
     Crn,
     Devp,
     Devp2,
+    Devp3,
     Barcode,
     Led,
     Scale,
diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java
index 2d19ada..7bf463d 100644
--- a/src/main/java/com/zy/core/properties/SlaveProperties.java
+++ b/src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -33,6 +33,8 @@
 
     private List<Devp2Slave> devp2 = new ArrayList<>();
 
+    private List<Devp2Slave> devp3 = new ArrayList<>();
+
     private List<Slave> barcode = new ArrayList<>();
 
     private List<LedSlave> led = new ArrayList<>();
diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread3.java b/src/main/java/com/zy/core/thread/SiemensDevpThread3.java
new file mode 100644
index 0000000..9b460f4
--- /dev/null
+++ b/src/main/java/com/zy/core/thread/SiemensDevpThread3.java
@@ -0,0 +1,275 @@
+package com.zy.core.thread;
+
+import HslCommunication.Core.Types.OperateResult;
+import HslCommunication.Core.Types.OperateResultExOne;
+import HslCommunication.Profinet.Siemens.SiemensPLCS;
+import HslCommunication.Profinet.Siemens.SiemensS7Net;
+import com.alibaba.fastjson.JSON;
+import com.core.common.Cools;
+import com.core.common.DateUtils;
+import com.core.common.SpringUtils;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.core.DevpThread;
+import com.zy.core.News;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.Devp2Slave;
+import com.zy.core.model.Task;
+import com.zy.core.model.protocol.StaProtocol;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 杈撻�佺嚎绾跨▼
+ * Created by vincent on 2020/8/4
+ */
+@Data
+@Slf4j
+public class SiemensDevpThread3 implements Runnable, DevpThread {
+
+    public static HashMap<String,Boolean> currentStationInfoMap;
+
+    private Devp2Slave slave;
+    private SiemensS7Net siemensS7Net;
+    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
+    private short heartBeatVal = 1;
+    private int barcodeSize = 1;
+    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
+        add(313);add(312);
+        add(311);add(310);
+    }};
+
+    public SiemensDevpThread3(Devp2Slave slave) {
+        this.slave = slave;
+    }
+
+    @Override
+    @SuppressWarnings("InfiniteLoopStatement")
+    public void run() {
+        connect();
+        while (true) {
+            try {
+                int step = 1;
+                Task task = MessageQueue.poll(SlaveType.Devp2, slave.getId());
+                if (task != null) {
+                    step = task.getStep();
+                }
+                switch (step) {
+                    // 璇绘暟鎹�
+                    case 1:
+                        read();
+                        break;
+//                    // 鍐欐暟鎹� ID+鐩爣绔�
+//                    case 2:
+//                        write((StaProtocol) task.getData());
+//                        read();
+//                        break;
+                    default:
+                        break;
+                }
+                // 蹇冭烦
+//                heartbeat();
+                Thread.sleep(400);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    }
+
+    @Override
+    public boolean connect() {
+        boolean result = false;
+        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
+        siemensS7Net.setRack(slave.getRack().byteValue());
+        siemensS7Net.setSlot(slave.getSlot().byteValue());
+        OperateResult connect = siemensS7Net.ConnectServer();
+        if(connect.IsSuccess){
+            result = true;
+            OutputQueue.DEVP.offer(MessageFormat.format( "銆恵0}銆戣緭閫佺嚎plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+            News.info("杈撻�佺嚎plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        } else {
+            OutputQueue.DEVP.offer(MessageFormat.format( "銆恵0}銆戣緭閫佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+            News.error("杈撻�佺嚎plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
+        }
+        siemensS7Net.ConnectClose();
+        return result;
+    }
+
+    /**
+     * 璇诲彇鐘舵�� ====> 鏁村潡plc
+     */
+    private void read() throws InterruptedException {
+        if(Cools.isEmpty(currentStationInfoMap)){
+            currentStationInfoMap = new HashMap<>();
+        }
+        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB69.0.0", (short) (staNos.size()));
+        boolean[] booleans = siemensS7Net.getByteTransform().TransBool(result.Content, 0, 1);
+        for (int i=0; i<staNos.size();i++){
+
+            String station = staNos.get(i) + "-1";
+            currentStationInfoMap.put(station,booleans[0]);
+
+
+//            StaProtocol staProtocol = station.get(staNos.get(i));
+//            if(Cools.isEmpty(staProtocol)){
+//                staProtocol = new StaProtocol();
+//                staProtocol.setSiteId(staNos.get(i));
+//                staProtocol.setLoading(booleans[i]);
+//                station.put(staNos.get(i),staProtocol);
+//            }
+        }
+
+    }
+
+    /**
+     * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
+     */
+    private void write(StaProtocol staProtocol) throws InterruptedException {
+        if (null == staProtocol) {
+            return;
+        }
+        int index = staNos.indexOf(staProtocol.getSiteId());
+        short[] array = new short[2];
+        array[0] = staProtocol.getWorkNo();
+        array[1] = staProtocol.getStaNo();
+//        OperateResult write = siemensS7Net.Write("DB100." + index*4, staProtocol.getWorkNo());    // 宸ヤ綔鍙�
+//        Thread.sleep(500);
+//        OperateResult write1 = siemensS7Net.Write("DB100." + (index*4+2), staProtocol.getStaNo());    // 鐩爣绔�
+
+        OperateResult writeResult;
+        //浠诲姟涓嬪彂娆℃暟
+        int writeCount = 0;
+        //浠诲姟涓嬪彂鎴愬姛鏍囪瘑
+        boolean writeFlag = false;
+        while(writeCount < 5){
+            writeResult = siemensS7Net.Write("DB1000." + index*4, array);    // 宸ヤ綔鍙枫�佺洰鏍囩珯
+            if(writeResult.IsSuccess){
+                Thread.sleep(200);
+                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*4, (short)4);
+                if(readResult.IsSuccess){
+                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
+                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
+                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
+                        //浠诲姟鍛戒护鍐欏叆鎴愬姛
+                        writeFlag = true;
+                        log.info("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝骞朵笖鍥炶鎴愬姛銆傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                        break;
+                    } else {//杩斿洖缁撴灉鏄垚鍔熶簡锛屼絾鏄湡瀹炲�间笉鐩稿悓
+                        writeCount++;
+                        OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                                slave.getId(), JSON.toJSON(staProtocol),writeCount));
+                        log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤繑鍥炴垚鍔燂紝浣嗘槸璇诲彇浠诲姟鍊间笉涓�鑷淬�傝緭閫佺嚎plc缂栧彿={}锛寋}锛屽啓鍏ユ鏁�={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                    }
+                } else {
+                    writeCount++;
+                    OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                            slave.getId(), JSON.toJSON(staProtocol), writeCount));
+                    log.error("鍐欏叆杈撻�佺嚎鍛戒护鍚庤鍙栧け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+                }
+            } else {
+                writeCount++;
+                OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2},鍐欏叆娆℃暟={3}",
+                        slave.getId(), JSON.toJSON(staProtocol),writeCount));
+                log.error("鍐欏叆杈撻�佺嚎鍛戒护澶辫触銆傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={},鍐欏叆娆℃暟={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
+            }
+            Thread.sleep(200);
+        }
+
+        //鍐欏懡浠ゅ皾璇曚簡5娆¤繕鏄け璐ヤ簡
+        if(!writeFlag){
+            staProtocol = station.get(staProtocol.getSiteId());
+            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
+                staProtocol.setPakMk(true);
+            }
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戝啓鍏ヨ緭閫佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={1}锛岀珯鐐规暟鎹�={2}", slave.getId(), JSON.toJSON(staProtocol)));
+            log.error("鍐欏叆杈撻�佺嚎鍛戒护灏濊瘯5娆″け璐ャ�傝緭閫佺嚎plc缂栧彿={}锛岀珯鐐规暟鎹�={}", slave.getId(), JSON.toJSON(staProtocol));
+
+            //閲嶆柊娣诲姞鏁版嵁鍒颁换鍔¢槦鍒�
+            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
+            read();//璇诲彇1娆¤澶囩姸鎬�
+            return;
+        } else {
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆� 杈撻�佺嚎鍛戒护涓嬪彂鎴愬姛 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
+            log.info("杈撻�佺嚎鍛戒护涓嬪彂 [id:{}] >>>>> 鍛戒护涓嬪彂鎴愬姛锛� {}",  slave.getId(), JSON.toJSON(staProtocol));
+
+            Integer siteId = staProtocol.getSiteId();
+            staProtocol = station.get(siteId);
+            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
+                staProtocol.setPakMk(true);
+            }
+        }
+    }
+
+    /**
+     * 蹇冭烦
+     */
+    private void heartbeat(){
+        if (heartBeatVal == 1) {
+            heartBeatVal = 2;
+        } else {
+            heartBeatVal = 1;
+        }
+        OperateResult write = siemensS7Net.Write("DB100.50", heartBeatVal);
+        if (!write.IsSuccess) {
+            News.error("杈撻�佺嚎plc缂栧彿={} 蹇冭烦澶辫触", slave.getId());
+        }
+    }
+
+    /**
+     * 璁剧疆鍏ュ簱鏍囪
+     */
+    @Override
+    public void setPakMk(Integer siteId, boolean pakMk) {
+        StaProtocol staProtocol = station.get(siteId);
+        if (null != staProtocol) {
+            staProtocol.setPakMk(pakMk);
+        }
+    }
+
+    @Override
+    public void close() {
+        siemensS7Net.ConnectClose();
+    }
+
+    public static void main(String[] args) {
+//        System.out.println(staNos.indexOf(129));
+        System.out.println(staNos.size());
+        for (int i = 0; i<staNos.size(); i++) {
+//            System.out.println(i*2);
+//            System.out.println(i*2 + 200);
+//            System.out.println(i);
+        }
+//        int index = staNos.indexOf(128);
+//        System.out.println(index*2);
+//        System.out.println(index*2 + 200);
+    }
+
+//    public static void main(String[] args) throws Exception {
+//        DevpSlave slave = new DevpSlave();
+//        slave.setIp("192.168.2.125");
+//        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
+//        devpThread.connect();
+//        devpThread.read();
+//        // 鍐�
+//        StaProtocol staProtocol = devpThread.getStation().get(1);
+//        staProtocol.setWorkNo((short) 232);
+//        staProtocol.setStaNo((short) 6);
+//        staProtocol.setAutoing(true);
+//        staProtocol.setEmptyMk(true);
+//        staProtocol.setInEnable(true);
+//        devpThread.write(staProtocol);
+//        System.out.println("----------------------------------------");
+//        // 璇�
+//        devpThread.read();
+//        System.out.println(JSON.toJSONString(devpThread.station));
+//
+//    }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 7e94169..50870f0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -333,6 +333,13 @@
     port: 102
     rack: 0
     slot: 0
+  # 杈撻�佺嚎2
+  devp3[0]:
+    id: 1
+    ip: 10.10.10.239
+    port: 102
+    rack: 0
+    slot: 0
 
   # 鏉$爜鎵弿浠�
   barcode[0]:

--
Gitblit v1.9.1