lty
2025-08-14 fc86a263ca2ffdb0e701261ff3b1e730b2065542
#RGV协议修改,rgv预调度,任务下发
11个文件已修改
1个文件已添加
1429 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 489 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvTaskStatusType.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 500 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/console.map.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -35,8 +35,10 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * RGV接口
@@ -70,44 +72,65 @@
    @PostMapping("/table/rgv/state")
    @ManagerAuth(memo = "RGV信息表")
    public R rgvStateTable(){
    public R rgvStateTable() {
        List<RgvStateTableVo> list = new ArrayList<>();
        List<BasRgv> rgvs = basRgvService.selectList(new EntityWrapper<BasRgv>().orderBy("rgv_no"));
        for (BasRgv basRgv : rgvs) {
            // 表格行
            RgvStateTableVo vo = new RgvStateTableVo();
            vo.setRgvNo(basRgv.getRgvNo());   //  RGV号
            list.add(vo);
            // 获取RGV信息
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basRgv.getRgvNo());
            if (rgvThread == null) {
                continue;
            }
            if (rgvThread == null) continue;
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }
            vo.setStatusType(rgvProtocol.modeType.desc);   //  模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc);     //  状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc);  // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物");  // 工位1有物
            if (rgvProtocol == null) continue;
            vo.setStatusType(rgvProtocol.modeType.desc);   // 模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc); // 状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());      // 工位1任务号
            vo.setStatus1(rgvProtocol.getStatusType1().desc); // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1() ? "有物" : "无物"); // 工位1有物
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setRgvPos1(rgvProtocol.getRgvPosI());
            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"在定位":"不在定位");
            vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定");
