#
lsh
2024-01-10 f4645599f341a039673939fbe2699387ea5b48d2
#
17个文件已修改
660 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ConsoleController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvErrLog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 238 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/RouteUtils.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvTaskModeType.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/BarcodeThread.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 153 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/BarcodeThread1.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/BarcodeThread2.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -28,14 +28,12 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.properties.SystemProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.MelsecCrnThread;
import com.zy.core.thread.ScaleThread;
import com.zy.core.thread.SiemensCrnThread;
import com.zy.core.thread.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -102,6 +100,13 @@
                stations.putAll(devpThread.getStation());
            }
        }
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            if (null != rgvThread) {
//                stations.putAll(rgvThread.getStation());
            }
        }
        for (Map.Entry<Integer, StaProtocol> entry : stations.entrySet()) {
            SiteLatestDataVo vo = new SiteLatestDataVo();
            StaProtocol staProtocol = entry.getValue();
src/main/java/com/zy/asrs/entity/BasRgvErrLog.java
@@ -18,7 +18,7 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.INPUT)
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -100,7 +100,7 @@
    /**
     * 工作类型
     */
    @ApiModelProperty(value= "工作类型  1:取(叠盘)  2:放 3:取放 4:拆盘")
    @ApiModelProperty(value= "工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放")
    @TableField("wrk_type")
    private Integer wrkType;
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
@@ -27,7 +27,7 @@
    /*
    * 查询指定工作号任务
    * */
    WrkMastSta selectByWrkNo(@Param("workNo") Integer workNo);
    WrkMastSta selectByWrkNo(@Param("workNo") Long workNo);
    /*
    * 查询不干涉的可执行任务
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -119,7 +119,7 @@
                String barcode = barcodeThread.getBarcode();
                if (!Cools.isEmpty(barcode)) {
                    log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
//                    log.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                    if ("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                        continue;
                    }
@@ -322,7 +322,7 @@
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
//                    WrkMast wrkMast = wrkMastMapper.selectPickStep(barcode);
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo().intValue());
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep3(staProtocol.getWorkNo());
                    if (wrkMast == null) {
                        // 无拣料数据
                        continue;
@@ -449,7 +449,7 @@
                        // 下发站点信息
                        staProtocol.setWorkNo(wrkMast.getWrkNo());
                        staProtocol.setStaNo(wrkMast.getStaNo());
                        staProtocol.setStaNo(RouteUtils.CrnStaEnd(wrkMast.getStaNo(),wrkMast.getSourceStaNo()));
                        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
                            continue;
                        }
@@ -1393,7 +1393,7 @@
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnInStn()){
                if(crnStn1.getStaNo() == wrkMast.getStaNo()){
                if(crnStn1.getStaNo().equals(wrkMast.getStaNo())){
                    crnStn = crnStn1;
                    break;
                } else {
@@ -1665,7 +1665,7 @@
            CrnSlave.CrnStn crnStn = null;
            for (CrnSlave.CrnStn crnStn1 : slave.getCrnOutStn()){
                if(crnStn1.getStaNo() == wrkMast.getSourceStaNo()){
                if(crnStn1.getStaNo().equals(wrkMast.getSourceStaNo())){
                    crnStn = crnStn1;
                    break;
                } else {
@@ -3838,11 +3838,12 @@
                }
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.WAITING
                if (rgvProtocol.getStatusType() == RgvStatusType.WORKING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING )
                ) {
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo1()!=0){
                    if (rgvProtocol.getTaskNo1()!=0&&rgvProtocol.getStatusType1()==RgvStatusType.WAITING){
                        if (rgvProtocol.getTaskNo1()==9999){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
@@ -3853,7 +3854,7 @@
                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().intValue());
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo1().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
@@ -3868,7 +3869,7 @@
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else if (rgvProtocol.getTaskNo2()!=0){
                    }else if (rgvProtocol.getTaskNo2()!=0 && rgvProtocol.getStatusType2()==RgvStatusType.WAITING){
                        if (rgvProtocol.getTaskNo2()==9999){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
@@ -3879,7 +3880,7 @@
                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue());
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
@@ -3966,7 +3967,7 @@
    /**
     * 执行小车搬运任务
     */
    public synchronized void rgvRunWrkMastEmptyStaPut() {//放
    public synchronized void rgvRunWrkMastEmptyStaPut() {//拆盘
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
@@ -3983,7 +3984,7 @@
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded2()==1  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && (rgvProtocol.getLoaded2()==3  || rgvProtocol.getLoaded2()==1 )////0 无物;1 一层无物二层有物 (只能拆叠) ;2一层有物二层无物 ;3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -3994,12 +3995,12 @@
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || (wrkMastSta.getWrkType()!=2 && wrkMastSta.getWrkType()!=4)){// 2:空板  2:放 4:拆盘
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=2){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//放
                            sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);
                            sign = rgvPutEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//拆盘
                        }else {
                            continue;
                        }
