自动化立体仓库 - WCS系统
#
zjj
2024-01-30 f417e368a7a68c693a30b16329fb3533a0c84183
#
18个文件已修改
871 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/BasRgvMap.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/BasRgvMapService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasRgvMapServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/RouteUtils.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MatDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/LedCommand.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LedThread.java 362 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasRgvMapMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/rgv.html 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvMap.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasRgvMapService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -77,8 +79,10 @@
        this.lockEndRoute = lockEndRoute;
    }
    public Integer getRgvNoOther(){
        return 3-this.rgvNo;
    public Integer getRgvNoOther(Integer rgvNo){
        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
        BasRgvMap basRgvMap = basRgvMapService.selectByOtherRgvNo(rgvNo);
        return basRgvMap.getRgvNo();
    }
src/main/java/com/zy/asrs/mapper/BasRgvMapMapper.java
@@ -11,4 +11,6 @@
public interface BasRgvMapMapper extends BaseMapper<BasRgvMap> {
    BasRgvMap selectByRgvNo(@Param("rgvNo") Integer rgvNo);
    BasRgvMap selectByOtherRgvNo(@Param("rgvNo") Integer rgvNo);
}
src/main/java/com/zy/asrs/service/BasRgvMapService.java
@@ -7,4 +7,5 @@
public interface BasRgvMapService extends IService<BasRgvMap> {
    BasRgvMap selectByRgvNo(Integer rgvNo);
    BasRgvMap selectByOtherRgvNo(Integer rgvNo);
}
src/main/java/com/zy/asrs/service/impl/BasRgvMapServiceImpl.java
@@ -13,4 +13,11 @@
    public BasRgvMap selectByRgvNo(Integer rgvNo) {
        return this.baseMapper.selectByRgvNo(rgvNo);
    }
    @Override
    public BasRgvMap selectByOtherRgvNo(Integer rgvNo) {
        return this.baseMapper.selectByOtherRgvNo(rgvNo);
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -221,7 +221,7 @@
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo()));
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发2:"+dto.getWorkNo()+","+dto.getStaNo());
@@ -238,10 +238,10 @@
//                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                            if (ledThread != null) {
//                                String errorMsg = jsonObject.getString("msg");
//                                if (!Cools.isEmpty(errorMsg)) {
//                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
//                                }
                                String errorMsg = jsonObject.getString("msg");
                                if (!Cools.isEmpty(errorMsg)) {
                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                                }
//                            }
//                            News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
@@ -392,7 +392,7 @@
                    StaDesc staDesc = staDescService.selectOne(wrapper);
                    if (Cools.isEmpty(staDesc)) {
                        News.error(""+mark+" - 2"+" - 入库路径不存在!type_no={},stn_no={},crn_no={}", wrkMast.getIoType(), pickSta.getStaNo(), wrkMast.getCrnNo());
                        staProtocol.setWorkNo(9989);
                        staProtocol.setWorkNo(wrkNo++);
                        staProtocol.setStaNo((short) (pickSta.getStaNo().shortValue()-(short)1));
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
@@ -402,7 +402,7 @@
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "此为拣料、并板、盘点再入库.请放在"+pickSta.getBackSta().shortValue()+"站点";
                            MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(5, errorMsg));
                            MessageQueue.offer(SlaveType.Led, pickSta.getLed(), new Task(3, errorMsg));
                        }
                        continue;
                    }
@@ -449,7 +449,7 @@
                    // 更新站点信息 且 下发plc命令
                    staProtocol.setWorkNo(wrkMast.getWrkNo());
                    staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                    staProtocol.setStaNo((short) 161);
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发5:"+wrkMast.getWrkNo()+","+wrkMast.getStaNo());
@@ -505,7 +505,7 @@
                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
                            && crnProtocol.statusType == CrnStatusType.WAITING
                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                        News.warnNoLog(""+mark+" - 0"+" - 开始执行");
                        News.error("堆垛机出库完成 - 开始执行");
                        // 命令下发区 --------------------------------------------------------------------------
@@ -521,6 +521,7 @@
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            News.error("出库任务完成下发堆垛机复位", wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
                        } else {
                            News.error(""+mark+" - 1"+" - 更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
@@ -1400,7 +1401,7 @@
                                ledCommand.setLocNo(dto.getLocNo());
                                ledCommand.setStaNo(dto.getStaNo());
                                commands.add(ledCommand);
                                MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, commands));
                                MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(1, commands));