//            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  工位2任务号
//            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 工位2状态
//            vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物");  // 工位2有物
            vo.setWalkPos(Objects.equals(rgvProtocol.getWalkPos(), 1) ? "在定位" : "不在定位");
            vo.setPakMk(rgvThread.isPakMk() ? "无锁" : "锁定");
            vo.setWorkNo2(rgvProtocol.getTaskNo2());      // 工位2任务号
            vo.setStatus2(rgvProtocol.getStatusType2().desc); // 工位2状态
            vo.setLoading2(rgvProtocol.getLoaded2() ? "有物" : "无物"); // 工位2有物
            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
            if (rgvProtocol.getAlarm() > 0) {
                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
                vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName());
            // --- 遍历 errX 字段生成 warnCode 和 alarm ---
            List<String> alarms = new ArrayList<>();
            List<String> warnCodes = new ArrayList<>();
            Field[] fields = rgvProtocol.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (field.getName().startsWith("err") && field.getType().equals(Boolean.class)) {
                    field.setAccessible(true);
                    try {
                        Boolean value = (Boolean) field.get(rgvProtocol);
                        if (Boolean.TRUE.equals(value)) {
                            String numPart = field.getName().substring(3);
                            int errId = Integer.parseInt(numPart);
                            warnCodes.add(String.valueOf(errId));
                            BasRgvErr rgvErr = basRgvErrMapper.selectById(errId);
                            alarms.add(rgvErr == null ? "未知异常(" + errId + ")" : rgvErr.getErrName());
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
            vo.setWarnCode(String.join(",", warnCodes));
            vo.setAlarm(alarms.isEmpty() ? "" : String.join(",", alarms));
        }
        return R.ok().add(list);
    }
    @PostMapping("/table/rgv/msg")
    @ManagerAuth(memo = "RGV数据表")
@@ -171,17 +194,17 @@
    public R rgvFetchPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
//        command.setAckFinish2((short) 0);  // 任务完成确认位
//        command.setTaskNo2((short) 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setAckFinish2(false);  // 任务完成确认位
        command.setTaskNo2(0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -191,17 +214,17 @@
    public R rgvFetch(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH); // 任务模式: 取货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setAckFinish2(false);  // 任务完成确认位
        command.setTaskNo2( 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -211,17 +234,17 @@
    public R rgvPut(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.PUT); // 任务模式: 放货
        command.setSourceStaNo1(param.getSourceStaNo1()); // 源站
        command.setDestinationStaNo1(param.getStaNo1());  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setAckFinish2(false);  // 任务完成确认位
        command.setTaskNo2( 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -233,17 +256,17 @@
    public R rgvTaskComplete(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 1);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(true);  // 任务完成确认位
        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 1);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setAckFinish2(true);  // 任务完成确认位
        command.setTaskNo2( 0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -256,17 +279,17 @@
        }
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(true);  // 任务完成确认位
        command.setTaskNo1( 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
        command.setAckFinish2((short) 0);  // 任务完成确认位
        command.setTaskNo2((short) 0); // 工作号
        command.setAckFinish2(true);  // 任务完成确认位
        command.setTaskNo2(0); // 工作号
        command.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo2((short) 0); // 源站
        command.setDestinationStaNo2((short) 0);  // 目标站
        command.setCommand((short) 0);
        command.setCommand(true);
        return rgvControl(command)? R.ok(): R.error();
    }
@@ -292,9 +315,9 @@
                RgvCommand Command = new RgvCommand();
                Command.setRgvNo(rgv.getId()); // RGV编号
                Command.setTaskMode1(RgvTaskModeType.NONE);
                Command.setAckFinish1((short) 0);  // 任务完成确认位
                Command.setAckFinish2((short) 0);  // 任务完成确认位
                Command.setCommand((short) 0);  // 任务完成确认位
                Command.setAckFinish1(true);  // 任务完成确认位
                Command.setAckFinish2(true);  // 任务完成确认位
                Command.setCommand(true);  // 任务完成确认位
                // 延时发送
                Thread.sleep(1000L);
                if (MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, Command))) {
src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -13,7 +13,7 @@
    private Integer rgvNo;
    // 工作号
    private Short workNo = 0;
    private Integer workNo = 0;
    // 状态
    private String status = "-";
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -18,7 +18,7 @@
    private String status = "-";
    // 任务号
    private Short workNo1 = 0;
    private Integer workNo1 = 0;
    // 状态
    private String status1 = "-";
@@ -27,13 +27,13 @@
    private String loading1 = "-";
    // RGV位置
    private Short RgvPos = 0;
    private Integer RgvPos = 0;
    // 走行定位
    private String walkPos = "-";
    // 任务号
    private Short workNo2 = 0;
    private Integer workNo2 = 0;
    // 状态
    private String status2 = "-";
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -181,6 +181,18 @@
        this.updateBy = updateBy;
    }
    public BasRgvOpt(Integer wrkNo1,  Integer rgvNo, Date sendTime, String mode, Integer sourceSta, Integer posSta,  Integer response, Date updateTime, Long updateBy) {
        this.wrkNo1 = wrkNo1;
        this.rgvNo = rgvNo;
        this.sendTime = sendTime;
        this.mode = mode;
        this.sourceSta = sourceSta;
        this.posSta = posSta;
        this.response = response;
        this.updateTime = updateTime;
        this.updateBy = updateBy;
    }
//    BasRgvOpt basRgvOpt = new BasRgvOpt(
//            null,    // ID[非空]
//            null,    // 任务号
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -46,7 +46,6 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -2699,13 +2698,13 @@
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE &&
                    rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                    && !rgvProtocol.isLoaded1ing()  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                    && (rgvProtocol.getTaskNo1()==0)
                        &&rgvThread.isPakMk()
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    Integer rgvNoOther = basRgvMap.getRgvNoOther(rgvProtocol.getRgvNo());
                    Integer rgvNoOther = basRgvMap.getRgvNoOther((int) rgvProtocol.getRgvNo());
                    RgvThread rgvThreadOther = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNoOther);
                    RgvProtocol rgvProtocolOther = rgvThreadOther.getRgvProtocol();
                    if (rgvProtocolOther == null) {
@@ -2715,7 +2714,7 @@
                    }
                    if (rgvProtocolOther.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocolOther.getModeType() == RgvModeType.AUTO
                        && rgvProtocolOther.getLoaded1()==0
                        && !rgvProtocolOther.isLoaded1ing()
                        && (rgvProtocolOther.getTaskNo1()==0)
                        &&rgvThreadOther.isPakMk()
                    ){
@@ -2788,7 +2787,22 @@
                        && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
                ){
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo1()!=0){
                    if(rgvProtocol.getTaskNo1() == 9999){
                        List<Integer> staNos = Arrays.asList( 1043, 1104);
                        for (Integer staNo : staNos) {
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                            StaProtocol staProtocol = devpThread.getStation().get(staNo);
                            boolean rgvComplete = false;
                            if(!staProtocol.isLoading()){
                                rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3);//工位1复位
                            }
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!等待入库取货",rgvProtocol.getRgvNo());
                                break;
                            }
                        }
                    }
                    if (rgvProtocol.getTaskNo1()!=0 && rgvProtocol.getTaskNo1()!=9999){
//                        if (rgvProtocol.getTaskNo1()==32222){
//                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
//                            if (!rgvComplete){
@@ -2849,9 +2863,9 @@
                        //双工位出入库不同工位复位
                        if((sourceSta >= 1001 && sourceSta <= 1035) || (sourceSta >= 2001 && sourceSta <= 2030)){
                            rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),6);
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),6);
                        }else{
                            rgvComplete = rgvComplete(rgvProtocol.getRgvNo(),3);
                            rgvComplete = rgvComplete((int) rgvProtocol.getRgvNo(),3);
                        }
                        if (!rgvComplete){
@@ -2883,6 +2897,8 @@
    }
    /**
     * 执行小车搬运任务
     *
     * @return
     */
    public synchronized boolean rgvRunWrkMastFullSta() {
        boolean wrkEnable = false;
@@ -2902,14 +2918,13 @@
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                // 只有当RGV空闲、自动,工位一无物//rgv可用  入库取货
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1() == 0
                        && !rgvProtocol.isLoaded1ing()
                        && rgvProtocol.getTaskNo1() == 0
                        && rgvProtocol.getTaskNo2() == 0
                        && rgvProtocol.getLoaded2() == 0
                        && rgvThread.isPakMk()
                        && rgvThread.isPakIn()
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -2920,35 +2935,10 @@
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
//                        if (wrkMastSta.getType()!=0 || wrkMastSta.getWrkType()!=3 || wrkMastSta.getWrkSts()!=0){//1:满版   3:取放
//                            continue;
//                        }
                        //判断工作结束位置状态
//                        boolean signDev = false;
//                        BasDevp devNo = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", wrkMastSta.getStaEnd()));
//                        if (devNo.getDevNo()==113){
//                            BasDevp devNo114 = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 114));
//                            if (!Cools.isEmpty(devNo114)){
//                                if (devNo114.getOutEnable().equals("Y")){
//                                    signDev = true;
//                                }
//                            }
//                        }
//                        if (!Cools.isEmpty(devNo)){
//                            if (devNo.getAutoing().equals("Y") && !devNo.getWrkNo().equals(0) && !devNo.getLoading().equals("N")){
//                                continue;
//                            }
//                            if (!signDev && devNo.getDevNo()==113){
//                                if (!devNo.getAutoing().equals("Y") || !devNo.getWrkNo().equals(0) || !devNo.getLoading().equals("N")){
//                                    wrkEnable = true;
//                                    continue;
//                                }
//                                if (!devNo.getOutEnable().equals("Y")){
//                                    wrkEnable = true;
//                                    continue;
//                                }
//                            }
//                        }
                        List<Integer> staNos = Arrays.asList(1042, 1105, 1038, 1036, 2037);//入库口
                        if (!staNos.contains(wrkMastSta.getStaStart())) {
                            continue;
                        }
                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
                        wrkEnable = true;
                        if (sign){
@@ -2960,12 +2950,13 @@
                                log.error("更新小车任务失败");
                            }
                            rgvThread.setPakMk(false);
                            rgvThread.setPakOut(false);
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                            if (signMap){
                                return wrkEnable;
//                                break;
                            }else {
                                log.error("3864行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                                log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                                Thread.sleep(500);
                            }
                        } else {
@@ -2976,15 +2967,132 @@
                    }
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用  出库取货
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && !rgvProtocol.isLoaded2ing()
                        && rgvProtocol.getTaskNo2() == 0
                        && rgvThread.isPakMk()
                        && rgvThread.isPakOut()
                ){
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        continue;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        List<Integer> staNos = Arrays.asList(1042, 1105, 1038, 1036, 2037);//入库口
                        if (staNos.contains(wrkMastSta.getStaStart())) {
                            continue;
                        }
                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
                        wrkEnable = true;
                        if (sign){
                            wrkMastSta.setWrkSts(1);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                                log.error("更新小车任务成功");
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            rgvThread.setPakMk(false);
                            rgvThread.setPakOut(false);
                            boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), wrkMastSta.getStaEnd(),"2526");
                            if (signMap){
                                return wrkEnable;
//                                break;
                            }else {
                                log.error("货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                                Thread.sleep(500);
                            }
                        } else {
                            log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                            Thread.sleep(500);
                        }
                        break;
                    }
                }
            }
