1
2025-09-29 4747e5dcb4066161b42a7a54cab542949ad5826c
#和得服务器
13个文件已修改
763 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/console.html 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/rgv.html 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -271,19 +271,12 @@
        }
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1(true);  // 任务完成确认位
//        command.setTaskNo1( 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2(true);  // 任务完成确认位
        command.setTaskNo2(0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand(true);
        command.setWrkTaskPri(0);  //执行工位
        command.setTaskNo(Math.toIntExact(0)); // 工作号
        command.setTaskStatus((short)0); // 任务模式: 取货
        command.setTargetPosition(0);  // 目标站
        return rgvControl(command)? R.ok(): R.error();
        return rgvClear(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "手动复位")
@@ -348,4 +341,30 @@
        return false;
    }
    private boolean rgvClear(RgvCommand command){
        if (command.getRgvNo() == null) {
            throw new CoolException("请选择RGV");
        }
        for (RgvSlave rgv : slaveProperties.getRgv()) {
            // 获取RGV信息
            if (command.getRgvNo().equals(rgv.getId())) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                if (rgvThread == null) {
                    throw new CoolException("RGV不在线");
                }
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    throw new CoolException("RGV不在线");
                }
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(3, command))) {
                    return true;
                } else {
                    throw new CoolException("命令下发失败");
                }
            }
        }
        return false;
    }
}
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -133,9 +133,11 @@
    @TableField("rgv_no")
    private Integer rgvNo;
    private Integer mk;
    public WrkMastSta() {}
    public WrkMastSta(Long wrkNo, Integer wrkStart, Integer wrkEnd, Integer staStart, Integer staEnd, Date createTime, Date updateTime, Integer type, Integer wrkSts, Integer lineNumber, Integer wrkType, Date bignTime,Integer workSta, Integer rgvNo) {
    public WrkMastSta(Long wrkNo, Integer wrkStart, Integer wrkEnd, Integer staStart, Integer staEnd, Date createTime, Date updateTime, Integer type, Integer wrkSts, Integer lineNumber, Integer wrkType, Date bignTime,Integer workSta, Integer rgvNo,Integer mk) {
        this.wrkNo = wrkNo;
        this.wrkStart = wrkStart;
        this.wrkEnd = wrkEnd;
@@ -150,6 +152,7 @@
        this.bignTime = bignTime;
        this.workSta = workSta;
        this.rgvNo = rgvNo;
        this.mk = mk;
    }
//    WrkMastSta wrkMastSta = new WrkMastSta(
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -129,7 +129,6 @@
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                // 获取条码扫描仪信息
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                BarcodeThread barcodeThreadMat = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcodeMat());
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
@@ -143,13 +142,9 @@
                    continue;
                }
                if (barcodeThreadMat == null) {
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                String barcodeMat = barcodeThreadMat.getBarcode();
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
@@ -212,7 +207,8 @@
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()) {
                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
                    if(Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode)) {
//                        News.error(JSON.toJSONString(staProtocol));
                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        // led 异常显示
                        if (ledThread != null) {
@@ -339,6 +335,7 @@
//                            }
//                        }
                        else {
                            News.error(JSON.toJSONString(staProtocol));
                            staProtocol.setWorkNo(wrkNo);
                            wrkNo++;
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
@@ -1050,61 +1047,61 @@
            } else {
                staProtocol = staProtocol.clone();
            }
            if (slave.getId() == 3) {
                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol2 = devpThread1.getStation().get(4001);
                if (staProtocol2 == null) {
                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
                    break;
                } else {
                    staProtocol2 = staProtocol2.clone();
                }
                WrkMast wrkMast9999 = wrkMastMapper.selectByWrkNo(9996);
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                if(wrkMast9999 != null && staProtocol2.isAutoing() && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")){
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo((short) 9996); // 工作号
//                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX((short) 5);     // 源库位排
                    crnCommand.setSourcePosY((short) 1);     // 源库位列
                    crnCommand.setSourcePosZ((short) 4);     // 源库位层
                    crnCommand.setDestinationPosX((short) 6);     // 目标库位排
                    crnCommand.setDestinationPosY((short) 1);     // 目标库位列
                    crnCommand.setDestinationPosZ((short) 1);     // 目标库位层
//                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9999.getCrnNo(), new Task(2, crnCommand))) {
                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9999.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast9999.setWrkSts(3L);
                        wrkMast9999.setCrnStrTime(now);
                        wrkMast9999.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast9999) == 0) {
                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9999.getWrkNo());
                        }
                        break;
                    }
                }
            }
