自动化立体仓库 - WCS系统
*
lsh
2025-04-03 0134bfa28a0583c0f2b28e52a6c0aeee7098ecf9
*
1个文件已添加
18个文件已修改
1033 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/SiteController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteDetailVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgv.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvMap.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasRgvOpt.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 328 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/CommandUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RouteCollectCountType.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 129 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/properties/SlaveProperties.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 235 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/SiteController.java
@@ -171,7 +171,7 @@
                    vo.setEmptyMk(staProtocol.isEmptyMk()?"Y":"N");     // 空板信号
                    vo.setStaNo(staProtocol.getStaNo());                // 目标站
                    vo.setLocType1(staProtocol.isHigh() != staProtocol.isLow() && staProtocol.isLow() ? "低" : "高");     //高低库位
                    vo.setCar(staProtocol.isCar() ? "有": "无");
//                    vo.setCar(staProtocol.isCar() ? "有": "无");
                    return R.ok().add(vo);
                }
            }
@@ -182,8 +182,8 @@
    @PostMapping("/detl/update")
    @ManagerAuth(memo = "修改站点数据")
    public R siteDetlUpdate(@RequestParam Integer devNo,
                            @RequestParam Short workNo,
                            @RequestParam Short staNo,
                            @RequestParam Integer workNo,
                            @RequestParam Integer staNo,
                            @RequestParam(required = false) String pakMk,
                            @RequestParam(required = false) Boolean inEnable,
                            @RequestParam(required = false) Boolean outEnable
@@ -267,8 +267,8 @@
                        staProtocol.setOutEnable(outEnable);
                        basDevp.setOutEnable(outEnable ? "Y" : "N");
                    }
                    staProtocol.setWorkNo((short) 0);
                    staProtocol.setStaNo((short) 0);
                    staProtocol.setWorkNo(0);
                    staProtocol.setStaNo(0);
                    basDevpService.updateById(basDevp);
                    boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                    if (result) {
@@ -308,8 +308,8 @@
                } else {
                    staProtocol = staProtocol.clone();
                }
                staProtocol.setWorkNo((short) 9999);
                staProtocol.setStaNo(inSta.getStaNo().shortValue());
                staProtocol.setWorkNo( 9999);
                staProtocol.setStaNo(inSta.getStaNo());
                boolean result = CommandUtils.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol), false);
                if (result) {
                    return R.ok();
@@ -324,68 +324,6 @@
    public List<PlcErrorTableVo> staPlcErr(Map.Entry<Integer, StaProtocol> entry){
        List<PlcErrorTableVo> list = new ArrayList<>();
        StaProtocol staProtocol = entry.getValue();
        if (staProtocol.getBreakerErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("断路器故障");
            vo.setError("断路器故障");
            list.add(vo);
        }
        if (staProtocol.getInfraredErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("光电异常");
            vo.setError("光电异常");
            list.add(vo);
        }
        if (staProtocol.getOutTimeErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("运行超时");
            vo.setError("运行超时");
            list.add(vo);
        }
        if (staProtocol.getSeizeSeatErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("占位超时");
            vo.setError("占位超时");
            list.add(vo);
        }
        if (staProtocol.getWrkYgoodsN()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("有任务无货故障");
            vo.setError("有任务无货故障");
            list.add(vo);
        }
        if (staProtocol.getInverterErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("变频器故障");
            vo.setError("变频器故障");
            list.add(vo);
        }
        if (staProtocol.getContactErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("电机接触器故障");
            vo.setError("电机接触器故障");
            list.add(vo);
        }
        if (staProtocol.getUpcontactErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
            vo.setPlcDesc("顶升电机接触器故障");
            vo.setError("顶升电机接触器故障");
            list.add(vo);
        }
        if (staProtocol.isFrontErr()){
            PlcErrorTableVo vo = new PlcErrorTableVo();
            vo.setNo(entry.getKey());   //  序号
src/main/java/com/zy/asrs/domain/vo/SiteDetailVo.java
@@ -13,7 +13,7 @@
    private Integer siteId;
    // 工作号
    private Short workNo;
    private Integer workNo;
    // 工作状态
    private String wrkSts = "";
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java
@@ -14,7 +14,7 @@
    private String siteId;
    // 工作号
    private Short workNo;
    private Integer workNo;
    // 站点状态
    private SiteStatusType siteStatus;
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
@@ -12,7 +12,7 @@
    private Integer devNo;
    // 工作号
    private Short workNo = 0;
    private Integer workNo = 0;
    // 自动
    private String autoing = "-";
@@ -33,7 +33,7 @@
    private String emptyMk = "-";
    // 目标站
    private Short staNo = 0;
    private Integer staNo = 0;
    //高低库位
    private String locType1 = "-";
src/main/java/com/zy/asrs/entity/BasRgv.java
@@ -14,7 +14,7 @@
import java.util.Date;
@Data
@TableName("asr_bas_rgv")
@TableName("\"SOURCE\".\"asr_bas_rgv\"")
public class BasRgv implements Serializable {
    private static final long serialVersionUID = 1L;
src/main/java/com/zy/asrs/entity/BasRgvMap.java
@@ -10,7 +10,7 @@
import java.io.Serializable;
@Data
@TableName("asr_bas_rgv_map")
@TableName("\"SOURCE\".\"asr_bas_rgv_map\"")
public class BasRgvMap implements Serializable {
    private static final long serialVersionUID = 1L;
src/main/java/com/zy/asrs/entity/BasRgvOpt.java
@@ -14,7 +14,7 @@
import java.util.Date;
@Data
@TableName("asr_bas_rgv_opt")
@TableName("\"SOURCE\".\"asr_bas_rgv_opt\"")
public class BasRgvOpt implements Serializable {
    private static final long serialVersionUID = 1L;
src/main/java/com/zy/asrs/entity/WrkMastSta.java
@@ -14,7 +14,7 @@
import java.util.Date;
@Data
@TableName("asr_wrk_mast_sta")
@TableName("\"SOURCE\".\"asr_wrk_mast_sta\"")
public class WrkMastSta implements Serializable {
    private static final long serialVersionUID = 1L;
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -24,12 +24,16 @@
import com.zy.core.enums.*;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.RgvSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.RgvThread;
import com.zy.core.thread.SiemensDevpThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -78,6 +82,12 @@
    private ApiLogService apiLogService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private BasRgvService basRgvService;
    @Autowired
    private WrkMastStaMapper wrkMastStaMapper;
    @Autowired
    private BasRgvMapMapper basRgvMapMapper;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -90,6 +100,8 @@
    @Autowired
    private CrnController crnController;
    @Value("${wms.rgvOpen}")
    private boolean rgvOpen;
    public void generateStoreWrkFile() throws IOException, InterruptedException {
        try {
@@ -107,8 +119,8 @@
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Short workNo = staProtocol.getWorkNo();
                    Short stano = staProtocol.getStaNo();
                    Integer workNo = staProtocol.getWorkNo();
                    Integer stano = staProtocol.getStaNo();
                    // 尺寸检测异常
                    boolean back = false;
@@ -154,7 +166,7 @@
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getStaNo().shortValue());
                        staProtocol.setStaNo(inSta.getStaNo());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -189,8 +201,8 @@
                                        log.info("托盘码:"+barcode+"任务档存在");
                                        return;
                                    }else {
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo().shortValue());
                                        staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                                        staProtocol.setWorkNo(taskWrk1.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
@@ -222,8 +234,8 @@
                                    // 退回
                                    log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e1);
                                }
                                staProtocol.setWorkNo((short)9999);
                                staProtocol.setStaNo(inSta.getStaNo().shortValue());
                                staProtocol.setWorkNo(9999);
                                staProtocol.setStaNo(inSta.getStaNo());
                                devpThread.setPakMk(staProtocol.getSiteId(), false);
                                MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -276,8 +288,8 @@
                                    log.error("扫码检测程序异常"+inSta.getStaNo()+errMsg);
                                    log.error("扫码检测程序异常,异常信息"+e);
                                    staProtocol.setWorkNo((short)9999);
                                    staProtocol.setStaNo(inSta.getStaNo().shortValue());
                                    staProtocol.setWorkNo(9999);
                                    staProtocol.setStaNo(inSta.getStaNo());
                                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//                                    TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -331,8 +343,8 @@
                                        taskWrkService.insert(taskWrk);
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).eq("stn_no",staProtocol.getSiteId()));
                                        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                                        staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                                        staProtocol.setWorkNo(taskWrk.getWrkNo());
                                        staProtocol.setStaNo(staDesc.getCrnStn());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    }
                                }
@@ -345,8 +357,8 @@
                            // 退回
                            log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                            staProtocol.setWorkNo((short)9999);
                            staProtocol.setStaNo(inSta.getStaNo().shortValue());
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
@@ -394,8 +406,8 @@
                            }
                            log.info("下发输送线任务:taskWrk:"+JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                            staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                            staProtocol.setWorkNo(taskWrk.getWrkNo());
                            staProtocol.setStaNo(staDesc.getCrnStn());
                            boolean offer = false;
                            try{
                                offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
@@ -1112,7 +1124,160 @@
        }
        return taskWrk;
    }
    /**
     *  完成小车任务
     */
    public synchronized void rgvCompleteWrkMastSta() {
        try{
            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
                RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
                RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                if (rgvProtocol == null) {
                    continue;
                }
                BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
                if (basRgv == null) {
                    log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                    continue;
                }
                // 只有当RGV等待WCS确认、自动
                if (rgvProtocol.getStatusType() == RgvStatusType.WORKING
                        && rgvProtocol.getModeType() == RgvModeType.AUTO
                        && ((rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.WAITING ) ||
                        (rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING ))
                ) {
                    log.info("{}号小车等待wcs确认,状态{},参数{}",rgvProtocol.getRgvNo(),rgvProtocol.getStatusType(),rgvProtocol);
                    if (rgvProtocol.getTaskNo1()!=0 && (rgvProtocol.getStatusType1()==RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo1()==(short)32222){
                            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.getTaskNo1().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=1 || wrkMastSta.getWrkSts()!=1){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                       /* WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast) && wrkMastSta.getWrkType()!=5){
                            Thread.sleep(200);
                            SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                            if (staProtocol == null) {
                                continue;
                            } else {
                                staProtocol = staProtocol.clone();
                            }
                            if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                            log.error("小车任务完成下发输送线任务:"+staProtocol);
//                            try{
//                                Thread.sleep(1000);
//                                DevpThread devpThreadEnd = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//                                StaProtocol staProtocolEnd = devpThreadEnd.getStation().get(wrkMastSta.getStaEnd());
//                                log.error("小车任务完成读取输送线任务:"+staProtocolEnd);
//                                if (staProtocolEnd.getWorkNo()==0 ){ //|| !staProtocolEnd.getWorkNo().equals(wrkMast.getWrkNo())
//                                    staProtocolEnd.setWorkNo(wrkMast.getWrkNo());
//                                    staProtocolEnd.setStaNo(wrkMast.getStaNo());
//                                    if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocolEnd))) {
//                                        continue;
//                                    }
//                                    log.error("小车任务完成下发输送线任务第二次:"+staProtocolEnd);
//                                }
//                            }catch (Exception e){
//
//                            }
                        }*/
                        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 if (rgvProtocol.getTaskNo2()!=0 && (rgvProtocol.getStatusType2()==RgvStatusType.WAITING || rgvProtocol.getStatusType2()==RgvStatusType.FETCHWAITING)){
                        if (rgvProtocol.getTaskNo2()==(short)32222){
                            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().longValue());
                        if (Cools.isEmpty(wrkMastSta) || wrkMastSta.getType()!=2){
                            log.error("未查到小车执行任务或者执行任务状态不符合!"+wrkMastSta);
                            continue;
                        }
                        /*WrkMast wrkMast = wrkMastMapper.selectPakInStep3(wrkMastSta.getWrkNo().intValue());
                        if (!Cools.isEmpty(wrkMast)  && wrkMastSta.getWrkType()!=5){
                            Thread.sleep(200);
                            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
                            StaProtocol staProtocol = devpThread.getStation().get(wrkMastSta.getStaEnd());
                            if (!staProtocol.isAutoing() || !staProtocol.isLoading()){
                                continue;
                            }
                            // 下发站点信息
                            staProtocol.setWorkNo(wrkMast.getWrkNo());
                            staProtocol.setStaNo(wrkMast.getStaNo());
                            if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol))) {
                                continue;
                            }
                            log.error("小车任务完成下发输送线任务:"+staProtocol);
//                            try{
//                                Thread.sleep(1000);
//                                DevpThread devpThreadEnd = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
//                                StaProtocol staProtocolEnd = devpThreadEnd.getStation().get(wrkMastSta.getStaEnd());
//                                log.error("小车任务完成读取输送线任务:"+staProtocolEnd);
//                                if (staProtocolEnd.getWorkNo()==0 ){ //|| !staProtocolEnd.getWorkNo().equals(wrkMast.getWrkNo())
//                                    staProtocolEnd.setWorkNo(wrkMast.getWrkNo());
//                                    staProtocolEnd.setStaNo(wrkMast.getStaNo());
//                                    if (!MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocolEnd))) {
//                                        continue;
//                                    }
//                                    log.error("小车任务完成下发输送线任务第二次:"+staProtocolEnd);
//                                }
//                            }catch (Exception e){
//
//                            }
                        }*/
                        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());
                    }
                }
            }
        }catch (Exception e){
            log.error("小车复位线程报错!"+e);
        }
    }
    /**
     * 入出库  ===>>  小车作业下发
     */
@@ -1156,9 +1321,6 @@
                        case 4://取叠盘
                            signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
                            break;
                        case 5:////满取
                            signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave);
                            break;
                        case 6:////提升