//            if (!wrkEnable){
//                rgvRunWrkMastEmptyStaAvoidance();
//            }
        }catch (Exception e){
            log.error("3875行执行小车搬运任务下发失败");
            log.error("3875行"+e);
            log.error("执行小车搬运任务下发失败");
        }
        return wrkEnable;
    }
    /**
     * 小车预调度
     */
    public synchronized  void rgvPreScheduling(){
        try{
            List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>());
            for (BasRgvMap rgvSlave:basRgvMaps) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }else {
                    rgvProtocol = rgvProtocol.clone();
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!4", rgvSlave.getRgvNo());
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用  才进行预调度
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && !rgvProtocol.isLoaded1ing()
                        && rgvProtocol.getTaskNo1() == 0
                        && !rgvProtocol.isLoaded2ing()
                        && rgvProtocol.getTaskNo2() == 0
                        && rgvThread.isPakMk()
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
                        log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                        continue;
                    }
                    List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    // 根据输送线plc遍历
                    for (DevpSlave devp : slaveProperties.getDevp()) {
                        // 遍历入库口  入库预调度
                        List<Integer> staNos = Arrays.asList(1042, 1043, 1105, 1104);
                        for (Integer staNo : staNos) {
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                            StaProtocol staProtocol = devpThread.getStation().get(staNo);
                            if(staProtocol.isLoading()){
                                RgvCommand rgvCommand = new RgvCommand();
                                rgvCommand.setRgvNo((int) rgvProtocol.getRgvNo()); // RGV编号
                                rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                                rgvCommand.setTaskNo1(9999); // 工位1工作号
                                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  取放货
                                rgvCommand.setEndStaNo1(0);   //工位1 放货后要去的位置
                                if(staNo == 1042 || staNo ==1043){
                                    rgvCommand.setTargetPosition1(1042);   //工位1目标站点
                                }else{
                                    rgvCommand.setTargetPosition1(1105);   //工位1目标站点
                                }
                                rgvCommand.setCommand(true);   //工位1任务确认
                                if (!MessageQueue.offer(SlaveType.Rgv, (int) rgvProtocol.getRgvNo(), new Task(4, rgvCommand))) {
                                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                                    log.error("RGV命令下发失败,RGV号={},任务数据={}", (int) rgvProtocol.getRgvNo(), JSON.toJSON(rgvCommand));
                                }
                            }
                        }
                    }
                }
            }
        }catch (Exception e){
            log.error("执行小车移动下发失败");
        }
    }
    /**
     * 执行小车搬运任务
@@ -3118,107 +3226,107 @@
    /*
     * 有任务但未执行  此时需要调整小车位置
     * */
    public synchronized void rgvRunWrkMastEmptyStaAvoidance() {
        try{
            Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务
            if (integer==0){
                return;
            }
            List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>());
            for (BasRgvMap rgvSlave:basRgvMaps) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }else {
                    rgvProtocol = rgvProtocol.clone();
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!1", rgvSlave.getRgvNo());
                    continue;
                }
                // 只有当RGV空闲、自动,工位一无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                        && rgvThread.isPakMk()
//                        && rgvProtocol.getTaskNo2()==0
                ){
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    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)  ){
//    public synchronized void rgvRunWrkMastEmptyStaAvoidance() {
//        try{
//            Integer integer = wrkMastStaMapper.selectAllWrkStsCount(null,0);//查询状态为0的任务
//            if (integer==0){
//                return;
//            }
//            List<BasRgvMap> basRgvMaps = basRgvMapService.selectList(new EntityWrapper<>());
//            for (BasRgvMap rgvSlave:basRgvMaps) {
//                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getRgvNo());
//                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
//                if (rgvProtocol == null) {
//                    continue;
//                }else {
//                    rgvProtocol = rgvProtocol.clone();
//                }
//                BasRgv basRgv = basRgvService.selectById(rgvSlave.getRgvNo());
//                if (basRgv == null) {
//                    log.error("{}号RGV尚未在数据库进行维护!1", rgvSlave.getRgvNo());
//                    continue;
//                }
//
//                // 只有当RGV空闲、自动,工位一无物//rgv可用
//                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
//                        && rgvProtocol.getModeType() == RgvModeType.AUTO
//                        && !rgvProtocol.isLoaded1ing()  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
//                        && rgvProtocol.getTaskNo1()==0
//                        && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
//                        && rgvThread.isPakMk()
////                        && rgvProtocol.getTaskNo2()==0
//                ){
//                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
//                        continue;
//                    }
                    rgvAvoidanceXY(rgvProtocol.getRgvNo());
                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2727");
                }
            }
        }catch (Exception e){
            log.error("4109行执行小车初始化任务下发失败");
            log.error("4109行"+e);
        }
    }
////                    if (rgvProtocol.getRgvNo()==1 && rgvProtocol.getRgvPosI().equals(100)){
////                        continue;
////                    } else if (rgvProtocol.getRgvNo()==2 && rgvProtocol.getRgvPosI().equals(157)  ){
////                        continue;
////                    }
//                    rgvAvoidanceXY((int) rgvProtocol.getRgvNo());
//                    rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute(),"2727");
//                }
//            }
//        }catch (Exception e){
//            log.error("4109行执行小车初始化任务下发失败");
//            log.error("4109行"+e);
//        }
//    }
    /*
     * 小车XY移动  避让
     * */
    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
        BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId);
        if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){
            try{
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue());
                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任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            }
        }else {
            try{
                //  命令下发区 --------------------------------------------------------------------------
                RgvCommand rgvCommand = new RgvCommand();
                rgvCommand.setRgvNo(rgvId); // RGV编号
                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
                //basRgvMap.getLockStartRoute().shortValue()
                rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue());
                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任务号
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                }
            }catch (Exception e){
                return false;
            }
        }
    }
