From ab18ecb1c25613535c2047467cf8c14d3b41b047 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期二, 07 五月 2024 15:46:58 +0800
Subject: [PATCH] #空桶入库完成

---
 src/main/java/com/zy/asrs/service/EmptyBarrelInService.java          |    8 
 src/main/java/com/zy/core/enums/RgvModeType.java                     |   23 
 src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java            |   43 
 src/main/java/com/zy/core/thread/ZyRgvThread.java                    |  138 ++-
 src/main/webapp/static/css/rgv.css                                   |  252 +++++
 src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java         |   25 
 src/main/java/com/zy/core/model/protocol/StaProtocol.java            |    5 
 src/main/java/com/zy/asrs/utils/Utils.java                           |   16 
 src/main/java/com/zy/core/model/RgvSlave.java                        |    7 
 src/main/java/com/zy/asrs/service/impl/EmptyBarrelInServiceImpl.java |   12 
 src/main/webapp/views/index.html                                     |    1 
 src/main/java/com/zy/core/MainProcess.java                           |   24 
 src/main/java/com/zy/core/model/command/RgvCommand.java              |   78 -
 src/main/java/com/zy/core/thread/SiemensDevpThread.java              |   81 +
 src/main/java/com/zy/core/enums/RgvStatusType.java                   |    3 
 src/main/java/com/zy/asrs/entity/EmptyBarrelIn.java                  |   45 +
 src/main/java/com/zy/asrs/entity/FullStoreParam.java                 |   36 
 src/main/java/com/zy/asrs/controller/RgvController.java              |  319 +++++++
 src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java             |   53 +
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java          |  351 +++++++
 src/main/java/com/zy/core/cache/MessageQueue.java                    |   14 
 src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java               |   62 +
 src/main/webapp/views/rgv.html                                       |  598 +++++++++++++
 src/main/java/com/zy/asrs/mapper/EmptyBarrelInMapper.java            |   12 
 src/main/java/com/zy/common/CodeBuilder.java                         |    2 
 src/main/java/com/zy/asrs/service/WrkMastService.java                |    2 
 src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java       |    5 
 src/main/java/com/zy/core/model/protocol/RgvProtocol.java            |  253 ++++-
 src/main/resources/application.yml                                   |   81 
 src/main/java/com/zy/core/enums/RgvTaskModeType.java                 |   32 
 src/main/resources/mapper/EmptyBarrelInMapper.xml                    |   14 
 31 files changed, 2,331 insertions(+), 264 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