@@ -4029,7 +4030,73 @@
        }
    }
    public synchronized void rgvRunWrkMastEmptyStaTake() {//取
    /**
     * 执行小车搬运任务
     */
    public synchronized void rgvRunWrkMastEmptyStaPutFull() {//满放
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        &&  (rgvProtocol.getLoaded2()==2  || rgvProtocol.getLoaded2()==3 ) ////0 无物;1 一层无物二层有物  ;2一层有物二层无物 (只能满放);3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        continue;
                    }
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());//获取活动范围
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);//查询可执行任务
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=6){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaStart()==0 && wrkMastSta.getStaEnd()!=0){//满放
                            sign = rgvPutEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, basRgvMap.getStartRoute(), wrkMastSta.getStaEnd());
                            if (signMap){
                                wrkMastSta.setWrkSts(2);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return;
                            }else {
                                log.error("3857行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
            }
        }catch (Exception e){
            log.error("3933行执行小车放空板任务下发失败");
            log.error("3933行"+e);
        }
    }
    public synchronized void rgvRunWrkMastEmptyStaTake() {//叠盘
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
@@ -4046,7 +4113,7 @@
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        &&  (rgvProtocol.getLoaded2()==0  || rgvProtocol.getLoaded2()==1 ) //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -4057,12 +4124,75 @@
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板  1:取
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=1){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取
                            sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);
                            sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘
                        }else {
                            continue;
                        }
                        if (sign){
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute());
                            if (signMap){
                                wrkMastSta.setWrkSts(1);
                                try{
                                    wrkMastStaMapper.updateById(wrkMastSta);
                                }catch (Exception e){
                                    log.error("更新小车任务失败");
                                }
                                return;
                            }else {
                                log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                            }
                        }else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                        }
                        break;
                    }
                }
            }
        }catch (Exception e){
            log.error("3989行执行小车取空板任务下发失败");
            log.error("3989行"+e);
        }
    }
    public synchronized void rgvRunWrkMastEmptyStaTakeFull() {//满取
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        &&  rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        continue;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=5){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                            continue;
                        }
                        boolean sign = false;
                        if (wrkMastSta.getStaEnd()==0 && wrkMastSta.getStaStart()!=0){//取
                            sign = rgvTakeEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                        }else {
                            continue;
                        }