//    public synchronized boolean rgvAvoidanceXY(Integer rgvId){
//        BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo(rgvId);
//        if (basRgvMap.getStartRoute() == 100 || basRgvMap.getStartRoute() == 101){
//            try{
//
//                //  命令下发区 --------------------------------------------------------------------------
//                RgvCommand rgvCommand = new RgvCommand();
//                rgvCommand.setRgvNo(rgvId); // RGV编号
//                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
//                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
//                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
//                //basRgvMap.getLockStartRoute().shortValue()
//                rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue());
//                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任务号
//                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//                    return false;
//                } else {
//                    return true;
//                }
//            }catch (Exception e){
//                return false;
//
//            }
//        }else {
//            try{
//                //  命令下发区 --------------------------------------------------------------------------
//                RgvCommand rgvCommand = new RgvCommand();
//                rgvCommand.setRgvNo(rgvId); // RGV编号
//                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
//                rgvCommand.setTaskNo1((short)32222); // 工位1工作号
//                rgvCommand.setTaskMode1(RgvTaskModeType.X_MOVE); // 工位1任务模式:  回原点
//                //basRgvMap.getLockStartRoute().shortValue()
//                rgvCommand.setSourceStaNo1(basRgvMap.getStartRoute().shortValue());
//                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任务号
//                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
//                    return false;
//                } else {
//                    return true;
//                }
//            }catch (Exception e){
//                return false;
//
//            }
//        }
//    }
    /*
@@ -3229,39 +3337,80 @@
            int startSta = wrkMastSta.getStaStart();
            //  命令下发区 --------------------------------------------------------------------------
            RgvCommand rgvCommand = new RgvCommand();
            boolean pakIn1 = true;
            boolean pakIn2 = true;
            rgvCommand.setRgvNo(rgvId); // RGV编号
            if((startSta >= 1001 && startSta <= 1035) || (startSta >= 2001 && startSta <= 2030)){//出库RGV取货
                rgvCommand.setAckFinish2((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo2(wrkMastSta.getWrkNo().shortValue()); // 工位2工作号
                rgvCommand.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 工位2任务模式:  取放货
                rgvCommand.setSourceStaNo2(wrkMastSta.getStaStart().shortValue());   //工位2起点
                rgvCommand.setDestinationStaNo2(wrkMastSta.getStaEnd().shortValue());   //工位2目标站点
                rgvCommand.setCommand((short) 2);   //工位1任务确认
            }else{  //入库RGV取货
                rgvCommand.setAckFinish1((short) 0);  // 工位1任务完成确认位
                rgvCommand.setTaskNo1(wrkMastSta.getWrkNo().shortValue()); // 工位1工作号
                rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
                rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
                rgvCommand.setCommand((short) 1);   //工位1任务确认
            }
            if(rgvCommand.getCommand() == 1){
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
            if(wrkMastSta.getWrkSts() == 1){//取货
                if((startSta >= 1001 && startSta <= 1035) || (startSta >= 2001 && startSta <= 2030)){//出库RGV取货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskMode2(RgvTaskModeType.FETCH); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaStart());   //工位2目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn1 = false;
                }else{  //入库RGV取货
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaStart());   //工位1目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
            }else{
                if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                    return false;
                } else {
                    return true;
                if(!pakIn1){
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                }else{
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                }
            }
            if(wrkMastSta.getWrkSts() == 2) {//放货
                if((startSta >= 1001 && startSta <= 1035) || (startSta >= 2001 && startSta <= 2030)){//出库RGV取货
                    rgvCommand.setAckFinish2(false);  // 工位2任务完成确认位
                    rgvCommand.setTaskNo2(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位2工作号
                    rgvCommand.setTaskMode2(RgvTaskModeType.PUT); // 工位2任务模式:  取放货
                    rgvCommand.setEndStaNo2(wrkMastSta.getWrkEnd());   //工位2 放货后要去的位置
                    rgvCommand.setTargetPosition2(wrkMastSta.getStaEnd());   //工位2目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                    pakIn2 = false;
                }else{  //入库RGV取货
                    rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                    rgvCommand.setTaskNo1(Math.toIntExact(wrkMastSta.getWrkNo())); // 工位1工作号
                    rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  取放货
                    rgvCommand.setEndStaNo1(wrkMastSta.getWrkEnd());   //工位1 放货后要去的位置
                    rgvCommand.setTargetPosition1(wrkMastSta.getStaEnd());   //工位1目标站点
                    rgvCommand.setCommand(true);   //工位1任务确认
                }
                if(!pakIn2){
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                }else{
                    if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(5, rgvCommand))) {
                        //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                        log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                        return false;
                    } else {
                        return true;
                    }
                }
            }
            return true;
        }catch (Exception e){
            return false;
        }
src/main/java/com/zy/core/MainProcess.java
@@ -124,12 +124,7 @@
                    // RGV  ===>>  小车任务作业下发
                    try{
                        mainService.rgvRunWrkMastFullSta();
//                        if (rgvIoExecuteSign){
//                            k = 0;
//                        } else if (k>4){
//                            k = 0;
//                            mainService.rgvRunWrkMastEmptyStaAvoidance();//避让
//                        }
                        mainService.rgvPreScheduling();
                    }catch (Exception e){
                        log.error("RGV  ===>>  小车任务作业下发异常"+e);
                    }
src/main/java/com/zy/core/enums/RgvTaskStatusType.java
New file
@@ -0,0 +1,37 @@
package com.zy.core.enums;
public enum RgvTaskStatusType {
    NONE(0),//无
    X_MOVE(1),//行走
    FETCH(2),//取货
    PUT(3),//放货
    FETCH_PUT(4);//取放货
    public Integer id;
    RgvTaskStatusType(Integer id) { this.id = id; }
    public static RgvTaskStatusType get(Short id) {
        if (null == id){
            return null;
        }
        for(RgvTaskStatusType type : RgvTaskStatusType.values()){
            if(type.id.equals(id.intValue())){
                return type;
            }
        }
        return null;
    }
    public static RgvTaskStatusType get(RgvTaskStatusType type) {
        if (null == type){
            return null;
        }
        for(RgvTaskStatusType rgvTaskStatusType : RgvTaskStatusType.values()){
            if(rgvTaskStatusType == type){
                return rgvTaskStatusType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.annotation.JSONField;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.RgvTaskStatusType;
import lombok.Data;
import java.util.Calendar;
@@ -18,10 +19,10 @@
    private Integer rgvNo = 0;
    // 工位1任务完成确认位
    private Short ackFinish1 = 0;
    private Boolean ackFinish1 = true;
    // 工位1任务号
    private Short taskNo1 = 0;
    private Integer taskNo1 = 0;
    /**
     * 任务模式:
@@ -32,8 +33,16 @@
     */
    private Short taskMode1 = 0;
    /**
     * 作业模式
     */
    private Short taskStatus1 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType1;
    @JSONField(serialize = false)
    private RgvTaskStatusType taskStatusType1;
    /*
    工位1源站
@@ -45,12 +54,26 @@
     */
    private Short destinationStaNo1 = 0;
    /**
     * 工位1目标位置
     */
    private Integer targetPosition1 = 0;
    /**
     * RGV放货后货物要去的目的地
     */
    private Integer endStaNo1 = 0;
    /**
     * 执行方向
     */
    private Short direction1 = 0;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    // 工位1任务完成确认位
    private Short ackFinish2 = 0;
    // 工位2任务完成确认位
    private Boolean ackFinish2 = true;
    // 工位2任务号
    private Short taskNo2 = 0;
    private Integer taskNo2 = 0;
    /**
     * 任务模式:
@@ -61,8 +84,16 @@
     */
    private Short taskMode2 = 0;
    /**
     * 作业模式
     */
    private Short taskStatus2 = 0;
    @JSONField(serialize = false)
    private RgvTaskModeType taskModeType2;
    @JSONField(serialize = false)
    private RgvTaskStatusType taskStatusType2;
    /*
    工位2源站
@@ -73,6 +104,21 @@
    工位2目标站
     */
    private Short destinationStaNo2 = 0;
    /**
     * 工位2目标位置
     */
    private Integer targetPosition2 = 0;
    /**
     * RGV放货后货物要去的目的地
     */
    private Integer endStaNo2 = 0;
    /**
     * 执行方向
     */
    private Short direction2 = 0;
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
@@ -81,8 +127,10 @@
     * 1 = 工位1任务确认
     * 2 = 工位2任务确认
     * 3 = 工位1、2任务同时确认
     * false 未确认
     * true 执行
     */
    private Short command = 0;
    private Boolean command = false;
    public void setTaskMode1(Short taskMode1){
        this.taskMode1 = taskMode1;
@@ -104,6 +152,26 @@
        this.taskMode2 = RgvTaskModeType.get(type2).id.shortValue();
    }
    public void setTaskStatus1(Short taskStatus1){
        this.taskStatus1 = taskStatus1;
        this.taskStatusType1 = RgvTaskStatusType.get(taskStatusType1);
    }
    public void setTaskStatus1(RgvTaskStatusType type1) {
        this.taskStatusType1 = type1;
        this.taskStatus1 = RgvTaskStatusType.get(type1).id.shortValue();
    }
    public void setTaskStatus2(Short taskStatus2){
        this.taskStatus2 = taskStatus2;
        this.taskStatusType2 = RgvTaskStatusType.get(taskStatusType2);
    }
    public void setTaskStatus2(RgvTaskStatusType type2) {
        this.taskStatusType2 = type2;
        this.taskStatus2 = RgvTaskStatusType.get(type2).id.shortValue();
    }
    public static void main(String[] args) {
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -5,6 +5,7 @@
import com.zy.core.enums.RgvStatusType;
import lombok.Data;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
@@ -14,7 +15,7 @@
@Data
public class RgvProtocol implements Cloneable{
    private Integer RgvNo;
    private short RgvNo;
    /**
     * 1 = 手动模式
@@ -26,12 +27,13 @@
    public RgvModeType modeType;
    /**
     * RGV当前状态
     * RGV当前状态工位1
     * 0:空闲,无任务
     * 1:作业中
     * 2:报警
     */
    public Short status;
    /**
     * 状态枚举
@@ -41,7 +43,7 @@
    /**
     * 工位1任务号
     */
    public Short taskNo1 = 0;
    public Integer taskNo1 = 0;
    /**
     * RGV工位1当前状态
@@ -60,12 +62,18 @@
    /**
     * 工位1有物
     */
    public Short loaded1;
    public Boolean loaded1;
    /**
     * RGV当前位置
     */
    public Short RgvPos;
    public Integer RgvPos;
    /**
     * RGV当前目的位置
     */
    public Integer RgvPosDestination;
    /**
     * 走行在定位
@@ -74,11 +82,46 @@
     */
    public Short walkPos;
    /**
     * 急停
     */
    public Boolean err1;
    /**
     * 有物无资料
     */
    public Boolean err2;
    /**
     * 有资料无物
     */
    public Boolean err3;
    /**
     * 命令错误走行联调冲突
     */
    public Boolean err4;
    /**
     * 目标为超过行走极限
     */
    public Boolean err5;
    /**
     *  变频器异常
     */
    public Boolean err6;
    /**
     * 光电异常
     */
    public Boolean err7;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    /**
     * 工位2任务号
     */
    public Short taskNo2 = 0;
    public Integer taskNo2 = 0;
    /**
     * RGV工位2当前状态
@@ -97,7 +140,44 @@
    /**
     * 工位2有物
     */
    public Short loaded2;
    public Boolean loaded2;
//    /**
//     * 急停
//     */
//    public Boolean err21;
//
//    /**
//     * 有物无资料
//     */
//    public Boolean err22;
//
//    /**
//     * 有资料无物
//     */
//    public Boolean err23;
//
//    /**
//     * 命令错误走行联调冲突
//     */
//    public Boolean err24;
//
//    /**
//     * 目标为超过行走极限
//     */
//    public Boolean err25;
//
//    /**
//     *  变频器异常
//     */
//    public Boolean err26;
//
//    /**
//     * 光电异常
//     */
//    public Boolean err27;
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
@@ -165,15 +245,24 @@
        this.status1 = RgvStatusType.get(type1).id.shortValue();
    }
//    public void setStatus2(Short status2){
//        this.status2 = status2;
//        this.statusType2 = RgvStatusType.get(status2);
//    }
//
//    public void setStatus2(RgvStatusType type2){
//        this.statusType2 = type2;
//        this.status2 = RgvStatusType.get(type2).id.shortValue();
//    }
    public void setStatus2(Short status2){
        this.status2 = status2;
        this.statusType2 = RgvStatusType.get(status2);
    }
    public void setStatus2(RgvStatusType type2){
        this.statusType2 = type2;
        this.status2 = RgvStatusType.get(type2).id.shortValue();
    }
    public boolean isLoaded1ing() {
        return Boolean.TRUE.equals(this.loaded1);
    }
    public boolean isLoaded2ing() {
        return Boolean.TRUE.equals(this.loaded2);
    }
    /**
     * 最近一次入出库类型
@@ -188,7 +277,7 @@
            basRgv.setRgvErr(alarm.longValue());
        }
        basRgv.setWrkNo1(taskNo1.intValue());
//        basRgv.setWrkNo2(taskNo2.intValue());
        basRgv.setWrkNo2(taskNo2.intValue());
        return basRgv;
    }
src/main/java/com/zy/core/thread/RgvThread.java
@@ -18,6 +18,7 @@
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.RgvTaskStatusType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
@@ -52,6 +53,10 @@
    //锁定标记
    private boolean PakMk = true;
    //入库标记
    private boolean PakIn = true;
    //出库标记
    private boolean PakOut = true;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
@@ -92,12 +97,12 @@
                            command = new RgvCommand();
                        }
                        command.setRgvNo(slave.getId()); // RGV编号
                        command.setTaskNo1((short) 0); // 工作号
                        command.setAckFinish1((short) 1);  // 任务完成确认位
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short)0);     // 源站
                        command.setDestinationStaNo1((short)0);     // 目标站
                        command.setCommand((short)0);
                        command.setTaskNo1(0); // 工作号
                        command.setAckFinish1(true);  // 任务完成确认位
                        command.setTaskStatus1(RgvTaskStatusType.NONE); // 任务模式
                        command.setTargetPosition1( 0);     // 源站
                        command.setEndStaNo1(0);     // 目标站
                        command.setCommand(false);
                        write1(command);
                        break;
                    case 6:
@@ -106,33 +111,33 @@
                            command2 = new RgvCommand();
                        }
                        command2.setRgvNo(slave.getId()); // RGV编号
                        command2.setTaskNo2((short) 0); // 工作号
                        command2.setAckFinish2((short) 1);  // 任务完成确认位
                        command2.setTaskMode2(RgvTaskModeType.NONE); // 任务模式
                        command2.setTaskNo2(0); // 工作号
                        command2.setAckFinish2(true);  // 任务完成确认位
                        command2.setTaskStatus2(RgvTaskStatusType.NONE); // 任务模式
                        command2.setSourceStaNo2((short)0);     // 源站
                        command2.setDestinationStaNo2((short)0);     // 目标站
                        command2.setCommand((short)0);
                        command2.setCommand(false);
                        write2(command2);
                        break;
                    // 回原点  避让
                    case 9:
                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
                        if (null == commandAvoidanceXY) {
                            commandAvoidanceXY = new RgvCommand();
                        }
                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
//                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
//                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
//                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
//                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
//                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
                        commandAvoidanceXY.setCommand((short)0);
                        write(commandAvoidanceXY);
//                        RgvCommand commandAvoidanceXY = (RgvCommand) task.getData();
//                        if (null == commandAvoidanceXY) {
//                            commandAvoidanceXY = new RgvCommand();
//                        }
//                        commandAvoidanceXY.setRgvNo(slave.getId()); // RGV编号
//                        commandAvoidanceXY.setTaskNo1((short) 9999); // 工作号
//                        commandAvoidanceXY.setAckFinish1((short) 1);  // 任务完成确认位
//                        commandAvoidanceXY.setTaskMode1(RgvTaskModeType.GO_ORIGIN); // 任务模式
//                        commandAvoidanceXY.setSourceStaNo1((short)0);     // 源站
//                        commandAvoidanceXY.setDestinationStaNo1((short)0);     // 目标站
////                        commandAvoidanceXY.setTaskNo2((short) 0); // 工作号
////                        commandAvoidanceXY.setAckFinish2((short) 1);  // 任务完成确认位
////                        commandAvoidanceXY.setTaskMode2(RgvTaskModeType.GO_ORIGIN); // 任务模式
////                        commandAvoidanceXY.setSourceStaNo2((short)0);     // 源站
////                        commandAvoidanceXY.setDestinationStaNo2((short)0);     // 目标站
//                        commandAvoidanceXY.setCommand((short)0);
//                        write(commandAvoidanceXY);
                        break;
                    default:
                        break;
@@ -152,21 +157,30 @@
        if (null == rgvProtocol) {
            rgvProtocol = new RgvProtocol();
        }
        rgvProtocol.setMode((short) -1);
        //小车状态
        rgvProtocol.setStatus((short)-1);
        rgvProtocol.setTaskNo1((short)0);
        rgvProtocol.setRgvPosDestination(0);
        rgvProtocol.setMode((short) -1);
        rgvProtocol.setRgvPos(0);
        rgvProtocol.setErr1(false);
        rgvProtocol.setErr2(false);
        rgvProtocol.setErr3(false);
        rgvProtocol.setErr4(false);
        rgvProtocol.setErr5(false);
        rgvProtocol.setErr6(false);
        rgvProtocol.setErr7(false);
        //工位1状态
        rgvProtocol.setTaskNo1(0);
        rgvProtocol.setStatus1((short)-1);
        rgvProtocol.setLoaded1((short)0);
        rgvProtocol.setWalkPos((short)0);
        rgvProtocol.setRgvPos((short)0);
        rgvProtocol.setLoaded1(false);
        //工位2状态
        rgvProtocol.setTaskNo2((short)0);
        rgvProtocol.setTaskNo2(0);
        rgvProtocol.setStatus2((short)-1);
        rgvProtocol.setLoaded2((short)0);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
        rgvProtocol.setxDuration((short) 0);
        rgvProtocol.setLoaded2(false);
//        rgvProtocol.setAlarm((short)0);
//        rgvProtocol.setxSpeed((short) 0);
//        rgvProtocol.setxDistance((short) 0);
//        rgvProtocol.setxDuration((short) 0);
    }
    @Override
@@ -189,6 +203,14 @@
        return result;
    }
    private void setBool(byte[] buffer, int byteIndex, int bitIndex, boolean value) {
        if (value) {
            buffer[byteIndex] |= (1 << bitIndex); // 置位
        } else {
            buffer[byteIndex] &= ~(1 << bitIndex); // 清零
        }
    }
    /**
     * 读取状态
     */
@@ -196,26 +218,49 @@
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            if (result.IsSuccess) {
                if (null == rgvProtocol || rgvProtocol.getRgvNo() == null) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
                    rgvProtocol.setRgvNo(slave.getId());
                    rgvProtocol.setRgvNo(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                }
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                rgvProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                rgvProtocol.setTaskNo1(siemensNet.getByteTransform().TransInt16(result.Content, 4));
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 6));
                rgvProtocol.setLoaded1(siemensNet.getByteTransform().TransInt16(result.Content, 8));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt16(result.Content, 10));
                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                rgvProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransInt32(result.Content, 4));
                rgvProtocol.setRgvPosDestination( siemensNet.getByteTransform().TransInt32(result.Content, 8));
                rgvProtocol.setStatus1(siemensNet.getByteTransform().TransInt16(result.Content, 12));
                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                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.setLoaded1(status1[0]);
                rgvProtocol.setLoaded2(status1[1]);
                boolean[] status2 = siemensNet.getByteTransform().TransBool(result.Content, 26, 1);
                rgvProtocol.setErr1(status2[0]);
                rgvProtocol.setErr2(status2[1]);
                rgvProtocol.setErr3(status2[2]);
                rgvProtocol.setErr4(status2[3]);
                rgvProtocol.setErr5(status2[4]);
                rgvProtocol.setErr6(status2[5]);
                rgvProtocol.setErr7(status2[6]);
                boolean[] status3 = siemensNet.getByteTransform().TransBool(result.Content, 27, 1);
                rgvProtocol.setErr1(status3[0]);
                rgvProtocol.setErr2(status3[1]);
                rgvProtocol.setErr3(status3[2]);
                rgvProtocol.setErr4(status3[3]);
                rgvProtocol.setErr5(status3[4]);
                rgvProtocol.setErr6(status3[5]);
                rgvProtocol.setErr7(status3[6]);
