自动化立体仓库 - WCS系统
#
zjj
2024-01-15 855bf7559274cbc7e3008eaac313e49e48d14e33
#
16个文件已修改
409 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/RgvController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/RouteUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/cache/MessageQueue.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnStatusType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvModeType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/CrnProtocol.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/RgvThread.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/rgv.html 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -84,10 +84,11 @@
            vo.setStatus1(rgvProtocol.getStatusType1().desc);  // 工位1状态
            vo.setLoading1(rgvProtocol.getLoaded1()==1?"有物":"无物");  // 工位1有物
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setRgvPos1(rgvProtocol.getRgvPosI());
            vo.setWalkPos(rgvProtocol.getWalkPos()==1?"不在定位":"在定位");
            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  工位2任务号
            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 工位2状态
            vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物");  // 工位2有物
//            vo.setWorkNo2(rgvProtocol.getTaskNo2());  //  工位2任务号
//            vo.setStatus2(rgvProtocol.getStatusType2().desc);  // 工位2状态
//            vo.setLoading2(rgvProtocol.getLoaded2()==1?"有物":"无物");  // 工位2有物
            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
            if (rgvProtocol.getAlarm() > 0) {
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -46,5 +46,6 @@
    // 异常码描述
    private String alarm = "-";
    private Integer RgvPos1 = 0;
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1426,10 +1426,11 @@
                // 站点条件判断
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && (staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo() <= 9999)
                        && staProtocol.isPakMk()&& staProtocol.getStamp()>=2) {
                        && staProtocol.isPakMk()
                        ) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货");
                    try {
@@ -1451,7 +1452,7 @@
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            if (!result) {
@@ -2233,7 +2234,7 @@
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && (rgvProtocol.getTaskNo1()==0 || rgvProtocol.getTaskNo1()==9999)
                        && (rgvProtocol.getTaskNo2()==0 || rgvProtocol.getTaskNo2()==9999)
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
@@ -2295,33 +2296,35 @@
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else if (rgvProtocol.getTaskNo2()!=0){
                        if (rgvProtocol.getTaskNo2()==9999){
                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                            if (!rgvComplete){
                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            }
                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                            break;
                        }
                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
                        if (!rgvComplete){
                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
                            break;
                        }
                        wrkMastSta.setWrkSts(3);
                        wrkMastStaMapper.updateById(wrkMastSta);
                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
                    }else {
                    }
//                    else if (rgvProtocol.getTaskNo2()!=0){
//                        if (rgvProtocol.getTaskNo2()==9999){
//                            boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
//                            if (!rgvComplete){
//                                log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                            }
//                            BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                            basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
//                            rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
//                            break;
//                        }
//                        WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(rgvProtocol.getTaskNo2().intValue());
//                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
//                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
//                            continue;
//                        }
//                        boolean rgvComplete = rgvComplete(rgvProtocol.getRgvNo());
//                        if (!rgvComplete){
//                            log.error("小车复位失败,小车号{}!",rgvProtocol.getRgvNo());
//                            break;
//                        }
//                        wrkMastSta.setWrkSts(3);
//                        wrkMastStaMapper.updateById(wrkMastSta);
//                        BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
//                        basRgvMap.setNowRoute(rgvProtocol.getRgvPosI());
//                        rgvMapUpdate(basRgvMap,basRgvMap.getStartRoute(),basRgvMap.getStartRoute());
//                    }
                    else {
                        log.error("小车复位失败,小车号{},等待wcs确认但是没有工作号!",rgvProtocol.getRgvNo());
                    }
                }
@@ -2361,7 +2364,7 @@
                    basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                    List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                    for (WrkMastSta wrkMastSta : wrkMastStaList){
                        if (wrkMastSta.getType()!=1 || wrkMastSta.getWrkType()!=3){//1:满版   3:取放
                        if (wrkMastSta.getType()!=0 || wrkMastSta.getWrkType()!=3){//1:满版   3:取放
                            continue;
                        }
                        boolean sign = rgvTakeFullAll(basRgvMap.getRgvNo(), wrkMastSta); //命令下发
@@ -2410,7 +2413,7 @@
                // 只有当RGV空闲、自动,工位二有物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded2()==1  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getLoaded1()==1  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -2473,7 +2476,7 @@
                // 只有当RGV空闲、自动,工位二无物//rgv可用
                if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (basRgvMap == null) {
@@ -2545,7 +2548,7 @@
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
//                        && rgvProtocol.getLoaded1()==0  //现场修改:叠盘机,不满都算无物,怎么判断需要跟电控对接
                        && rgvProtocol.getTaskNo1()==0
                        && rgvProtocol.getTaskNo2()==0
//                        && rgvProtocol.getTaskNo2()==0
                ) {
                    BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                    if (rgvProtocol.getRgvPosI().equals(basRgvMap.getStartRoute())){
@@ -2601,7 +2604,7 @@
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -2626,7 +2629,7 @@
            rgvCommand.setTaskMode1(RgvTaskModeType.FETCH); // 工位1任务模式:  取货
            rgvCommand.setSourceStaNo1(wrkMastSta.getStaStart().shortValue());   //工位1起点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
@@ -2651,7 +2654,7 @@
            rgvCommand.setTaskMode1(RgvTaskModeType.PUT); // 工位1任务模式:  放货
            rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
            rgvCommand.setCommand((short) 1);   //工位1任务确认
            if (!MessageQueue.offer(SlaveType.Crn, rgvId, new Task(4, rgvCommand))) {
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(4, rgvCommand))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={},任务数据={}", rgvId, JSON.toJSON(rgvCommand));
                return false;
src/main/java/com/zy/asrs/utils/RouteUtils.java
@@ -14,7 +14,7 @@
    //问题2  周俊杰
    public static final List<Integer> MERGE_STA_NO_One = new ArrayList<Integer>() {{
//        add(116);add(117);
        add(113);add(119);
    }};
    public static final List<Integer> MERGE_STA_NO_TWO = new ArrayList<Integer>() {{
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -29,14 +29,14 @@
    }
    public LocTypeDto(StaProtocol staProtocol) {
        if (staProtocol.isHigh() == staProtocol.isLow()) {
            throw new CoolException("plc高低检测异常");
        }
        if (staProtocol.isLow()) {
//        if (staProtocol.isHigh() == staProtocol.isLow()) {
//            throw new CoolException("plc高低检测异常");
//        }
//        if (staProtocol.isLow()) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
//        } else {
//            this.locType1 = 2; // 高库位
//        }
    }
    /**
src/main/java/com/zy/core/MainProcess.java
@@ -44,7 +44,7 @@
                    }
                    // 演示
//                    mainService.crnDemoOfLocMove1();
                    mainService.crnDemoOfLocMove1();
                    //刷新RGV地图
                    mainService.refreshRgvMap();
src/main/java/com/zy/core/ServerBootstrap.java
@@ -13,10 +13,13 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * Created by vincent on 2020/8/4
@@ -29,6 +32,8 @@
    private SlaveProperties slaveProperties;
    @Autowired
    private MainProcess mainProcess;
    public static final Map<CrnThread, Thread> map = new ConcurrentHashMap<>();
    /**
     * PostConstruct会在加载servlet的时候运行一次
@@ -129,5 +134,40 @@
    public void destroy() {
    }
    @Component
    class killThread {
        @Scheduled(cron = "0/3 * * * * ? ")
        public void kill() {
            int i = 0;
            for (Map.Entry<CrnThread, Thread> entry : map.entrySet()) {
                i++;
                SiemensCrnThread key = (SiemensCrnThread) entry.getKey();
//                System.out.println("第"+i+"个堆垛机线程重启线程条件:"+(System.currentTimeMillis() - key.getSign()));
                if (System.currentTimeMillis() - key.getSign() > 120000) {
                    System.out.println("第"+i+"个堆垛机线程被重启");
                    // 请求线程安全停止
                    key.requestStop();
                    // 等待线程完成停止, 可以这样做也可以选择不这么做,取决于是否需要等待线程结束
                    try {
                        entry.getValue().join(20000); // 等待最多20秒
                    } catch (InterruptedException e) {
//                        // 可适当处理中断
//                        Thread.currentThread().interrupt(); // 保留中断状态
                        entry.getValue().stop();
                    }
                    // 重新启动线程
                    Thread thread = new Thread((Runnable) key); // 假设CrnThread实现了Runnable
                    thread.start();
                    // 替换映射关系中的旧线程
                    map.put(entry.getKey(), thread);
                }
            }
        }
    }
}
src/main/java/com/zy/core/cache/MessageQueue.java
@@ -28,6 +28,8 @@
    // 台车mq交换机
    private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>();
    private static final Map<Integer, LinkedBlockingQueue<Task>> RGV_EXCHANGE = new ConcurrentHashMap<>();
    /**
     * mq 交换机初始化
     */
@@ -35,6 +37,9 @@
        switch (type) {
            case Crn:
                CRN_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
                break;
            case Rgv:
                RGV_EXCHANGE.put(slave.getId(), new LinkedBlockingQueue<>(1));
                break;
            case Devp:
                DEVP_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>());
@@ -64,6 +69,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).offer(task);
            case Rgv:
                return RGV_EXCHANGE.get(id).offer(task);
            case Devp:
                return DEVP_EXCHANGE.get(id).offer(task);
            case Barcode:
@@ -87,6 +94,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).poll();
            case Rgv:
                return RGV_EXCHANGE.get(id).poll();
            case Devp:
                return DEVP_EXCHANGE.get(id).poll();
            case Barcode:
@@ -109,6 +118,8 @@
        switch (type) {
            case Crn:
                return CRN_EXCHANGE.get(id).peek();
            case Rgv:
                return RGV_EXCHANGE.get(id).peek();
            case Devp:
                return DEVP_EXCHANGE.get(id).peek();
            case Barcode:
@@ -127,9 +138,11 @@
    public static void clear(SlaveType type, Integer id){
        switch (type) {
            case Crn:
                CRN_EXCHANGE.get(id).clear();
                break;
            case Rgv:
                RGV_EXCHANGE.get(id).clear();
                break;
            case Devp:
                DEVP_EXCHANGE.get(id).clear();
                break;
src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -13,7 +13,7 @@
    ORIGIN_GO(7, "回原点"),
    ORIGIN_BACK(8, "回反原点"),
    MOVING(9, "走行中"),
    WAITING(90, "任务完成等待WCS确认"),
    WAITING(10, "任务完成等待WCS确认"),
    PAUSE(11, "任务暂停"),
    SOS(99, "报警"),
    UNKNOW(100, "其他"),
src/main/java/com/zy/core/enums/RgvModeType.java
@@ -3,7 +3,7 @@
public enum RgvModeType {
    NONE(-1, "离线"),
    STOP(0, "维修"),
    STOP(0, "关机"),
    HAND(1, "手动"),
    HALF_AUTO(2, "半自动"),
    AUTO(3, "自动"),
src/main/java/com/zy/core/model/protocol/CrnProtocol.java
@@ -251,32 +251,32 @@
        return basCrnp;
    }
    public void setxSpeed(Short xSpeed) {
        this.xSpeed = Float.valueOf(xSpeed);
    public void setxSpeed(float xSpeed) {
        this.xSpeed = xSpeed;
    }
    public void setySpeed(Short ySpeed) {
        this.ySpeed = Float.valueOf(ySpeed);
    public void setySpeed(float ySpeed) {
        this.ySpeed = ySpeed;
    }
    public void setzSpeed(Short zSpeed) {
        this.zSpeed = Float.valueOf(zSpeed);
    public void setzSpeed(float zSpeed) {
        this.zSpeed = zSpeed;
    }
    public void setxDistance(Short xDistance) {
        this.xDistance = Float.valueOf(xDistance);
    public void setxDistance(float xDistance) {
        this.xDistance = xDistance;
    }
    public void setyDistance(Short yDistance) {
        this.yDistance = Float.valueOf(yDistance);
    public void setyDistance(float yDistance) {
        this.yDistance = yDistance;
    }
    public void setxDuration(Short xDuration) {
        this.xDuration = Float.valueOf(xDuration);
    public void setxDuration(float xDuration) {
        this.xDuration = xDuration;
    }
    public void setyDuration(Short yDuration) {
        this.yDuration = Float.valueOf(yDuration);
    public void setyDuration(float yDuration) {
        this.yDuration = yDuration;
    }
}
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -5,6 +5,9 @@
import com.zy.core.enums.RgvStatusType;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by vincent on 2020/8/7
 */
@@ -72,29 +75,29 @@
    public Short walkPos;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    /**
     * 工位2任务号
     */
    public Short taskNo2 = 0;
    /**
     * RGV工位2当前状态
     * 0:空闲,无任务
     * 11:取货中
     * 12:放货中
     * 10:任务完成等待WCS确认
     */
    public Short status2;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType2;
    /**
     * 工位2有物
     */
    public Short loaded2;
//    /**
//     * 工位2任务号
//     */
//    public Short taskNo2 = 0;
//
//    /**
//     * RGV工位2当前状态
//     * 0:空闲,无任务
//     * 11:取货中
//     * 12:放货中
//     * 10:任务完成等待WCS确认
//     */
//    public Short status2;
//
//    /**
//     * 状态枚举
//     */
//    public RgvStatusType statusType2;
//
//    /**
//     * 工位2有物
//     */
//    public Short loaded2;
    ///////////////////////////////////////////////////////////////////////////////////////
    /**
@@ -162,15 +165,15 @@
        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();
//    }
    /**
     * 最近一次入出库类型
@@ -185,7 +188,7 @@
            basRgv.setRgvErr(alarm.longValue());
        }
        basRgv.setWrkNo1(taskNo1.intValue());
        basRgv.setWrkNo2(taskNo2.intValue());
//        basRgv.setWrkNo2(taskNo2.intValue());
        return basRgv;
    }
@@ -203,8 +206,16 @@
    public Integer getRgvPosI(){
        //需要根据现场改造  根据读到的值获取对应站点位置
        Map<Short,Integer> map = new HashMap<>();
        map.put((short) 1,100);map.put((short) 2,101);
        map.put((short) 3,106);map.put((short) 4,107);
        map.put((short) 5,112);map.put((short) 6,113);
        map.put((short) 7,119);map.put((short) 8,124);
        map.put((short) 9,149);map.put((short) 10,153);
        map.put((short) 11,157);map.put((short) 12,161);
        if (RgvPos==null) return 0;
        return RgvPos.intValue();
        return map.get(RgvPos);
    }
}
src/main/java/com/zy/core/thread/RgvThread.java
@@ -144,9 +144,9 @@
        rgvProtocol.setLoaded1((short)0);
        rgvProtocol.setWalkPos((short)0);
        rgvProtocol.setRgvPos((short)0);
        rgvProtocol.setTaskNo2((short)0);
        rgvProtocol.setStatus2((short)-1);
        rgvProtocol.setLoaded2((short)0);
//        rgvProtocol.setTaskNo2((short)0);
//        rgvProtocol.setStatus2((short)-1);
//        rgvProtocol.setLoaded2((short)0);
        rgvProtocol.setAlarm((short)0);
        rgvProtocol.setxSpeed((short) 0);
        rgvProtocol.setxDistance((short) 0);
@@ -178,7 +178,7 @@
     */
    private void readStatus(){
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB1.0", (short) 34);
            OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 30);
            if (result.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -191,16 +191,16 @@
                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.setTaskNo2(siemensNet.getByteTransform().TransInt16(result.Content, 14));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 14));
//                rgvProtocol.setStatus2(siemensNet.getByteTransform().TransInt16(result.Content, 16));
//                rgvProtocol.setLoaded2(siemensNet.getByteTransform().TransInt16(result.Content, 18));
                rgvProtocol.setAlarm(siemensNet.getByteTransform().TransInt16(result.Content, 20));
                rgvProtocol.setHeart(siemensNet.getByteTransform().TransInt16(result.Content, 22));
                rgvProtocol.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                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.setTemp1(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                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));
//                rgvProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 30));
//                rgvProtocol.setTemp5(siemensNet.getByteTransform().TransInt16(result.Content, 32));
//                rgvProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
//                rgvProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
//                rgvProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
@@ -220,16 +220,16 @@
                }
                // 工位2复位信号
                if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING)
                        || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) {
                    if (resetFlag2) {
                        RgvCommand rgvCommand = new RgvCommand();
                        rgvCommand.setAckFinish2((short)1);
                        if (write(rgvCommand)) {
                            resetFlag2 = false;
                        }
                    }
                }
//                if (rgvProtocol.getStatusType2().equals(RgvStatusType.WAITING)
//                        || rgvProtocol.getStatusType2().equals(RgvStatusType.FETCHWAITING)) {
//                    if (resetFlag2) {
//                        RgvCommand rgvCommand = new RgvCommand();
//                        rgvCommand.setAckFinish2((short)1);
//                        if (write(rgvCommand)) {
//                            resetFlag2 = false;
//                        }
//                    }
//                }
                try {
                    // 根据实时信息更新数据库
@@ -281,11 +281,11 @@
        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);
        }
//        if (command.getAckFinish1() == 0 && command.getAckFinish2() == 0) {
//            short commandFinish = 3;  //工位1、2任务同时写入
//            Thread.sleep(100L);
//            result = siemensNet.Write("DB100.20", commandFinish);
//        }
        try {
            // 日志记录
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -40,6 +40,10 @@
    private CrnProtocol crnProtocol;
    private boolean resetFlag = false;
    public boolean isRunning = true;
    public Long sign = System.currentTimeMillis();
    /**
     * 堆垛机是否在回原点运动中标记
     */
@@ -53,7 +57,7 @@
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        this.connect();
        while (true) {
        while (isRunning) {
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Crn, slave.getId());
@@ -169,13 +173,13 @@
                crnProtocol.setTemp2(siemensNet.getByteTransform().TransInt16(result.Content, 22));
                crnProtocol.setTemp3(siemensNet.getByteTransform().TransInt16(result.Content, 24));
                crnProtocol.setTemp4(siemensNet.getByteTransform().TransInt16(result.Content, 26));
                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 28));
                crnProtocol.setySpeed(siemensNet.getByteTransform().TransInt16(result.Content, 32));
                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransInt16(result.Content, 36));
                crnProtocol.setxDistance(siemensNet.getByteTransform().TransInt16(result.Content, 40));
                crnProtocol.setyDistance(siemensNet.getByteTransform().TransInt16(result.Content, 44));
                crnProtocol.setxDuration(siemensNet.getByteTransform().TransInt16(result.Content, 48));
                crnProtocol.setyDuration(siemensNet.getByteTransform().TransInt16(result.Content, 52));
                crnProtocol.setxSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 28));
                crnProtocol.setySpeed(siemensNet.getByteTransform().TransSingle(result.Content, 32));
                crnProtocol.setzSpeed(siemensNet.getByteTransform().TransSingle(result.Content, 36));
                crnProtocol.setxDistance(siemensNet.getByteTransform().TransSingle(result.Content, 40));
                crnProtocol.setyDistance(siemensNet.getByteTransform().TransSingle(result.Content, 44));
                crnProtocol.setxDuration(siemensNet.getByteTransform().TransSingle(result.Content, 48));
                crnProtocol.setyDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52));
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
@@ -293,6 +297,10 @@
        }
    }
    public void requestStop() {
        isRunning = false;
    }
    @Override
    public void close() {
src/main/resources/application.yml
@@ -57,15 +57,15 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
      row: 2
      staNo: 123
      row: 3
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 104
      row: 3
      staNo: 118
      row: 2
      bay: 1
      lev: 1
  # 堆垛机2
@@ -81,15 +81,15 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 203
      row: 12
      staNo: 128
      row: 6
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 204
      row: 13
      staNo: 132
      row: 7
      bay: 1
      lev: 1
  # 堆垛机3
@@ -105,15 +105,15 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 303
      row: 22
      staNo: 136
      row: 12
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 304
      row: 23
      staNo: 140
      row: 11
      bay: 1
      lev: 1
  # 堆垛机4
@@ -129,15 +129,15 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 303
      row: 22
      staNo: 144
      row: 14
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 304
      row: 23
      staNo: 148
      row: 15
      bay: 1
      lev: 1
src/main/webapp/views/rgv.html
@@ -90,16 +90,16 @@
                    <thead>
                    <tr>
                        <th>RGV</th>
                        <th>模式</th>
                        <th>状态</th>
                        <th>任务号1</th>
                        <th>状态1</th>
                        <th>有物1</th>
                        <th>当前模式</th>
                        <th>当前状态</th>
                        <th>任务号</th>
                        <th>工作状态</th>
                        <th>有物</th>
                        <th>RGV位置</th>
                        <th>走行定位</th>
                        <th>任务号2</th>
                        <th>状态2</th>
                        <th>有物2</th>
<!--                        <th>任务号2</th>-->
<!--                        <th>状态2</th>-->
<!--                        <th>有物2</th>-->
                        <th>故障代码</th>
                        <th>故障描述</th>
                    </tr>
@@ -315,13 +315,13 @@
                        setVal(tr.children("td").eq(3), table[i-1].workNo1);
                        setVal(tr.children("td").eq(4), table[i-1].status1);
                        setVal(tr.children("td").eq(5), table[i-1].loading1);
                        setVal(tr.children("td").eq(6), table[i-1].rgvPos);
                        setVal(tr.children("td").eq(6), table[i-1].rgvPos1);
                        setVal(tr.children("td").eq(7), table[i-1].walkPos);
                        setVal(tr.children("td").eq(8), table[i-1].workNo2);
                        setVal(tr.children("td").eq(9), table[i-1].status2);
                        setVal(tr.children("td").eq(10), table[i-1].loading2);
                        setVal(tr.children("td").eq(11), table[i-1].warnCode);
                        setVal(tr.children("td").eq(12), table[i-1].alarm);
                        // setVal(tr.children("td").eq(8), table[i-1].workNo2);
                        // setVal(tr.children("td").eq(9), table[i-1].status2);
                        // setVal(tr.children("td").eq(10), table[i-1].loading2);
                        setVal(tr.children("td").eq(8), table[i-1].warnCode);
                        setVal(tr.children("td").eq(9), table[i-1].alarm);
                    }
                } else if (res.code === 403){
                    window.location.href = baseUrl+"/login";