new file mode 100644
index 0000000..4b76047
--- /dev/null
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -0,0 +1,319 @@
+package com.zy.asrs.controller;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.core.annotations.ManagerAuth;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.exception.CoolException;
+import com.zy.asrs.domain.enums.RgvStatusType;
+import com.zy.asrs.domain.param.RgvOperatorParam;
+import com.zy.asrs.domain.vo.RgvMsgTableVo;
+import com.zy.asrs.domain.vo.RgvStateTableVo;
+import com.zy.asrs.entity.BasRgv;
+import com.zy.asrs.entity.BasRgvErr;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.mapper.BasRgvErrMapper;
+import com.zy.asrs.service.BasRgvService;
+import com.zy.asrs.service.LocMastService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.asrs.service.impl.MainServiceImpl;
+import com.zy.core.cache.MessageQueue;
+import com.zy.core.cache.OutputQueue;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RgvModeType;
+import com.zy.core.enums.RgvTaskModeType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.RgvSlave;
+import com.zy.core.model.Task;
+import com.zy.core.model.command.RgvCommand;
+import com.zy.core.model.protocol.RgvProtocol;
+import com.zy.core.properties.SlaveProperties;
+import com.zy.core.thread.ZyRgvThread;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * RGV鎺ュ彛
+ * Created by vincent on 2020-06-01
+ */
+@Slf4j
+@RestController
+@RequestMapping("/rgv")
+public class RgvController {
+
+    @Autowired
+    private SlaveProperties slaveProperties;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private BasRgvErrMapper basRgvErrMapper;
+    @Autowired
+    private BasRgvService basRgvService;
+    @Autowired
+    private MainServiceImpl mainService;
+    @Autowired
+    private LocMastService locMastService;
+
+
+
+    @PostMapping("/table/rgv/state")
+    @ManagerAuth(memo = "RGV淇℃伅琛�")
+    public R rgvStateTable(){
+        List<RgvStateTableVo> list = new ArrayList<>();
+        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
+        for (BasRgv basRgv : rgvs) {
+            // 琛ㄦ牸琛�
+            RgvStateTableVo vo = new RgvStateTableVo();
+            vo.setRgvNo(basRgv.getRgvNo());   //  RGV鍙�
+            list.add(vo);
+            // 鑾峰彇RGV淇℃伅
+            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol == null) {
+                continue;
+            }
+            vo.setStatusType(rgvProtocol.modeType.desc);   //  妯″紡鐘舵��
+            vo.setStatus(rgvProtocol.getStatusType().desc);     //  鐘舵��
+            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  宸ヤ綅1浠诲姟鍙�
+            vo.setLoading1(rgvProtocol.getLoaded1()==1?"鏈夌墿":"鏃犵墿");  // 宸ヤ綅1鏈夌墿
+//            vo.setRgvPos(rgvProtocol.getRgvPos());
+            vo.setRgvPos1(rgvProtocol.getRgvPosI());
+//            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"鍦ㄥ畾浣�":"涓嶅湪瀹氫綅");
+            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  宸ヤ綅2浠诲姟鍙�
+//            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 宸ヤ綅2鐘舵��
+//            vo.setLoading2(rgvProtocol.getLoaded2()==1?"鏈夌墿":"鏃犵墿");  // 宸ヤ綅2鏈夌墿
+
+            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
+            if (rgvProtocol.getAlarm() > 0) {
+                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
+                vo.setAlarm(rgvErr==null?"鏈煡寮傚父":rgvErr.getErrName());
+            }
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/table/rgv/msg")
+    @ManagerAuth(memo = "RGV鏁版嵁琛�")
+    public R rgvMsgTable(){
+        List<RgvMsgTableVo> list = new ArrayList<>();
+        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
+        for (BasRgv basRgv : rgvs) {
+            // 琛ㄦ牸琛�
+            RgvMsgTableVo vo = new RgvMsgTableVo();
+            vo.setRgvNo(basRgv.getRgvNo());   //  RGV鍙�
+            list.add(vo);
+            // 鑾峰彇RGV淇℃伅
+            ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
+            if (rgvThread == null) {
+                continue;
+            }
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol == null) {
+                continue;
+            }
+
+            vo.setWorkNo(rgvProtocol.getTaskNo1());  //  浠诲姟鍙�
+            if (rgvProtocol.getTaskNo1()>0) {
+                WrkMast wrkMast = wrkMastService.selectById(rgvProtocol.getTaskNo1());
+                if (wrkMast != null) {
+                    vo.setStatus(RgvStatusType.process(wrkMast.getIoType()).getDesc());   //  妯″紡鐘舵��
+                    vo.setSourceStaNo(wrkMast.getSourceStaNo$());    //  婧愮珯
+                    vo.setStaNo(wrkMast.getStaNo$());   //  鐩爣绔�
+                    vo.setSourceLocNo(wrkMast.getSourceLocNo());    //  婧愬簱浣�
+                    vo.setLocNo(wrkMast.getLocNo());    //  鐩爣搴撲綅
+                }
+            } else {
+                vo.setStatus(rgvProtocol.modeType.equals(RgvModeType.AUTO)? rgvProtocol.modeType.desc: RgvModeType.HAND.desc);   //  妯″紡鐘舵��
+            }
+            vo.setXspeed(rgvProtocol.getXSpeed());  //  璧拌閫熷害锛坢/min)
+            vo.setXdistance(rgvProtocol.getXDistance());  //  璧拌璺濈(Km)
+            vo.setXduration(rgvProtocol.getXDuration());    //  璧拌鏃堕暱(H)
+        }
+        return R.ok().add(list);
+    }
+
+    @PostMapping("/output/site")
+    @ManagerAuth(memo = "RGV鎶ユ枃鏃ュ織杈撳嚭")
+    public R rgvOutput(){
+        StringBuilder str = new StringBuilder();
+        String s;
+        int i = 0;
+        while((s = OutputQueue.RGV.poll()) != null && i <=10) {
+            str.append("\n").append(s);
+            i++;
+        }
+        return R.ok().add(str.toString());
+    }
+
+    /****************************************************************/
+    /************************** 鎵嬪姩鎿嶄綔 ******************************/
+    /****************************************************************/
+
+    @ManagerAuth(memo = "鍙栨斁璐�")
+    @PostMapping("/operator/put")
+    public R rgvFetchPut(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        //宸ヤ綅1
+        command.setTaskNo1(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo1(param.getSourceStaNo1()); // 婧愮珯
+        command.setDestinationStaNo1(param.getStaNo1());  // 鐩爣绔�
+        command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
+
+        //宸ヤ綅2
+        command.setTaskNo2(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo2(param.getSourceStaNo2()); // 婧愮珯
+        command.setDestinationStaNo2(param.getStaNo2());  // 鐩爣绔�
+        command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
+
+        if (Cools.isEmpty(param.getSourceStaNo1()) || param.getStaNo1() == 0){
+            command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 浠诲姟妯″紡: 鍙栨斁璐�
+        } else if (Cools.isEmpty(param.getSourceStaNo2()) || param.getStaNo2() == 0) {
+            command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 浠诲姟妯″紡: 鍙栨斁璐�
+        }else {
+            command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 浠诲姟妯″紡: 鍙栨斁璐�
+        }
+
+
+        command.setCommand(false);
+
+        return rgvControl(command)? R.ok(): R.error();
+    }
+
+
+
+
+    @ManagerAuth(memo = "宸ヤ綅1浠诲姟瀹屾垚")
+    @PostMapping("/operator/taskComplete1")
+    public R rgvTaskComplete1(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        //宸ヤ綅1
+        command.setTaskNo1(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo1((short) 0); // 婧愮珯
+        command.setDestinationStaNo1((short) 0);  // 鐩爣绔�
+        command.setAckFinish1(true);  // 浠诲姟瀹屾垚纭浣�
+
+        //宸ヤ綅2
+        command.setTaskNo2(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo2((short) 0); // 婧愮珯
+        command.setDestinationStaNo2((short) 0);  // 鐩爣绔�
+        command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
+
+        command.setTaskMode(RgvTaskModeType.NONE); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setCommand(false);
+
+        return rgvControlAsk1(command)? R.ok(): R.error();
+    }
+
+    @ManagerAuth(memo = "宸ヤ綅2浠诲姟瀹屾垚")
+    @PostMapping("/operator/taskComplete2")
+    public R rgvTaskComplete2(RgvOperatorParam param){
+        RgvCommand command = new RgvCommand();
+        command.setRgvNo(param.getRgvNo()); // RGV缂栧彿
+        //宸ヤ綅1
+        command.setTaskNo1(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo1((short) 0); // 婧愮珯
+        command.setDestinationStaNo1((short) 0);  // 鐩爣绔�
+        command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
+
+        //宸ヤ綅2
+        command.setTaskNo2(0); // 宸ヤ綔鍙�
+        command.setSourceStaNo2((short) 0); // 婧愮珯
+        command.setDestinationStaNo2((short) 0);  // 鐩爣绔�
+        command.setAckFinish2(true);  // 浠诲姟瀹屾垚纭浣�
+
+        command.setTaskMode(RgvTaskModeType.NONE); // 浠诲姟妯″紡: 鍙栨斁璐�
+        command.setCommand(false);
+
+        return rgvControlAsk2(command)? R.ok(): R.error();
+    }
+
+
+
+
+    private boolean rgvControl(RgvCommand command){
+        if (command.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV");
+        }
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            // 鑾峰彇RGV淇℃伅
+            if (command.getRgvNo().equals(rgv.getId())) {
+                ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+                if (rgvThread == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(2, command))) {
+                    return true;
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean rgvControlAsk1(RgvCommand command){
+        if (command.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV");
+        }
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            // 鑾峰彇RGV淇℃伅
+            if (command.getRgvNo().equals(rgv.getId())) {
+                ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+                if (rgvThread == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(3, command))) {
+                    return true;
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean rgvControlAsk2(RgvCommand command){
+        if (command.getRgvNo() == null) {
+            throw new CoolException("璇烽�夋嫨RGV");
+        }
+        for (RgvSlave rgv : slaveProperties.getRgv()) {
+            // 鑾峰彇RGV淇℃伅
+            if (command.getRgvNo().equals(rgv.getId())) {
+                ZyRgvThread rgvThread = (ZyRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
+                if (rgvThread == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+                if (rgvProtocol == null) {
+                    throw new CoolException("RGV涓嶅湪绾�");
+                }
+                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, command))) {
+                    return true;
+                } else {
+                    throw new CoolException("鍛戒护涓嬪彂澶辫触");
+                }
+            }
+        }
+        return false;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java b/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java
new file mode 100644
index 0000000..ee4e2ce
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/enums/RgvStatusType.java
@@ -0,0 +1,43 @@
+package com.zy.asrs.domain.enums;
+
+/**
+ * RGV鐘舵�佹灇涓�
+ */
+public enum RgvStatusType {
+
+    // 鍏ュ簱
+    MACHINE_PAKIN("鍏ュ簱"),
+    // 鍑哄簱
+    MACHINE_PAKOUT("鍑哄簱"),
+    // 寮傚父
+    MACHINE_ERROR("寮傚父"),
+    // 鑷姩
+    MACHINE_AUTO("鑷姩"),
+    // 闈炶嚜鍔�/鎵嬪姩
+    MACHINE_UN_AUTO("闈炶嚜鍔�"),
+    ;
+
+    private String desc;
+    RgvStatusType(String desc){
+        this.desc = desc;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public static RgvStatusType process(Integer ioType){
+        if (ioType>100) {
+            return MACHINE_PAKOUT;
+        } else if (ioType < 100 && ioType!=3 && ioType!=6 && ioType!=11) {
+            return MACHINE_PAKIN;
+        } else {
+            return MACHINE_ERROR;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
new file mode 100644
index 0000000..3b0881f
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
@@ -0,0 +1,25 @@
+package com.zy.asrs.domain.param;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvOperatorParam {
+
+    // RGV鍙�
+    private Integer rgvNo;
+
+    // 宸ヤ綅1婧愮珯
+    private Short sourceStaNo1;
+
+    // 宸ヤ綅1鐩爣绔�
+    private Short staNo1;
+
+    // 宸ヤ綅2婧愮珯
+    private Short sourceStaNo2;
+
+    // 宸ヤ綅2鐩爣绔�
+    private Short staNo2;
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java b/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
new file mode 100644
index 0000000..dd6989b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -0,0 +1,62 @@
+package com.zy.asrs.domain.vo;
+
+import com.zy.asrs.utils.Utils;
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvMsgTableVo {
+
+        // RGV鍙�
+    private Integer rgvNo;
+
+    // 宸ヤ綔鍙�
+    private Integer workNo = 0;
+
+    // 鐘舵��
+    private String status = "-";
+
+    // 婧愮珯
+    private String sourceStaNo = "-";
+
+    // 鐩爣绔�
+    private String staNo = "-";
+
+    // 婧愬簱浣�
+    private String sourceLocNo = "-";
+
+    // 鐩爣搴撲綅
+    private String locNo = "-";
+
+    // 寮傚父
+    private String error = "";
+
+    // 鍘熺偣
+    private String origin = "";
+
+    // 鍛戒护
+    private String command = "";
+
+    // 璧拌閫熷害锛坢/min)
+    private Float xspeed = 0.0F;
+
+    // 璧拌璺濈(Km)
+    private Float xdistance = 0.0F;
+
+    // 璧拌鏃堕暱(H)
+    private Float xduration = 0.0F;
+
+    public void setXspeed(Float xspeed) {
+        this.xspeed = Utils.scale(xspeed);
+    }
+
+    public void setXdistance(Float xdistance) {
+        this.xdistance = Utils.scale(xdistance);
+    }
+
+    public void setXduration(Float xduration) {
+        this.xduration = Utils.scale(xduration);
+    }
+}
diff --git a/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
new file mode 100644
index 0000000..020f874
--- /dev/null
+++ b/src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -0,0 +1,53 @@
+package com.zy.asrs.domain.vo;
+
+import lombok.Data;
+
+/**
+ * Created by vincent on 2020-06-02
+ */
+@Data
+public class RgvStateTableVo {
+
+    // RGV鍙�
+    private Integer RgvNo;
+
+    // 妯″紡
+    private String statusType = "-";
+
+    // 鐘舵��
+    private String status = "-";
+
+    // 浠诲姟鍙�
+    private Integer workNo1 = 0;
+
+    // 鐘舵��
+    private String status1 = "-";
+
+    // 鏈夌墿
+    private String loading1 = "-";
+
+    // RGV浣嶇疆
+    private Integer RgvPos = 0;
+
+    // 璧拌瀹氫綅
+    private String walkPos = "-";
+
+    // 浠诲姟鍙�
+    private Integer workNo2 = 0;
+
+    // 鐘舵��
+    private String status2 = "-";
+
+    // 鏈夌墿
+    private String loading2 = "-";
+
+    //寮傚父
+    private String warnCode;
+
+    // 寮傚父鐮佹弿杩�
+    private String alarm = "-";
+    private Integer RgvPos1 = 0;
+
+    private String pakMk="-";
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/EmptyBarrelIn.java b/src/main/java/com/zy/asrs/entity/EmptyBarrelIn.java
new file mode 100644
index 0000000..39d152b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/EmptyBarrelIn.java
@@ -0,0 +1,45 @@
+package com.zy.asrs.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("man_emptyBarrel_in")
+public class EmptyBarrelIn implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value= "")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value= "")
+    private String matnr;
+
+    @ApiModelProperty(value= "")
+    private String batch;
+
+    @ApiModelProperty(value= "")
+    private String maktx;
+
+    public EmptyBarrelIn() {}
+
+    public EmptyBarrelIn(String matnr,String batch,String maktx) {
+        this.matnr = matnr;
+        this.batch = batch;
+        this.maktx = maktx;
+    }
+
+//    EmptyBarrelIn emptyBarrelIn = new EmptyBarrelIn(
+//            null,    // 
+//            null,    // 
+//            null    // 
+//    );
+
+
+}
diff --git a/src/main/java/com/zy/asrs/entity/FullStoreParam.java b/src/main/java/com/zy/asrs/entity/FullStoreParam.java
new file mode 100644
index 0000000..bb5fd8b
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/FullStoreParam.java
@@ -0,0 +1,36 @@
+package com.zy.asrs.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Created by vincent on 2020/6/11
+ */
+@Data
+public class FullStoreParam {
+
+    // 鎵樼洏鏉$爜
+    private String barcode;
+
+    // 绔欑偣缂栧彿
+    private Integer devpNo;
+
+    // 鐗╂枡鍒楄〃鏁版嵁
+    private List<MatCodeStore> list;
+
+    @Data
+    public static class MatCodeStore {
+
+        // 鐗╂枡缂栧彿
+        private String matnr;
+
+        // 搴忓垪鐮�
+        private String batch;
+
+        // 鐗╂枡鏁伴噺
+        private Double anfme;
+
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/mapper/EmptyBarrelInMapper.java b/src/main/java/com/zy/asrs/mapper/EmptyBarrelInMapper.java
new file mode 100644
index 0000000..5668503
--- /dev/null
+++ b/src/main/java/com/zy/asrs/mapper/EmptyBarrelInMapper.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.mapper;
+
+import com.zy.asrs.entity.EmptyBarrelIn;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface EmptyBarrelInMapper extends BaseMapper<EmptyBarrelIn> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/EmptyBarrelInService.java b/src/main/java/com/zy/asrs/service/EmptyBarrelInService.java
new file mode 100644
index 0000000..3b6e9cc
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/EmptyBarrelInService.java
@@ -0,0 +1,8 @@
+package com.zy.asrs.service;
+
+import com.zy.asrs.entity.EmptyBarrelIn;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface EmptyBarrelInService extends IService<EmptyBarrelIn> {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/WrkMastService.java b/src/main/java/com/zy/asrs/service/WrkMastService.java
index 5263e48..e0b8f2d 100644
--- a/src/main/java/com/zy/asrs/service/WrkMastService.java
+++ b/src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -19,4 +19,6 @@
     WrkMast selectpj(Integer staNo,String barcode);
 
     List<WrkMast> selectLaneWrkMast(Integer lane, Boolean pakIn);//鏌ヨ鎸囧畾宸烽亾浠诲姟
+
+    WrkMast selectByworkNo(Short workNo);
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/EmptyBarrelInServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/EmptyBarrelInServiceImpl.java
new file mode 100644
index 0000000..3f85e49
--- /dev/null
+++ b/src/main/java/com/zy/asrs/service/impl/EmptyBarrelInServiceImpl.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.service.impl;
+
+import com.zy.asrs.mapper.EmptyBarrelInMapper;
+import com.zy.asrs.entity.EmptyBarrelIn;
+import com.zy.asrs.service.EmptyBarrelInService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+@Service("emptyBarrelInService")
+public class EmptyBarrelInServiceImpl extends ServiceImpl<EmptyBarrelInMapper, EmptyBarrelIn> implements EmptyBarrelInService {
+
+}
diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index d4eaf2f..8263c0a 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -24,6 +24,7 @@
 import com.zy.common.utils.News;
 import com.zy.core.CrnThread;
 import com.zy.core.DevpThread;
+import com.zy.core.RgvThread;
 import com.zy.core.cache.MessageQueue;
 import com.zy.core.cache.SlaveConnection;
 import com.zy.core.enums.*;
@@ -46,6 +47,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -86,9 +88,13 @@
     private BasErrLogService basErrLogService;
     @Autowired
     private BasCrnErrorMapper basCrnErrorMapper;
+    @Autowired
+    private EmptyBarrelInService emptyBarrelInService;
 
     @Value("${wms.url}")
     private String wmsUrl;
+
+    public int workNo = 9900;
 
     /**
      * 缁勬墭
@@ -491,6 +497,9 @@
      */
     public synchronized void crnStnToOutStn() {
         for (CrnSlave crnSlave : slaveProperties.getCrn()) {
+            if (crnSlave.getId() ==5){
+                continue;
+            }
             // 閬嶅巻鍫嗗灈鏈哄嚭搴撶珯
             for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                 // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
@@ -561,6 +570,9 @@
      */
     public synchronized void crnIoExecute() {
         for (CrnSlave crn : slaveProperties.getCrn()) {
+            if (crn.getId() == 5){
+                continue;
+            }
             // 鑾峰彇鍫嗗灈鏈轰俊鎭�
             CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
             CrnProtocol crnProtocol = crnThread.getCrnProtocol();
@@ -2189,7 +2201,29 @@
             if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                     && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
 
-                Crn5InTaskSta(crnSlave,crnProtocol);
+//                Crn5InTaskSta(crnSlave,crnProtocol);
+
+                // 濡傛灉鏈�杩戜竴娆℃槸鍏ュ簱妯″紡
+                if (crnProtocol.getLastIo().equals("I")) {
+                    if (basCrnp.getInEnable().equals("Y")) {
+                        this.Crn5InTaskSta(crnSlave,crnProtocol);
+                        crnProtocol.setLastIo("O");
+                    } else if (basCrnp.getOutEnable().equals("Y")) {
+                        this.locToCrn5Stn(crnSlave, crnProtocol); //  鍑哄簱
+                        crnProtocol.setLastIo("I");
+                    }
+                }
+                // 濡傛灉鏈�杩戜竴娆℃槸鍑哄簱妯″紡
+                else if (crnProtocol.getLastIo().equals("O")) {
+                    if (basCrnp.getOutEnable().equals("Y")) {
+                        this.locToCrn5Stn(crnSlave, crnProtocol); //  鍑哄簱
+                        crnProtocol.setLastIo("I");
+                    } else if (basCrnp.getInEnable().equals("Y")) {
+
+                        this.Crn5InTaskSta(crnSlave,crnProtocol);
+                        crnProtocol.setLastIo("O");
+                    }
+                }
 
             }
 
@@ -2249,4 +2283,319 @@
 
     }
 
+
+    public synchronized void crn5StnToOutStn() {
+        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
+            if (crnSlave.getId() != 5){
+                continue;
+            }
+            // 閬嶅巻鍫嗗灈鏈哄嚭搴撶珯
+            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
+                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                if (staProtocol == null) {
+                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) {
+                    // 鏌ヨ宸ヤ綔妗�
+                    WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(crnStn.getStaNo());
+                    if (wrkMast == null) {
+                        continue;
+                    }
+                    // 鍒ゆ柇宸ヤ綔妗f潯浠�
+                    if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
+                        continue;
+                    }
+                    // 鍒ゆ柇鍚婅溅鏄惁瀹為檯宸插畬鎴愶紝涓旂數鑴戠姸鎬佸湪move涓紝浠ュ鐢佃剳杩涜鏇存柊宸ヤ綔妗�
+                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
+                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
+                    if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
+                        // 绉诲姩涓�
+                        continue;
+                    }
+                    //  鍒ゆ柇鍫嗗灈鏈虹姸鎬佺瓑寰呯‘璁�
+                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
+                            && crnProtocol.statusType == CrnStatusType.WAITING
+                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
+
+                            // 鏇存柊宸ヤ綔妗g姸鎬佷负14
+                            wrkMast.setWrkSts(14L);
+
+                        wrkMast.setCrnEndTime(new Date());
+                        if (wrkMastMapper.updateById(wrkMast) != 0) {
+                            // 澶嶄綅鍫嗗灈鏈�
+                            crnThread.setResetFlag(true);
+                        } else {
+                            log.error("鏇存柊宸ヤ綔妗g殑宸ヤ綔鐘舵�佷负14澶辫触锛侊紒锛� [宸ヤ綔鍙�:{}]", wrkMast.getWrkNo());
+                        }
+
+                    }
+
+                }
+            }
+        }
+    }
+
+
+    public synchronized void locToCrn5Stn(CrnSlave slave, CrnProtocol crnProtocol) {
+        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
+            // 鑾峰彇宸ヤ綔鐘舵�佷负11锛堢敓鎴愬嚭搴揑D锛夌殑鍑哄簱宸ヤ綔妗�
+//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
+            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
+            //            鑾峰彇宸ヤ綔鐘舵�佷负14鐨勫伐浣滄。
+            WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep14(slave.getId(), crnStn.getStaNo());
+            if ( wrkMast1 !=null) {
+                continue;
+            }
+            for (WrkMast wrkMast : wrkMasts) {
+                if (wrkMast == null) {
+                    continue;
+                }
+                // 宸ヤ綔妗g姸鎬佸垽鏂�
+                if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
+                    log.error("鏌ヨ宸ヤ綔妗f暟鎹笉绗﹀悎鏉′欢--鍏ュ嚭绫诲瀷/绔欑偣, 宸ヤ綔鍙�={}锛屾簮搴撲綅={}锛屽叆鍑虹被鍨�={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
+                    continue;
+                }
+                // 鑾峰彇婧愬簱浣嶄俊鎭�
+                LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
+                if (!locMast.getLocSts().equals("R") && !locMast.getLocSts().equals("P")) {
+                    log.error("鍑哄簱鎿嶄綔搴撲綅鐘舵�佷笉绗﹀悎--鐘舵��, 搴撲綅鍙�={}锛屽簱浣嶇姸鎬�={}", wrkMast.getLocNo(), locMast.getLocSts());
+                    continue;
+                }
+                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                if (staProtocol == null) {
+                    break;
+//                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+
+                // 鏌ヨ绔欑偣璇︾粏淇℃伅
+                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
+                if (staDetl == null) {
+                    log.error("鍑哄簱 ===>> 鍫嗗灈鏈虹珯鐐瑰湪鏁版嵁搴撲笉瀛樺湪, 绔欑偣缂栧彿={}", crnStn.getStaNo());
+                    break;
+//                    continue;
+                }
+                // 鍒ゆ柇鍫嗗灈鏈哄嚭搴撶珯鐘舵��
+                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) {
+                    // 鍛戒护涓嬪彂鍖� --------------------------------------------------------------------------
+
+                    // 鍫嗗灈鏈烘帶鍒惰繃婊�
+                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
+//                        continue;
+                        break;
+                    }
+
+
+                    // 宸茬粡瀛樺湪鍚婅溅鎵ц浠诲姟鏃讹紝鍒欒繃婊�
+                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
+                        break;
+//                        return;
+                    }
+
+                    // 1.鍫嗗灈鏈哄紑濮嬬Щ鍔�
+                    CrnCommand crnCommand = new CrnCommand();
+                    crnCommand.setCrnNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
+                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 宸ヤ綔鍙�
+                    crnCommand.setAckFinish((short) 0);  // 浠诲姟瀹屾垚纭浣�
+                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 浠诲姟妯″紡:  搴撲綅绉昏浆
+                    crnCommand.setSourcePosX(locMast.getRow1()==9?(short)4:(short)5);     // 婧愬簱浣嶆帓
+                    crnCommand.setSourcePosY(locMast.getBay1().shortValue());     // 婧愬簱浣嶅垪
+                    crnCommand.setSourcePosZ(locMast.getLev1().shortValue());     // 婧愬簱浣嶅眰
+                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 鐩爣搴撲綅鎺�
+                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 鐩爣搴撲綅鍒�
+                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 鐩爣搴撲綅灞�
+                    crnCommand.setLocType1(locMast.getLocType1().shortValue());     // 璐х墿绫诲瀷
+                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
+                        log.error("鍫嗗灈鏈哄懡浠や笅鍙戝け璐ワ紝鍫嗗灈鏈哄彿={}锛屼换鍔℃暟鎹�={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
+                    } else {
+                        // 淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓�
+                        Date now = new Date();
+                        wrkMast.setWrkSts(12L);
+                        wrkMast.setCrnStrTime(now);
+                        wrkMast.setModiTime(now);
+                        if (wrkMastMapper.updateById(wrkMast) == 0) {
+                            log.error("淇敼宸ヤ綔妗g姸鎬� 11.鐢熸垚鍑哄簱ID => 12.鍚婅溅鍑哄簱涓� 澶辫触锛侊紒锛屽伐浣滃彿={}", wrkMast.getWrkNo());
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public synchronized void crn5TaskCreate() throws IOException {
+        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
+            if (crnSlave.getId() != 5){
+                continue;
+            }
+            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnInStn()) {
+                // 鑾峰彇鍫嗗灈鏈哄嚭搴撶珯淇℃伅
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
+                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
+                if (staProtocol == null) {
+                    break;
+//                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){
+
+                    EmptyBarrelIn emptyBarrelIn = emptyBarrelInService.selectOne(new EntityWrapper<>());
+                    if (Cools.isEmpty(emptyBarrelIn)){
+                        continue;
+                    }
+
+                    FullStoreParam fullStoreParam = new FullStoreParam();
+                    fullStoreParam.setDevpNo(crnStn.getStaNo());
+                    FullStoreParam.MatCodeStore matCodeStore = new FullStoreParam.MatCodeStore();
+                    matCodeStore.setMatnr(emptyBarrelIn.getMatnr());
+                    matCodeStore.setBatch(emptyBarrelIn.getBatch());
+                    if (staProtocol.isForce()){
+                        log.info("绌烘《寮哄埗鍏ュ簱锛�"+staProtocol.getAmount());
+                        matCodeStore.setAnfme(Double.valueOf(staProtocol.getAmount()));
+                    }else {
+                        matCodeStore.setAnfme(8d) ;
+                    }
+                    ArrayList<FullStoreParam.MatCodeStore> matCodeStores = new ArrayList<>();
+                    matCodeStores.add(matCodeStore);
+                    fullStoreParam.setList(matCodeStores);
+                    try {
+                        String response = new HttpHandler.Builder()
+                                .setUri(wmsUrl)
+                                .setPath("/full/store/put/start")
+                                .setJson(JSON.toJSONString(fullStoreParam))
+                                .build()
+                                .doPost();
+                        JSONObject jsonObject = JSON.parseObject(response);
+                        if (jsonObject.getInteger("code").equals(200)) {
+                            devpThread.setPakMk(crnStn.getStaNo(),false);
+                        }
+                    }catch (CoolException e){
+
+                    }
+
+                }
+
+            }
+        }
+    }
+
+    public synchronized void RGVTaskPut(){
+        for (RgvSlave rgvSlave:slaveProperties.getRgv()){
+            ZyRgvThread rgvThread = (ZyRgvThread)SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
+            if (rgvProtocol.getModeType() != RgvModeType.AUTO){
+                continue;
+            }
+
+
+            int workNo1 = 0;
+            int workNo2 = 0;
+            short souSta1 = 0;
+            short sta1 = 0;
+            short souSta2 = 0;
+            short sta2 = 0;
+
+            //宸ヤ綅涓�浠诲姟
+            for (RgvSlave.Sta inStn :  rgvSlave.getInStn()){
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId());
+                StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo());
+                if (staProtocol == null) {
+                    break;
+//                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){
+                    if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){
+                        WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo());
+                        if (Cools.isEmpty(wrkMast)){
+                            log.error("鏈壘鍒板伐浣滄。");
+                            continue;
+                        }
+                        workNo1 = wrkMast.getWrkNo();
+                        souSta1 = inStn.getSourceStaNo().shortValue();
+                        sta1 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo());
+                        break;
+                    }
+                    workNo1 = workNo++;
+                    souSta1 = inStn.getSourceStaNo().shortValue();
+                    sta1 = inStn.getStaNo().shortValue();
+                    break;
+                }
+            }
+
+
+            //宸ヤ綅浜屼换鍔�
+            for (RgvSlave.Sta inStn :  rgvSlave.getInStn()){
+                if (souSta1 == inStn.getSourceStaNo()){
+                    continue;
+                }
+                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId());
+                StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo());
+                if (staProtocol == null) {
+                    break;
+//                    continue;
+                } else {
+                    staProtocol = staProtocol.clone();
+                }
+                if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){
+                    if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){
+                        WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo());
+                        if (Cools.isEmpty(wrkMast)){
+                            log.error("鏈壘鍒板伐浣滄。");
+                            continue;
+                        }
+                        workNo2 = wrkMast.getWrkNo();
+                        souSta2 = inStn.getSourceStaNo().shortValue();
+                        sta2 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo());
+                        break;
+                    }
+                    workNo2 = workNo++;
+                    souSta2 = inStn.getSourceStaNo().shortValue();
+                    sta2 = inStn.getStaNo().shortValue();
+                    break;
+                }
+            }
+
+            //rgv浠诲姟涓嬪彂--------------------------------------------------------------
+            RgvCommand command = new RgvCommand();
+            command.setRgvNo(rgvSlave.getId()); // RGV缂栧彿
+            //宸ヤ綅1
+            command.setTaskNo1(workNo1); // 宸ヤ綔鍙�
+            command.setSourceStaNo1(souSta1); // 婧愮珯
+            command.setDestinationStaNo1(sta1);  // 鐩爣绔�
+            command.setAckFinish1(false);  // 浠诲姟瀹屾垚纭浣�
+
+            //宸ヤ綅2
+            command.setTaskNo2(workNo2); // 宸ヤ綔鍙�
+            command.setSourceStaNo2(souSta2); // 婧愮珯
+            command.setDestinationStaNo2(sta2);  // 鐩爣绔�
+            command.setAckFinish2(false);  // 浠诲姟瀹屾垚纭浣�
+
+            if (workNo1 != 0 && workNo2 ==0){
+                command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 浠诲姟妯″紡: 鍙栨斁璐�
+            } else if (workNo1 == 0 && workNo2 !=0) {
+                command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 浠诲姟妯″紡: 鍙栨斁璐�
+            }else {
+                command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 浠诲姟妯″紡: 鍙栨斁璐�
+            }
+            command.setCommand(false);
+            MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(2, command));
+            log.info("rgv浠诲姟涓嬪彂锛�"+JSON.toJSONString(command));
+
+        }
+    }
+
+
+    public synchronized void RGVTaskOver() {
+
+    }
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
index 6c2cc0d..0791e9b 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -62,4 +62,9 @@
         }
         return list;
     }