//                                ledThread.errorReset();
                            }
                        } else {
@@ -1413,12 +1414,12 @@
//                                throw new CoolException("更新plc站点信息失败");
//                            }
//
//                            if (ledThread != null) {
//                                String errorMsg = jsonObject.getString("msg");
//                                if (!Cools.isEmpty(errorMsg)) {
//                                    MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(5, errorMsg));
//                                }
//                            }
                            if (ledThread != null) {
                                String errorMsg = jsonObject.getString("msg");
                                if (!Cools.isEmpty(errorMsg)) {
                                    MessageQueue.offer(SlaveType.Led, emptyInSta.getLed(), new Task(3, errorMsg));
                                }
                            }
//                            News.error(""+mark+" - 3"+" - 请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
@@ -1440,7 +1441,6 @@
     * 出库  ===>> 工作档信息写入led显示器
     */
    public synchronized void ledExecute(Integer mark) {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
@@ -1458,11 +1458,7 @@
                }
                // 获取工作档数据
                WrkMast wrkMast = wrkMastMapper.selectById(staProtocol.getWorkNo());
//                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                if (null == wrkMast) {
                    continue;
                }
                News.warnNoLog(""+mark+" - 0"+" - 开始执行:出库  ===>> 工作档信息写入led显示器");
                if (null == wrkMast || wrkMast.getWrkSts() < 14 || wrkMast.getIoType() < 100) { continue; }
                wrkMasts.add(wrkMast);
                // 组装命令
                LedCommand ledCommand = new LedCommand();
@@ -1470,12 +1466,6 @@
                ledCommand.setIoType(wrkMast.getIoType());
                // 出库模式
                switch (wrkMast.getIoType()) {
                    case 1:
                        ledCommand.setTitle("全板入库");
                        break;
                    case 10:
                        ledCommand.setTitle("空板入库");
                        break;
                    case 101:
                        ledCommand.setTitle("全板出库");
                        break;
@@ -1493,16 +1483,34 @@
                        ledCommand.setEmptyMk(true);
                        break;
                    default:
                        News.error(""+mark+" - 1"+" - 任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        News.error("任务入出库类型错误!!![工作号:{}] [入出库类型:{}]", wrkMast.getWrkNo(), wrkMast.getIoType());
                        break;
                }
                ledCommand.setSourceLocNo(wrkMast.getSourceLocNo());
                ledCommand.setLocNo(wrkMast.getLocNo());
                ledCommand.setStaNo(wrkMast.getStaNo());
//                ledCommand.setSourceStaNo(wrkMast.getSourceStaNo());
                if (wrkMast.getIoType() != 110 && wrkMast.getIoType() != 10) {
                ledCommand.setBarcode(wrkMast.getBarcode());
                if (wrkMast.getIoType() != 110) {
                    List<WrkDetl> wrkDetls = wrkDetlService.findByWorkNo(wrkMast.getWrkNo());
                    wrkDetls.forEach(wrkDetl -> ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getAnfme(),wrkDetl.getSpecs())));
                    wrkDetls.forEach(wrkDetl -> {
                        Double total = 0.0;
                        EntityWrapper<LocDetl> wrapper = new EntityWrapper<>();
                        LocDetl locDetl = locDetlService.selectOne(wrapper.eq("zpallet", wrkDetl.getZpallet()).eq("matnr", wrkDetl.getMatnr()));
                        if (Cools.isEmpty(locDetl)) {
                            total = wrkDetl.getAnfme();
                        } else {
                            total = locDetl.getAnfme();
                        }
                        if (wrkMast.getIoType() == 101) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
                        }
                        if (wrkMast.getIoType() == 103 && (null == wrkDetl.getInspect() || 0 == wrkDetl.getInspect())) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
                        }
                        if (wrkMast.getIoType() == 107) {
                            ledCommand.getMatDtos().add(new MatDto(wrkDetl.getMatnr(), wrkDetl.getMaktx(), wrkDetl.getBatch(), wrkDetl.getSpecs(), wrkDetl.getManu(), wrkDetl.getMemo(), wrkDetl.getAnfme(),total));
                        }
                    });
                }
                commands.add(ledCommand);
            }
@@ -1513,32 +1521,11 @@
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
//             命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                if (led.getId() < 7) {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                        News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                } else {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
//                        News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                }
//
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                    continue;
                }else {
                    ledThread.setLedMk(false);
                }
            }
@@ -1548,7 +1535,6 @@
                    wrkMast.setOveMk("Y");
                    wrkMast.setModiTime(new Date());
                    if (wrkMastMapper.updateById(wrkMast) == 0) {
                        News.errorNoLog(""+mark+" - 4"+" - 更新工作档失败");
                        throw new CoolException("更新工作档失败");
                    }
                }