//                            signWork = qwe();
                            break;
@@ -1178,9 +1340,6 @@
                                break;
                            case 4://取叠盘
                                signWork = rgvRunWrkMastEmptyStaTake(rgvSlave);
                                break;
                            case 5:////满取
                                signWork = rgvRunWrkMastEmptyStaTakeFull(rgvSlave);
                                break;
                            case 6:////提升
//                            signWork = rgvRunWrkMastEmptyStaPut();
@@ -1247,16 +1406,6 @@
                    BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaEnd());
                    if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){
                        continue;
                    }
                    if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                        if (basDevp.getLoadingSuper().equals("Y")){
                            continue;
                        }
                    }
                    if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                        if (!basDevp.getEmptyMk().equals("Y")){
                            continue;
                        }
                    }
                    Date date = new Date();
@@ -1365,16 +1514,6 @@
                        if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){
                            continue;
                        }
                        if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                            if (basDevp.getLoadingSuper().equals("Y")){
                                continue;
                            }
                        }
                        if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                            if (!basDevp.getEmptyMk().equals("Y")){
                                continue;
                            }
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
@@ -1473,16 +1612,6 @@
                        if (!basDevp.getAutoing().equals("Y") || basDevp.getLoading().equals("Y") || basDevp.getWrkNo()!=0){
                            continue;
                        }
                        if (basDevp.getDevNo()>117 && basDevp.getDevNo()<124){
                            if (basDevp.getLoadingSuper().equals("Y")){
                                continue;
                            }
                        }
                        if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                            if (!basDevp.getEmptyMk().equals("Y")){
                                continue;
                            }
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
@@ -1578,11 +1707,6 @@
                        if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){
                            continue;
                        }
                        if (basDevp.getDevNo()>=118 && basDevp.getDevNo()<=123){
                            if (!basDevp.getEmptyMk().equals("Y")){
                                continue;
                            }
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
@@ -1603,98 +1727,6 @@
                        log.info(date+"叠盘任务下发:小车工作档:"+wrkMastSta);
                        log.info(date+"叠盘任务下发:目标站状态:"+basDevp);
                        sign = rgvTakeEmpty(rgvProtocol.getRgvNo(),wrkMastSta);//叠盘
                    }else {
                        continue;
                    }
                    if (sign){
                        boolean signMap = rgvMapUpdate(basRgvMap, wrkMastSta.getStaStart(), basRgvMap.getStartRoute());
                        if (signMap){
                            wrkMastSta.setWrkSts(1);
                            try{
                                wrkMastStaMapper.updateById(wrkMastSta);
                            }catch (Exception e){
                                log.error("更新小车任务失败");
                            }
                            return true;
                        }else {
                            log.error("3879行,货物搬运任务:工作号{}所属任务下发后地图同步失败",wrkMastSta.getWrkNo());
                        }
                    }else {
                        log.error("工作号{}所属任务下发失败",wrkMastSta.getWrkNo());
                    }
                    break;
                }
            }