+
+    @Override
+    public WrkMast selectByworkNo(Short workNo) {
+        return this.baseMapper.selectByWrkNo(Integer.valueOf(workNo));
+    }
 }
diff --git a/src/main/java/com/zy/asrs/utils/Utils.java b/src/main/java/com/zy/asrs/utils/Utils.java
index a2e94d9..141b18a 100644
--- a/src/main/java/com/zy/asrs/utils/Utils.java
+++ b/src/main/java/com/zy/asrs/utils/Utils.java
@@ -8,6 +8,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by vincent on 2020/8/27
@@ -16,6 +17,21 @@
 
     private static final DecimalFormat fmt = new DecimalFormat("##0.00");
 
+    public static short getRgvEndStaNo(Integer rgvNo,Integer staNo){
+        Map<Integer, Short> rgv1Map = new HashMap<>();
+        Map<Integer, Short> rgv2Map = new HashMap<>();
+        Map<Integer, Short> rgv3Map = new HashMap<>();
+        switch (rgvNo){
+            case 1:
+                return rgv1Map.get(staNo);
+            case 2:
+                return rgv2Map.get(staNo);
+            case 3:
+                return rgv3Map.get(staNo);
+        }
+        return 0;
+    }
+
     public static float scale(Float f){
         if (f == null || f == 0f || Float.isNaN(f)) {
             return 0f;
diff --git a/src/main/java/com/zy/common/CodeBuilder.java b/src/main/java/com/zy/common/CodeBuilder.java
index 7df0e02..a172bd3 100644
--- a/src/main/java/com/zy/common/CodeBuilder.java
+++ b/src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
         generator.url="127.0.0.1:1433;databasename=mdqdasrs";
         generator.username="sa";
         generator.password="sa@123";
-        generator.table="asr_wrk_mast_sta";
+        generator.table="man_emptyBarrel_in";
         generator.packagePath="com.zy.asrs";
         generator.html = false;
         generator.htmlDetail = false;
diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java
index 70dfd89..497dc9c 100644
--- a/src/main/java/com/zy/core/MainProcess.java
+++ b/src/main/java/com/zy/core/MainProcess.java
@@ -37,16 +37,10 @@
 
                     // 闂撮殧
                     Thread.sleep(1000);
-
                     // 绯荤粺杩愯鐘舵�佸垽鏂�
                     if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                         continue;
                     }
-
-                    // 婕旂ず
-                    //mainService.crnDemoOfLocMove1();
-//                    // 婕旂ず 鎵�鏈夊簱浣嶈疆璇�
-//                    mainService.crnDemoOfLocMove2();
                     // 鍏ュ簱  ===>> 鍏ュ簱绔欏埌鍫嗗灈鏈虹珯锛屾牴鎹潯鐮佹壂鎻忕敓鎴愬叆搴撳伐浣滄。
                     mainService.generateStoreWrkFile(); // 缁勬墭
 //                    mainService.generateStoreWrkFile0(); // WMS鍏ュ簱
@@ -56,13 +50,8 @@
                     mainService.crnStnToOutStn();
                     // 鍏ュ嚭搴�  ===>>  鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂
                     mainService.crnIoExecute();
-                    //绌烘《搴撳叆搴�
-                    mainService.crn5InTask();
                     // 鍏ュ簱  ===>> 鎵ц瀵瑰伐浣滄。鐨勫畬鎴愭搷浣�
                     mainService.storeFinished();
-
-
-
                     // 鍫嗗灈鏈哄紓甯镐俊鎭褰�
                     mainService.recCrnErr();
                     // 鍏ュ簱  ===>> 绌烘爤鏉垮垵濮嬪寲鍏ュ簱,鍙夎溅鍏ュ簱绔欐斁璐�
@@ -77,6 +66,19 @@
                     //鎵弿鎷嗙洏鏈鸿嚜鍔ㄥ嚭搴撶┖鎵樼洏
                     mainService.autoEmptyOut();
 
+                    //浜屾湡
+                    //绌烘《搴撲换鍔$敓鎴�
+                    mainService.crn5TaskCreate();
+                    //绌烘《搴撳叆搴�
+                    mainService.crn5InTask();
+                    //绌烘《鍑哄簱瀹屾垚
+                    mainService.crn5StnToOutStn();
+                    //rgv浠诲姟
+                    mainService.RGVTaskPut();
+                    //rgv浠诲姟瀹屾垚
+                    mainService.RGVTaskOver();
+
+
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java
index 6a751f2..d48aae3 100644
--- a/src/main/java/com/zy/core/cache/MessageQueue.java
+++ b/src/main/java/com/zy/core/cache/MessageQueue.java
@@ -28,6 +28,8 @@
     // 鍙拌溅mq浜ゆ崲鏈�
     private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
 
+    private static final Map<Integer, LinkedBlockingQueue<Task>> RGV_EXCHANGE = new ConcurrentHashMap<>();
+
     /**
      * mq 浜ゆ崲鏈哄垵濮嬪寲
      */
@@ -35,6 +37,9 @@
         switch (type) {
             case Crn:
                 CRN_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
+                break;
+            case Rgv:
+                RGV_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
                 break;
             case Devp:
                 DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
@@ -64,6 +69,8 @@
         switch (type) {
             case Crn:
                 return CRN_EXCHANGE.get(id).offer(task);
+            case Rgv:
+                return RGV_EXCHANGE.get(id).offer(task);
             case Devp:
                 return DEVP_EXCHANGE.get(id).offer(task);
             case Barcode:
@@ -87,6 +94,8 @@
         switch (type) {
             case Crn:
                 return CRN_EXCHANGE.get(id).poll();
+            case Rgv:
+                return RGV_EXCHANGE.get(id).poll();
             case Devp:
                 return DEVP_EXCHANGE.get(id).poll();
             case Barcode:
@@ -109,6 +118,8 @@
         switch (type) {
             case Crn:
                 return CRN_EXCHANGE.get(id).peek();
+            case Rgv:
+                return RGV_EXCHANGE.get(id).peek();
             case Devp:
                 return DEVP_EXCHANGE.get(id).peek();
             case Barcode:
@@ -130,6 +141,9 @@
                 
                 CRN_EXCHANGE.get(id).clear();
                 break;
+            case Rgv:
+                RGV_EXCHANGE.get(id).clear();
+                break;
             case Devp:
                 DEVP_EXCHANGE.get(id).clear();
                 break;
diff --git a/src/main/java/com/zy/core/enums/RgvModeType.java b/src/main/java/com/zy/core/enums/RgvModeType.java
index 2b2fdc5..81d1747 100644
--- a/src/main/java/com/zy/core/enums/RgvModeType.java
+++ b/src/main/java/com/zy/core/enums/RgvModeType.java
@@ -5,16 +5,17 @@
  */
 public enum RgvModeType {
 
-    STOP((short) 0, "鍋滄満妯″紡"),
-    MANUAL((short) 1, "鎵嬪姩妯″紡"),
-    AUTO((short) 2, "鑷姩妯″紡"),
-    COMPUTER((short) 3, "鐢佃剳妯″紡"),
+    NONE(-1, "绂荤嚎"),
+    STOP(0, "鍏虫満"),
+    HAND(1, "鎵嬪姩"),
+    HALF_AUTO(2, "鍗婅嚜鍔�"),
+    AUTO(3, "鑷姩"),
+    AUTO2(100, "鍏跺畠"),
     ;
 
-    public Short id;
+    public Integer id;
     public String desc;
-
-    RgvModeType(Short id, String desc) {
+    RgvModeType(Integer id, String desc) {
         this.id = id;
         this.desc = desc;
     }
@@ -24,7 +25,7 @@
             return null;
         }
         for (RgvModeType type : RgvModeType.values()) {
-            if (type.id.equals(id)) {
+            if (type.id.equals(id.intValue())) {
                 return type;
             }
         }
@@ -35,9 +36,9 @@
         if (null == type) {
             return null;
         }
-        for (RgvModeType type1 : RgvModeType.values()) {
-            if (type1 == type) {
-                return type1;
+        for (RgvModeType rgvModeType : RgvModeType.values()) {
+            if (rgvModeType == type) {
+                return rgvModeType;
             }
         }
         return null;
diff --git a/src/main/java/com/zy/core/enums/RgvStatusType.java b/src/main/java/com/zy/core/enums/RgvStatusType.java
index 972cb31..5927760 100644
--- a/src/main/java/com/zy/core/enums/RgvStatusType.java
+++ b/src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -14,7 +14,8 @@
     RELEASE_WAIT((short) 5, "鏀捐揣绛夊緟"),
     RELEASE_WORKING((short) 6, "鏀捐揣涓�"),
     WALKING((short) 9, "璧拌涓�"),
-    WAITING((short) 90, "浠诲姟瀹屾垚绛夊緟WCS纭"),
+    WAITING((short) 90, "宸ヤ綅涓�浠诲姟瀹屾垚绛夊緟WCS纭"),
+    WAITING2((short) 91, "宸ヤ綅浜屼换鍔″畬鎴愮瓑寰匴CS纭"),
     ALARM((short) 99, "鎶ヨ"),
     OTHER((short) 100, "鍏朵粬"),
     ;
diff --git a/src/main/java/com/zy/core/enums/RgvTaskModeType.java b/src/main/java/com/zy/core/enums/RgvTaskModeType.java
index 85a8626..b1c1128 100644
--- a/src/main/java/com/zy/core/enums/RgvTaskModeType.java
+++ b/src/main/java/com/zy/core/enums/RgvTaskModeType.java
@@ -2,26 +2,32 @@
 
 public enum RgvTaskModeType {
 
-    NONE((short) 0, "鏃�"),
-    PICK((short) 1, "鍙栬揣"),
-    RELEASE((short) 2, "鏀捐揣"),
-    PICK_RELEASE((short) 3, "鍙栨斁璐�"),
-    MOVE((short) 4, "绉诲姩(鍙戝伐浣�1浠诲姟鍗冲彲)"),
+    NONE(0),    // 鏃�
+    FETCH(1),    // 鍙栬揣
+    PUT(2),    // 鏀捐揣
+    FETCH_PUT_ALL(1),    // 鍙栨斁璐�
+    FETCH_PUT1(8),    // 鍙栨斁璐�
+    FETCH_PUT2(9),    // 鍙栨斁璐�
+    X_MOVE(4),    // 绔欎綅绉昏浆
+    //    Y_MOVE(5),    // 绔欎綅绉昏浆
+//    XY_MOVE(6),    // 绔欎綅绉昏浆
+    GO_ORIGIN(7),    // 鍥炲師鐐�
+//    BACK_ORIGIN(8),      // 鍥炲弽鍘熺偣
+//    CLEAR(9),       // 娓呴敊
     ;
-    public Short id;
-    public String desc;
 
-    RgvTaskModeType(Short id, String desc) {
+    public Integer id;
+    RgvTaskModeType(Integer id) {
         this.id = id;
-        this.desc = desc;
     }
+
 
     public static RgvTaskModeType get(Short id) {
         if (null == id) {
             return null;
         }
         for (RgvTaskModeType type : RgvTaskModeType.values()) {
-            if (type.id.equals(id)) {
+            if (type.id.equals(id.intValue())) {
                 return type;
             }
         }
@@ -32,9 +38,9 @@
         if (null == type) {
             return null;
         }
-        for (RgvTaskModeType type1 : RgvTaskModeType.values()) {
-            if (type1 == type) {
-                return type1;
+        for (RgvTaskModeType rgvTaskModeType : RgvTaskModeType.values()) {
+            if (rgvTaskModeType == type) {
+                return rgvTaskModeType;
             }
         }
         return null;
diff --git a/src/main/java/com/zy/core/model/RgvSlave.java b/src/main/java/com/zy/core/model/RgvSlave.java
index f2de390..a89d9d0 100644
--- a/src/main/java/com/zy/core/model/RgvSlave.java
+++ b/src/main/java/com/zy/core/model/RgvSlave.java
@@ -21,12 +21,11 @@
 
     @Data
     public static class Sta {
+        private Integer sourceStaNo;//婧愮珯
+        private Integer sourcePlcId;
 
         private Integer staNo;//鐩爣绔�
-
-        private Integer sourceStaNo;//婧愮珯
-
-        private Integer devpPlcId;
+        private Integer staPlcId;
 
     }
 
diff --git a/src/main/java/com/zy/core/model/command/RgvCommand.java b/src/main/java/com/zy/core/model/command/RgvCommand.java
index e4079e2..1472669 100644
--- a/src/main/java/com/zy/core/model/command/RgvCommand.java
+++ b/src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -13,40 +13,17 @@
     // RGV缂栧彿
     private Integer rgvNo = 0;
 
-    // 浠诲姟瀹屾垚纭浣�
-    private boolean ackFinish = false;
-
-    //**************宸ヤ綅1**************
-
-    // 宸ヤ綅1宸ヤ綔鍙�
-    private Integer taskNo1 = 0;
-
-    /**
-     * 浠诲姟妯″紡锛�
-     * 0 = 鏃�
-     * 1 = 鍙栬揣
-     * 2 = 鏀捐揣
-     * 3 = 鍙栨斁璐�
-     * 4 = 绉诲姩(鍙戝伐浣�1浠诲姟鍗冲彲)
-     */
-    private Short taskMode1 = 0;
-
-    @JSONField(serialize = false)
-    private RgvTaskModeType taskModeType1;
-
     // 宸ヤ綅1婧愮珯
     private Short sourceStaNo1 = 0;
 
     // 宸ヤ綅1鐩爣绔�
     private Short destinationStaNo1 = 0;
 
-    //**************宸ヤ綅1**************
+    // 宸ヤ綅2婧愮珯
+    private Short sourceStaNo2 = 0;
 
-
-    //**************宸ヤ綅2**************
-
-    // 宸ヤ綅2宸ヤ綔鍙�
-    private Short taskNo2 = 0;
+    // 宸ヤ綅2鐩爣绔�
+    private Short destinationStaNo2 = 0;
 
     /**
      * 浠诲姟妯″紡锛�
@@ -56,40 +33,41 @@
      * 3 = 鍙栨斁璐�
      * 4 = 绉诲姩(鍙戝伐浣�1浠诲姟鍗冲彲)
      */
-    private Short taskMode2 = 0;
+    private Short taskMode = 0;
+
+    // 宸ヤ綅1宸ヤ綔鍙�
+    private Integer taskNo1 = 0;
+    // 宸ヤ綅2宸ヤ綔鍙�
+    private Integer taskNo2 = 0;
+
+    // 浠诲姟纭 0锛氭湭纭 1锛氬凡纭
+    private boolean command = false;
+
+
+    // 浠诲姟瀹屾垚纭浣�
+    private boolean ackFinish1 = false;
+
+    // 浠诲姟瀹屾垚纭浣�
+    private boolean ackFinish2 = false;
 
     @JSONField(serialize = false)
-    private RgvTaskModeType taskModeType2;
+    private RgvTaskModeType taskModeType;
 
-    // 宸ヤ綅1婧愮珯
-    private Short sourceStaNo2 = 0;
-
-    // 宸ヤ綅1鐩爣绔�
-    private Short destinationStaNo2 = 0;
 
     //**************宸ヤ綅2**************
 
-    // 浠诲姟纭 0锛氭湭纭 1锛氬凡纭
-    private Short command = 0;
 
-    public void setTaskMode1(Short taskMode){
-        this.taskMode1 = taskMode;
-        this.taskModeType1 = RgvTaskModeType.get(taskMode);
+
+    public void setTaskMode(Short taskMode){
+        this.taskMode = taskMode;
+        this.taskModeType = RgvTaskModeType.get(taskMode);
     }
 
-    public void setTaskMode1(RgvTaskModeType type) {
-        this.taskModeType1 = type;
-        this.taskMode1 = RgvTaskModeType.get(type).id;
+    public void setTaskMode(RgvTaskModeType type) {
+        this.taskModeType = type;
+        this.taskMode = RgvTaskModeType.get(type).id.shortValue();
     }
 
-    public void setTaskMode2(Short taskMode){
-        this.taskMode2 = taskMode;
-        this.taskModeType2 = RgvTaskModeType.get(taskMode);
-    }
 
-    public void setTaskMode2(RgvTaskModeType type) {
-        this.taskModeType2 = type;
-        this.taskMode2 = RgvTaskModeType.get(type).id;
-    }
 
 }
diff --git a/src/main/java/com/zy/core/model/protocol/RgvProtocol.java b/src/main/java/com/zy/core/model/protocol/RgvProtocol.java
index 13c11bf..d6df231 100644
--- a/src/main/java/com/zy/core/model/protocol/RgvProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -1,98 +1,195 @@
 package com.zy.core.model.protocol;
 
+import com.zy.asrs.entity.BasRgv;
 import com.zy.core.enums.RgvModeType;
 import com.zy.core.enums.RgvStatusType;
 import com.zy.core.enums.RgvWalkPosType;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
 
 @Data
 public class RgvProtocol {
 
-    //RGV缂栧彿
-    private Integer rgvNo;
+    private Integer RgvNo;
 
-    //妯″紡
-    private Short mode;
+    /**
+     * 1 = 鎵嬪姩妯″紡
+     * 2 = 鑷姩妯″紡
+     * 3 = 鐢佃剳妯″紡
+     */
+    public Short mode;
 
-    //RGV妯″紡鏋氫妇
-    private RgvModeType modeType;
+    public RgvModeType modeType;
 
-    //RGV鐘舵��
-    private Short status;
+    /**
+     * 宸ヤ綅1浠诲姟鍙�
+     */
+    public Integer taskNo1 = 0;
+    /**
+     * 宸ヤ綅2浠诲姟鍙�
+     */
+    public Integer taskNo2 = 0;
 
-    //RGV鐘舵�佹灇涓�
-    private RgvStatusType statusType;
+    /**
+     * RGV褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 1锛氫綔涓氫腑
+     * 2锛氭姤璀�
+     */
+    public Short status;
 
-    //宸ヤ綅1宸ヤ綔鍙�
-    private Integer taskNo1;
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType;
+    /**
+     * 褰撳墠鍒楀彿
+     */
+    public Short columnNumber;
 
-    //宸ヤ綅1鏈夌墿淇″彿
-    private Short loaded1;
+    /**
+     * RGV褰撳墠浣嶇疆
+     */
+    public Integer RgvPos;
 
-    //RGV褰撳墠浣嶇疆
-    private Short rgvPos;
+    /**
+     * 宸ヤ綅1鏈夌墿
+     */
+    public Short loaded1;
 
-    //璧拌鍦ㄥ畾浣� 0锛氬湪瀹氫綅锛�1锛氫笉鍦ㄥ畾浣�
-    private Short walkPos;
 
-    //RGV璧拌鏋氫妇
-    private RgvWalkPosType walkPosType;
+    /**
+     * 寮傚父鐮�
+     */
+    public Short alarm;
 
-    //宸ヤ綅2宸ヤ綔鍙�
-    private Short taskNo2;
+    /**
+     * X琛岃蛋琛岄�熷害m/min
+     */
+    private Float xSpeed;
 
-    //宸ヤ綅2鏈夌墿淇″彿
-    private Short loaded2;
+    /**
+     * 鍫嗗灈鏈虹疮璁¤蛋琛岃窛绂籯m
+     */
+    public Float xDistance;
 
-    //宸ヤ綅1浠诲姟瀹屾垚淇″彿
-    private Short taskFinish1;
+    /**
+     * 鍫嗗灈鏈虹疮璁¤蛋琛屾椂闀縣
+     */
+    public Float xDuration;
 
-    //宸ヤ綅2浠诲姟瀹屾垚淇″彿
-    private Short taskFinish2;
 
-    //寮傚父鐮�
-    private Short alarm;
 
-    //蹇冭烦
-    private Short heart;
 
-    //澶囩敤1
-    private Integer temp1;
 
-    //澶囩敤2
+    /**
+     * RGV宸ヤ綅1褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 11锛氬彇璐т腑
+     * 12锛氭斁璐т腑
+     * 10锛氫换鍔″畬鎴愮瓑寰匴CS纭
+     */
+    public Short status1;
+
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType1;
+
+
+
+
+
+    /**
+     * 璧拌鍦ㄥ畾浣�
+     * 0 = 鍦ㄥ畾浣�
+     * 1 = 涓嶅湪瀹氫綅
+     */
+    public Short walkPos;
+
+
+
+
+    /**
+     * RGV宸ヤ綅2褰撳墠鐘舵��
+     * 0锛氱┖闂诧紝鏃犱换鍔�
+     * 11锛氬彇璐т腑
+     * 12锛氭斁璐т腑
+     * 10锛氫换鍔″畬鎴愮瓑寰匴CS纭
+     */
+    public Short status2;
+
+    /**
+     * 鐘舵�佹灇涓�
+     */
+    public RgvStatusType statusType2;
+
+    /**
+     * 宸ヤ綅2鏈夌墿
+     */
+    public Short loaded2;
+
+
+
+    /**
+     * 蹇冭烦鎸囦护 1-2姣忕鍒囨崲涓�娆�
+     */
+    public Short heart;
+
+    private Short temp1;
+
     private Short temp2;
 
-    //澶囩敤3
     private Short temp3;
 
-    //澶囩敤4
     private Short temp4;
 
-    //澶囩敤5
     private Short temp5;
 
-    //宸ヤ綅1浠诲姟妯″紡
-    private Short taskMode1;
 
-    //宸ヤ綅1婧愮珯
-    private Short sourceStn1;
 
-    //宸ヤ綅1鐩爣绔�
-    private Short destinationPos1;
+    public void setMode(Short mode) {
+        this.mode = mode;
+        this.modeType = RgvModeType.get(mode);
+    }
 
-    //宸ヤ綅2浠诲姟妯″紡
-    private Short taskMode2;
+    public void setMode(RgvModeType type) {
+        this.modeType = type;
+        this.mode = RgvModeType.get(type).id.shortValue();
+    }
 
-    //宸ヤ綅2婧愮珯
-    private Short sourceStn2;
+    public void setStatus(Short status){
+        this.status = status;
+        this.statusType = RgvStatusType.get(status);
+    }
 
-    //宸ヤ綅2鐩爣绔�
-    private Short destinationPos2;
+    public void setStatus(RgvStatusType type){
+        this.statusType = type;
+        this.status = RgvStatusType.get(type).id.shortValue();
+    }
 
-    //宸ヤ綅1涓嬪彂鏃堕棿
-    private Long task1SendTime;
+    public void setStatus1(Short status1){
+        this.status1 = status1;
+        this.statusType1 = RgvStatusType.get(status1);
+    }
+
+    public void setStatus1(RgvStatusType type1){
+        this.statusType1 = type1;
+        this.status1 = RgvStatusType.get(type1).id.shortValue();
+    }
+
+    public void setStatus2(Short status2){
+        this.status2 = status2;
+        this.statusType2 = RgvStatusType.get(status2);
+    }
+
+    public void setStatus2(RgvStatusType type2){
+        this.statusType2 = type2;
+        this.status2 = RgvStatusType.get(type2).id.shortValue();
+    }
 
     /**
      * 鏈�杩戜竴娆″叆鍑哄簱绫诲瀷
@@ -101,34 +198,50 @@
      */
     private String lastIo = "I";
 
-    public void setMode(Short mode) {
-        this.mode = mode;
-        this.modeType = RgvModeType.get(mode);
+
+    public BasRgv toSqlModel(BasRgv basRgv){
+        if (alarm!=null) {
+            basRgv.setRgvErr(alarm.longValue());
+        }
+        basRgv.setWrkNo1(taskNo1.intValue());
+//        basRgv.setWrkNo2(taskNo2.intValue());
+        return basRgv;
     }
 
-    public void setMode(RgvModeType type) {
-        this.mode = type.id;
-        this.modeType = type;
+    public void setxSpeed(float xSpeed) {
+        this.xSpeed = xSpeed;
     }
 
-    public void setStatus(Short status) {
-        this.status = status;
-        this.statusType = RgvStatusType.get(status);
+    public void setxDistance(float xDistance) {
+        this.xDistance = xDistance;
     }
 
-    public void setStatus(RgvStatusType type) {
-        this.status = type.id;
-        this.statusType = type;
+    public void setxDuration(float xDuration) {
+        this.xDuration = xDuration;
     }
 
-    public void setWalkPos(Short walkPos) {
-        this.walkPos = walkPos;
-        this.walkPosType = RgvWalkPosType.get(walkPos);
+    public Integer getRgvPosI(){
+        //闇�瑕佹牴鎹幇鍦烘敼閫�  鏍规嵁璇诲埌鐨勫�艰幏鍙栧搴旂珯鐐逛綅缃�
+        Map<Short,Integer> map = new HashMap<>();
+        map.put((short) 1,100);map.put((short) 2,101);
+        map.put((short) 3,106);map.put((short) 4,107);
+        map.put((short) 5,112);map.put((short) 6,113);
+        map.put((short) 7,119);map.put((short) 8,124);
+        map.put((short) 9,149);map.put((short) 10,153);
+        map.put((short) 11,157);map.put((short) 12,161);
+        if (RgvPos==null) return 0;
+
+        return map.get(RgvPos);
     }
 
-    public void setWalkPos(RgvWalkPosType type) {
-        this.walkPos = type.id;
-        this.walkPosType = type;
+    @Override
+    public RgvProtocol clone() {
+        try {
+            return (RgvProtocol) super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 
 }
diff --git a/src/main/java/com/zy/core/model/protocol/StaProtocol.java b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
index dfb9de5..fb81cc3 100644
--- a/src/main/java/com/zy/core/model/protocol/StaProtocol.java
+++ b/src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -85,6 +85,9 @@
     // 鎵爜澶辫触
     private boolean barcodeErr = false;
 
+    private boolean force = false;
+    private short amount = 0;
+
     public Boolean isErr(){
         if (frontErr || backErr || highErr || leftErr || rightErr || weightErr || barcodeErr){
             return true;
@@ -104,7 +107,7 @@
         basDevp.setLocType1((short) 0);  // 楂樹綆绫诲瀷{0:鏈煡,1:浣庡簱浣�,2:楂樺簱浣峿
         basDevp.setLocType2((short) 0);  // 瀹界獎绫诲瀷{0:鏈煡,1:绐勫簱浣�,2:瀹藉簱浣峿
         basDevp.setLocType3((short) 0);  // 杞婚噸绫诲瀷{0:鏈煡,1:杞诲簱浣�,2:閲嶅簱浣峿
-        basDevp.setLocType1(high != low && low ? (short) 1 : (short) 2);
+        basDevp.setLocType1(high != low && high ? (short) 2 : (short) 1);
 //        basDevp.
         return basDevp;
     }
diff --git a/src/main/java/com/zy/core/thread/SiemensDevpThread.java b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
index c360820..70a9ffa 100644
--- a/src/main/java/com/zy/core/thread/SiemensDevpThread.java
+++ b/src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -59,9 +59,7 @@
     }};
 
     public static final ArrayList<Integer> staNos3 = new ArrayList<Integer>() {{
-        add(2007);add(2008);add(2009);add(2010);add(2011);add(2012);add(2013);
-        add(2108);add(2109);add(2110);add(2111);add(2112);add(2113);add(2114);
-        add(2401);add(2402);add(2403);
+        add(5001);add(5002);
     }};
 
     public static final ArrayList<Integer> staNos4 = new ArrayList<Integer>() {{
@@ -88,15 +86,13 @@
     }};
 
     public static final ArrayList<Integer> writeStaNos2 = new ArrayList<Integer>() {{
-        add(2001);add(2002);add(2003);
-        add(2101);add(2102);add(2103);
-        add(2301);
+        add(2001);add(2002);add(2101);add(2102);add(2301);add(2302);
+        add(2303);add(2304);add(2305);add(2306);add(2003);add(2004);add(2005);
+        add(2006);add(2103);add(2104);add(2105);add(2106);add(2107);
     }};
 
     public static final ArrayList<Integer> writeStaNos3 = new ArrayList<Integer>() {{
-        add(2013);
-        add(2114);
-        add(2401);add(2402);
+        add(5001);add(5002);
     }};
 
     public static final ArrayList<Integer> writeStaNos4 = new ArrayList<Integer>() {{
@@ -209,7 +205,12 @@
                 switch (step) {
                     // 璇绘暟鎹�
                     case 1:
-                        read();
+                        if (slave.getId() ==3){
+                            read30();
+                        }else {
+                            read();
+                        }
+
                         break;
                     // 鍐欐暟鎹� ID+鐩爣绔�
                     case 2:
@@ -356,6 +357,66 @@
         }
     }
 
+    private void read30() throws InterruptedException {
+        ArrayList<Integer> staNos = getStaNo();
+        int staNoSize = staNos.size();
+        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size() * 8));
+
+        result = siemensS7Net.Read("DB101.0", (short) (getStaNo().size()*4));
+        if (result.IsSuccess) {
+            for (int i = 0; i < staNoSize; i++) {
+                Integer siteId = staNos.get(i); // 绔欑偣缂栧彿
+                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*4, 1);
+                short count = siemensS7Net.getByteTransform().TransInt16(result.Content, i * 4 + 2);
+
+                StaProtocol staProtocol = station.get(siteId);
+                if (null == staProtocol) {
+                    staProtocol = new StaProtocol();
+                    staProtocol.setSiteId(siteId);
+                    station.put(siteId, staProtocol);
+                }
+                staProtocol.setAutoing(status[0]);  // 鑷姩
+                staProtocol.setLoading(status[1]);  // 鏈夌墿
+                staProtocol.setInEnable(status[2]); // 鍙叆
+                staProtocol.setOutEnable(status[3]);// 鍙嚭
+                staProtocol.setForce(status[4]);
+                staProtocol.setAmount(count);
+
+
+                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
+                    staProtocol.setPakMk(true);
+                }
+            }
+        }
+
+        if (result.IsSuccess) {
+
+            OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+
+            // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
+            try {
+                List<BasDevp> basDevps = new ArrayList<>();
+                for (Integer siteId : staNos) {
+                    StaProtocol staProtocol = station.get(siteId);
+                    basDevps.add(staProtocol.toSqlModel());
+                }
+
+                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
+                if (null != basDevpService && !basDevpService.updateBatchById(basDevps)) {
+                    throw new Exception("鏇存柊鏁版嵁搴撴暟鎹け璐�");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                OutputQueue.DEVP.offer(MessageFormat.format("銆恵0}銆戞洿鏂版暟鎹簱鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
+                log.error("鏇存柊鏁版嵁搴撴暟鎹け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+            }
+
+        } 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()));
+//            log.error("璇诲彇杈撻�佺嚎plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
+        }
+    }
+
     /**
      * 鍐欏叆 ID+鐩爣绔� =====> 鍗曠珯鐐瑰啓鍏�
      */
diff --git a/src/main/java/com/zy/core/thread/ZyRgvThread.java b/src/main/java/com/zy/core/thread/ZyRgvThread.java
index 184847d..5df1199 100644
--- a/src/main/java/com/zy/core/thread/ZyRgvThread.java
+++ b/src/main/java/com/zy/core/thread/ZyRgvThread.java
@@ -64,23 +64,13 @@
                     case 2:
                         write((RgvCommand) task.getData());
                         break;
-                    // 澶嶄綅
+                    // 宸ヤ綅1澶嶄綅
                     case 3:
-                        RgvCommand command = (RgvCommand) task.getData();
-                        if (null == command) {
-                            command = new RgvCommand();
-                        }
-                        command.setRgvNo(slave.getId()); // 鍫嗗灈鏈虹紪鍙�
-                        command.setTaskNo1(0); // 宸ヤ綔鍙�
-                        command.setTaskMode1(RgvTaskModeType.NONE); // 浠诲姟妯″紡
-                        command.setSourceStaNo1((short) 0);//婧愮珯
-                        command.setDestinationStaNo1((short) 0);//鐩爣绔�
-                        command.setTaskNo2((short) 0); // 宸ヤ綔鍙�
-                        command.setTaskMode2(RgvTaskModeType.NONE); // 浠诲姟妯″紡
-                        command.setSourceStaNo2((short) 0);//婧愮珯
-                        command.setDestinationStaNo2((short) 0);//鐩爣绔�
-                        command.setAckFinish(true);  // 浠诲姟瀹屾垚纭浣�
-                        write(command);
+                        writeAckFinish1((RgvCommand) task.getData());
+                        break;
+                        //宸ヤ綅2澶嶄綅
+                    case 4:
+                        writeAckFinish2((RgvCommand) task.getData());
                         break;
 
                     default:
@@ -88,7 +78,7 @@
                 }
                 Thread.sleep(500);
             } catch (Exception e) {
-//                e.printStackTrace();
+                e.printStackTrace();
             }
 
         }
@@ -103,10 +93,10 @@
         OperateResult connect = siemensNet.ConnectServer();
         if(connect.IsSuccess){
             result = true;
-            OutputQueue.CRN.offer(MessageFormat.format( "銆恵0}銆慠GV 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()));
+            OutputQueue.RGV.offer(MessageFormat.format( "銆恵0}銆慠GV 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()));
             log.info("RGV plc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
         } else {
-            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慠GV 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()));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慠GV 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()));
             log.error("RGV plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
             initRgv();
         }
@@ -118,7 +108,7 @@
      */
     private void readStatus(){
         try {
-            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
+            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34);
             if (result.IsSuccess) {
                 if (null == rgvProtocol) {
                     rgvProtocol = new RgvProtocol();
@@ -126,17 +116,18 @@
                 }
                 rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));//妯″紡
                 rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt32(result.Content, 2));//宸ヤ綅1宸ヤ綔鍙�
-                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 6));//RGV鐘舵��
-                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 8));//RGV褰撳墠浣嶇疆
-                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));//璧拌鍦ㄥ畾浣�
-                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt32(result.Content, 12));//澶囩敤1
-                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 16));//宸ヤ綅1鏈夌墿
-                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 18));//寮傚父鐮�
-                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 20));//澶囩敤2
-                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));//澶囩敤3
-                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 28));//澶囩敤4
+                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt32(result.Content, 6));//宸ヤ綅1宸ヤ綔鍙�
+                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 10));//RGV鐘舵��
+                rgvProtocol.setColumnNumber(siemensNet.getByteTransform().TransInt16(result.Content, 12));//RGV褰撳墠浣嶇疆
+                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 14));//璧拌鍦ㄥ畾浣�
+                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 16));//RGV褰撳墠浣嶇疆
+                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 20));//宸ヤ綅1鏈夌墿
+                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 22));//寮傚父鐮�
+                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 24));//澶囩敤2
+                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransSingle(result.Content, 28));//澶囩敤3
+                rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 32));//澶囩敤4
 