@@ -4174,14 +4304,16 @@
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
        try{
            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvId);
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
            rgvCommand.setTaskNo1((short)9999); // 工位1工作号
            rgvCommand.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 工位1任务模式:  回原点
            rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
            rgvCommand.setDestinationStaNo1(basRgvMap.getLockStartRoute().shortValue());
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(9, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(9, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4209,7 +4341,7 @@
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4234,7 +4366,7 @@
            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4259,7 +4391,7 @@
            rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4272,7 +4404,7 @@
    }
    /*
     * 小车取空板至工位任务
     * 小车取空板至工位任务  叠盘
     * */
    public synchronized boolean rgvTakeEmpty(Integer rgvId,WrkMastSta wrkMastSta){
        try{
@@ -4284,7 +4416,7 @@
            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式:  取货
            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4297,7 +4429,7 @@
    }
    /*
     * 小车放空板至输送线任务
     * 小车放空板至输送线任务   //拆盘
     * */
    public synchronized boolean rgvPutEmpty(Integer rgvId,WrkMastSta wrkMastSta){
        try{
@@ -4309,7 +4441,57 @@
            rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式:  放货
            rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(5, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车取空板至工位任务  满取
     * */
    public synchronized boolean rgvTakeEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_5); // 工位2任务模式:  满取
            rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
            } else {
                return true;
            }
        }catch (Exception e){
            return false;
        }
    }
    /*
     * 小车放空板至输送线任务   //满放
     * */
    public synchronized boolean rgvPutEmptyFull(Integer rgvId,WrkMastSta wrkMastSta){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            rgvCommand.setRgvNo(rgvId); // RGV编号
            rgvCommand.setAckFinish2((short) 0);  // 工位2任务完成确认位
            rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
            rgvCommand.setTaskMode2(RgvTaskModeType.PUT_6); // 工位2任务模式:  满放
            rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点
            rgvCommand.setCommand((short) 2);   //工位2任务确认
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -4359,7 +4541,7 @@
            BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther);
            List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute());
            Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置
            basRgvMapOther.setStartRoute(lockEndRoute);
            basRgvMapOther.setEndRoute(lockEndRoute);
            basRgvMapMapper.updateById(basRgvMapOther);
            return true;
        }catch (Exception e){
src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -29,11 +29,11 @@
//    正序
    public static final List<Integer> TRACK_POSITION_POSITIVE_SEQUENCE = new ArrayList<Integer>() {{
        add(101);add(102);add(104);add(105);add(107);add(118);add(108);add(119);add(110);add(120);add(111);add(121);add(113);add(114);add(116);add(117);
        add(101);add(102);add(104);add(122);add(105);add(107);add(118);add(108);add(119);add(110);add(120);add(111);add(121);add(113);add(123);add(114);add(116);add(117);
    }};
//    反序
    public static final List<Integer> TRACK_POSITION_REVERSE_SEQUENCE = new ArrayList<Integer>() {{
        add(117);add(116);add(114);add(113);add(121);add(111);add(120);add(110);add(119);add(108);add(118);add(107);add(105);add(104);add(102);add(101);
        add(117);add(116);add(114);add(113);add(123);add(121);add(111);add(120);add(110);add(119);add(108);add(107);add(118);add(105);add(104);add(122);add(102);add(101);
    }};
    public static String zerofill(String msg, Integer count){
@@ -268,4 +268,77 @@
        }
    }
    public static short RgvPosSta(Integer rgvId,Short posId){
        switch (rgvId){
            case 1:
                return RgvPosStaOne(posId);
            case 2:
                return RgvPosStaTwo(posId);
            default:
                return 1;
        }
    }
    public static short RgvPosStaOne(Short posId){
        return 1;
    }
    public static short RgvPosStaTwo(Short posId){
        switch (posId.intValue()){
            case 1:
            case 2:
                return 116;
            case 3:
            case 4:
                return 114;
            case 5:
                return 123;
            case 6:
            case 7:
            case 8:
                return 113;
            case 9:
            case 10:
                return 121;
            case 11:
            case 12:
            case 13:
            case 14:
                return 120;
            case 15:
                return 110;
            case 16:
            case 17:
            case 18:
                return 119;
            case 19:
                return 108;
            case 20:
            case 21:
            case 22:
                return 107;
            case 23:
            case 24:
                return 105;
            case 25:
                return 104;
            default:
                return 0;
        }
    }
    public static Integer CrnStaEnd(Integer endSta,Integer souSta) {
        switch (souSta) {
            case 100:
            case 103:
            case 106:
            case 109:
            case 112:
            case 115:
                return souSta + 1;
            default:
                return endSta;
        }
    }
}
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -10,6 +10,8 @@
    PUTTING(12, "放货中"),
    WAITING(90, "任务完成等待WCS确认"),
    FETCHWAITING(91, "取货任务完成等待WCS确认"),
    SOS99(99, "报警99"),
    SOS100(100, "报警100")
    ;
    public Integer id;