//            }
        }catch (Exception e){
            log.error("3989行执行小车取空板任务下发失败");
            log.error("3989行"+e);
        }
        return false;
    }
    public synchronized boolean rgvRunWrkMastEmptyStaTakeFull(RgvSlave rgvSlave) {//满取
        try{
//            for (RgvSlave rgvSlave:slaveProperties.getRgv()) {
            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                return false;
            }
            BasRgv basRgv = basRgvService.selectById(rgvSlave.getId());
            if (basRgv == null) {
                log.error("{}号RGV尚未在数据库进行维护!", rgvSlave.getId());
                return false;
            }
            // 只有当RGV空闲、自动,工位二无物//rgv可用
            if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                    && rgvProtocol.getStatusType1() == RgvStatusType.IDLE
                    && rgvProtocol.getStatusType2() == RgvStatusType.IDLE
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getTaskNo1()==0 && rgvProtocol.getTaskNo2()==0
                    &&  rgvProtocol.getLoaded2()==0  //现场修改:叠盘机,////0 无物;1 一层无物二层有物(只能拆叠)   ;2一层有物二层无物 (只能满放);3  1、2层都有物  4:()只允许拆盘
            ) {
                BasRgvMap basRgvMap = basRgvMapMapper.selectById(rgvProtocol.getRgvNo());
                if (basRgvMap == null) {
                    log.error("{}号RGV尚未在数据库地图中进行维护!", rgvProtocol.getRgvNo());
                    return false;
                }
                List<Integer> route = RouteUtils.getRoute(basRgvMap.getStartRoute(), basRgvMap.getEndRoute());
                basRgvMap.setNowRoute(rgvProtocol.getRgvPosI()); //更新小车当前位置站点号
                List<WrkMastSta> wrkMastStaList = wrkMastStaMapper.selectNoInterfereList(route, route);
                WrkMast wrkMast = wrkMastMapper.selectBy122ManQu(122,110,15L);
                if (!Cools.isEmpty(wrkMast)){
                    WrkMastSta wrkMastSta = wrkMastStaMapper.selectByWrkNo(wrkMast.getWrkNo().longValue());
                    if (!Cools.isEmpty(wrkMastSta) && wrkMastSta.getType()==2 && wrkMastSta.getWrkType()==5 ){
                        wrkMastStaList.add(wrkMastSta);
                    }
                }
                for (WrkMastSta wrkMastSta : wrkMastStaList){
                    if (wrkMastSta.getType()!=2 || wrkMastSta.getWrkType()!=5){// 2:空板  || 工作类型  1:取(叠盘)  2:拆盘  5:满取  6:满放
                        continue;
                    }
                    boolean sign = false;
                    if (wrkMastSta.getStaStart()!=0){//满取
                        BasDevp basDevp = basDevpService.selectById(wrkMastSta.getStaStart());
                        if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")){
                            continue;
                        }
                        Date date = new Date();
                        SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, rgvSlave.getDevpPlcId());
                        StaProtocol staProtocol = devpThread.getStation().get(basDevp.getDevNo());
                        if (staProtocol == null) {
                            log.info(date+"满取任务下发:未查询到站点信息:"+wrkMastSta);
                            continue;
                        }
                        if (!staProtocol.isAutoing() || staProtocol.isLoading()){
                            continue;
                        }
                        log.info(date+"满取任务下发:小车工作档:"+wrkMastSta);
                        log.info(date+"满取任务下发:目标站状态:"+basDevp);
                        sign = rgvTakeEmptyFull(rgvProtocol.getRgvNo(),wrkMastSta);
                    }else {
                        continue;
                    }
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -229,12 +229,12 @@
            } else {
                staProtocol = staProtocol.clone();
            }
            Short workNo = staProtocol.getWorkNo();
            Integer workNo = staProtocol.getWorkNo();
            if (wharfCode1.contains(param.getWharfCode())){
                if (!staProtocol.isLoading() && !staProtocol.isCar() && staProtocol.getWorkNo() >0){
                if (!staProtocol.isLoading() && staProtocol.getWorkNo() >0){
                    //AGV出库完成以后
                    staProtocol.setWorkNo((short) 0);
                    staProtocol.setStaNo((short)0);
                    staProtocol.setWorkNo( 0);
                    staProtocol.setStaNo(0);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                    if (result) {
@@ -246,10 +246,10 @@
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    if (inSta.getBackSta().equals(staDesc.getStnNo())){
                        if (staProtocol.isLoading() && !staProtocol.isCar() && workNo == 0){
                        if (staProtocol.isLoading() && workNo == 0){
                            //AGV入库完成以后
                            staProtocol.setWorkNo((short) 9999);
                            staProtocol.setStaNo(inSta.getStaNo().shortValue());
                            staProtocol.setWorkNo(9999);
                            staProtocol.setStaNo(inSta.getStaNo());
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                            if (result) {
@@ -322,7 +322,7 @@
                } else {
                    staProtocol = staProtocol.clone();
                }
                Short workNo = staProtocol.getWorkNo();
                Integer workNo = staProtocol.getWorkNo();
                if (workNo == 0 && !staProtocol.isLoading()){
                    if (Cools.isEmpty( map.get(inSta.getStaNo()))){
                        continue;
@@ -358,7 +358,7 @@
                } else {
                    staProtocol = staProtocol.clone();
                }
                Short workNo = staProtocol.getWorkNo();
                Integer workNo = staProtocol.getWorkNo();
                if (workNo == 0 && !staProtocol.isLoading()){
                    if (Cools.isEmpty( map.get(inSta.getStaNo()))){
                        continue;
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -213,8 +213,8 @@
        //生成输送线命令
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()).clone();
        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
        staProtocol.setStaNo((short) Integer.parseInt(taskWrk.getTargetPoint()));
        staProtocol.setWorkNo(taskWrk.getWrkNo());
        staProtocol.setStaNo(Integer.parseInt(taskWrk.getTargetPoint()));
        if (!CommandUtils.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(3, staProtocol))) {
            log.error("输送线命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
            throw new CoolException("输送线命令生成失败");
src/main/java/com/zy/asrs/utils/CommandUtils.java
@@ -90,7 +90,7 @@
            commandInfoService.insert(commandInfo);//插入指令
            staProtocol.setCommandId(commandInfo.getId());
//            staProtocol.setCommandId(commandInfo.getId());
            commandPackage.setCommand(staProtocol);
            commandPackage.setWrkNo(wrkNo);
            commandPackage.setDevice("输送线");
src/main/java/com/zy/core/enums/RouteCollectCountType.java
New file
@@ -0,0 +1,42 @@
package com.zy.core.enums;
public enum RouteCollectCountType {
    INTERSECTION(0, "交集"),   // 交集
    DIFFERENCESET(1, "差集"),   // 差集
    UNION(2, "并集"),  //并集
    DEDUPLICATIONUNION(3, "去重并集"),  //去重并集
    ;
    public Integer id;
    public String desc;
    RouteCollectCountType(Integer id, String desc) {
        this.id = id;
        this.desc = desc;
    }
    public static RouteCollectCountType get(Short id) {
        if (null == id) {
            return null;
        }
        for (RouteCollectCountType type : RouteCollectCountType.values()) {
            if (type.id.equals(id.intValue())) {
                return type;
            }
        }
        return null;
    }
    public static RouteCollectCountType get(RouteCollectCountType type) {
        if (null == type) {
            return null;
        }
        for (RouteCollectCountType crnLiftPosType : RouteCollectCountType.values()) {
            if (crnLiftPosType == type) {
                return crnLiftPosType;
            }
        }
        return null;
    }
}
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -1,11 +1,7 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.CommandInfo;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * 输送线plc单个站点详细信息
@@ -19,11 +15,11 @@
    // ----------------------------------------------------------------
    // 工作号
    private Short workNo = 0;
    private Integer workNo = 0;
    // ----------------------------------------------------------------
    // 目标站
    private Short staNo;
    private Integer staNo;
    // ----------------------------------------------------------------
    // 自动
@@ -45,13 +41,10 @@
    private boolean fullPlt;
    // 高
    private boolean high = false;
    private boolean high;
    // 低
    private boolean low;
    //agv
    private boolean car;
    // 锁定标记
    private boolean pakMk = true;
@@ -62,134 +55,38 @@
    // 隔壁站点(台车位置)
    private String nearbySta;
    //指令ID
    private Integer commandId;
    // 外形检测 ------------------------------------------------------------------------
    // 前超限
    private boolean frontErr = false;
    private boolean frontErr;
    // 后超限
    private boolean backErr = false;
    private boolean backErr;
    // 高超限
    private boolean highErr = false;
    private boolean highErr;
    // 左超限
    private boolean leftErr = false;
    private boolean leftErr;
    // 右超限
    private boolean rightErr = false;
    private boolean rightErr;
    // 超重
    private boolean weightErr = false;
    private boolean weightErr;
    // 扫码失败
    private boolean barcodeErr = false;
    private boolean barcodeErr;
    //故障-----------------------------------------------------------------------
    private Boolean breakerErr = false; //断路器故障
    private Boolean infraredErr = false; //光电异常
    private Boolean outTimeErr = false; //运行超时
    private Boolean seizeSeatErr = false; //占位超时
    private Boolean wrkYgoodsN = false;//有任务无货故障
    private Boolean inverterErr = false; //变频器故障
    private Boolean contactErr = false; //电机接触器故障
    private Boolean upcontactErr = false; //顶升电机接触器故障
    private Short agvStartPick; //允许取货
    private Short agvStartPlace; //允许放货
    private Short agvTypeSign; //允许放货
    private Short agvTargetPick; //取货完成
    private Short agvTargetPlace; //放货完成
    private Short agvTypeSignEnd; //放货完成
    private List<Integer> alarm;
    public List<Integer> getAlarm(){
        List<Integer> alarm = new ArrayList<>();
        if (breakerErr){
            alarm.add(1);
        }
        if (infraredErr){
            alarm.add(2);
        }
        if (outTimeErr){
            alarm.add(3);
        }
        if (seizeSeatErr){
            alarm.add(4);
        }
        if (wrkYgoodsN){
            alarm.add(5);
        }
        if (inverterErr){
            alarm.add(6);
        }
        if (contactErr){
            alarm.add(7);
        }
        if (upcontactErr){
            alarm.add(8);
        }
        return alarm;
    }
    // Super有无信息
    private boolean loadingSuper = true;
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
        basDevp.setDevNo(siteId);
        basDevp.setWrkNo(workNo.intValue());
        basDevp.setWrkNo(workNo);
        basDevp.setAutoing(autoing?"Y":"N");
        basDevp.setLoading(loading?"Y":"N");
        if (frontErr){
            basDevp.setStaErr(11);
        }else if (backErr){
            basDevp.setStaErr(12);
        }else if (highErr){
            basDevp.setStaErr(13);
        }else if (leftErr){
            basDevp.setStaErr(14);
        }else if (rightErr){
            basDevp.setStaErr(15);
        }else if (weightErr){
            basDevp.setStaErr(16);
        }else if (barcodeErr){
            basDevp.setStaErr(17);
        }else if (breakerErr){
            basDevp.setStaErr(18);
        }else if (infraredErr){
            basDevp.setStaErr(19);
        }else if (outTimeErr){
            basDevp.setStaErr(110);
        }else if (seizeSeatErr){
            basDevp.setStaErr(111);
        }else if (wrkYgoodsN){
            basDevp.setStaErr(112);
        }else if (inverterErr){
            basDevp.setStaErr(113);
        }else if (contactErr){
            basDevp.setStaErr(114);
        }else if (upcontactErr){
            basDevp.setStaErr(115);
        }else {
            if (!loading){
                basDevp.setStaErr(0);
            }
        }
        basDevp.setInEnable(inEnable?"Y":"N");
        basDevp.setOutEnable(outEnable?"Y":"N");
        basDevp.setLocType1((short) 0);  // 高低类型{0:未知,1:低库位,2:高库位}
src/main/java/com/zy/core/properties/SlaveProperties.java
@@ -4,6 +4,7 @@
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.LedSlave;
import com.zy.core.model.RgvSlave;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -32,6 +33,8 @@
    private List<CrnSlave> crn = new ArrayList<>();
    private List<RgvSlave> rgv = new ArrayList<>();
    private List<DevpSlave> devp = new ArrayList<>();
    private List<Slave> barcode = new ArrayList<>();
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -125,15 +125,6 @@
                        write((StaProtocol)task.getData());
                        read();
                        break;
                    // 写数据 ID+目标站
                    case 4:
                        writeAgvOk((StaProtocol)task.getData());
                        read();
                        break;
                   /* case 3:
                        write2((StaProtocol)task.getData());
                        read();
                        break;*/
                    default:
                        break;
                }
@@ -160,13 +151,13 @@
                staProtocol.setSiteId(siteId);
                station.put(siteId, staProtocol);
            }
            staProtocol.setWorkNo((short) 0);    // ID
            staProtocol.setWorkNo(0);    // ID
            staProtocol.setAutoing(false);      // 自动
            staProtocol.setLoading(false);      // 有物
            staProtocol.setInEnable(false);     // 可入
            staProtocol.setOutEnable(false);    // 可出
            staProtocol.setEmptyMk(false);      // 空板信号
            staProtocol.setStaNo((short) 0);     // 目标站
            staProtocol.setStaNo(0);     // 目标站
            if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                staProtocol.setPakMk(true);
@@ -214,9 +205,9 @@
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo((short)siemensS7Net.getByteTransform().TransInt32(result.Content, i*8));     // 工作号
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, i*8 + 4));   // 目标站
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt32(result.Content, i*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result.Content, i*8 + 6, 2);
                staProtocol.setAutoing(status[0]);  // 自动
@@ -246,8 +237,8 @@
                        staProtocol.setSiteId(siteId);
                        station.put(siteId, staProtocol);
                    }
                    staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6+4));     // 允许取货
                    staProtocol.setAgvStartPlace((short)0);   // 允许放货
//                    staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6+4));     // 允许取货
//                    staProtocol.setAgvStartPlace((short)0);   // 允许放货
                    continue;
                }
                Integer siteId = staNos.get(i); // 站点编号
@@ -257,8 +248,8 @@
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6));     // 允许取货
                staProtocol.setAgvStartPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6 + 2));   // 允许放货