-                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
 
                 // 澶嶄綅淇″彿
                 if (rgvProtocol.getStatusType().equals(RgvStatusType.WAITING)) {
@@ -172,16 +163,33 @@
 
             } else {
                 initRgv();
-                OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV 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()));
+                OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV 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()));
                 log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
             }
         } catch (Exception e) {
             e.printStackTrace();
-            OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+            OutputQueue.RGV.offer(MessageFormat.format("銆恵0}銆戣鍙朢GV plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
             log.error("璇诲彇RGV plc鐘舵�佷俊鎭け璐� ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
             initRgv();
         }
     }
+    private boolean writeAckFinish1(RgvCommand command) throws InterruptedException {
+        OperateResult write = siemensNet.Write("DB100.22.1", true);
+        if (!write.IsSuccess){
+            log.error("浠诲姟1纭瀹屾垚鍐欏叆RGVplc鏁版嵁澶辫触锛岄噸鏂版坊鍔犱换鍔″埌闃熷垪 ===> [id:{}]",slave.getId());
+            MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(3, command));
+        }
+        return write.IsSuccess;
+    }
+    private boolean writeAckFinish2(RgvCommand command) throws InterruptedException {
+        OperateResult write = siemensNet.Write("DB100.22.2", true);
+        if (!write.IsSuccess){
+            log.error("浠诲姟2纭瀹屾垚鍐欏叆RGVplc鏁版嵁澶辫触锛岄噸鏂版坊鍔犱换鍔″埌闃熷垪 ===> [id:{}]",slave.getId());
+            MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command));
+        }
+        return write.IsSuccess;
+    }
+
 
     /**
      * 鍐欏叆鏁版嵁
@@ -198,11 +206,21 @@
         array[1] = command.getSourceStaNo2();
         array[2] = command.getDestinationStaNo1();
         array[3] = command.getDestinationStaNo2();
-        array[4] = command.getTaskMode1();
+        array[4] = command.getTaskMode();
+
+        int[] array2 = new int[3];
+        array2[0] = command.getTaskNo1();
+        array2[1] = command.getTaskNo2();
+        array2[2] = 0;
+
+        boolean[] array3 = new boolean[3];
+        array3[0] = command.isCommand();
+        array3[1] = command.isAckFinish1();
+        array3[2] = command.isAckFinish2();
 
         OperateResult result1 = siemensNet.Write("DB100.0",array);
-        OperateResult result2 = siemensNet.Write("DB100.10",command.getTaskNo1());
-        OperateResult result3 = siemensNet.Write("DB100.18.1",command.isAckFinish());
+        OperateResult result2 = siemensNet.Write("DB100.10",array2);
+        OperateResult result3 = siemensNet.Write("DB100.22",array3);
 
         if (!result1.IsSuccess && !result2.IsSuccess && !result3.IsSuccess){
             log.error("鍐欏叆RGVplc鏁版嵁澶辫触锛岄噸鏂版坊鍔犱换鍔″埌闃熷垪 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
@@ -215,23 +233,33 @@
         //RGV浠诲姟鍐欏叆鍚庯紝鍥炶涓�娆★紝鐪嬫槸鍚︽垚鍔�
         Thread.sleep(400);
         try {
-            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
-            OperateResultExOne<byte[]> resultReadAck = siemensNet.Read("DB100.18.1", (short) 1);
-            if (resultRead.IsSuccess){
+            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
+            OperateResultExOne<byte[]> readAck1 = siemensNet.Read("DB100.0", (short) 22.1);
+            OperateResultExOne<byte[]> readAck2 = siemensNet.Read("DB100.0", (short) 22.2);
+            if (resultRead.IsSuccess && readAck1.IsSuccess && readAck2.IsSuccess){
                 RgvCommand one = new RgvCommand();
-                one.setAckFinish(siemensNet.getByteTransform().TransBool(resultReadAck.Content, 0));
                 one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                 one.setSourceStaNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                 one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                 one.setDestinationStaNo2(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
-                one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
+                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                 one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));
+                one.setTaskNo2(siemensNet.getByteTransform().TransInt32(resultRead.Content, 14));
+                one.setCommand(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
+                one.setAckFinish1(siemensNet.getByteTransform().TransBool(readAck1.Content, 0));
+                one.setAckFinish2(siemensNet.getByteTransform().TransBool(readAck2.Content, 0));
 //                one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
-                if (    !command.isAckFinish() == one.isAckFinish() ||
+                if (    !command.isAckFinish1() == one.isAckFinish1() ||
+                        !command.isAckFinish2() == one.isAckFinish2() ||
+                        !command.isCommand() == one.isCommand() ||
+
                         !command.getTaskNo1().equals(one.getTaskNo1()) ||
-                        !command.getTaskMode1().equals(one.getTaskMode1()) ||
+                        !command.getTaskNo2().equals(one.getTaskNo2()) ||
+                        !command.getTaskMode().equals(one.getTaskMode()) ||
                         !command.getSourceStaNo1().equals(one.getSourceStaNo1()) ||
-                        !command.getDestinationStaNo1().equals(one.getDestinationStaNo1())
+                        !command.getDestinationStaNo1().equals(one.getDestinationStaNo1()) ||
+                        !command.getSourceStaNo2().equals(one.getSourceStaNo2()) ||
+                        !command.getDestinationStaNo2().equals(one.getDestinationStaNo2())
                 ){
                     try{
                         log.error("RGV鍛戒护鍦板潃鍐欏叆鍚庡洖璇诲け璐id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
@@ -250,12 +278,15 @@
                 }else {
                     log.info("RGV鍛戒护鍦板潃鍐欏叆鍚庡洖璇绘垚鍔焄id:{}] >>>>> 鍐欏叆[{}],===>>鍥炶[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                 }
+            }else {
+                log.error("RGV鍛戒护鍦板潃鍐欏叆鍚庡洖璇诲嚭閿�,閲嶆柊鍔犲叆闃熷垪");
+                MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(2, command));
             }
         }catch (Exception e){
             log.error("RGV鍛戒护鍦板潃鍐欏叆鍚庡洖璇诲嚭閿�");
         }
 
-        if (!command.isAckFinish()) {
+        if (!command.isAckFinish1() && !command.isAckFinish2()) {
             if (result1.IsSuccess) {
                 Thread.sleep(300);
                 //浠诲姟涓嬪彂娆℃暟
@@ -263,11 +294,11 @@
 
                 do {
                     writeCount2++;
-                    result1 = siemensNet.Write("DB100.18", true);
+                    result1 = siemensNet.Write("DB100.22", true);
                     if(result1.IsSuccess){
                         //RGV浠诲姟鍐欏叆鍚庯紝鍥炶涓�娆★紝鐪嬫槸鍚︽垚鍔�
                         Thread.sleep(200);
-                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
+                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.22", (short) 2);
                         if (resultRead.IsSuccess) {
                             boolean commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0);
                             if (!commandFinish){
@@ -309,9 +340,18 @@
         if (null == rgvProtocol) {
             rgvProtocol = new RgvProtocol();
         }
-        rgvProtocol.setMode((short) 0);
-        rgvProtocol.setStatus((short) -1);
-        rgvProtocol.setWalkPos((short) 1);
+        rgvProtocol.setMode((short) 0);//妯″紡
+        rgvProtocol.setTaskNo1(0);//宸ヤ綅1宸ヤ綔鍙�
+        rgvProtocol.setTaskNo2(0);//宸ヤ綅1宸ヤ綔鍙�
+        rgvProtocol.setStatus((short) 0);//RGV鐘舵��
+        rgvProtocol.setColumnNumber((short) 0);//RGV褰撳墠浣嶇疆
+        rgvProtocol.setWalkPos((short) 0);//璧拌鍦ㄥ畾浣�
+        rgvProtocol.setRgvPos(0);//RGV褰撳墠浣嶇疆
+        rgvProtocol.setLoaded1((short) 0);//宸ヤ綅1鏈夌墿
+        rgvProtocol.setAlarm((short) 0);//寮傚父鐮�
+        rgvProtocol.setxSpeed( 0);//澶囩敤2
+        rgvProtocol.setxDistance(0);//澶囩敤3
+        rgvProtocol.setxDuration( 0);//澶囩敤4
     }
 
     @Override
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index c499a4b..3b07a94 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -8,7 +8,7 @@
     name: @pom.build.finalName@
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    url: jdbc:sqlserver://127.0.0.1:1433;databasename=mdqdasrs
+    url: jdbc:sqlserver://10.10.10.212:1433;databasename=mdqdasrs
     username: sa
     password: sa@123
   mvc:
@@ -34,7 +34,7 @@
   enable: false
 
 wms:
-  url: localhost:8080/mdqdwms
+  url: localhost:8082/mdqdwms
 
 # 涓嬩綅鏈洪厤缃�
 wcs-slave:
@@ -132,15 +132,15 @@
     demo: false
     # 鍫嗗灈鏈哄叆搴撶珯1
     crnInStn[0]:
-      devpPlcId: ${wcs-slave.devp[0].id}
-      staNo: 1013
+      devpPlcId: ${wcs-slave.devp[2].id}
+      staNo: 5001
       row: 4
       bay: 2
       lev: 1
     # 鍫嗗灈鏈哄嚭搴撶珯鐐�1
     crnOutStn[0]:
-      devpPlcId: ${wcs-slave.devp[0].id}
-      staNo: 1010
+      devpPlcId: ${wcs-slave.devp[2].id}
+      staNo: 5002
       row: 4
       bay: 1
       lev: 1
@@ -225,45 +225,42 @@
     port: 102
     rack: 0
     slot: 0
-    rgvSta[0]:
-      staNo: 4007
-    rgvSta[1]:
-      staNo: 4001
-    rgvSta[2]:
-      staNo: 4016
-    rgvSta[3]:
-      staNo: 4010
-    rgvSta[4]:
-      staNo: 2003
-    rgvSta[5]:
-      staNo: 2103
-    rgvSta[6]:
-      staNo: 2301
-    rgvSta[7]:
-      staNo: 2002
-    rgvSta[8]:
-      staNo: 2102
-#    # 杈撻�佺嚎3
-#  devp[2]:
-#    id: 1
-#    ip: 10.10.10.20
-#    port: 102
-#    rack: 0
-#    slot: 0
-#  # 杈撻�佺嚎4
-#  devp[3]:
-#    id: 1
-#    ip: 10.10.10.20
-#    port: 102
-#    rack: 0
-#    slot: 0
-  # RGV1
-  rgv[0]:
-    id: 1
-    ip: 10.10.10.120
+    # 杈撻�佺嚎3
+  devp[2]:
+    id: 3
+    ip: 10.10.10.30
     port: 102
     rack: 0
     slot: 0
+  # 杈撻�佺嚎4
+  devp[3]:
+    id: 4
+    ip: 10.10.10.33
+    port: 102
+    rack: 0
+    slot: 0
+#  # 杈撻�佺嚎5
+#  devp[4]:
+#    id: 5
+#    ip: 10.10.10.33
+#    port: 102
+#    rack: 0
+#    slot: 0
+#  # RGV1
+  rgv[0]:
+    id: 1
+    ip: 10.10.10.130
+    port: 102
+    rack: 0
+    slot: 0
+    inStn[0]:
+      sourceStaNo: 4007
+      sourcePlcId: 4
+      staNo: 2103
+      staPlcId: 2
+    outStn[0]:
+      sourceStaNo: 4007
+      sourcePlcId: 4
 #  # RGV2
 #  rgv[1]:
 #    id: 2
diff --git a/src/main/resources/mapper/EmptyBarrelInMapper.xml b/src/main/resources/mapper/EmptyBarrelInMapper.xml
new file mode 100644
index 0000000..025c0ae
--- /dev/null
+++ b/src/main/resources/mapper/EmptyBarrelInMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.asrs.mapper.EmptyBarrelInMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.EmptyBarrelIn">
+        <id column="id" property="id" />
+        <result column="matnr" property="matnr" />
+        <result column="batch" property="batch" />
+        <result column="maktx" property="maktx" />
+
+    </resultMap>
+
+</mapper>
diff --git a/src/main/webapp/static/css/rgv.css b/src/main/webapp/static/css/rgv.css
new file mode 100644
index 0000000..01230f4
--- /dev/null
+++ b/src/main/webapp/static/css/rgv.css
@@ -0,0 +1,252 @@
+body {
+    background-color: #6CA7A8;
+}
+.button-window {
+    float: left;
+    width: 100%;
+    height: 100%;
+    padding: 10px;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0 0 0 .3);
+}
+/* -------------------- 绗竴妯″潡 -------------------- */
+.log-board {
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+    height: 28%;
+}
+
+/* 宸� */
+.command-log {
+    float: left;
+    height: 100%;
+    width: 20%;
+    text-align: center;
+}
+.command-log h2 {
+    padding: 10px;
+}
+.rgv-command-item {
+    padding: 4px 0;
+}
+.rgv-command-item label {
+    font-size: 20px;
+    font-weight: bold;
+    vertical-align: middle;
+}
+.rgv-command-item span {
+    display: inline-block;
+    width: 20px;
+    height: 20px;
+    background-color: #2e9926;
+    border-radius: 5px;
+    vertical-align: middle;
+}
+.rgv-command-item input {
+    vertical-align: middle;
+    outline: none;
+    width: 60%;
+}
+
+/* 鍙� */
+.rgv-state {
+    float: left;
+    height: 100%;
+    width: 100%;
+    overflow: auto;
+}
+/* 鍫嗗灈鏈虹姸鎬佽〃 */
+#rgv-state-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#rgv-state-table td, #rgv-state-table th {
+    border: 1px solid #cad9ea;
+    color: #666;
+    height: 25px;
+}
+#rgv-state-table thead th {
+    background-color: #CCE8EB;
+    width: 300px;
+}
+#rgv-state-table tr:nth-child(odd) {
+    background: #fff;
+}
+#rgv-state-table tr:nth-child(even) {
+    background: #F5FAFA;
+}
+
+/* -------------------- 绗簩妯″潡 -------------------- */
+.rgv-msg {
+    /*overflow: auto;*/
+    margin-top: 10px;
+    height: 23%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+/* 鍫嗗灈鏈虹姸鎬佷俊鎭〃 */
+#rgv-msg-table {
+    font-size: 12px;
+    border-collapse: collapse;
+    margin: 0 auto;
+    text-align: center;
+}
+#rgv-msg-table td, #rgv-msg-table th {
+    border: 1px solid #f1f1f1;
+    color: #666;
+    height: 30px;
+}
+#rgv-msg-table thead th {
+    background-color: #fff;
+    width: 400px;
+}
+#rgv-msg-table tr:nth-child(odd) {
+    background: #fff;
+}
+#rgv-msg-table tr:nth-child(even) {
+    background: #fff;
+}
+
+/* -------------------- 绗笁妯″潡 -------------------- */
+.rgv-operation {
+    position: relative;
+    margin-top: 10px;
+    height: 25%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+
+/* 浠诲姟璁惧閫夋嫨妗� */
+.task-select {
+    height: 50%;
+    overflow: hidden;
+    padding: 20px 0 10px 20px;
+}
+.operator-item {
+    display: inline-block;
+    height: 100%;
+    width: 20%;
+    text-align: center;
+    position: relative;
+    vertical-align: middle;
+    padding: 10px 0px 10px 50px;
+}
+.operator-item .select-title {
+    display: inline-block;
+    position: absolute;
+    top: -11px;
+    left: 50%;
+    transform: translate(-50%, 0);
+    background-color: #fff;
+    color: #2e95d3;
+    font-size: 12px;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+    padding: 5px;
+    z-index: 999;
+}
+.operator-item .select-container {
+    padding: 10px 0;
+    height: 100%;
+    border: 1px solid #8d8d8d;
+    border-radius: 5px;
+}
+#rgv-select .select-container label {
+    display: inline-block;
+    padding: 0 20px;
+    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
+
+}
+.select-container input {
+    display: inline-block;
+    font-size: 12px;
+    vertical-align: middle; margin-top:-2px; margin-bottom:1px;
+}
+.select-container-item {
+    display: block;
+    margin: 0px auto;
+    padding: 0;
+}
+.select-container-item input {
+    height: 20px;
+    border: 1px solid #8D8D8D;
+    border-radius: 3px;
+    width: 80px;
+    outline: none;
+}
+
+/* 浠诲姟浣滀笟閫夋嫨妗� */
+.task-operator {
+    height: 50%;
+    overflow: hidden;
+    padding: 0 20px 10px 20px;
+}
+.task-operator fieldset {
+    padding: 15px 20px 5px 50px;
+    border-width: 1px;
+    border-style: solid;
+    height: 100%;
+}
+.task-operator legend {
+    margin-left: 20px;
+    padding: 0 10px;
+    font-size: 16px;
+    font-weight: 300;
+}
+button.item {
+    border: 1px solid #333;
+    font-size: 13px;
+    padding: 1px 1px 1px 1px;
+    width: 100px;
+    height: 40px;
+    outline: none;
+    cursor: pointer;
+    color: #333;
+    background-color: transparent;
+    margin-right: 5px;
+    border-radius: 5px;
+}
+button.item:hover {
+    background-color: #333;
+    color: #fff;
+}
+
+/* 鎵嬪姩鎿嶄綔閬僵 */
+.rgv-operation-shade {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+    z-index: 1000;
+    text-align: center;
+    padding: 80px 0;
+}
+.rgv-operation-shade-span {
+    font-size: xx-large;
+    font-weight: bold;
+    color: red;
+}
+
+/* -------------------- 绗洓妯″潡 -------------------- */
+.rgv-output-board {
+    margin-top: 10px;
+    height: 15%;
+    background-color: #fff;
+    border-radius: 5px;
+    box-shadow: 0 0 3px rgba(0,0,0,.3);
+}
+#rgv-output {
+    border-left: none;
+    border-right: none;
+    border-top: 1px solid #9d9d9d;
+    border-bottom: 1px solid #333;
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+    resize:none;
+    color: #666;
+}
diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html
index 5a55a20..fba5381 100644
--- a/src/main/webapp/views/index.html
+++ b/src/main/webapp/views/index.html
@@ -17,6 +17,7 @@
             <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">涓绘帶鍥�</a></li>
             <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">杈撻�佽澶�</a></li>
             <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">鍫嗗灈鏈�</a></li>