//                rgvProtocol.setWalkPos(siemensNet.getByteTransform().TransInt16(result.Content, 12));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
//                rgvProtocol.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 4));
//                rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 8));
//                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18));
//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 18));
//                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 22));
//                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
//                rgvProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 26));
//                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));
//                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));
@@ -230,8 +275,8 @@
                        || rgvProtocol.getStatusType1().equals(RgvStatusType.FETCHWAITING)) {
                    if (resetFlag1) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish1((short)1);
                        if (write(rgvCommand)) {
                        rgvCommand.setAckFinish1(true);
                        if (write1(rgvCommand)) {
                            resetFlag1 = false;
                        }
                    }
@@ -242,8 +287,8 @@
                        || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) {
                    if (resetFlag2) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish2((short)1);
                        if (write(rgvCommand)) {
                        rgvCommand.setAckFinish2(true);
                        if (write2(rgvCommand)) {
                            resetFlag2 = false;
                        }
                    }
@@ -275,73 +320,73 @@
        }
    }
    /**
     * 工位1、2同时写入数据
     */
    private boolean write(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
//        convertRow(command);
        command.setRgvNo(slave.getId());
        short[] array = new short[11];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        array[2] = command.getTaskMode1();
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
//    /**
//     * 工位1、2同时写入数据
//     */
//    private boolean write(RgvCommand command) throws InterruptedException {
//        if (null == command) {
//            log.error("RGV写入命令为空");
//            return false;
//        }
////        convertRow(command);
//        command.setRgvNo(slave.getId());
//        short[] array = new short[11];
//        array[0] = command.getAckFinish1();
//        array[1] = command.getTaskNo1();
//        array[2] = command.getTaskMode1();
//        array[3] = command.getSourceStaNo1();
//        array[4] = command.getDestinationStaNo1();
//        array[5] = command.getAckFinish2();
//        array[6] = command.getTaskNo2();
//        array[7] = command.getTaskMode2();
//        array[8] = command.getSourceStaNo2();
//        array[9] = command.getDestinationStaNo2();
//        array[10] = command.getCommand();
        OperateResult result = siemensNet.Write("DB100.0", array);
//        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
//            short commandFinish = 3;  //工位1、2任务同时写入
//            Thread.sleep(100L);
//            result = siemensNet.Write("DB100.20", commandFinish);
////        array[0] = command.getAckFinish1();
////        array[1] = command.getTaskNo1();
////        array[2] = command.getTaskMode1();
////        array[3] = command.getSourceStaNo1();
////        array[4] = command.getDestinationStaNo1();
////        array[5] = command.getAckFinish2();
////        array[6] = command.getTaskNo2();
////        array[7] = command.getTaskMode2();
////        array[8] = command.getSourceStaNo2();
////        array[9] = command.getDestinationStaNo2();
////        array[10] = command.getCommand();
//        OperateResult result = siemensNet.Write("DB100.0", array);
//
////        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
////            short commandFinish = 3;  //工位1、2任务同时写入
////            Thread.sleep(100L);
////            result = siemensNet.Write("DB100.20", commandFinish);
////        }
//
//        try {
//            // 日志记录
//            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
//            BasRgvOpt basRgvOpt = new BasRgvOpt(
//                    command.getTaskNo1().intValue(),
//                    command.getTaskNo2().intValue(),
//                    command.getRgvNo(),
//                    new Date(),
//                    command.getTaskModeType1().toString(),
//                    command.getSourceStaNo1().intValue(),
//                    command.getDestinationStaNo1().intValue(),
//                    command.getSourceStaNo2().intValue(),
//                    command.getDestinationStaNo2().intValue(),
//                    null,
//                    new Date(),
//                    null
//            );
//            bean.insert(basRgvOpt);
//        } catch (Exception ignore) {}
//
//        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;
//        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getTaskNo1().intValue(),
                    command.getTaskNo2().intValue(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTaskModeType1().toString(),
                    command.getSourceStaNo1().intValue(),
                    command.getDestinationStaNo1().intValue(),
                    command.getSourceStaNo2().intValue(),
                    command.getDestinationStaNo2().intValue(),
                    null,
                    new Date(),
                    null
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        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;
        }
    }