//                staProtocol.setAgvStartPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6));     // 允许取货
//                staProtocol.setAgvStartPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlc.Content, sign*6 + 2));   // 允许放货
            }
        }
@@ -274,8 +265,8 @@
                        staProtocol.setSiteId(siteId);
                        station.put(siteId, staProtocol);
                    }
                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6+4));     // 允许取货
                    staProtocol.setAgvTargetPlace((short)0);   // 允许放货
//                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6+4));     // 允许取货
//                    staProtocol.setAgvTargetPlace((short)0);   // 允许放货
                    continue;
                }
                Integer siteId = staNos.get(i); // 站点编号
@@ -285,18 +276,18 @@
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                try{
                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6));     // 取货完成
                    if (staProtocol.getAgvTargetPick()!=0){
                        System.out.println(staProtocol.getAgvTargetPick());
                    }
                    staProtocol.setAgvTargetPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6 + 2));   // 放货完成
                    if (staProtocol.getAgvTargetPlace()!=0){
                        System.out.println(staProtocol.getAgvTargetPlace());
                    }
                }catch (Exception e){
                    log.error(""+e);
                }
//                try{
//                    staProtocol.setAgvTargetPick(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6));     // 取货完成
//                    if (staProtocol.getAgvTargetPick()!=0){
//                        System.out.println(staProtocol.getAgvTargetPick());
//                    }
//                    staProtocol.setAgvTargetPlace(siemensS7Net.getByteTransform().TransInt16(resultAgvAndPlcOk.Content, sign*6 + 2));   // 放货完成
//                    if (staProtocol.getAgvTargetPlace()!=0){
//                        System.out.println(staProtocol.getAgvTargetPlace());
//                    }
//                }catch (Exception e){
//                    log.error(""+e);
//                }
            }
        }