//            if (slave.getId() == 3) {
//                SiemensDevpThread devpThread1 = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
//                StaProtocol staProtocol2 = devpThread1.getStation().get(4001);
//                if (staProtocol2 == null) {
//                    News.infoNoLog("" + mark + " - 2" + " - 3" + " - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol=" + staProtocol2);
//                    break;
//                } else {
//                    staProtocol2 = staProtocol2.clone();
//                }
//                WrkMast wrkMast9999 = wrkMastMapper.selectByWrkNo(9996);
//                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
//                if (staDetl == null) {
//                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
//                    break;
////                    continue;
//                }
//                if(wrkMast9999 != null && staProtocol2.isAutoing() && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")){
//                    // 堆垛机控制过滤
//                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
////                        continue;
//                        break;
//                    }
//                    // 已经存在吊车执行任务时,则过滤
//                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
//                        break;
////                        return;
//                    }
//                    // 1.堆垛机开始移动
//                    CrnCommand crnCommand = new CrnCommand();
//                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
//                    crnCommand.setTaskNo((short) 9996); // 工作号
////                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
//                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
//                    crnCommand.setSourcePosX((short) 5);     // 源库位排
//                    crnCommand.setSourcePosY((short) 1);     // 源库位列
//                    crnCommand.setSourcePosZ((short) 4);     // 源库位层
//                    crnCommand.setDestinationPosX((short) 6);     // 目标库位排
//                    crnCommand.setDestinationPosY((short) 1);     // 目标库位列
//                    crnCommand.setDestinationPosZ((short) 1);     // 目标库位层
////                crnCommand.setTraySize(sourceSta.getLocType1() == 2);     //库位类型
//                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast9999.getCrnNo(), new Task(2, crnCommand))) {
//                        News.error("" + mark + " - 2" + " - 13" + " - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast9999.getCrnNo(), JSON.toJSON(crnCommand));
//                    } else {
//                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
//                        Date now = new Date();
//                        wrkMast9999.setWrkSts(3L);
//                        wrkMast9999.setCrnStrTime(now);
//                        wrkMast9999.setModiTime(now);
//                        if (wrkMastMapper.updateById(wrkMast9999) == 0) {
//                            News.error("" + mark + " - 2" + " - 14" + " - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast9999.getWrkNo());
//                        }
//                        break;
//                    }
//                }
//            }
            // 查询站点详细信息
            BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
            if (staDetl == null) {
@@ -2564,18 +2561,18 @@
    public synchronized void autoEmptyOut() {
        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        List<Integer> list = new ArrayList<>();
        list.add(1108);list.add(2031);
        list.add(1109);list.add(2031);
        for (Integer site:list){
            Integer emptyCount = wrkMastMapper.countPakOutEmpty(site);
            StaProtocol staProtocol = null;
            if(emptyCount >= 2 && site == 1108){
            if(emptyCount >= 2 && site == 1109){
                continue;
            }else if(emptyCount == 1 && site == 2031){
                continue;
            }
            //如果站点可出禁用,则不生成空盘出库任务
            switch (site){
                case 1108:staProtocol = devpThread.getStation().get(site - 2);break;
                case 1109:staProtocol = devpThread.getStation().get(site - 2);break;
                case 2031:staProtocol = devpThread.getStation().get(site);break;
            }
            if (staProtocol == null) {
@@ -2620,6 +2617,7 @@
        list.add(1038);
        for (Integer site:list){
            StaProtocol staProtocol = devpThread.getStation().get(site);
            StaProtocol staProtocol1 = devpThread.getStation().get(1040);
            if (staProtocol == null) {
                return;
            } else {
@@ -2629,9 +2627,11 @@
                    && staProtocol.isLoading()  //有物
                    && staProtocol.isInEnable()  //可入信号
                    && staProtocol.isPakMk()
                    && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() > 9990) //工作号为0或者工作号是9991~9999(输送机留用)
                    && staProtocol1.isFull() //叠满信号
                    && (staProtocol.getWorkNo() == 0 || staProtocol.getWorkNo() > 9990 ) //工作号为0或者工作号是9991~9999(输送机留用)
            ) {
                System.out.println(staProtocol);
                try {
                    Short loctype1 = 1;
                    LocTypeDto locTypeDto = new LocTypeDto(loctype1, (short) 1, (short) 1);
@@ -3091,16 +3091,20 @@
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    Integer workNo = rgvProtocol.getTaskNo2() !=0 ? rgvProtocol.getTaskNo2() : rgvProtocol.getTaskNo1(); //入库放货优先工位2执行
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNoPut(workNo);
                    WrkMast wrkMast = wrkMastMapper.selectByWrkNo(workNo);
                    if( null == wrkMastSta ) {
                        News.infoNoLog( " - 1" + " - 4" + " - 查询无待入库数据--wrk_sts0, 工作号={}", staProtocol.getWorkNo());
                        continue;
                    }
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
                    if (sign){
                        try{
                            wrkMast.setSheetNo("2");
                            wrkMastSta.setWrkSts(2);
                            wrkMastStaMapper.updateById(wrkMastSta);
                            wrkMastMapper.updateById(wrkMast);
                            log.error("更新小车任务成功");
                        }catch (Exception e){
                            log.error("更新小车任务失败");
@@ -3159,7 +3163,7 @@
                    boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
                    if (sign){
                        try{
                            wrkMastSta.setWrkSts(3);
                            wrkMastSta.setWrkSts(2);
                            wrkMastStaMapper.updateById(wrkMastSta);
                            log.error("更新小车任务成功");
                        }catch (Exception e){
@@ -3191,6 +3195,7 @@
            List<WrkMastSta> wrkMastStaList = wrkMastStaService.selectList(
                    new EntityWrapper<WrkMastSta>()
                            .eq("wrk_sts" ,2)
                    .eq("rgv_no", rgvProtocol.getRgvNo())
            );
            for(WrkMastSta wrkMastSta : wrkMastStaList){
                if(!Objects.equals(wrkMastSta.getWrkNo(), taskNo1) && !Objects.equals(wrkMastSta.getWrkNo(), taskNo2)){
@@ -3203,7 +3208,11 @@
                    }
                }
            }
            if(rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0 && !rgvProtocol.isLoaded1ing() && !rgvProtocol.isLoaded2ing()){
            if(rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getTaskNo1() == 0 && rgvProtocol.getTaskNo2() == 0
                    && !rgvProtocol.isLoaded1ing()
                    && !rgvProtocol.isLoaded2ing()){
                rgvThread.setPakRgv(true);
                rgvThread.setPakIn(true);
                rgvThread.setPakOut(true);
@@ -3270,7 +3279,7 @@
//                rgvPreScheduling();//若暂无下发任务预调度提前到取货点
//            }
            if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO) {
            if (rgvProtocol.getStatusType1() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO) {
                //小车执行放货任务
                rgvOutExecute();
@@ -3339,6 +3348,17 @@
                    News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
                WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
                if(wrkMastSta2 != null){
                    wrkMastSta2.setMk(1);
                    try{
                        wrkMastStaMapper.updateById(wrkMastSta2);
                        log.error("锁定相隔站点任务");
                    }catch (Exception e){
                        log.error("锁定相隔站点任务失败");
                    }
                }
            }
            if (staProtocol == null) {
                News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv入库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
@@ -3391,9 +3411,7 @@
            boolean sign = false;
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
                    rgvThread.setPakToCrn(false); //锁定小车只能接接驳任务
                }
                rgvThread.setPakOut(false);//出库不允许
                try{
                    wrkMastSta.setWrkSts(1);
@@ -3433,6 +3451,19 @@
                    News.error("" + mark + " - 1" + " - 2" + " - 入库 ===>>Rgv站点在数据库不存在, 站点编号={}", rgvStn.getStaNo());
                    continue;
                }
                WrkMastSta wrkMastSta2 = wrkMastStaMapper.selectByWrkNo(staProtocol2.getWorkNo());
                if(wrkMastSta2 != null){
                    wrkMastSta2.setMk(1);
                    try{
                        wrkMastStaMapper.updateById(wrkMastSta2);
                        log.error("锁定相隔站点任务");
                    }catch (Exception e){
                        log.error("锁定相隔站点任务失败");
                    }
                }
            }
            if (staProtocol == null) {
                News.infoNoLog("" + mark + " - 1" + " - 1" + " - Rgv出库站信息(staProtocol!=null继续执行):staProtocol=" + staProtocol);
@@ -3485,6 +3516,9 @@
            boolean sign = false;
            sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
            if (sign){
                if(LEFT_POSITION.contains(wrkMastSta.getStaEnd())){
                    rgvThread.setPakToCrn(false); //锁定小车只能接接驳任务
                }
                rgvThread.setPakIn(false);//入库不允许
                try{
                    wrkMastSta.setWrkSts(1);
@@ -3899,6 +3933,7 @@
                        continue;
                    }
                    String barcode = barcodeThread.getBarcode();
                    barcode="999997";
                    if(!Cools.isEmpty(barcode)) {
                        if("NG".endsWith(barcode) || "NoRead".equals(barcode)) {
                            continue;
@@ -3909,7 +3944,7 @@
                    List<BasArm> basArmList = basArmService.selectList(new EntityWrapper<BasArm>()
                            .eq("arm_no", armSta.getArmNo())
                            .eq("sta_no", armSta.getStaNo())
                            .eq("sta_no_sou", armSta.getStaNo())
                            .eq("status", 1));
                    for (BasArm basArm : basArmList) {
                        if (basArm.getStatus()!=1){
@@ -3970,19 +4005,19 @@
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
                        int workNo = commonService.getWorkNo(6);//待完善
                        // 更新站点信息 且 下发plc命令
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(armSta.getStaNoEnd().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        log.error("输送线下发5:"+workNo+","+armSta.getStaNoEnd());
                        if (!result) {
                            News.error(""+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
                        }
//                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()) {
//                        int workNo = commonService.getWorkNo(6);//待完善
//                        // 更新站点信息 且 下发plc命令
//                        staProtocol.setWorkNo(workNo);
//                        staProtocol.setStaNo(armSta.getStaNoEnd().shortValue());
//                        devpThread.setPakMk(staProtocol.getSiteId(), false);
//                        boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                        log.error("输送线下发5:"+workNo+","+armSta.getStaNoEnd());
//                        if (!result) {
//                            News.error(""+" - 3"+" - 发布命令至输送线队列失败!!! [plc编号:{}]", devp.getId());
//                        }
                        basArmMastService.updateArmMastStatus(basArmMastList.get(0).getArmNo(),basArmMastList.get(0).getSortingLine(),4,5);
                    }
//                    }
                }
            }
        } catch (Exception e){
@@ -4001,6 +4036,16 @@
                    continue;
                }
                try{
                    List<BasArmMast> basArmMastListError = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", basArm.getArmNo())
                                    .eq("sorting_line", basArm.getSortingLineSou())
                                    .eq("status", 9)
                    );
                    if (!basArmMastListError.isEmpty()){
                        log.error(basArm.getArmNo()+"号机械臂存在异常数据需要维护!!!");
                        continue;
                    }
                    List<BasArmMast> basArmMastListRuning = basArmMastService.selectList(
                            new EntityWrapper<BasArmMast>()
                                    .eq("arm_no", basArm.getArmNo())
src/main/java/com/zy/common/CodeBuilder.java
@@ -17,10 +17,10 @@
//        generator.table="sys_host";
        // sqlserver
        generator.sqlOsType = SqlOsType.SQL_SERVER;
        generator.url="192.168.4.191:50948;databasename=jshdasrs";
        generator.url="localhost:1433;databasename=jshdasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="asr_bas_arm";
        generator.table="asr_bas_devp_opt";
        generator.packagePath="com.zy.asrs";
        generator.build();
    }
src/main/java/com/zy/core/MainProcess.java
@@ -92,7 +92,7 @@
                if (i>10){
                    //空托盘自动出库
                    mainService.autoEmptyOut();
//                    mainService.autoEmptyOut();
                    //空托盘自动入库
                    mainService.autoEmptyIn();
                    i=0;
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -59,6 +59,10 @@
     * 工位1任务号
     */
    public Integer taskNo1 = 0;
    /**
     * 工位1目标站
     */
    public Integer staNo1 = 0;
    /**
     * RGV工位1当前状态
@@ -98,12 +102,12 @@
    public Short walkPos;
    /**
     * 急停
     * 急停触发
     */
    public Boolean err1;
    /**
     * 有物无资料
     *
     */
    public Boolean err2;
@@ -132,11 +136,21 @@
     */
    public Boolean err7;
    public Boolean err8;
    public Boolean err9;
    public Boolean err10;
    public Boolean err11;
    public Boolean err12;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    /**
     * 工位2任务号
     */
    public Integer taskNo2 = 0;
    /**
     * 工位1目标站
     */
    public Integer staNo2 = 0;
    /**
     * RGV工位2当前状态
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -24,6 +24,8 @@
    // 目标站
    private Short staNo;
    private String barcode;
    // ----------------------------------------------------------------
    // 自动
    private boolean autoing;
@@ -49,6 +51,9 @@
    // 低
    private boolean low;
    // 叠盘叠满
    private boolean full;
    // 锁定标记
    private boolean pakMk = true;
@@ -60,6 +65,10 @@
    //lfd入库印记  当stamp>=2时才入库
    private Integer stamp = 0;
    private boolean err = false;
    // 外形检测 ------------------------------------------------------------------------
@@ -113,6 +122,7 @@
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setBarcode(barcode);
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        basDevp.setInEnable(inEnable?"Y":"N");
src/main/java/com/zy/core/thread/RgvThread.java
@@ -5,10 +5,16 @@
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvMap;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasRgvMapService;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.common.utils.News;
@@ -25,11 +31,13 @@
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.Date;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
 * RGV线程
@@ -42,6 +50,8 @@
    private SiemensS7Net siemensNet;
    private RgvSlave slave;
    private RgvProtocol rgvProtocol;
    private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
    /**
     * 工位1复位信号
     */
@@ -97,7 +107,8 @@
                        command.setTaskStatus(RgvTaskStatusType.NONE); // 任务模式
                        command.setTargetPosition(0);     // 源站
                        command.setWrkTaskPri(0);     // 目标站
                        write(command);
                        command.setCommand(false);
                        write2(command);
                        break;
                    default:
                        break;
@@ -108,6 +119,45 @@
            }
        }
    }
    private static final Set<Integer> specialSites = new HashSet<>(
            Arrays.asList(1004,1014,1018,1028,1035));
    public static final Map<Integer, Integer> StaPosition = new HashMap<Integer, Integer>() {{
        put(1004, 1001);put(1014, 1011);put(1018, 1015);put(1028, 1025);put(1035, 1032);
    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(1);add(2);
    }};
    public static final ArrayList<Integer> staNos2 = new ArrayList<Integer>() {{
        add(3);add(4);
    }};
    /**
     * 初始化站点状态
     */
    private void initSite() {
        ArrayList<Integer> staNos = getStaNo();
            // 站点编号
            for (Integer siteId : staNos) {
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo(0);    // ID
                staProtocol.setAutoing(false);      // 自动
                staProtocol.setLoading(false);      // 有物
                staProtocol.setInEnable(false);     // 可入
                staProtocol.setOutEnable(false);    // 可出
                staProtocol.setEmptyMk(false);      // 空板信号
                staProtocol.setStaNo((short) 0);     // 目标站
            }
    }
    /**
@@ -145,7 +195,16 @@
//        rgvProtocol.setxDistance((short) 0);
//        rgvProtocol.setxDuration((short) 0);
    }
    private ArrayList<Integer> getStaNo() {
        switch (slave.getId()) {
            case 1:
                return staNos1;
            case 2:
                return staNos2;
            default:
                throw new CoolException("服务器异常");
        }
    }
    @Override
    public boolean connect() {
        boolean result = false;
@@ -179,7 +238,9 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 27);
            ArrayList<Integer> staNos = getStaNo();
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 38);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -192,10 +253,12 @@
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt32(result.Content, 16));
                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt32(result.Content, 20));
                boolean[] status1 = siemensNet.getByteTransform().TransBool(result.Content, 24, 2);
                rgvProtocol.setStaNo1(siemensNet.getByteTransform().TransInt32(result.Content, 28));
                rgvProtocol.setStaNo2(siemensNet.getByteTransform().TransInt32(result.Content, 32));
                boolean[] status1 = siemensNet.getByteTransform().TransBool(result.Content, 24, 1);
                rgvProtocol.setLoaded1(status1[0]);
                rgvProtocol.setLoaded2(status1[1]);
                boolean[] status2 = siemensNet.getByteTransform().TransBool(result.Content, 26, 1);
                boolean[] status2 = siemensNet.getByteTransform().TransBool(result.Content, 36,1);
                rgvProtocol.setErr1(status2[0]);
                rgvProtocol.setErr2(status2[1]);
                rgvProtocol.setErr3(status2[2]);
@@ -203,8 +266,16 @@
                rgvProtocol.setErr5(status2[4]);
                rgvProtocol.setErr6(status2[5]);
                rgvProtocol.setErr7(status2[6]);
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                rgvProtocol.setErr8(status2[7]);
                boolean[] status3 = siemensNet.getByteTransform().TransBool(result.Content, 37, 1);
                rgvProtocol.setErr9(status3[0]);
                rgvProtocol.setErr10(status3[1]);
                rgvProtocol.setErr11(status3[2]);
                rgvProtocol.setErr12(status3[3]);
                BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), slave.getId()));
                try {
                    // 根据实时信息更新数据库
                    BasRgvService basRgvService = SpringUtils.getBean(BasRgvService.class);
@@ -249,6 +320,9 @@
        }
        byte[] writeBytes = new byte[14];
        command.setRgvNo(slave.getId());
        if(specialSites.contains(command.getTargetPosition())){
            command.setTargetPosition(StaPosition.get(command.getTargetPosition()));
        }
        writeInt32(writeBytes, 0, command.getWrkTaskPri());
        writeInt32(writeBytes, 4, command.getTargetPosition());
        writeInt16(writeBytes, 8, (short)command.getTaskStatus());
@@ -307,15 +381,145 @@
            int writeCount2 = 0;
            do {
                writeCount2++;
                boolean commandFinish = true;
                Short commandFinish = 1;
                result = siemensNet.Write("DB100.34.0", commandFinish);
                if(result.IsSuccess){
                    //RGV任务写入后,回读一次,看是否成功
                    Thread.sleep(200);
                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.34", (short) 2);
                    if (resultRead.IsSuccess) {
                        commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0);
                        if (!commandFinish){
                        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);
        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getTaskNo(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTaskStatus().toString(),
                    command.getTargetPosition(),
                    command.getWrkTaskPri(),
                    new Date()
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {
            log.error(ignore.getMessage());
        }
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
            this.readStatus();
            log.info("RGV 工位命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc工位数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    private boolean write2(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 39);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
            one.setWrkTaskPri(siemensNet.getByteTransform().TransInt32(result1.Content, 0));//执行工位
            one.setTargetPosition(siemensNet.getByteTransform().TransInt32(result1.Content, 4));//行走目标站
            one.setTaskStatus(siemensNet.getByteTransform().TransInt16(result1.Content, 8));//小车状态
            one.setTaskNo(siemensNet.getByteTransform().TransInt32(result1.Content, 10));//下发工作号
            News.info("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        }
        byte[] writeBytes = new byte[36];
        command.setRgvNo(slave.getId());
        if(specialSites.contains(command.getTargetPosition())){
            command.setTargetPosition(StaPosition.get(command.getTargetPosition()));
        }
        writeInt32(writeBytes, 0, command.getWrkTaskPri());
        writeInt32(writeBytes, 4, command.getTargetPosition());
        writeInt16(writeBytes, 8, (short)command.getTaskStatus());
        writeInt32(writeBytes, 10, command.getTaskNo());
        writeBool(writeBytes, 34, 0, command.getCommand());
        OperateResult result = siemensNet.Write("DB100.0", writeBytes);
        if (!result.IsSuccess){
            News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(2,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 14);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setWrkTaskPri(siemensNet.getByteTransform().TransInt32(resultRead.Content, 0));//执行工位
                one.setTargetPosition(siemensNet.getByteTransform().TransInt32(resultRead.Content, 4));//行走目标站
                one.setTaskStatus(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));//小车状态
                one.setTaskNo(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));//下发工作号
                if (
                        !command.getTaskNo().equals(one.getTaskNo()) ||
                                !command.getTaskStatus().equals(one.getTaskStatus()) ||
                                !command.getWrkTaskPri().equals(one.getWrkTaskPri()) ||
                                !command.getTargetPosition().equals(one.getTargetPosition())
                ) {
                    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(2, 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 (result.IsSuccess) {  //任务下发确认
            Thread.sleep(300);
            //任务下发次数
            int writeCount2 = 0;
            do {
                writeCount2++;
                Short commandFinish = 1;
                result = siemensNet.Write("DB100.34.0", commandFinish);
                if(result.IsSuccess){
                    //RGV任务写入后,回读一次,看是否成功
                    Thread.sleep(200);
                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.34", (short) 2);
                    if (resultRead.IsSuccess) {
                        commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                        if (commandFinish !=1){
                            News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                        }else{
                            //任务命令写入成功
@@ -380,7 +584,33 @@
        }
    }
    public Integer getRgvPosI(Integer pos) {
        if (pos == null) return 0;
        // key: 站点号  value: 基准物理位置
        Map<Integer, Integer> posMap = new HashMap<>();
        posMap.put(1004, 6534);
        posMap.put(1007, 33634);
        posMap.put(1010, 75174);
        posMap.put(1014, 102124);
        posMap.put(1018, 138224);
        posMap.put(1021, 178034);
        posMap.put(1024, 219684);
        posMap.put(1028, 246724);
        posMap.put(1031, 288194);
        posMap.put(1035, 315204);
        int tolerance = 50; // 允许误差范围
        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
            int site = entry.getKey();
            int basePos = entry.getValue();
            if (Math.abs(pos - basePos) <= tolerance) {
                return site;
            }
        }
        return 0; // 没匹配到站点
    }
    @Override
    public void close() {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -59,7 +59,7 @@
        add(1029);add(1031);
        add(1032);add(1033);add(1035);
        add(1036);add(1037);add(1038);
        add(1039);add(1041);
        add(1039);add(1040);add(1041);
        add(1042);add(1043);add(1044);add(1045);add(1046);add(1047);add(1048);add(1050);add(1051);add(1052);add(1053);add(1054);add(1055);add(1056);add(1057);
        add(1058);add(1059);add(1060);add(1061);add(1062);add(1063);add(1064);add(1065);add(1066);add(1067);add(1068);add(1069);add(1070);add(1071);add(1072);
        add(1073);add(1074);add(1075);add(1076);add(1077);add(1078);add(1079);add(1080);add(1081);add(1082);add(1083);add(1084);add(1085);add(1086);add(1087);
@@ -117,6 +117,9 @@
    // 特殊站点集合
    private static final Set<Integer> specialSites2 = new HashSet<>(
            Arrays.asList(1051,1055,1057,1065,1067,1069,1077,1081,1083,1086,1089,1092,1095,1097,1100));
    private static final Set<Integer> specialSites3 = new HashSet<>(//机械臂站点
            Arrays.asList(1098,1093,1087,1082,1074,1071,1062,1059));
    public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{
@@ -278,11 +281,11 @@
        ArrayList<Integer> staNos = getStaNo();
        int staNoSize = staNos.size();
        OperateResultExOne<byte[]> result = null;
        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.0", (short) (2764));//1001-1028
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.0", (short) (1264));//1029-1037
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB104.0", (short) (1264));//1042-1053
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB103.0", (short) (2820));//1054-1079
        OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB102.0", (short) (3424));//1080-1110
        OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.0", (short) (2768));//1001-1028
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.0", (short) (1268));//1029-1037
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB104.0", (short) (1268));//1042-1053
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB103.0", (short) (2824));//1054-1079
        OperateResultExOne<byte[]> result5 = siemensS7Net.Read("DB102.0", (short) (3428));//1080-1110
@@ -313,13 +316,18 @@
                }
                Integer offset2 = getOffsetBySiteId(siteId);
                Integer offset3 = getOffsetBySiteId2(siteId);
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, offset + offset2 + 12));   // 目标站
                if(specialSites2.contains(siteId)){
                    staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, offset + offset2 + 48));   // 目标站
                if(siteId == 1040){
                    boolean[] full = siemensS7Net.getByteTransform().TransBool(result.Content, offset, 2);
                    staProtocol.setFull(full[0]);
                }
                if(siteId ==1041){
                    News.info("1");
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2));     // 工作号
                staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 12));   // 目标站
                staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 16)));  //条码
                if(specialSites2.contains(siteId)){
                    staProtocol.setStaNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 48));   // 目标站
                    staProtocol.setBarcode(String.valueOf(siemensS7Net.getByteTransform().TransInt32(result.Content, offset + offset2 + 52)));  //条码
                }
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, offset + offset3, 2);
@@ -328,8 +336,9 @@
                staProtocol.setLoading(!status1[0]);  // 有物
                staProtocol.setInEnable(true); // 可入
                staProtocol.setOutEnable(true);// 可出
                staProtocol.setInEnable(status1[2]); // 可入
                staProtocol.setOutEnable(status1[2]);// 可出
                staProtocol.setErr(status1[6]);
//                staProtocol.setInEnable(status1[1]); // 可入
//                staProtocol.setOutEnable(status1[3]);// 可出
//                staProtocol.setEmptyMk(status[4]);  // 空板信号
@@ -342,17 +351,55 @@
                }
            }
        }
        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
        //条码扫描器
        ArrayList<Integer> barcodeList = BarcodeList;
        OperateResultExOne<byte[]> reasultBarcode1 = siemensS7Net.Read("DB101.780", (short) 8);//1036
        OperateResultExOne<byte[]> reasultBarcode2 = siemensS7Net.Read("DB104.548", (short) 8);//1047
        OperateResultExOne<byte[]> reasultBarcode3 = siemensS7Net.Read("DB102.2780", (short) 8);//1103
//        OperateResultExOne<byte[]> reasultBarcode4 = siemensS7Net.Read("DB104.180", (short) 184);
        if(reasultBarcode1.IsSuccess){
            Integer barcodeId = barcodeList.get(0);
            String barcode = String.valueOf(siemensS7Net.getByteTransform().TransInt32(reasultBarcode1.Content, 0));
            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1);
            if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                barcodeThread.setBarcode(barcode);
            }
//            News.error(JSON.toJSONString(barcode+"线程"+barcodeId));
        }
        if(reasultBarcode2.IsSuccess){
            Integer barcodeId = barcodeList.get(1);
            String barcode = String.valueOf(siemensS7Net.getByteTransform().TransInt32(reasultBarcode2.Content, 0));
            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1);
            if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                barcodeThread.setBarcode(barcode);
            }
//            News.error(JSON.toJSONString(barcode+"线程"+barcodeId));
        }
        if(reasultBarcode3.IsSuccess){
            Integer barcodeId = barcodeList.get(2);
            String barcode = String.valueOf(siemensS7Net.getByteTransform().TransInt32(reasultBarcode3.Content, 0));
            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1);
            if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
                barcodeThread.setBarcode(barcode);
            }
//            News.error(JSON.toJSONString(barcode+"线程"+barcodeId));
        }
//        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
//        RGV小车1
//        Thread.sleep(100);
//        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.",(short)27);
//        if (result3.IsSuccess) {
//            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));
//        OperateResultExOne<byte[]> resultCar1 = siemensS7Net.Read("DB101.0",(short)36);
//        if (resultCar1.IsSuccess) {
//            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(resultCar1.Content, 0) + 1);
//            if (!Cools.isEmpty(basRgvMap)){
//                Integer siteId1 = 1;
//                Integer siteId2 = 2;
//                StaProtocol staProtocol1 = station.get(siteId1);
//                StaProtocol staProtocol2 = station.get(siteId1);
//                StaProtocol staProtocol2 = station.get(siteId2);
//
//                if (null == staProtocol1) {
//                    staProtocol1 = new StaProtocol();
@@ -365,15 +412,15 @@
//                    station.put(siteId2, staProtocol2);
//
//                }
//                String pos = String.valueOf(getRgvPosI(siemensS7Net.getByteTransform().TransInt32(result.Content, 4)));
//                staProtocol1.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 2);
//                staProtocol2.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 2);
//                String pos = String.valueOf(getRgvPosI(siemensS7Net.getByteTransform().TransInt32(resultCar1.Content, 4)));
//                staProtocol1.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 0);
//                staProtocol2.setAutoing(siemensS7Net.getByteTransform().TransInt16(result.Content, 2) == 0);
//                staProtocol1.setNearbySta(pos);
//                staProtocol1.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, 8));
//                staProtocol2.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(result.Content, 8));
//                staProtocol1.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 16));
//                staProtocol2.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, 20));
//                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result.Content, 24, 2);
//                staProtocol1.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(resultCar1.Content, 28));
//                staProtocol2.setStaNo((short) siemensS7Net.getByteTransform().TransInt32(resultCar1.Content, 32));
//                staProtocol1.setWorkNo(siemensS7Net.getByteTransform().TransInt32(resultCar1.Content, 16));
//                staProtocol2.setWorkNo(siemensS7Net.getByteTransform().TransInt32(resultCar1.Content, 20));
//                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultCar1.Content, 24, 1);
//                staProtocol1.setLoading(status1[0]);
//                staProtocol2.setLoading(status1[1]);
//                //                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8)));
@@ -415,19 +462,8 @@
//            }
//        }
//        //条码扫描器
//        ArrayList<Integer> barcodeList = BarcodeList;
//        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.840", (short) (barcodeList.size() * 8));
//        if (result2.IsSuccess) {
//            for (int i = 0; i < barcodeList.size(); i++) {
//                Integer barcodeId = barcodeList.get(i);
//                String barcode = siemensS7Net.getByteTransform().TransString(result2.Content,i*8,8, "UTF-8");
//                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, barcodeId + 1);
//                if(!Cools.isEmpty(barcodeThread) && !barcodeThread.getBarcode().equals(barcode)) {
//                    barcodeThread.setBarcode(barcode);
//                }
//            }
//        }
        //条码扫描器
//        ArrayList<Integer> barcodeListMat = BarcodeListMat;
//        OperateResultExOne<byte[]> result2Mat = siemensS7Net.Read("DB103.0", (short) (barcodeListMat.size() * 30));
@@ -572,7 +608,7 @@
                    write1 = siemensS7Net.Write("DB104." + (offset + offset2 + 12), staProtocol.getStaNo().intValue());    // 目标站
                }
            }else if(siteId < 1080){
                write = siemensS7Net.Write("DB104." + (offset + offset2), staProtocol.getWorkNo());    // 工作号
                write = siemensS7Net.Write("DB103." + (offset + offset2), staProtocol.getWorkNo());    // 工作号
                Thread.sleep(200);
                if(specialSites2.contains(siteId)){
                    write1 = siemensS7Net.Write("DB103." + (offset + offset2 + 48), staProtocol.getStaNo().intValue());    // 目标站
@@ -580,7 +616,7 @@
                    write1 = siemensS7Net.Write("DB103." + (offset + offset2 + 12), staProtocol.getStaNo().intValue());    // 目标站
                }
            }else if(siteId < 1111){
                write = siemensS7Net.Write("DB104." + (offset + offset2), staProtocol.getWorkNo());    // 工作号
                write = siemensS7Net.Write("DB102." + (offset + offset2), staProtocol.getWorkNo());    // 工作号
                Thread.sleep(200);
                if(specialSites2.contains(siteId)){
                    write1 = siemensS7Net.Write("DB102." + (offset + offset2 + 48), staProtocol.getStaNo().intValue());    // 目标站
@@ -599,7 +635,7 @@
        if (!write.IsSuccess) {
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0 && !staProtocol.isLoading()) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
src/main/resources/application.yml
@@ -9,7 +9,7 @@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
#    url: jdbc:sqlserver://localhost:1433;databasename=jshdasrs
    url: jdbc:sqlserver://10.10.10.198:1433;databasename=jshdasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jshdasrs
    username: sa
    password: sa@123
#    url: jdbc:sqlserver://192.168.4.191:50948;databasename=jshdasrs
@@ -137,7 +137,7 @@
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1015
      row: 10
      row: 9
      bay: 52
      lev: 1
    crnInStn[1]:
@@ -434,10 +434,14 @@
      led: ${wcs-slave.led[1].id}
    # 入库口1
    inSta[0]:
      staNo: 1044
      barcode: ${wcs-slave.barcode[0].id}
      barcodeMat: ${wcs-slave.barcode[3].id}
      staNo: 1043
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1041
      led: ${wcs-slave.led[1].id}
    inSta[1]:
      staNo: 1036
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1035
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[0]:
@@ -452,10 +456,9 @@
      led: ${wcs-slave.led[5].id}
      backSta: 1037
    # 入库口1
    inSta[1]:
      staNo: 1103
      barcode: ${wcs-slave.barcode[1].id}
      barcodeMat: ${wcs-slave.barcode[4].id}
    inSta[2]:
      staNo: 1104
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1041
      led: ${wcs-slave.led[2].id}
#    inSta[2]:
src/main/resources/mapper/WrkMastStaMapper.xml
@@ -42,7 +42,7 @@
        select top 1 * from asr_wrk_mast_sta
        where 1=1
          and wrk_no = #{workNo}
          and wrk_sts = 2
          and wrk_sts = 1
    </select>
<!--    <select id="selectNoInterfere" resultMap="BaseResultMap">-->
src/main/webapp/views/console.html
@@ -385,12 +385,11 @@
</script>
<script type="text/javascript">
    // 弹窗站点信息
    $('.site').on('click', function () {
    $(document).on('click', '.site' ,function () {
        var id = this.id.split("-")[1];
        $("#siteWindow").attr("style", "display:block;");//显示div
        $("#crnWindow").attr("style", "display:none;");
        $(".detailed").empty();
        $('.detailed').append(id + '站点详细信息');
        $("#siteWindow").css("display", "block");//显示div
        $("#crnWindow").css("display", "none");
        $(".detailed").empty().append(id + '站点详细信息');
        $.ajax({
            url: baseUrl + "/console/site/detail",
            headers: {
@@ -406,7 +405,7 @@
                    if (find[0].type === 'text') {
                        find.val(res.data[val]);
                    } else if (find[0].type === 'checkbox') {
                        find.attr("checked", res.data[val] === 'Y');
                        find.prop("checked", res.data[val] === 'Y');
                    }
                }
            }
@@ -415,32 +414,27 @@
    });
    // 堆垛机信息
    $('.machine').on('click', function () {
    $(document).on('click', '.machine',function () {
        var id = this.id.split("-")[1];
        $("#crnWindow").attr('style', 'display:block;');
        $("#siteWindow").attr("style", "display:none;");
        $('.detailed').empty();
        $('.detailed').append(id + '号堆垛机');
        $("#crnWindow").css("display","block");
        $("#siteWindow").css("display","none");
        $(".detailed").empty().append(id + '号堆垛机');
        $.ajax({
            url: baseUrl + "/console/crn/detail",
            headers: {
                'token': localStorage.getItem('token')
            },
            data: {
                crnNo: id
            },
            headers: {'token': localStorage.getItem('token')},
            data: {crnNo: id},
            method: 'post',
            success: function (res) {
                for (var val in res.data) {
                    var find = $("#crnWindow").find(":input[name='" + val + "']");
                    if (find[0].type === 'text') {
                for(var val in res.data){
                    var find = $("#crnWindow").find(":input[name='"+ val + "']");
                    if(find[0].type === 'text'){
                        find.val(res.data[val]);
                    } else if (find[0].type === 'checkbox') {
                        find.attr("checked", res.data[val] === 'Y');
                    }else if (find[0].type === 'checkbox'){
                        find.prop("checked", res.data[val] === 'Y')
                    }
                }
            }
            }
        })
    })
@@ -603,30 +597,13 @@
                        // crnEl.animate({left: (crns[i].bay * unit) + 'px'}, 1000);
                        // crns[i].bay = 15;
                        var offSet = 120;
                        unit = 52;
                        // switch (i) {
                        //     case 0:
                        //     case 1:
                        //     case 2:
                        //     case 3:
                        //         unit = 35;
                        //         offSet = 500;
                        //         break;
                        //     case 5:
                        //         unit = 124;
                        //         offSet = 550;
                        //         break;
                        //     case 4:
                        //     case 6:
                        //         unit = 62;
                        //         offSet = 550;
                        //         break;
                        // }
                        unit = 15;
                        if(crns[i].bay === 1){
                            crnEl.animate({left: offSet + 'px'}, 19);
                            crnEl.animate({left: offSet + 'px'}, 10);
                        } else {
                            crnEl.animate({left: (offSet - unit + (crns[i].bay * unit)) + 'px'}, 19);
                            crnEl.animate({left: (offSet - unit + (crns[i].bay * unit)) + 'px'}, 10);
                        }
                    }
src/main/webapp/views/rgv.html
@@ -119,8 +119,10 @@
                    <th>工位1工作号</th>
                    <th>工位2工作号</th>
                    <th>状态</th>
                    <th>目标站</th>
<!--                    <th>源库位</th>-->
                    <th>走行目标站</th>
                    <th>工位1目标站</th>
                    <th>工位2目标站</th>
                    <!--                    <th>源库位</th>-->
<!--                    <th>目标库位</th>-->
<!--                    <th>走行速度(m/min)</th>-->
<!--                    <th>升降速度(m/min)</th>-->
@@ -239,7 +241,7 @@
<!--                        <button class="item" onclick="lock()">解锁</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>