//    }
    /**
     * 工位1写入数据
@@ -352,38 +397,49 @@
            return false;
        }
        OperateResultExOne<byte[]> result3 = siemensNet.Read("DB100.0", (short) 12);
        OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2);
        if (result3.IsSuccess){
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34);
//        OperateResultExOne<byte[]> result4 = siemensNet.Read("DB100.10", (short) 2);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
            one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(result1.Content, 0));
            one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 4));
            one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(result1.Content, 8));
            one.setTaskNo1(siemensNet.getByteTransform().TransInt32(result1.Content, 10));
            one.setDirection1(siemensNet.getByteTransform().TransInt16(result1.Content, 14));
//                one.setAckFinish1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
            one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2));
            one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4));
            one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 6));
            one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 8));
            one.setCommand(siemensNet.getByteTransform().TransInt16(result4.Content, 0));
//            one.setTaskNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 2));
//            one.setTaskMode1(siemensNet.getByteTransform().TransInt16(result3.Content, 4));
//            one.setSourceStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 6));
//            one.setDestinationStaNo1(siemensNet.getByteTransform().TransInt16(result3.Content, 8));
//            one.setCommand(siemensNet.getByteTransform().TransInt16(result4.Content, 0));
            News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        }
        OperateResult result8 = siemensNet.Write("DB100.10", (short) 0);
        if (result8.IsSuccess){
        OperateResult result2 = siemensNet.Write("DB100.34", false);
        if (result2.IsSuccess){
            News.error("下发前把车子确认位置为0");
        }
//        siemensNet.Write("DB100.20", command.getCommand());
        byte[] writeBytes = new byte[34];
        command.setRgvNo(slave.getId());
        short[] array = new short[5];
        array[0] = command.getAckFinish1();
        array[1] = command.getTaskNo1();
        array[2] = command.getTaskMode1();
        array[3] = command.getSourceStaNo1();
        array[4] = command.getDestinationStaNo1();
        siemensNet.getByteTransform().TransInt32(writeBytes, 0, command.getTargetPosition1());
        siemensNet.getByteTransform().TransInt32(writeBytes, 4, command.getEndStaNo1());
        siemensNet.getByteTransform().TransInt16(writeBytes, 8, command.getTaskStatus1());
        siemensNet.getByteTransform().TransInt32(writeBytes, 10, command.getTaskNo1());
        siemensNet.getByteTransform().TransInt16(writeBytes, 14, command.getDirection1());
        setBool(writeBytes, 32, 0, command.getAckFinish1());
//        command.setRgvNo(slave.getId());
//        short[] array = new short[5];
//        array[0] = command.getAckFinish1();
//        array[1] = command.getTaskNo1();
//        array[2] = command.getTaskMode1();
//        array[3] = command.getSourceStaNo1();
//        array[4] = command.getDestinationStaNo1();
//        siemensNet.Write("DB100.10", command.getCommand());
        OperateResult result = siemensNet.Write("DB100.0", array);
        OperateResult result = siemensNet.Write("DB100.0", writeBytes);
        if (!result.IsSuccess){
            News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
@@ -396,20 +452,21 @@
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 12);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34);
            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));
                one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 10));
                one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 4));
                one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 0));
                if (
                    !command.getTaskNo1().equals(one.getTaskNo1()) ||
                        !command.getTaskMode1().equals(one.getTaskMode1()) ||
                        !command.getSourceStaNo1().equals(one.getSourceStaNo1()) ||
                        !command.getDestinationStaNo1().equals(one.getDestinationStaNo1())
                ){
                        !command.getDirection1().equals(one.getDirection1()) ||
                                !command.getTaskNo1().equals(one.getTaskNo1()) ||
                                !command.getTaskStatus1().equals(one.getTaskStatus1()) ||
                                !command.getEndStaNo1().equals(one.getEndStaNo1()) ||
                                !command.getTargetPosition1().equals(one.getTargetPosition1())
                ) {
                    try{
                        News.error("RGV命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
@@ -432,7 +489,7 @@
            News.error("RGV命令地址写入后回读出错");
        }
        if (command.getAckFinish1() == 0) {
        if (command.getAckFinish1()) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
@@ -440,15 +497,15 @@
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.10", commandFinish);
                    boolean commandFinish = false;
                    result = siemensNet.Write("DB100.32.0", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.10", (short) 2);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                            commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 0);
                            if (!commandFinish){
                                News.error("RGV任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
@@ -475,15 +532,12 @@
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getTaskNo1().intValue(),
                    command.getTaskNo2().intValue(),
                    command.getTaskNo1(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTaskModeType1().toString(),
                    command.getSourceStaNo1().intValue(),
                    command.getDestinationStaNo1().intValue(),
                    command.getSourceStaNo2().intValue(),
                    command.getDestinationStaNo2().intValue(),
                    command.getTaskStatus1().toString(),
                    command.getTargetPosition1(),
                    command.getEndStaNo1(),
                    null,
                    new Date(),
                    null
@@ -515,36 +569,124 @@
            return false;
        }
        OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) 34);
        if (result1.IsSuccess){
            RgvCommand one = new RgvCommand();
            one.setTargetPosition2(siemensNet.getByteTransform().TransInt32(result1.Content, 16));
            one.setEndStaNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 20));
            one.setTaskStatus2(siemensNet.getByteTransform().TransInt16(result1.Content, 24));
            one.setTaskNo2(siemensNet.getByteTransform().TransInt32(result1.Content, 26));
            one.setDirection2(siemensNet.getByteTransform().TransInt16(result1.Content, 30));
            News.error("RGV命令下发前读取状态[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
        }
        OperateResult result2 = siemensNet.Write("DB100.34", false);
        if (result2.IsSuccess){
            News.error("下发前把车子确认位置为0");
        }
        byte[] writeBytes = new byte[34];
        command.setRgvNo(slave.getId());
        short[] array = new short[6];
        array[0] = command.getAckFinish2();
        array[1] = command.getTaskNo2();
        array[2] = command.getTaskMode2();
        array[3] = command.getSourceStaNo2();
        array[4] = command.getDestinationStaNo2();
        array[5] = command.getCommand();
        siemensNet.getByteTransform().TransInt32(writeBytes, 16, command.getTargetPosition2());
        siemensNet.getByteTransform().TransInt32(writeBytes, 20, command.getEndStaNo2());
        siemensNet.getByteTransform().TransInt16(writeBytes, 24, command.getTaskStatus2());
        siemensNet.getByteTransform().TransInt32(writeBytes, 26, command.getTaskNo2());
        siemensNet.getByteTransform().TransInt16(writeBytes, 30, command.getDirection2());
        setBool(writeBytes, 32, 1, command.getAckFinish2());
        OperateResult result = siemensNet.Write("DB100.10", array);
        OperateResult result = siemensNet.Write("DB100.0", writeBytes);
        if (command.getAckFinish2() == 0) {
            short commandFinish = 2;  //工位2任务写入
            Thread.sleep(100L);
            result = siemensNet.Write("DB100.20", commandFinish);
        if (!result.IsSuccess){
            News.error("写入RGVplc数据失败,重新添加任务到队列 ===> [id:{}],{}",slave.getId(),JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Rgv,slave.getId(),new Task(5,command));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //RGV任务写入后,回读一次,看是否成功
        Thread.sleep(400);
        try {
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 34);
            if (resultRead.IsSuccess){
                RgvCommand one = new RgvCommand();
                one.setDirection1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 30));
                one.setTaskNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 26));
                one.setTaskStatus1(siemensNet.getByteTransform().TransInt16(resultRead.Content, 24));
                one.setEndStaNo1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 20));
                one.setTargetPosition1(siemensNet.getByteTransform().TransInt32(resultRead.Content, 16));
                if (
                        !command.getDirection2().equals(one.getDirection2()) ||
                                !command.getTaskNo2().equals(one.getTaskNo2()) ||
                                !command.getTaskStatus2().equals(one.getTaskStatus2()) ||
                                !command.getEndStaNo2().equals(one.getEndStaNo2()) ||
                                !command.getTargetPosition2().equals(one.getTargetPosition2())
                ) {
                    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(5, 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()) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    boolean commandFinish = false;
                    result = siemensNet.Write("DB100.32.1", commandFinish);
                    if(result.IsSuccess){
                        //RGV任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.32", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransBool(resultRead.Content, 1);
                            if (!commandFinish){
                                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.getTaskNo1().intValue(),
                    command.getTaskNo2().intValue(),
                    command.getTaskNo2(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTaskModeType1().toString(),
                    command.getSourceStaNo1().intValue(),
                    command.getDestinationStaNo1().intValue(),
                    command.getSourceStaNo2().intValue(),
                    command.getDestinationStaNo2().intValue(),
                    command.getTaskStatus2().toString(),
                    command.getTargetPosition2(),
                    command.getEndStaNo2(),
                    null,
                    new Date(),
                    null
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -269,23 +269,23 @@
            }
        }
        //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)));
            }
        }
//        //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;
src/main/webapp/static/js/console.map.js
@@ -309,7 +309,9 @@
            "stns": [
                {"type": "track", "id": "lb_trCart11", "text": "", "top": 65, "left": 1000, "width": 6, "height": 560},
                {"type": "track", "id": "lb_trCart12", "text": "", "top": 65, "left": 1020, "width": 6, "height": 560},
                { "type": "stn", "id": "site-1", "text": "1", "top": 84, "left": 1000, "width": 35, "height": 20 },
                { "type": "stn", "id": "site-1", "text": "1", "top": 84, "left": 984, "width": 30, "height": 20 },
                { "type": "stn", "id": "site-2", "text": "2", "top": 84, "left": 1016, "width": 30, "height": 20 },
                { "type": "stn", "id": "site-1001", "text": "1001", "top": 84, "left": 870, "width": 35, "height": 20 },
                { "type": "stn", "id": "site-1002", "text": "1002", "top": 84, "left": 907, "width": 35, "height": 20 },
                { "type": "stn", "id": "site-1004", "text": "1004", "top": 84, "left": 944, "width": 35, "height": 20 },
@@ -444,8 +446,8 @@
            "width": 2900,
            "height": 600,
            "stns": [
                { "type": "stn", "id": "site-2", "text": "2", "top": 84, "left": 1000, "width": 35, "height": 20 },
                { "type": "stn", "id": "site-3", "text": "1", "top": 84, "left": 984, "width": 30, "height": 20 },
                { "type": "stn", "id": "site-4", "text": "2", "top": 84, "left": 1016, "width": 30, "height": 20 },
                {"type": "track", "id": "lb_trCart21", "text": "", "top": 65, "left": 1000, "width": 6, "height": 560},
                {"type": "track", "id": "lb_trCart22", "text": "", "top": 65, "left": 1020, "width": 6, "height": 560},
                { "type": "stn", "id": "site-2003", "text": "2003", "top": 84, "left": 926, "width": 54, "height": 20 },