@@ -322,14 +313,14 @@
                    Integer siteId = staNos.get(i); // 站点编号
                    boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, i * 4, 1);
                    StaProtocol staProtocol = station.get(siteId);
                    staProtocol.setBreakerErr(status[0]);
                    staProtocol.setInfraredErr(status[1]);
                    staProtocol.setOutTimeErr(status[2]);
                    staProtocol.setSeizeSeatErr(status[3]);
                    staProtocol.setWrkYgoodsN(status[4]);
                    staProtocol.setInverterErr(status[5]);
                    staProtocol.setContactErr(status[6]);
                    staProtocol.setUpcontactErr(status[7]);
//                    staProtocol.setBreakerErr(status[0]);
//                    staProtocol.setInfraredErr(status[1]);
//                    staProtocol.setOutTimeErr(status[2]);
//                    staProtocol.setSeizeSeatErr(status[3]);
//                    staProtocol.setWrkYgoodsN(status[4]);
//                    staProtocol.setInverterErr(status[5]);
//                    staProtocol.setContactErr(status[6]);
//                    staProtocol.setUpcontactErr(status[7]);
                }
            }
@@ -392,90 +383,6 @@
        }
    }
    /**
     * 写入 ID+目标站 =====> 单站点写入
     */
    private void writeAgvOk(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        if (staProtocol.getAgvTypeSign()==0 || staProtocol.getAgvTypeSign()==2 ){  //0取货
            switch (staProtocol.getSiteId()){
                case 100:
                    index=32;
                    break;
                case 101:
                    index=34;
                    break;
                case 102:
                    index=38;
                    break;
                case 103:
                    index=40;
                    break;
                case 104:
                    index=44;
                    break;
                case 105:
                    index=46;
                    break;
                case 106:
                    index=50;
                    break;
                case 107:
                    index=52;
                    break;
                default:
                    return;
            }
        }else {
            switch (staProtocol.getSiteId()){
                case 100:
                    index=30;
                    break;
                case 102:
                    index=36;
                    break;
                case 104:
                    index=42;
                    break;
                case 106:
                    index=48;
                    break;
                default:
                    return;
            }
        }
        OperateResult write = null;
        //任务下发次数
        int writeCount = 0;
        do {
            short textWrite = 1;// 任务完成
            if (staProtocol.getAgvTypeSign()>1){
                textWrite = 0;// 任务复位
            }
            write = siemensS7Net.Write("DB102." + index, textWrite);
            if(write.IsSuccess){
                writeCount=6;
            }else {
                writeCount++;
                log.error("写入输送线取放货完成命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
        }while (writeCount<5);
        if (!write.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线站点数据失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线取放货完成站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            log.info("输送线取放货完成命令下发码垛完成  给输送线写任务完成 [id:{}] >>>>> 命令下发: {}",  slave.getId(), JSON.toJSON(staProtocol));
        }
    }
    private void write(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
@@ -547,88 +454,6 @@
//            }
        }
    }
    private void write2(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {
            return;
        }
        ArrayList<Integer> staNos = getStaNo();
        int index = staNos.indexOf(staProtocol.getSiteId());
        short[] array = new short[2];
        array[0] = staProtocol.getWorkNo();
        array[1] = staProtocol.getStaNo();
        OperateResult writeResult;
        //任务下发次数
        int writeCount = 0;
        //任务下发成功标识
        boolean writeFlag = false;
        while(writeCount < 5){
            writeResult = siemensS7Net.Write("DB100." + index*4, array);    // 工作号、目标站
            if(writeResult.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*4, (short)4);
                if(readResult.IsSuccess){
                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
                        //任务命令写入成功
                        writeFlag = true;
                        log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                        Date now = new Date();
                        break;
                    } else {//返回结果是成功了,但是真实值不相同
                        writeCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol),writeCount));
                        log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                    }
                } else {
                    writeCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后读取失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol), writeCount));
                    log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                }
            } else {
                writeCount++;
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                        slave.getId(), JSON.toJSON(staProtocol),writeCount));
                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
            Thread.sleep(200);
        }
        //写命令尝试了5次还是失败了
        if(!writeFlag){
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线命令尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            //重新添加数据到任务队列
            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(3, staProtocol));
            read();//读取1次设备状态
            return;
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            //log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}",  slave.getId(), JSON.toJSON(staProtocol));
            Integer siteId = staProtocol.getSiteId();
            staProtocol = station.get(siteId);
            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
                staProtocol.setPakMk(true);
            }
        }
    }