src/main/java/com/zy/core/enums/RgvTaskModeType.java
@@ -3,13 +3,13 @@
public enum RgvTaskModeType {
    NONE(0),    // 无
    FETCH(1),    // 取货
    PUT(2),    // 放货
    FETCH(1),    // 取货 (空板)单取
    PUT(2),    // 放货 (空板)单放
    FETCH_PUT(3),    // 取放货
//    X_MOVE(4),    // 站位移转
//    Y_MOVE(5),    // 站位移转
//    XY_MOVE(6),    // 站位移转
    GO_ORIGIN(7),    // 回原点
    X_MOVE(4),    // 站位移转
    FETCH_5(5),    // (空板)满取
    PUT_6(6),    // (空板)满放
//    GO_ORIGIN(7),    // 回原点
//    BACK_ORIGIN(8),      // 回反原点
//    CLEAR(9),       // 清错
    ;
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -57,7 +57,7 @@
    /**
     * 工位1有物
     */
    public Short loaded1;
    public Short loaded1;//0 无物;1 有物
    /**
     * RGV当前位置
@@ -94,7 +94,7 @@
    /**
     * 工位2有物
     */
    public Short loaded2;
    public Short loaded2;  //0 无物;1 一层无物二层有物(只能拆叠)  ;2一层有物二层无物 (只能满放);3  1、2层都有物
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
src/main/java/com/zy/core/thread/BarcodeThread.java
@@ -34,7 +34,7 @@
        this.barcode.delete(0, this.barcode.length());
        this.barcode.append(barcode);
        if(!Cools.isEmpty(barcode)) {
            log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
//            log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
            jsonObject.put("barcode", barcode);
src/main/java/com/zy/core/thread/RgvThread.java
@@ -11,6 +11,7 @@
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.RouteUtils;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
@@ -108,14 +109,14 @@
                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式
                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
                        commandAvoidanceXY.setDestinationStaNo1(slave.getId()==1? (short) 101:(short)117);     // 目标站
                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.X_MOVE); // 任务模式
                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
                        commandAvoidanceXY.setDestinationStaNo2(slave.getId()==1? (short) 101:(short)117);     // 目标站
                        commandAvoidanceXY.setCommand((short)0);
                        write(commandAvoidanceXY);
                        break;
@@ -178,7 +179,7 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB1.0", (short) 34);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 34);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -189,7 +190,7 @@
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setRgvPos(RouteUtils.RgvPosSta(slave.getId(),siemensNet.getByteTransform().TransInt16(result.Content, 10)));
                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
@@ -333,10 +334,10 @@
        short[] array = new short[5];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        array[2] = command.getTaskMode1();
        array[2] = command.getTaskMode1();//任务模式
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
        siemensNet.Write("DB100.20", command.getCommand());
//        siemensNet.Write("DB100.20", 0);
        OperateResult result = siemensNet.Write("DB100.0", array);
@@ -390,12 +391,12 @@
        command.setRgvNo(slave.getId());
        short[] array = new short[6];
        array[0] = command.getAckFinish2();
        array[1] = command.getTaskNo2();
        array[2] = command.getTaskMode2();
        array[3] = command.getSourceStaNo2();
        array[4] = command.getDestinationStaNo2();
        array[5] = command.getCommand();
        array[0] = command.getAckFinish2();//任务完成确认位
        array[1] = command.getTaskNo2();//任务号
        array[2] = command.getTaskMode2();//任务模式
        array[3] = command.getSourceStaNo2();//源站
        array[4] = command.getDestinationStaNo2();//目标站
        array[5] = command.getCommand();//任务下发确认
        OperateResult result = siemensNet.Write("DB100.10", array);
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -49,7 +49,7 @@
        add(112);add(113);add(114);add(115);
        add(116);add(117);add(118);add(119);
        add(120);add(121);add(122);add(123);
        add(124);add(125);add(126);add(127);
//        add(124);add(125);add(126);add(127);
        add(130);add(131);
        add(132);add(133);add(134);add(135);
        add(136);add(137);add(138);add(139);
@@ -65,7 +65,7 @@
        add(212);
        add(213);add(214);add(215);add(216);
        add(217);add(218);add(219);add(220);
        add(221);add(222);
        add(221);add(222);add(2000);
    }};
    /**
@@ -121,6 +121,10 @@
                    case 2:
                        write((StaProtocol)task.getData());
                        break;
                    // 写数据 ID+目标站 码垛完成  给输送线写任务完成
                    case 3:
                        write3((StaProtocol)task.getData());
                        break;
                    default:
                        break;
                }
@@ -173,7 +177,7 @@
                }
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8 + 4));   // 目标站
                staProtocol.setStaNo((int)siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2);
                staProtocol.setAutoing(status[0]);  // 自动
@@ -231,7 +235,7 @@
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.102",(short)(barcodeSize*10));
        if (result2.IsSuccess) {
            for (int i = 0; i < barcodeSize; i++) {
                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*10,10, "UTF-8");
                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*10,6, "UTF-8");
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, i + 1);
                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                    barcodeThread.setBarcode(barcode);
@@ -292,14 +296,63 @@
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        int[] array = new int[2];
        array[0] = staProtocol.getWorkNo();
        array[1] = staProtocol.getStaNo();
        OperateResult write = siemensS7Net.Write("DB100." + index*8, array);
//        int[] array = new int[2];
//        array[0] = staProtocol.getWorkNo();
//        array[1] = staProtocol.getStaNo();
//        OperateResult write = siemensS7Net.Write("DB100." + index*8, array);
//        OperateResult write = siemensS7Net.Write("DB100." + index*2, staProtocol.getWorkNo());    // 工作号
//        Thread.sleep(500);
//        OperateResult write1 = siemensS7Net.Write("DB101." + index*2, staProtocol.getStaNo());    // 目标站
        OperateResult write = null;
        OperateResult write1 = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + index*6, staProtocol.getWorkNo());    // 工作号
            Thread.sleep(500);
            write1 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo().shortValue());    // 目标站
            if(write.IsSuccess || write1.IsSuccess){
                writeCount=6;
            }else {
                writeCount++;
                log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess || !write1.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入   码垛完成  给输送线写任务完成
     */
    private void write3(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        OperateResult write = null;
        //任务下发次数
        int writeCount = 0;
        do {
            write = siemensS7Net.Write("DB100." + index*6, (short)1);    // 工作号
            if(write.IsSuccess){
                writeCount=6;
            }else {
                writeCount++;
                log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
@@ -313,7 +366,6 @@
            log.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
        if (this.ioModeOf2F != IoModeType.NONE) {
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://192.168.4.15:1433;databasename=srjtasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=srjtasrs
    username: sa
    password: sa@123
  mvc:
@@ -49,7 +49,7 @@
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 192.168.4.250
    ip: 192.168.18.13
    port: 102
    rack: 0
    slot: 0
@@ -59,21 +59,35 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 007
      staNo: 102
      row: 3
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 201
      row: 3
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 008
      staNo: 100
      row: 2
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 200
      row: 2
      bay: 1
      lev: 2
  # 堆垛机2
  crn[1]:
    id: 2
    ip: 192.168.4.250
    ip: 192.168.18.21
    port: 102
    rack: 0
    slot: 0
@@ -83,21 +97,35 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 005
      staNo: 105
      row: 7
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 203
      row: 7
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 006
      staNo: 103
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 202
      row: 6
      bay: 1
      lev: 1
  # 堆垛机3
  crn[2]:
    id: 3
    ip: 192.168.4.250
    ip: 192.168.18.29
    port: 102
    rack: 0
    slot: 0
@@ -107,21 +135,35 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 003
      staNo: 108
      row: 11
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 205
      row: 11
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 004
      staNo: 106
      row: 10
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 204
      row: 10
      bay: 1
      lev: 2
  # 堆垛机4
  crn[3]:
    id: 4
    ip: 192.168.4.250
    ip: 192.168.18.37
    port: 102
    rack: 0
    slot: 0
@@ -131,21 +173,35 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 001
      staNo: 111
      row: 15
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 207
      row: 15
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 002
      staNo: 109
      row: 14
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 206
      row: 14
      bay: 1
      lev: 2
  # 堆垛机5
  crn[4]:
    id: 5
    ip: 192.168.4.250
    ip: 192.168.18.45
    port: 102
    rack: 0
    slot: 0
@@ -155,21 +211,35 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 001
      row: 15
      staNo: 114
      row: 19
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 209
      row: 19
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 002
      row: 14
      staNo: 112
      row: 18
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 208
      row: 18
      bay: 1
      lev: 2
  # 堆垛机6
  crn[5]:
    id: 6
    ip: 192.168.4.250
    ip: 192.168.18.53
    port: 102
    rack: 0
    slot: 0
@@ -179,22 +249,36 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 001
      row: 15
      staNo: 117
      row: 23
      bay: 1
      lev: 1
    # 堆垛机入库站点
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 211
      row: 23
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 002
      row: 14
      staNo: 115
      row: 22
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 210
      row: 22
      bay: 1
      lev: 2
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 10.10.10.40
    ip: 192.168.18.77
    port: 502
    rack: 0
    slot: 0
@@ -222,7 +306,7 @@
  # RGV穿梭车2
  rgv[1]:
    id: 2
    ip: 192.168.4.15
    ip: 192.168.18.79
    port: 502
    rack: 0
    slot: 0
@@ -251,7 +335,7 @@
  # 输送线
  devp[0]:
    id: 1
    ip: 192.168.4.250
    ip: 192.168.18.71
    port: 102
    rack: 0
    slot: 0
@@ -309,23 +393,30 @@
  # 输送线
  devp[1]:
    id: 2
    ip: 192.168.4.250
    ip: 192.168.18.81
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 15
      staNo: 217
      barcode: ${wcs-slave.barcode[0].id}
    # 入库口1
    inSta[1]:
      staNo: 221
      barcode: ${wcs-slave.barcode[1].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 12
      staNo: 212
    # 出库口1
    outSta[0]:
      staNo: 11
      staNo: 212
    # 出库口1
    outSta[1]:
      staNo: 213
    # 拣料入库口1
    pickSta[0]:
      staNo: 11
      staNo: 212
      barcode: ${wcs-slave.barcode[0].id}
  # 条码扫描仪
src/main/resources/mapper/WrkMastStaMapper.xml
@@ -33,7 +33,7 @@
    <select id="selectByWrkNo" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast_sta
        where 1=1
        and wrk_no = #{wrkNo}
        and wrk_no = #{workNo}
    </select>
    <select id="selectNoInterfere" resultMap="BaseResultMap">
src/main/webapp/static/js/console.map.js
@@ -533,7 +533,7 @@
                "type": "stn",
                "id": "site-130",
                "text": "130",
                "top": 380,
                "top": 297,
                "left": 266,
                "width": 100,
                "height": 20
@@ -541,15 +541,15 @@
                "type": "stn",
                "id": "site-131",
                "text": "131",
                "top": 402,
                "top": 319,
                "left": 266,
                "width": 100,
                "height": 20
                "height": 34
            }, {
                "type": "stn",
                "id": "site-132",
                "text": "132",
                "top": 424,
                "top": 355,
                "left": 266,
                "width": 100,
                "height": 20
@@ -557,15 +557,15 @@
                "type": "stn",
                "id": "site-133",
                "text": "133",
                "top": 446,
                "top": 377,
                "left": 266,
                "width": 100,
                "height": 20
                "height": 42
            }, {
                "type": "stn",
                "id": "site-134",
                "text": "134",
                "top": 468,
                "top": 421,
                "left": 266,
                "width": 100,
                "height": 20
@@ -573,26 +573,26 @@
                "type": "stn",
                "id": "site-135",
                "text": "135",
                "top": 490,
                "top": 443,
                "left": 266,
                "width": 100,
                "height": 20
                "height": 34
            }, {
                "type": "stn",
                "id": "site-136",
                "text": "136",
                "top": 512,
                "top": 479,
                "left": 266,
                "width": 100,
                "height": 20
                "height": 39
            }, {
                "type": "stn",
                "id": "site-137",
                "text": "137",
                "top": 534,
                "top": 520,
                "left": 266,
                "width": 100,
                "height": 20
                "height": 34
            }, {
                "type": "stn",
                "id": "site-138",
@@ -653,7 +653,7 @@
                "type": "stn",
                "id": "site-118",
                "text": "118",
                "top": 380,
                "top": 297,
                "left": 368,
                "width": 100,
                "height": 20
@@ -661,7 +661,7 @@
                "type": "stn",
                "id": "site-119",
                "text": "119",
                "top": 424,
                "top": 355,
                "left": 368,
                "width": 100,
                "height": 20
@@ -669,7 +669,7 @@
                "type": "stn",
                "id": "site-120",
                "text": "120",
                "top": 468,
                "top": 421,
                "left": 368,
                "width": 100,
                "height": 20
@@ -677,7 +677,7 @@
                "type": "stn",
                "id": "site-121",
                "text": "121",
                "top": 512,
                "top": 479,
                "left": 368,
                "width": 100,
                "height": 20
@@ -685,7 +685,7 @@
                "type": "stn",
                "id": "site-122",
                "text": "122",
                "top": 534,
                "top": 183,
                "left": 368,
                "width": 100,
                "height": 20
@@ -710,7 +710,7 @@
                "type": "stn",
                "id": "site-130",
                "text": "130",
                "top": 380,
                "top": 297,
                "left": 266,
                "width": 100,
                "height": 20
@@ -885,8 +885,8 @@
                "height": 684
            }, {
                "type": "stn",
                "id": "site-3",
                "text": "3",
                "id": "site-2000",
                "text": "2000",
                "top": 457,
                "left": 469,
                "width": 69,
version/BarcodeThread1.java
@@ -47,7 +47,7 @@
                    String s = new String(read);
                    if (!Cools.isEmpty(s)) {
                        barcode = new String(read);
                        log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
//                        log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
                        jsonObject.put("barcode", barcode);
version/BarcodeThread2.java
@@ -32,7 +32,7 @@
    public void setBarcode(String barcode) {
        this.barcode.delete(0, this.barcode.length());
        this.barcode.append(barcode);
        log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
//        log.info("{}号条码器,检索数据:{}", slave.getId(), this.barcode);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("time", DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F));
        jsonObject.put("barcode", barcode);