+            <li><a id="rgv" onclick="nav(this.id)" class="nav-unselect" href="#">RGV</a></li>
         </ul>
     </div>
 </div>
diff --git a/src/main/webapp/views/rgv.html b/src/main/webapp/views/rgv.html
new file mode 100644
index 0000000..aa468fc
--- /dev/null
+++ b/src/main/webapp/views/rgv.html
@@ -0,0 +1,598 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>RGV鐩戞帶绠$悊</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" type="text/css" href="../static/css/normalize.css">
+    <link rel="stylesheet" type="text/css" href="../static/css/common.css">
+    <link rel="stylesheet" type="text/css" href="../static/css/rgv.css">
+    <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+    <script type="text/javascript" src="../static/js/common.js"></script>
+    <script type="text/javascript" src="../static/js/layer/layer.js"></script>
+    <style>
+        .demoBtn {
+            vertical-align: middle;
+            width: 20%;
+            height: 25px;
+            left: 0;
+            top: 0;
+            text-shadow: inherit;
+            font-size: 15px;
+            margin-left: 5px;
+            margin-right: 5px;
+            display: inline-block;
+            background-color: #FF5722;
+            border: none;
+            color: #FFF;
+            box-shadow: 1px 1px 5px #B6B6B6;
+            border-radius: 3px;
+            cursor: pointer;
+        }
+
+        .demoBtn:hover {
+            opacity: 0.8
+        }
+        .demoBtn:focus {
+            outline: 0;
+        }
+    </style>
+</head>
+<body>
+<div style="padding: 10px;height: 100%;float: left;width: 6%">
+    <div class="button-window"></div>
+</div>
+<div style="height: 100%;padding-left: 6%">
+    <div style="padding: 10px;height: 100%">
+        <!-- 鏃ュ織鐩戞帶鏉� -->
+        <div class="log-board">
+            <!-- 鎵ц鍛戒护 -->
+
+            <!-- 鎵ц鍛戒护 -->
+            <!--<div class="command-log">-->
+<!--                <h3>鎵ц涓殑鍛戒护</h3>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>1#</label>-->
+<!--                    <button id="demoBtn-1" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn1" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>2#</label>-->
+<!--                    <button id="demoBtn-2" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn2" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>3#</label>-->
+<!--                    <button id="demoBtn-3" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn3" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>4#</label>-->
+<!--                    <button id="demoBtn-4" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn4" disabled="disabled">-->
+<!--                </div>-->
+<!--                <div class="crn-command-item">-->
+<!--                    <label>5#</label>-->
+<!--                    <button id="demoBtn-5" class="demoBtn" onclick="demoSwitch(this.id)"> - </button>-->
+<!--                    &lt;!&ndash;            <span>&nbsp;</span>&ndash;&gt;-->
+<!--                    <input id="crn5" disabled="disabled">-->
+<!--                </div>-->
+<!--            </div>-->
+            <!-- RGV鐘舵�佷綅淇℃伅 -->
+            <div class="rgv-state">
+                <table id="rgv-state-table">
+                    <thead>
+                    <tr>
+                        <th>RGV</th>
+                        <th>褰撳墠妯″紡</th>
+                        <th>褰撳墠鐘舵��</th>
+                        <th>宸ヤ綅1浠诲姟鍙�</th>
+                        <th>宸ヤ綔鐘舵��</th>
+                        <th>鏈夌墿</th>
+                        <th>RGV浣嶇疆</th>
+                        <th>璧拌瀹氫綅</th>
+<!--                        <th>浠诲姟鍙�2</th>-->
+<!--                        <th>鐘舵��2</th>-->
+<!--                        <th>鏈夌墿2</th>-->
+                        <th>鏁呴殰浠g爜</th>
+                        <th>鏁呴殰鎻忚堪</th>
+<!--                        <th>閿佸畾鐘舵��</th>-->
+                    </tr>
+                    </thead>
+                    <tbody>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <!-- RGV鐘舵�� -->
+        <div class="rgv-msg">
+            <table id="rgv-msg-table">
+                <thead>
+                <tr>
+                    <th>RGV</th>
+                    <th>宸ヤ綔鍙�</th>
+                    <th>鐘舵��</th>
+                    <th>婧愮珯</th>
+                    <th>鐩爣绔�</th>
+                    <th>婧愬簱浣�</th>
+                    <th>鐩爣搴撲綅</th>
+<!--                    <th>璧拌閫熷害锛坢/min)</th>-->
+<!--                    <th>鍗囬檷閫熷害锛坢/min)</th>-->
+<!--                    <th>鍙夌墮閫熷害锛坢/min)</th>-->
+<!--                    <th>璧拌璺濈(Km)</th>-->
+<!--                    <th>鍗囬檷璺濈(Km)</th>-->
+<!--                    <th>璧拌鏃堕暱(H)</th>-->
+<!--                    <th>鍗囬檷鏃堕暱(H)</th>-->
+                </tr>
+                </thead>
+                <tbody>
+                </tbody>
+            </table>
+        </div>
+        <!-- 鎵嬪姩鎿嶄綔 -->
+        <div class="rgv-operation">
+
+            <!-- 閬僵灞� -->
+            <div class="rgv-operation-shade">
+        <span class="rgv-operation-shade-span">
+            WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔
+        </span>
+            </div>
+
+            <!-- 璁惧浠诲姟閫夋嫨 -->
+            <div class="task-select">
+                <!-- 鍫嗗灈鏈洪�夋嫨 -->
+                <div id="rgv-select" class="operator-item" style="width: 55%">
+                    <span class="select-title">RGV鍙�</span>
+                    <div class="select-container" style="padding: 20px 0;">
+                        <label><input type="radio" name="rgvSelect" value="1" checked>&nbsp;1鍙稲GV</label>
+                        <label><input type="radio" name="rgvSelect" value="2">&nbsp;2鍙稲GV</label>
+                        <label><input type="radio" name="rgvSelect" value="3">&nbsp;3鍙稲GV</label>
+                    </div>
+                </div>
+                <!-- 婧愮珯/婧愬簱浣� 閫夋嫨 -->
+                <div id="source-select" class="operator-item">
+                    <span class="select-title">婧愮珯</span>
+                    <div class="select-container">
+                        <div class="select-container-item">
+                            <span>宸ヤ綅1婧愮珯</span>
+                            <label><input id="sourceStaNo" type="number" name="points" min="0" value="0"/></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>鎺�</span>-->
+<!--                            <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                        <div class="select-container-item">
+                            <span>宸ヤ綅2婧愮珯</span>
+                            <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>灞�</span>-->
+<!--                            <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                    </div>
+                </div>
+                <!-- 鐩爣绔�/鐩爣搴撲綅 閫夋嫨 -->
+                <div id="target-select" class="operator-item">
+                    <span class="select-title">鐩爣绔�</span>
+                    <div class="select-container">
+                        <div class="select-container-item">
+                            <span>宸ヤ綅1鐩爣绔�</span>
+                            <label><input id="staNo" type="number" name="points" min="0" value="0"/></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>鎺�</span>-->
+<!--                            <label><input id="row" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                        <div class="select-container-item">
+                            <span>宸ヤ綅2鐩爣绔�</span>
+                            <label><input id="bay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label>
+                        </div>
+<!--                        <div class="select-container-item">-->
+<!--                            <span>灞�</span>-->
+<!--                            <label><input id="lev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label>-->
+<!--                        </div>-->
+                    </div>
+                </div>
+            </div>
+
+            <!-- 璁惧浠诲姟鎿嶄綔 -->
+            <div class="task-operator">
+                <fieldset>
+                    <legend>鎵嬪姩鎿嶄綔</legend>
+                    <div class="button-group">
+                        <button class="item" onclick="put()">鍙栨斁璐�</button>
+<!--                        <button class="item" onclick="take()">鍙栬揣</button>-->
+<!--                        <button class="item" onclick="stockMove()">鏀捐揣</button>-->
+<!--                        <button class="item" onclick="siteMove()">绔欏埌绔�</button>-->
+                        <!--                <button class="item" onclick="bacOrigin()">鍥炲師鐐�</button>-->
+                        <!--                <button class="item" onclick="reverseOrigin()">鍙嶅師鐐�</button>-->
+                        <!--                <button class="item" onclick="coorMove()">鍧愭爣绉昏</button>-->
+                        <button class="item" onclick="taskComplete1()">宸ヤ綅1浠诲姟瀹屾垚</button>
+                        <button class="item" onclick="taskComplete2()">宸ヤ綅2浠诲姟瀹屾垚</button>
+                        <!--                <button class="item" onclick="pause()">鏆傚仠</button>-->
+                        <!--                <button class="item" onclick="boot()">鍚姩</button>-->
+<!--                        <button class="item" onclick="clearCommand()">娓呴櫎鍛戒护</button>-->
+<!--                        <button class="item" onclick="handleReset()">澶嶄綅</button>-->
+                    </div>
+                </fieldset>
+            </div>
+
+        </div>
+        <!-- 鍫嗗灈鏈烘棩蹇楄緭鍑� -->
+        <div class="rgv-output-board">
+            <textarea id="rgv-output"></textarea>
+        </div>
+    </div>
+</div>
+</body>
+<script>
+    // 绌虹櫧琛屾暟
+    var rgvStateTableBlankRows = 0;
+    var rgvMsgTableBlankRows = 0;
+    // 瀹為檯琛屾暟
+    var rgvStateTableFullRows = 0;
+    var rgvMsgTableFullRows = 0;
+    // 鍒濆鍖�
+    var rgvOutputDom = document.getElementById("rgv-output");
+    $(document).ready(function() {
+        // getCommandLog();
+        initRgvStateTable();
+        getRgvStateInfo();
+        initRgvMsgTable();
+        getRgvMsgInfo();
+        operatorBlockShow();
+    });
+    // 鏁版嵁鏇存柊
+    setInterval(function () {
+        getRgvStateInfo();
+        getRgvMsgInfo();
+        // getCommandLog();
+    },1000);
+    setInterval(function () {
+        getRgvOutput();
+        operatorBlockShow();
+        // initDemo();
+    },500);
+
+    // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤
+    function operatorBlockShow() {
+        if (parent.systemRunning) {
+            $('.rgv-operation').css("opacity", "0.5");
+            $('.rgv-operation-shade').show();
+            $('.rgv-operation-shade-span').show();
+        }  else {
+            $('.rgv-operation').css("opacity", "1");
+            $('.rgv-operation-shade').hide();
+            $('.rgv-operation-shade-span').hide();
+        }
+    }
+
+    // 鑾峰彇RGV鎵ц涓殑鍛戒护
+    function getCommandLog() {
+        $.ajax({
+            url: baseUrl + "/rgv/command/ongoing",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200) {
+                    var commands = res.data;
+                    for (var i=0; i<commands.length;i++){
+                        $("#rgv"+commands[i].rgvNo).val(commands[i].command);
+                    }
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // 鍫嗗灈鏈轰俊鎭〃鑾峰彇 ---- 琛ㄤ竴
+    function getRgvStateInfo() {
+        var tableEl = $('#rgv-state-table');
+        $.ajax({
+            url: baseUrl+ "/rgv/table/rgv/state",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                console.log(res)
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > rgvStateTableBlankRows && table.length !== rgvStateTableFullRows) {
+                        initRgvStateTable(table.length-rgvStateTableBlankRows);
+                        rgvStateTableFullRows = table.length;
+                    }
+                    for (var i=1;i<=table.length;i++){
+                        var tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
+                        setVal(tr.children("td").eq(1), table[i-1].statusType);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].workNo1);
+                        setVal(tr.children("td").eq(4), table[i-1].status1);
+                        setVal(tr.children("td").eq(5), table[i-1].loading1);
+                        setVal(tr.children("td").eq(6), table[i-1].rgvPos1);
+                        setVal(tr.children("td").eq(7), table[i-1].walkPos);
+                        // setVal(tr.children("td").eq(8), table[i-1].workNo2);
+                        // setVal(tr.children("td").eq(9), table[i-1].status2);
+                        // setVal(tr.children("td").eq(10), table[i-1].loading2);
+                        setVal(tr.children("td").eq(8), table[i-1].warnCode);
+                        setVal(tr.children("td").eq(9), table[i-1].alarm);
+                        // setVal(tr.children("td").eq(10), table[i-1].pakMk);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍫嗗灈鏈烘暟鎹〃鑾峰彇 ---- 琛ㄤ簩
+    function getRgvMsgInfo() {
+        var tableEl = $('#rgv-msg-table');
+        $.ajax({
+            url: baseUrl+ "/rgv/table/rgv/msg",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                if (res.code === 200){
+                    var table = res.data;
+                    if (table.length > rgvStateTableBlankRows && table.length !== rgvMsgTableFullRows) {
+                        initRgvStateTable(table.length-rgvStateTableBlankRows);
+                        rgvMsgTableFullRows = table.length;
+                    }
+                    for (var i=1;i<=table.length;i++){
+                        var tr = tableEl.find("tr").eq(i);
+                        setVal(tr.children("td").eq(0), table[i-1].rgvNo);
+                        setVal(tr.children("td").eq(1), table[i-1].workNo);
+                        setVal(tr.children("td").eq(2), table[i-1].status);
+                        setVal(tr.children("td").eq(3), table[i-1].sourceStaNo);
+                        setVal(tr.children("td").eq(4), table[i-1].staNo);
+                        setVal(tr.children("td").eq(5), table[i-1].sourceLocNo);
+                        setVal(tr.children("td").eq(6), table[i-1].locNo);
+                        // setVal(tr.children("td").eq(7), table[i-1].xspeed);
+                        // setVal(tr.children("td").eq(8), table[i-1].yspeed);
+                        // setVal(tr.children("td").eq(9), table[i-1].zspeed);
+                        // setVal(tr.children("td").eq(10), table[i-1].xdistance);
+                        // setVal(tr.children("td").eq(11), table[i-1].ydistance);
+                        // setVal(tr.children("td").eq(12), table[i-1].xduration);
+                        // setVal(tr.children("td").eq(13), table[i-1].yduration);
+                    }
+                } else if (res.code === 403){
+                    window.location.href = baseUrl+"/login";
+                }  else {
+                    console.log(res.msg);
+                }
+            }
+        });
+    }
+
+    // 鍫嗗灈鏈烘墜鍔ㄦ搷浣滃尯 -----------------------------------------------------------------------
+
+    function getReqParam() {
+        var rgvNo = $('input[name="rgvSelect"]:checked').val();
+        var sourceStaNo = $('#sourceStaNo').val();
+        var sourceRow = $('#sourceRow').val();
+        var sourceBay = $('#sourceBay').val();
+        var sourceLev = $('#sourceLev').val();
+        var staNo = $('#staNo').val();
+        var row = $('#row').val();
+        var bay = $('#bay').val();
+        var lev = $('#lev').val();
+        return {
+            rgvNo: rgvNo,
+            sourceStaNo1: sourceStaNo,
+            sourceRow: sourceRow,
+            sourceStaNo2: sourceBay,
+            sourceLev: sourceLev,
+            staNo1: staNo,
+            row: row,
+            staNo2: bay,
+            lev: lev
+        };
+    }
+
+    // 鍏ュ簱
+    function put() {
+        http.post(baseUrl+"/rgv/operator/put", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍑哄簱
+    function take() {
+        http.post(baseUrl+"/rgv/operator/take", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 搴撲綅杞Щ
+    function stockMove() {
+        http.post(baseUrl+"/rgv/operator/stockMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 绔欏埌绔�
+    function siteMove() {
+        http.post(baseUrl+"/rgv/operator/siteMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍧愭爣绉诲姩
+    function coorMove() {
+        http.post(baseUrl+"/rgv/operator/coorMove", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍥炲師鐐�
+    function bacOrigin() {
+        http.post(baseUrl+"/rgv/operator/bacOrigin", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍥炲師鐐�
+    function reverseOrigin() {
+        http.post(baseUrl+"/rgv/operator/reverseOrigin", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 浠诲姟瀹屾垚
+    function taskComplete1() {
+        http.post(baseUrl+"/rgv/operator/taskComplete1", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 浠诲姟瀹屾垚
+    function taskComplete2() {
+        http.post(baseUrl+"/rgv/operator/taskComplete2", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    function lock() {
+        http.post(baseUrl+"/rgv/lock", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鏆傚仠
+    function pause() {
+        http.post(baseUrl+"/rgv/operator/pause", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鍚姩
+    function boot() {
+        http.post(baseUrl+"/rgv/operator/boot", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 娓呴櫎鍛戒护
+    function clearCommand() {
+        http.post(baseUrl+"/rgv/operator/clearCommand", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 鎵嬪姩澶嶄綅
+    function handleReset() {
+        http.post(baseUrl+"/rgv/operator/handleReset", getReqParam(), function (res) {
+            layer.msg(res.msg);
+        });
+    }
+
+    // 杈撻�佽澶囨棩蹇楄緭鍑� -----------------------------------------------------------------------
+    function getRgvOutput() {
+        $.ajax({
+            url: baseUrl + "/rgv/output/site",
+            headers: {'token': localStorage.getItem('token')},
+            method: 'POST',
+            success: function (res) {
+                console.log(res)
+                if (res.code === 200) {
+                    rgvOutput(res.data);
+                } else if (res.code === 403) {
+                    window.location.href = baseUrl + "/login";
+                } else {
+                    console.log(res.msg);
+                }
+            }
+        })
+    }
+
+    // ------------------------------------------------------------------------------------------------
+
+    // 鍫嗗灈鏈轰俊鎭〃鑾峰彇  ----- 琛ㄤ竴
+    function initRgvStateTable(row) {
+        var line;
+        if (row === undefined){
+            var one = $('#rgv-state-table thead').height();
+            var total = $('.rgv-state').height();
+            var count = total / one;
+            count = parseInt(count) - 1;
+            rgvStateTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        var html = "";
+        for (var i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#rgv-state-table tbody').after(html);
+    }
+
+    // 鍫嗗灈鏈烘暟鎹〃鑾峰彇  ----- 琛ㄤ簩
+    function initRgvMsgTable(row) {
+        var line;
+        if (row === undefined){
+            var one = $('#rgv-msg-table thead').height();
+            var total = $('.rgv-msg').height();
+            var count = total / one;
+            count = parseInt(count) - 1;
+            rgvMsgTableBlankRows = count;
+            line = count;
+        } else {
+            line = row;
+        }
+        var html = "";
+        for (var i = 0; i < line; i ++){
+            html += " <tr>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "       <td></td>\n" +
+                "     </tr>\n";
+        }
+        $('#rgv-msg-table tbody').after(html);
+    }
+
+    // 鏃ュ織杈撳嚭妗�
+    function rgvOutput(content){
+        rgvOutputDom.value += content;
+        rgvOutputDom.scrollTop = rgvOutputDom.scrollHeight;
+    }
+
+</script>
+</html>

--
Gitblit v1.9.1