src/main/resources/application-prod.yml
@@ -22,121 +22,12 @@
    id: 1
    slot: 0
    demo: false
  crn[1]: #堆垛机2
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 103
      row: 5
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    ip: 192.168.4.250
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 102
      row: 4
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    id: 2
    slot: 0
    demo: false
  crn[2]: #堆垛机3
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 105
      row: 9
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    ip: 192.168.4.250
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 104
      row: 8
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    id: 3
    slot: 0
    demo: false
  crn[3]: #堆垛机4
    rack: 0
    offset: 2    #偏移量,当堆垛机站点列号=1时,偏移量=2
    port: 102
    crnOutStn[0]:    #堆垛机出库站点
      staNo: 107
      row: 12
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    ip: 192.168.4.250
    crnInStn[0]:    #堆垛机入库站点1
      staNo: 106
      row: 11
      bay: 1
      lev: 1
      devpPlcId: ${wcs-slave.devp[0].id}
    id: 4
    slot: 0
    demo: false
  barcode[0]: #条码扫描仪1
    port: 51236
    ip: 10.10.10.52
    id: 1
  barcode[1]: #条码扫描仪2
    port: 51236
    ip: 192.168.4.250
    id: 2
  barcode[2]: #条码扫描仪3
    port: 51236
    ip: 192.168.4.250
    id: 3
  barcode[3]: #条码扫描仪4
    port: 51236
    ip: 192.168.4.250
    id: 4
  devp[0]: #输送线
    emptyInSta[2]: #空板入库口3
      staNo: 104
    emptyInSta[1]: #空板入库口2
      staNo: 102
    rack: 0
    emptyInSta[0]: #空板入库口1
      staNo: 100
    ip: 192.168.4.250
    outSta[4]: #出库口5
      staNo: 104
    outSta[3]: #出库口4
      staNo: 103
    outSta[6]: #出库口7
      staNo: 106
    slot: 0
    outSta[5]: #出库口6
      staNo: 105
    outSta[0]: #出库口1
      staNo: 100
    outSta[2]: #出库口3
      staNo: 102
    emptyInSta[3]: #空板入库口4
      staNo: 106
    outSta[1]: #出库口2
      staNo: 101
    inSta[2]:
      staNo: 104
      barcode: ${wcs-slave.barcode[2].id}
    inSta[3]:
      staNo: 106
      barcode: ${wcs-slave.barcode[3].id}
    port: 102
    outSta[7]: #出库口8
      staNo: 107
    inSta[0]: #入库口1
      staNo: 100
      barcode: ${wcs-slave.barcode[0].id}
    inSta[1]: #入库口2
      staNo: 102
      barcode: ${wcs-slave.barcode[1].id}
    id: 1