@@ -1562,17 +1548,13 @@
            }
        }
//        News.infoNoLog(""+mark+" - 0"+" - 出库  ===>> 工作档信息写入led显示器执行完成");
    }
    /**
     * 其他  ===>> LED显示器复位,显示默认信息
     */
    public synchronized void ledReset(Integer mark) {
//        News.warnNoLog(""+mark+" - 0"+" - 开始执行:其他  ===>> LED显示器复位,显示默认信息");
    public synchronized void ledReset() {
        for (LedSlave led : slaveProperties.getLed()) {
            // 获取输送线plc线程
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, led.getDevpPlcId());
            // 命令集合
@@ -1580,27 +1562,25 @@
            for (Integer staNo : led.getStaArr()) {
                // 获取叉车站点
                StaProtocol staProtocol = devpThread.getStation().get(staNo);
                if (staProtocol == null) {
                    continue;
                }
                if (staProtocol.getWorkNo() != 0 && staProtocol.isLoading()) {
                if (staProtocol == null) { continue; }
                if (staProtocol.getWorkNo() != 0) {
                    reset = false;
                    break;
                }
            }
            // 获取led线程
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getId());
            LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, led.getDevpPlcId());
            // led显示默认内容
            if (reset && !ledThread.isLedMk()) {
                ledThread.setLedMk(true);
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(4, new ArrayList<>()))) {
                    News.error(""+mark+" - 1"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                } else {
            if (reset) {
                if (ledThread == null) {
                    continue;
                }
                ledThread.errorReset();
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(2, new ArrayList<>()))) {
                    News.error("{}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
                }
            }
        }