src/main/resources/application.yml
@@ -50,6 +50,7 @@
wms:
  # 是否开启上报
  start: true
  rgvOpen: true
  # WMS系统ip
  #url: 10.32.53.195:8080
  # WMS系统ip
src/main/resources/mapper/WrkMastStaMapper.xml
@@ -22,102 +22,102 @@
    </resultMap>
    <select id="selectAllWrkMastStaList" resultMap="BaseResultMap">
        select * from asr_wrk_mast_sta
        select * from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        and wrk_sts=0
        and WRK_STS=0
        <if test="type!=null">
            and type = #{type}
            and TYPE = #{type}
        </if>
        order by line_number,id
        order by LINE_NUMBER,ID
    </select>
    <select id="selectByWrkNo" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast_sta
        select top 1 * from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        and wrk_no = #{workNo}
        and WRK_NO = #{workNo}
    </select>
    <select id="selectNoInterfere" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast_sta
        select top 1 * from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        and (sta_start in
        and (STA_START in
        <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>
        or sta_start = 0
        or STA_START = 0
        )
        and (sta_end in
        and (STA_END in
        <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>
        or sta_end = 0
        or STA_END = 0
        )
        and wrk_sts=0
        order by line_number,id
        and WRK_STS=0
        order by LINE_NUMBER,ID
    </select>
    <select id="selectNoInterfereList" resultMap="BaseResultMap">
        select * from asr_wrk_mast_sta
        select * from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        and (sta_start in
        and (STA_START in
        <foreach item="item" collection="staStarts" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>
        or sta_start = 0
        or STA_START = 0
        )
        and (sta_end in
        and (STA_END in
        <foreach item="item" collection="staEnds" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>
        or sta_end = 0
        or STA_END = 0
        )
        and wrk_sts=0
        order by line_number,id
        and WRK_STS=0
        order by LINE_NUMBER,ID
    </select>
    <select id="selectAllWrkCount" resultType="Integer">
        select count(1) from asr_wrk_mast_sta
        select count(1) from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        <if test="type!=null">
            and type = #{type}
            and TYPE = #{type}
        </if>
    </select>
    <select id="selectAllWrkCount108" resultType="Integer">
        select count(1) from asr_wrk_mast_sta
        select count(1) from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        and type = 1
        and (sta_end = 108 or sta_start = 108)
        and TYPE = 1
        and (STA_END = 108 or STA_START = 108)
    </select>
    <select id="selectAllWrkCount108Y" resultType="Integer">
        select count(1) from asr_wrk_mast_sta
        select count(1) from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
--         and type = 1
        and ((sta_end &lt;= 108 or sta_start &lt;= 108)
        or (sta_end = 118 or sta_start = 118)
        or (sta_end = 122 or sta_start = 122))
        and ((STA_END &lt;= 108 or STA_START &lt;= 108)
        or (STA_END = 118 or STA_START = 118)
        or (STA_END = 122 or STA_START = 122))
    </select>
    <select id="selectAllWrkStsCount" resultType="Integer">
        select count(1) from asr_wrk_mast_sta
        select count(1) from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        <if test="type!=null">
            and type = #{type}
            and TYPE = #{type}
        </if>
        <if test="wrkSts!=null">
            and wrk_sts = #{wrkSts}
            and WRK_STS = #{wrkSts}
        </if>
    </select>
    <select id="selectAllWrkStsCountWrkMastSta" resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast_sta
        select top 1 * from "SOURCE"."asr_wrk_mast_sta"
        where 1=1
        <if test="type!=null">
            and type = #{type}
            and TYPE = #{type}
        </if>
        <if test="wrkSts!=null">
            and wrk_sts = #{wrkSts}
            and WRK_STS = #{wrkSts}
        </if>
    </select>