//        News.infoNoLog(""+mark+" - 0"+" - 执行完成:其他  ===>> LED显示器复位,显示默认信息");
    }
    /**
@@ -2082,7 +2062,7 @@
                        String data = jsonObject.get("data").toString();
                        News.info((String) jsonObject.get("msg")+","+data);
                    } else {
                        News.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response);
                        News.warnNoLog("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
@@ -2159,7 +2139,7 @@
            basRgvMapMapper.updateById(basRgvMapCurrent);
            //更新另一台小车地图
            Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther();
            Integer rgvNoOther = basRgvMapCurrent.getRgvNoOther(basRgvMapCurrent.getRgvNo());
            BasRgvMap basRgvMapOther = basRgvMapMapper.selectById(rgvNoOther);
            List<Integer> integers = RouteUtils.RouteMapCurrentFar(fallMerge, basRgvMapCurrent.getLockStartRoute());
            Integer lockEndRoute = RouteUtils.RouteMapOtherFarStnNo(integers, basRgvMapCurrent.getLockStartRoute());//另一台小车可活动最远位置
@@ -2193,10 +2173,11 @@
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999)
                if (
//                        rgvProtocol.getStatusType() == RgvStatusType.IDLE
                         rgvProtocol.getModeType() == RgvModeType.AUTO
//                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
//                        && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999)
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
@@ -2327,6 +2308,7 @@
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0
                        && rgvProtocol.getTaskNo1() == 0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -2535,11 +2517,11 @@
                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
                        continue;
                    }
                    if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){
                        continue;
                    } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157)  ){
                        continue;
                    }
//                    if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){
//                        continue;
//                    } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157)  ){
//                        continue;
//                    }
                    rgvAvoidanceXY(rgvProtocol.getRgvNo());
                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                }
@@ -2555,7 +2537,7 @@
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
        BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId);
        if (basRgvMap.getStartRoute() == 100){
        if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){
            try{
                //  命令下发区 --------------------------------------------------------------------------
@@ -2565,7 +2547,7 @@
                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1( (short)100);
                rgvCommand.setSourceStaNo1( (short)101);
                rgvCommand.setCommand((short) 1);   //工位1任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
@@ -2587,7 +2569,7 @@
                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1( (short)157);
                rgvCommand.setSourceStaNo1( (short)161);
                rgvCommand.setCommand((short) 1);   //工位1任务确认
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务   step=9,回原点 9999任务号
src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -247,6 +247,13 @@
        }
    }
    public static  Short SouStaEnd(Integer endSta,Integer souSta){
       if (souSta == 159) {
           return (short)161;
       }
       return souSta.shortValue();
    }
    public static void main(String[] arge){
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -34,7 +34,7 @@
//        if (staProtocol.isHigh() == staProtocol.isLow()) {
//            throw new CoolException("plc高低检测异常");
//        }
        if (staProtocol.getSiteId() == 106){
        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
            this.locType1 = 2; // 高库位
        }else {
            this.locType1 = 1; // 低库位
src/main/java/com/zy/common/model/MatDto.java
@@ -14,17 +14,33 @@
    // 物料名称
    private String maknx;
    // 库位规格
    private String batch;
    private String specs;
    // 客户信息
    private String manu;
    // 备注
    private String memo;
    // 物料数量
    private Double count;
    // 库位数量
    private Double total;
    public MatDto() {
    }
    public MatDto(String matnr, String maknx, String batch, String specs, String manu, String memo, Double count, Double total) {
        this.matnr = matnr;
        this.maknx = maknx;
        this.batch = batch;
        this.specs = specs;
        this.manu = manu;
        this.memo = memo;
        this.count = count;
        this.total = total;
    }
    public MatDto(String matNo, String maknx, Double count) {
        this.matnr = matNo;
src/main/java/com/zy/core/MainProcess.java
@@ -72,14 +72,18 @@
                    // 出库  ===>> 工作档信息写入led显示器
                    mainService.ledExecute(9);
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset(10);
                    mainService.ledReset();
                    mainService.outOfDevp(11);
                    //空托盘自动出库
//                    mainService.autoEmptyOut();
//                    //空托盘自动入库
//                    mainService.autoEmptyIn();
                    if (i>10){
                        //空托盘自动出库
                        mainService.autoEmptyOut();
                        //空托盘自动入库
                        mainService.autoEmptyIn();
                        i=0;
                    }
                    i++;
                    // 其他  ===>> 入出库模式切换
//                    i++;
src/main/java/com/zy/core/model/command/LedCommand.java
@@ -1,5 +1,6 @@
package com.zy.core.model.command;
import com.core.common.Cools;
import com.zy.common.model.MatDto;
import lombok.Data;
@@ -30,4 +31,23 @@
    private boolean emptyMk = false;
    private Integer ioType;
    private String barcode;
    @Override
    public String toString() {
        StringBuffer s = new StringBuffer();
        s.append("工作号[" + this.workNo + "]\n");
        s.append("工作类型[" + this.title + "]\n");
        if (!Cools.isEmpty(this.barcode)) {
            s.append("托盘码[" + this.barcode + "]\n");
        }
        if (!this.emptyMk){
            for (MatDto matDto : matDtos) {
                s.append("[商品编码:" + matDto.getMatnr() + ", 数量:" + matDto.getCount() + "]\n");
            }
        }
        return s.toString();
    }
}
src/main/java/com/zy/core/thread/LedThread.java
@@ -36,13 +36,7 @@
public class LedThread implements Runnable, ThreadHandler {
    private Slave slave;
    private Bx5GScreenClient screen;
    ProgramBxFile pf;
    TextCaptionBxArea area;
    DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
    private Set<Integer> workNos = new HashSet<>();
    private boolean ledMk = false;
    private boolean resetStatus = false;    // 复位状态
    // 显示器
    private StringBuffer stringBuffer = new StringBuffer();
@@ -52,20 +46,12 @@
    public LedThread(Slave slave) {
        this.slave = slave;
        try {
//            Bx5GEnv.initial(3000);
//            screen = new Bx5GScreenClient("my");
        } catch (Exception e) {
            e.printStackTrace();
            News.info("Led"+" - 1"+" - led连接构造器错误 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    @Override
    @SuppressWarnings({"InfiniteLoopStatement", "unchecked"})
    public void run() {
//        connect();
        close();
        while (true) {
            try {
                Task task = MessageQueue.poll(SlaveType.Led, slave.getId());
@@ -79,131 +65,24 @@
                        case 2:
                            reset();
                            break;
                        // 写数据 液晶
                        case 3:
                            write7((List<LedCommand>)task.getData());
                            break;
                        // 复位 液晶
                        case 4:
                            reset7();
                            break;
                        case 5:
                            error((String) task.getData());
                            break;
                        case 6:
                        case 4:
                            errorReset();
                            break;
                        default:
                            break;
                    }
                }
                Thread.sleep(400);
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void write(List<LedCommand> list) throws Bx5GException {
        if (!connect()) {
            return;
        }
        pf = new ProgramBxFile( 0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
        for (LedCommand command : list) {
            page.newLine(command.getTitle() +"("+command.getWorkNo()+")");
            page.newLine("库位:"+ (command.getIoType() < 100 ? command.getLocNo() : command.getSourceLocNo()));
            page.newLine("目标站:"+command.getStaNo());
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    //去掉小数点
                    String strQty = matDto.getCount().toString();
                    int idx = strQty.lastIndexOf(".");
                    if(idx >= 0){
                        strQty.substring(0,idx);
                    }
                    page.newLine(matDto.getMaknx() + "[数量" + strQty +"]");
//                    page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】");
                }
            }
            page.newLine("\n");
        }
        // 设置字体
        page.setFont(new Font("宋体",Font.PLAIN,12));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        if (pf.validate() != null) {
            News.info("Led"+" - 2"+" - pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = false;
        }
        close();
    }
    private void reset() throws Bx5GException {
        if (!connect()) {
            return;
        }
//        if (resetStatus) {
//            return;
//        }
        pf = new ProgramBxFile( 0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
//        List<String> list = null;
//        try {
//            String ledDefaultMsg = Parameter.get().getLedDefaultMsg();
//            list = JSON.parseArray(ledDefaultMsg, String.class);
//        } catch (Exception ignore) {
//        }
//        if (!Cools.isEmpty(list)) {
//            for (String str : list) {
//                page.newLine(str);
//            }
//        } else {
//            page.newLine("自动化立体仓库");
//            page.newLine("西格迈股份有限公司");
//        }
        page.newLine("力源智能仓储");
        // 设置字体
        page.setFont(new Font("宋体",Font.PLAIN,13));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        // 更新节目
        if (pf.validate() != null) {
            News.info("Led"+" - 3"+" - pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = true;
        }
        close();
    }
    private void write7(List<LedCommand> list) {
    private void write(List<LedCommand> list) {
        commandList = list;
        StringBuilder sb = new StringBuilder();
@@ -213,9 +92,7 @@
            sb.append("目标站:").append(command.getStaNo()).append("\n");
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    sb.append("物料编码:").append(matDto.getMatnr()).append("\n");
                    sb.append("数量:").append(matDto.getCount()).append("\n");
                    sb.append("规格:").append(matDto.getSpecs()).append("\n");
                    sb.append(matDto.getSpecs()).append("-").append(matDto.getBatch()).append("\n");
                }
            }
            sb.append("\n");
@@ -227,7 +104,7 @@
    }
    private void reset7() {
    private void reset() {
        commandList = null;
        stringBuffer.delete(0, stringBuffer.length());
@@ -245,238 +122,11 @@
    @Override
    public boolean connect() {
        boolean connRes = false;
        try {
            connRes = screen.connect(slave.getIp(),slave.getPort());
            screen.turnOn();
        } catch (Exception ignore) {
        }
        if (connRes) {
            News.info("Led"+" - 4"+" - led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            News.error("Led"+" - 5"+" - led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        return connRes;
        return true;
    }
    @Override
    public void close() {
    }
    public static void main(String[] args) throws Exception {
        String strQty = "1234";
        int index = strQty.lastIndexOf(".");
        if(index>=0) {
            strQty=strQty.substring(0, index);
        }
        System.out.println("2==>>"+strQty);
        Bx5GEnv.initial(3000);
        Bx5GScreenClient screen = new Bx5GScreenClient("my");
        DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
        if (!screen.connect("192.168.10.101",5005)) {
            System.err.println("连接失败!!!!");
            return;
        }
        screen.turnOn();
        while (true) {
            Thread.sleep(5000L);
            ProgramBxFile pf = new ProgramBxFile( 0, screen.getProfile());
            pf.setFrameShow(false);
            // 分别输入X,Y,width,heigth
            TextCaptionBxArea area = new TextCaptionBxArea(  0,0,192,96,screen.getProfile());
            // 创建一个数据页
            // 第一行数据
            TextBxPage page = new TextBxPage("出库任务(303)");
            page.newLine("源库位:0100204");
            page.newLine("目标站:1000");
            // 设置字体
            page.setFont( new Font("宋体",Font.PLAIN,15));
            // 设置文本颜色
            page.setForeground(Color.red);
            // 设置显示特技为快速打出
            page.setDisplayStyle(styles[6]);
            area.clearPages();
            area.addPage(page);
            pf.addArea( area );
            // 更新节目
            // 更新节目
            if (pf.validate() != null) {
                System.out.println("pf out of range");
                News.info("Led"+" - 6"+" - pf out of range");
            } else {
                // 更新节目
                screen.writeProgram(pf);
            }
        }
        // 继开与控制器之间的链接
//        screen.disconnect();
    }
    public static void main1(String[] args) throws Exception {
        Bx5GEnv.initial(3000);
        // 创建screen对象,用于对控制器进行访问,客户端模式
        Bx5GScreenClient screen = new Bx5GScreenClient("my");
        // 创建screen对象,用于对控制器进行访问,串口模式
        //        Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen");
        // 在对控制器交互之前,需要先与控制器建立连接
        boolean conn = screen.connect("192.168.10.61",5005);
        System.out.println(conn);
        // 与控制器交互完成后,需断开与控制器之间的连接
//        screen.disconnect();
        // 以下为一些简单控制命令的使用方法
        // 开关机命令
//        screen.turnOff();// 关机
        screen.turnOn();// 开机
//        screen.syncTime();// 校时
//        screen.ping();// ping命令
//        // 查询控制器状态
//        screen.checkControllerStatus();
//        // 查询控制器当前固件版本
//        screen.checkFirmware();
//        // 查询控制器内存
//        screen.checkMemVolumes();
//        // 锁定屏幕当前画面
//        screen.lock();
//        // 解除锁定屏幕当前画面
//        screen.unlock();
        Bx5GScreen.Result <ReturnControllerStatus> result1 =
                screen.checkControllerStatus();
        if (result1.isOK())
        {
            ReturnControllerStatus status = result1.reply;
            System.out.println(status.getBrightness());
            System.out.println(status.getRtcDay());
            System.out.println(status.getScreenOnOff());
            //
            // status 还有很对其他接口,可以根据实际需求再次调用以获取相应状态
        }
//
        // 以下是静态区部分 Demo
        // 创建节目文件
        ProgramBxFile pf = new ProgramBxFile( 0,screen.getProfile() );
// 是否显示节目边框
        pf.setFrameShow(true);
// 节目边框的移动速度
        pf.setFrameSpeed(20);
// 使用第几个内置边框
        pf.loadFrameImage(13);
        DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
// 创建一个文本区
        // 分别输入X,Y,width,heigth
        // 注意区域坐标和宽度高度,不要越界
        TextCaptionBxArea area = new TextCaptionBxArea( 0,0,160,64,screen.getProfile() );
        // 创建一个数据页
        // 第一行数据
        TextBxPage page = new TextBxPage("入库");
        // 第二行数据
        page.newLine( "物料:" );
        page.newLine("接收器 RX18 XH 6V (数量:2)");
        page.newLine("中控 BM蓝牙 英文 6V (数量:1)");
        page.newLine("线束 S2588-1-XX 无实物(数量:5)");
        page.newLine("目标库位:0100204");
        // 设置字体
        page.setFont( new Font("宋体",Font.PLAIN,12) );
        // 设置显示特技为快速打出
        page.setDisplayStyle( styles[2] );
        // 数据页可以是图片
//        ImageFileBxPage iPage = new ImageFileBxPage( "E;a/001.bmp" );
//
//        // 数据页可以是txt文件
//        TextFileBxPage tPage  = new TextFileBxPage("E:a/001.txt");
        // 将前面的page添加到area中 area中可以添加多个page 其中page可以是字符串,可以是txt文件,可以是图片,不可以是表格,如果需要Led屏上显示表格,请先将表格绘制成图片
        area.addPage( page );
//        area.addPage( iPage );
//        area.addPage( tPage );
        // 将area添加到节目中  节目中可以添加多个area
        pf.addArea( area );
        // 更新节目
        screen.writeProgram( pf );
        //
        // 以下是动态区部分 Demo
        // 动态区的特点
        // DynamicBxAreaRule(id, runMode, immediatePlay, timeout)
        // runMode 运行模式:
        //   0:循环显示。
        //   1:显示完成后静止显示最后一页数据。
        //   2:循环显示,超过设定时间后数据仍未更新时不再显示。
        //   3:循环显示,超过设定时间后数据仍未更新时显示 Logo 信息。
        //   4:循环显示,显示完最后一页后就不再显示。
        // immediatePlay 是否立即播放:
        //   0:与异步节目一起播放。
        //   1:异步节目停止播放,仅播放动态区域。
        //   2:当播放完节目编号最高的异步节目后播放该动态区域。
        //
        // 定义一个动态区
        // 可以通过ID来更新不同的动态区内容, 此处 ID 为 0
//        DynamicBxAreaRule dynRule = new DynamicBxAreaRule(0, (byte) 0, (byte) 1, 0);
        //dArea.addProgram("P000");
        //dArea.addProgram("P001");
//        int posX = 440;
//        int posY = 4;
//        TextCaptionBxArea dAreaContent = new TextCaptionBxArea(posX, posY, 64, 16, screen.getProfile());
//        TextBxPage page = new TextBxPage("动态第一次尝试");
//        page.setDisplayStyle(DisplayStyleFactory.getStyle(4));
//        dAreaContent.addPage(page);
//
//        // 发送动态区之前,如果需要删除之前的动态区,可以调用以下接口
//        // 通常如果动态区的位置或大小没有发生改变,不用删除
//        screen.deleteAllDynamic();
//
//        // 更新动态区
//        screen.writeDynamic(dynRule, dAreaContent);
//        Thread.sleep(15000);
//
//        //
//        // 下面模拟再次更新动态区
//        page = new TextBxPage("再次尝试");
//        TextBxPage page2 = new TextBxPage("成功");
//
//        dAreaContent.clearPages();
//        dAreaContent.addPage(page);
//        dAreaContent.addPage(page2);
//
//        // 更新动态区
//        screen.writeDynamic(dynRule, dAreaContent);
        //
        // 继开与控制器之间的链接
        screen.disconnect();
    }
}
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.common.utils.News;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
@@ -19,6 +20,7 @@
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import lombok.Data;
@@ -342,12 +344,92 @@
        OperateResult result = siemensNet.Write("DB100.0", array);
        if (command.getAckFinish1() == 0) {
            short commandFinish = 1;  //工位1任务写入
            Thread.sleep(200);
            result = siemensNet.Write("DB100.10", commandFinish);
        if (!result.IsSuccess){
            News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(4,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
//                one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                one.setTaskMode1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                if (
                    !command.getTaskNo1().equals(one.getTaskNo1()) ||
                        !command.getTaskMode1().equals(one.getTaskMode1()) ||
                        !command.getSourceStaNo1().equals(one.getSourceStaNo1()) ||
                        !command.getDestinationStaNo1().equals(one.getDestinationStaNo1())
                ){
                    try{
                        News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            News.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            News.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    News.error("Rgv命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Rgv, slave.getId(), new Task(4, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                }else {
                    News.info("RGV命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
            }
        }catch (Exception e){
            News.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.10", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                News.info("RGV任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            News.error("RGV任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        News.error("RGV任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
//        if (command.getAckFinish1() == 0) {
//            short commandFinish = 1;  //工位1任务写入
//            Thread.sleep(200);
//            result = siemensNet.Write("DB100.10", commandFinish);
//        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -231,12 +231,12 @@
            }
        }
        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
        //RGV小车
        Thread.sleep(200);
        //RGV小车1
        Thread.sleep(100);
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10);
        if (result3.IsSuccess) {
            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));
            if (!Cools.isEmpty(basRgvMap) && basRgvMap.getStartRoute() == 100){
            if (!Cools.isEmpty(basRgvMap)){
                Integer siteId = 1;
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
@@ -248,12 +248,12 @@
                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8)));
            }
        }
        //RGV小车
        Thread.sleep(200);
        //RGV小车2
        Thread.sleep(100);
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB50.212",(short)10);
        if (result4.IsSuccess) {
            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result4.Content, 0));
            if (!Cools.isEmpty(basRgvMap) && (basRgvMap.getStartRoute() == 161 || basRgvMap.getStartRoute() == 157)){
            if (!Cools.isEmpty(basRgvMap)){
                Integer siteId = 2;
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
@@ -266,6 +266,24 @@
            }
        }
        //RGV小车3
        Thread.sleep(100);
        OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB50.224",(short)10);
        if (result5.IsSuccess) {
            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result5.Content, 0));
            if (!Cools.isEmpty(basRgvMap)){
                Integer siteId = 3;
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setAutoing(true);
                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result5.Content, 8)));
            }
        }
        //条码扫描器
        ArrayList<Integer> barcodeList = BarcodeList;
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840", (short) (barcodeList.size() * 8));
src/main/resources/application.yml
@@ -198,33 +198,33 @@
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
  # RGV穿梭车2
#  rgv[2]:
#    id: 3
#    ip: 10.10.10.66
#    port: 502
#    rack: 0
#    slot: 0
#    #RGV入库源站点
#    rgvInSStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 100
#    rgvInSStn[1]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 101
#    #RGV出库源站点
#    rgvOutSStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 110
#    rgvOutSStn[1]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 112
#    #RGV目标站点
#    rgvDestStn[0]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 102
#    rgvDestStn[1]:
#      devpPlcId: ${wcs-slave.devp[0].id}
#      staNo: 103
  rgv[2]:
    id: 3
    ip: 10.10.10.66
    port: 502
    rack: 0
    slot: 0
    #RGV入库源站点
    rgvInSStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 100
    rgvInSStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
    #RGV出库源站点
    rgvOutSStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 110
    rgvOutSStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 112
    #RGV目标站点
    rgvDestStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
    rgvDestStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
  # 输送线1
  devp[0]:
    id: 1
@@ -246,32 +246,43 @@
      led: ${wcs-slave.led[1].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 106
      barcode: ${wcs-slave.barcode[0].id}
      led: ${wcs-slave.led[1].id}
      backSta: 105
      staNo: 159
      barcode: ${wcs-slave.barcode[2].id}
      led: ${wcs-slave.led[5].id}
      backSta: 160
    # 入库口1
    inSta[1]:
      staNo: 107
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 108
      led: ${wcs-slave.led[1].id}
      led: ${wcs-slave.led[2].id}
    # 空板入库口1
    emptyInSta[1]:
      staNo: 107
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 108
      led: ${wcs-slave.led[1].id}
    # 拣料入库口1
    pickSta[1]:
      staNo: 107
      barcode: ${wcs-slave.barcode[1].id}
      led: ${wcs-slave.led[1].id}
      backSta: 108
      led: ${wcs-slave.led[2].id}
    inSta[2]:
      staNo: 159
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 160
      led: ${wcs-slave.led[5].id}
#    # 拣料入库口1
#    pickSta[1]:
#      staNo: 107
#      barcode: ${wcs-slave.barcode[1].id}
#      led: ${wcs-slave.led[1].id}
#      backSta: 108
    # 出库口1
    outSta[0]:
      staNo: 100
      led: ${wcs-slave.led[0].id}
    outSta[1]:
      staNo: 152
      led: ${wcs-slave.led[3].id}
    outSta[2]:
      staNo: 156
      led: ${wcs-slave.led[4].id}
  # 条码扫描仪1
  barcode[0]:
@@ -291,35 +302,42 @@
   # LED1
  led[0]:
    id: 1
    ip: 10.10.10.249
    ip: 10.10.10.101
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 100
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.248
    ip: 10.10.10.102
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 106
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.247
    ip: 10.10.10.103
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 107
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.246
    ip: 10.10.10.104
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 126
    staArr: 152
  # LED5
  led[4]:
    id: 5
    ip: 10.10.10.245
    ip: 10.10.10.105
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 134
    staArr: 156
  # LED6
  led[5]:
    id: 6
    ip: 10.10.10.106
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 160
src/main/resources/mapper/BasRgvMapMapper.xml
@@ -17,5 +17,9 @@
        select * from asr_bas_rgv_map
        where rgv_no = #{rgvNo}
    </select>
    <select id="selectByOtherRgvNo" resultMap="BaseResultMap">
        select * from asr_bas_rgv_map
        where rgv_no != #{rgvNo}
    </select>
</mapper>
src/main/webapp/static/js/console.map.js
@@ -625,11 +625,19 @@
                "left": 270,
                "width": 6,
                "height": 742
            },{
                "type": "stn",
                "id": "site-3",
                "text": "3",
                "top": -20,
                "left": 220,
                "width": 60,
                "height": 19
            }, {
                "type": "stn",
                "id": "site-2",
                "text": "2",
                "top": 398,
                "top": -20,
                "left": 220,
                "width": 60,
                "height": 19
@@ -637,7 +645,7 @@
                "type": "stn",
                "id": "site-1",
                "text": "1",
                "top": 698,
                "top": -20,
                "left": 220,
                "width": 60,
                "height": 19
src/main/webapp/views/console.html
@@ -568,7 +568,7 @@
                            siteEl.html(sites[i].siteId);
                        }
                        if (sites[i].siteId === '1' || sites[i].siteId === '2') {
                        if (sites[i].siteId === '1' || sites[i].siteId === '2' || sites[i].siteId === '3') {
                            carAnimate(Number(sites[i].siteId), Number(sites[i].nearbySta));
                        }
@@ -715,7 +715,7 @@
    function carAnimate(id, target) {
        // debugger
        var targetTop = 0;
        if (id === 1 || id === '1' || id === '2' || id === 2) {
        if (id === 1 || id === '1' || id === '2' || id === 2 || id === '3' || id === 3) {
            switch (target) {
                case 1:
                    targetTop += 792;
src/main/webapp/views/rgv.html
@@ -166,10 +166,10 @@
<!--                            <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>工位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>-->
@@ -188,10 +188,10 @@
<!--                            <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>工位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>-->
@@ -206,8 +206,8 @@
                    <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="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>-->
@@ -215,7 +215,7 @@
                        <button class="item" onclick="taskComplete()">任务完成</button>
                        <!--                <button class="item" onclick="pause()">暂停</button>-->
                        <!--                <button class="item" onclick="boot()">启动</button>-->
                        <button class="item" onclick="clearCommand()">清除命令</button>
<!--                        <button class="item" onclick="clearCommand()">清除命令</button>-->
                        <button class="item" onclick="handleReset()">复位</button>
                    </div>
                </fieldset>