自动化立体仓库 - WCS系统
pang.jiabao
昨天 e9a5f5c065e7232e9d5ca1f2a4948d2f8e6e0c03
米多泉州wcs开发完成
2个文件已添加
1个文件已删除
10个文件已修改
1267 ■■■■ 已修改文件
src/main/java/com/zy/common/model/CanningLineInLocParam.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/CombParam.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/SearchLocParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/controller/OpenController.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/WrkMast.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 527 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 146 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/CanningLineInLocParam.java
New file
@@ -0,0 +1,23 @@
package com.zy.common.model;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 罐装完成,申请入成品库
 * @createDate 2025/4/24 10:13
 */
@Data
public class CanningLineInLocParam {
    /**
     * 任务号
     */
    private Integer wrkNo;
    /**
     * 源站点
     */
    private Integer sourceStaNo;
}
src/main/java/com/zy/common/model/CombParam.java
New file
@@ -0,0 +1,54 @@
package com.zy.common.model;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/28
 */
@Data
public class CombParam {
    // 单据编号
    private String orderNo;
    // 托盘条码
    private String barcode;
    // 库位编号
    private String locNo;
    private List<CombMat> combMats;
    @Data
    public static class CombMat {
        private String orderNo;
        // 物料编号
        private String matnr = "";
        // 序列码
        private String batch = "";
        private String brand = "";
        private String standby1 = "";
        private String standby2 = "";
        private String standby3 = "";
        private String boxType1 = "1";
        private String boxType2 = "1";
        private String boxType3 = "1";
        // 物料数量
        private Double anfme;
        // 商品名称
        private String maktx;
        // 规格
        private String specs;
    }
}
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -1,6 +1,5 @@
package com.zy.common.model;
import com.core.exception.CoolException;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
@@ -34,11 +33,11 @@
//        if (staProtocol.isHigh() == staProtocol.isLow()) {
//            throw new CoolException("plc高低检测异常");
//        }
        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
            this.locType1 = 2; // 高库位
        }else {
//        if (staProtocol.getSiteId() == 106 || staProtocol.getSiteId() == 159){
//            this.locType1 = 2; // 高库位
//        }else {
            this.locType1 = 1; // 低库位
        }
//        }
    }
    /**
src/main/java/com/zy/common/model/SearchLocParam.java
@@ -3,6 +3,9 @@
import com.alibaba.fastjson.JSON;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by vincent on 2020/10/30
 */
@@ -18,6 +21,23 @@
    // 库位规格( 0:未知, 1:低库位, 2:中库位, 3:高库位 )
    private Short locType1;
    /**
     * 库区类型 1.成品库,2.空桶库
     */
    private int locArea;
    // 入库桶编号
    private String bucketType;
    // 入库桶数量
    private int bucketCount;
    // 尾托标识
    private boolean tailSupportFlag;
    // 罐装线要桶 罐装线号-桶类型
    private Map<Integer,String> wantBucketFlag =  new HashMap<>();
    public static void main(String[] args) {
        SearchLocParam searchLocParam = new SearchLocParam();
        searchLocParam.setIoType(1);
src/main/java/com/zy/controller/OpenController.java
File was deleted
src/main/java/com/zy/core/MainProcess.java
@@ -41,12 +41,22 @@
                        continue;
                    }
                    // 托盘到达rgv接驳站点,更改工作档状态为9.呼叫RGV,环穿程序调度rgv
                    mainService.callRgv();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(1); // 组托
                    Thread.sleep(500);
                    // 生成 空子/母托盘任务
                    // 生成 空子/母托盘出库任务
                    mainService.generateEmptyPalletStoreWrk();
                    // 入库 ===>> 空子托盘入库
                    mainService.storeEmptyPlt();
                    // 入库 ===>> 母空托盘叠满入库
                    mainService.autoEmptyIn();
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn(4);
@@ -57,6 +67,9 @@
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished(6);
                    // 空桶罐装完成到达罐装线rgv口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务
                    mainService.canningLineTaskFinish();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr(7);
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -58,6 +58,26 @@
    //lfd入库印记  当stamp>=2时才入库
    private Integer stamp = 0;
    /**
     * 入库桶编号/物料号
     */
    private String bucketType;
    /**
     * 入库桶数量,托盘上有几个桶
     */
    private int bucketCount;
    /**
     * 尾托标识 0不是尾托,1是尾托
     */
    private boolean tailSupportFlag;
    /**
     * 清除要桶信号 0.不用清除,123清除相应要桶信号
     */
    private int clearBucketSignal;
    // 外形检测 ------------------------------------------------------------------------
    // 前超限
@@ -97,14 +117,6 @@
    private Boolean contactErr = false; //电机接触器故障
    private Boolean upcontactErr = false; //顶升电机接触器故障
    private Boolean ifOpenDoor = false; // 是否打开
    private Boolean ifCloseDoor = false; // 是否关闭
    private Boolean openAskDoor = false; // 请求开门
    private Boolean closeAskDoor = false; // 请求关门
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -278,15 +278,9 @@
        array[7] = command.getDestinationPosY(); // 目标位置列号
        array[8] = command.getDestinationPosZ(); // 目标位置层号
        array[9] = command.getCommand();
//        array[10] = 0;   //备用1
//        boolean[] array2 = new boolean[1];
//        array2[0] = command.isTraySize();
        OperateResult result = siemensNet.Write("DB100.0", array);
//        OperateResult result2 = siemensNet.Write("DB100.22", array2);
        News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), array);
//        if(!result.IsSuccess || !result2.IsSuccess){
            if(!result.IsSuccess){
            News.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, command));
@@ -372,14 +366,6 @@
            }
        }
//        if (command.getAckFinish() == 0) {
//            short commandFinish = 1;
//            Thread.sleep(200L);
//            result = siemensNet.Write("DB100.18", commandFinish);
//            log.info("堆垛机commandFinish下发[id:{}] >>>>> {}", slave.getId(), commandFinish);
////            result = siemensNet.Write("DB100.22", commandFinish);
//        }
        try {
            // 日志记录
            BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
@@ -403,7 +389,7 @@
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
        if (result.IsSuccess) {
            this.readStatus();
            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -43,10 +43,15 @@
    private short heartBeatVal = 1;
    private StaError1 staError1;
    public static final ArrayList<Integer> staNos = new ArrayList<Integer>() {{
        add(1002);add(1020);add(1035);add(103);
        add(104);add(105);add(106);add(107);
        add(200);add(201);add(202);add(203);add(210);
        add(300);add(301);add(302);add(303);add(304);add(305);
        add(1001);add(1002);add(1004);add(1005);add(1006);add(1007);add(1008);add(1009);add(1010);add(1011);add(1012);
        add(1041);add(1042);add(1043);add(1013);add(1014);add(1015);add(1016);add(1017);add(1018);add(1019);add(1020);
        add(1034);add(1035);add(1036);add(1038);add(1039);add(1040);
        add(1022);add(1023);add(1024);add(1025);add(1026);add(1027);add(1028);add(1030);add(1031);add(1032);add(1033);
        add(1044);add(1045);add(1046);add(1047);add(1049);add(1050);add(1051);add(1052);add(1053);add(1054);add(1056);add(1057);
        add(1061);add(1063);add(1064);add(1065);add(1066);add(1067);add(1068);add(1073);add(1074);add(1075);add(1077);add(1078);add(1079);
        add(1081);add(1082);add(1083);add(1084);add(1085);add(1086);add(1087);add(1088);add(1089);add(1090);
        add(1091);add(1092);add(1093);add(1094);add(1095);add(1096);add(1097);add(1098);add(1099);add(1100);add(1101);add(1102);add(1103);add(1104);
        add(1105);add(1106);add(1107);
    }};
    public static final ArrayList<Integer> BarcodeList = new ArrayList<Integer>() {{
@@ -55,6 +60,9 @@
    public static final ArrayList<Integer> staNosErrList = new ArrayList<Integer>() {{
        add(101); add(103);
    }};
    // 罐装线要桶标识
    private volatile Map<Integer,String> wantBucketFlag =  new HashMap<>();
    /**
     * 条码数量
@@ -105,10 +113,6 @@
                        write((StaProtocol)task.getData());
//                        log.error("输送线下发命令:"+((StaProtocol) task.getData()).getWorkNo()+","+((StaProtocol) task.getData()).getStaNo());
                        break;
                    // 写开门
                    case 3:
                        write2((Integer) task.getData());
                        break;
                    default:
                        break;
                }
@@ -119,44 +123,6 @@
                e.printStackTrace();
            }
        }
    }
    private void write2(int flag) throws InterruptedException {
        if (flag == 0) {
            OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1);
            if (readOpenResult.IsSuccess) {
                boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1);
                booleans[1] = true; // 关门信号
                booleans[0] = false;
                siemensS7Net.Write("DB100.826",booleans);
                log.info("下发关门信号成功:" + Arrays.toString(booleans));
            }
        } else if(flag == 1) {
            OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1);
            if (readOpenResult.IsSuccess) {
                boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1);
                booleans[0] = true; // 开门信号
                booleans[1] = false;
                siemensS7Net.Write("DB100.826",booleans);
                log.info("下发开门信号成功:" + Arrays.toString(booleans));
            }
        }
        Thread.sleep(500);
        OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1);
        if (readOpenResult.IsSuccess) {
            boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1);
            StaProtocol staProtocol = station.get(305);
            if (null == staProtocol) {
                staProtocol = new StaProtocol();
                staProtocol.setSiteId(305);
                station.put(305, staProtocol);
            }
            staProtocol.setOpenAskDoor(booleans[0]);
            staProtocol.setCloseAskDoor(booleans[1]);
            staProtocol.setIfOpenDoor(booleans[2]);
            staProtocol.setIfCloseDoor(booleans[3]);
            log.info("下发开关门后回读:" + Arrays.toString(booleans));
        }
    }
@@ -211,10 +177,10 @@
     * 读取状态 ====> 整块plc
     */
    private void read() throws InterruptedException {
//        // 更新入出库模式
//        updateIoMode();
//        ArrayList<Integer> staNos = getStaNo();
//        int staNoSize = staNos.size();
        wantBucketFlag.clear();
        //todo 读取罐装线PLC要桶标识
        wantBucketFlag.put(1,"IBC");
        // 读一楼连续8个站点
        OperateResultExOne<byte[]> result = siemensS7Net.Read("DB101.0", (short) (8*8));
        if (result.IsSuccess) {
@@ -245,112 +211,6 @@
                }
            }
        }
        // 读二楼连续4个站点
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB101.800", (short) (4*8));
        if (result2.IsSuccess) {
            for (int i = 8; i < 12; i++) {
                Integer siteId = staNos.get(i); // 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result2.Content, (i-8)*8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result2.Content, (i-8)*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result2.Content, (i-8)*8 + 6, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setOutEnable(status[3]);// 可出
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
        // 读二楼210
        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB101.880", (short) (8));
        if (result3.IsSuccess) {
                Integer siteId = staNos.get(12); // 站点编号210
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result3.Content, 0));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result3.Content, 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result3.Content, 6, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setOutEnable(status[3]);// 可出
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
        }
        // 读二楼3区
        OperateResultExOne<byte[]> result4 = siemensS7Net.Read("DB101.1600", (short) (6*8));
        if (result2.IsSuccess) {
            for (int i = 13; i < staNos.size(); i++) {
                Integer siteId = staNos.get(i); // 站点编号
                StaProtocol staProtocol = station.get(siteId);
                if (null == staProtocol) {
                    staProtocol = new StaProtocol();
                    staProtocol.setSiteId(siteId);
                    station.put(siteId, staProtocol);
                }
                staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt32(result4.Content, (i-13)*8));     // 工作号
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result4.Content, (i-13)*8 + 4));   // 目标站
                boolean[] status = siemensS7Net.getByteTransform().TransBool(result4.Content, (i-13)*8 + 6, 2);
                staProtocol.setAutoing(status[0]);  // 自动
                staProtocol.setLoading(status[1]);  // 有物
                staProtocol.setInEnable(status[2]); // 可入
                staProtocol.setOutEnable(status[3]);// 可出
                staProtocol.setEmptyMk(status[4]);  // 空板信号
                staProtocol.setFullPlt(status[5]);  // 满托盘
                staProtocol.setHigh(status[6]);     // 高库位
                staProtocol.setLow(status[7]);      // 低库位
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
            }
        }
//        BasRgvMapService basRgvMapService = SpringUtils.getBean(BasRgvMapService.class);
        //RGV小车1
//        Thread.sleep(100);
//        OperateResultExOne<byte[]> result3 = siemensS7Net.Read("DB50.200",(short)10);
//        if (result3.IsSuccess) {
//            BasRgvMap basRgvMap = basRgvMapService.selectByRgvNo((int) siemensS7Net.getByteTransform().TransInt16(result3.Content, 0));
//            if (!Cools.isEmpty(basRgvMap)){
//                Integer siteId = 1;
//                StaProtocol staProtocol = station.get(siteId);
//                if (null == staProtocol) {
//                    staProtocol = new StaProtocol();
//                    staProtocol.setSiteId(siteId);
//                    station.put(siteId, staProtocol);
//                }
//                staProtocol.setAutoing(true);
//                staProtocol.setNearbySta(String.valueOf(siemensS7Net.getByteTransform().TransInt16(result3.Content, 8)));
//            }
//        }
        // 条码扫描器
        OperateResultExOne<byte[]> barcodeResult = siemensS7Net.Read("DB101.1672", (short) ((BarcodeList.size()+1) * 8)); // 不连续
@@ -396,145 +256,6 @@
            }
        }
        // 读二楼连续4个站点,故障信息反馈
        OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB101.3512", (short) (4*2));
        if (resultErr3.IsSuccess) {
            for (int i = 8; i < 12; i++) {
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, (i-8) * 2 + 1, 1);
                StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号
                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]);
            }
        }
        // 读三区故障信息反馈
        OperateResultExOne<byte[]> resultErr4 = siemensS7Net.Read("DB101.2096", (short) (6*2));
        if (resultErr4.IsSuccess) {
            for (int i = 13; i < staNos.size(); i++) {
                boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr4.Content, (i-13) * 2 + 1, 1);
                StaProtocol staProtocol = station.get(staNos.get(i)); // 站点编号
                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]);
            }
        }
        // 一楼出入库模式切换
//        OperateResultExOne<byte[]> ioModeResult = siemensS7Net.Read("DB101.3724", (short) 1);
//        if (ioModeResult.IsSuccess) {
//            boolean[] ioModelBooleans = siemensS7Net.getByteTransform().TransBool(ioModeResult.Content, 0, 1);
////            log.info("读取出入库模式:" + Arrays.toString(ioModelBooleans));
//            WrkMastService wrkMastService = SpringUtils.getBean(WrkMastService.class);
//            if (ioModelBooleans[0]) { // 100切入库
//                if (ioModeOf101 == IoModeType.PAKOUT_MODE) {
//                    int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101)
//                            .eq("sta_no", 100).in("wrk_sts", 12, 13, 14));
//                    if (outCount == 0) {
//                        boolean[] booleans = new boolean[8];
//                        booleans[0]=true;
//                        ioModeOf101 = IoModeType.PAKIN_MODE;
//                        siemensS7Net.Write("DB100.824",booleans);
//                        log.info("101切换入库模式成功");
//                    }
//                }
//            }
//            if (ioModelBooleans[1]) { // 100切出库
//                if (ioModeOf101 == IoModeType.PAKIN_MODE) {
//                    int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1)
//                            .eq("sta_no", 101).in("wrk_sts", 2, 3, 4));
//                    if (inCount == 0) {
//                        boolean[] booleans = new boolean[8];
//                        booleans[0]=true;
//                        ioModeOf101 = IoModeType.PAKOUT_MODE;
//                        siemensS7Net.Write("DB100.824",booleans);
//                        log.info("101切换出库模式成功");
//                    }
//                }
//            }
//            if (ioModelBooleans[2]) { // 102切入库
//                if (ioModeOf103 == IoModeType.PAKOUT_MODE) {
//                    int outCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101)
//                            .eq("sta_no", 102).in("wrk_sts", 12, 13, 14));
//                    if (outCount == 0) {
//                        boolean[] booleans = new boolean[8];
//                        booleans[1]=true;
//                        ioModeOf103 = IoModeType.PAKIN_MODE;
//                        siemensS7Net.Write("DB100.824",booleans);
//                        log.info("103切换入库模式成功");
//                    }
//                }
//            }
//            if (ioModelBooleans[3]) { // 102切出库
//                if (ioModeOf103 == IoModeType.PAKIN_MODE) {
//                    int inCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 1)
//                            .eq("sta_no", 103).in("wrk_sts", 2, 3, 4));
//                    if (inCount == 0) {
//                        boolean[] booleans = new boolean[8];
//                        booleans[1]=true;
//                        ioModeOf103 = IoModeType.PAKOUT_MODE;
//                        siemensS7Net.Write("DB100.824",booleans);
//                        log.info("103切换出库模式成功");
//                    }
//                }
//            }
//        }
        // 读开门信号
//        OperateResultExOne<byte[]> readOpenResult = siemensS7Net.Read("DB100.826", (short) 1);
//        if (readOpenResult.IsSuccess) {
//            boolean[] booleans = siemensS7Net.getByteTransform().TransBool(readOpenResult.Content, 0, 1);
//            StaProtocol staProtocol = station.get(305);
//            if (null == staProtocol) {
//                staProtocol = new StaProtocol();
//                staProtocol.setSiteId(305);
//                station.put(305, staProtocol);
//            }
//            staProtocol.setOpenAskDoor(booleans[0]);
//            staProtocol.setCloseAskDoor(booleans[1]);
//            staProtocol.setIfOpenDoor(booleans[2]);
//            staProtocol.setIfCloseDoor(booleans[3]);
////            log.info("开门信号:" + Arrays.toString(booleans));
//        }
////        OperateResultExOne<byte[]> resultErr3 = siemensS7Net.Read("DB13.400", (short) 3);
////        if (resultErr3.IsSuccess) {
////            if (staError1 == null){
////                staError1 = new StaError1();
//            }
//            boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr3.Content, 0, 3);
//            staError1.setEMERGENCY_Stop_Core(status[0]);
//            staError1.setEMERGENCY_STOP1(status[1]);
//            staError1.setEMERGENCY_STOP2(status[2]);
//            staError1.setEMERGENCY_STOP3(status[3]);
//            staError1.setEMERGENCY_STOP4(status[4]);
//
//            staError1.setDoor_EMERGENCY_STOP1(status[5]);
//            staError1.setDoor_EMERGENCY_STOP2(status[6]);
//            staError1.setDoor_EMERGENCY_STOP3(status[7]);
//            staError1.setDoor_EMERGENCY_STOP4(status[8]);
//            staError1.setDoor_EMERGENCY_STOP5(status[9]);
//            staError1.setDoor_EMERGENCY_STOP6(status[10]);
//
//            staError1.setDoor_Open_Err1(status[11]);
//            staError1.setDoor_Open_Err1(status[12]);
//            staError1.setDoor_Open_Err1(status[13]);
//            staError1.setDoor_Open_Err1(status[14]);
//            staError1.setDoor_Open_Err1(status[15]);
//            staError1.setDoor_Open_Err1(status[16]);
//
//        }
        if (result.IsSuccess) {
@@ -629,16 +350,6 @@
        }
    }
    // 更新入出库模式
    private void updateIoMode() throws InterruptedException {
//        if (this.ioModeOf2F != IoModeType.NONE) {
//            if (!siemensS7Net.Write("DB100.180", this.ioModeOf2F.id).IsSuccess) {
//                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线2F入出库模式失败。输送线plc编号={1}", slave.getId()));
//                News.error("SiemensDevp"+" - 6"+" - 写入输送线2F入出库模式失败。输送线plc编号={}", slave.getId());
//            }
//        }
    }
    /**
     * 心跳
     */
@@ -675,7 +386,6 @@
        slave.setIp("10.10.10.18");
        SiemensDevpThread devpThread = new SiemensDevpThread(slave);
        devpThread.connect();
        devpThread.write2(0);
        devpThread.read();
//        // 写
//        StaProtocol staProtocol = devpThread.getStation().get(1);
src/main/java/com/zy/entity/WrkMast.java
@@ -301,6 +301,15 @@
    @TableField("ctn_no")
    private String ctnNo;
    @TableField("rgv_no")
    private Integer rgvNo;
    @TableField("rgv_ssta_no")
    private Integer rgvSstaNo;
    @TableField("rgv_dsta_no")
    private Integer rgvDstaNo;
    /**
     * 满板
     */
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -6,10 +6,7 @@
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
import com.zy.common.model.StartupDto;
import com.zy.common.model.*;
import com.zy.common.service.CommonService;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
@@ -53,12 +50,41 @@
    public static final long COMMAND_TIMEOUT = 5 * 1000;
    // 空拖出库站点
    // 空拖出库站点,区分子母空托盘
    public static final Map<Integer,String>  emptyPalletSiteMap = new HashMap<>();
    // 初始化空托盘出库站点 M空母托盘,Z空子托盘
    // 母托盘叠盘站点
    public static final List<Integer>  stackingSite = new ArrayList<>();
    // rgv接驳站点
    public static final List<Integer>  rgvConnectionSiteList = new ArrayList<>();
    // 工作档对应目标站点转换为rgv目标站点
    public static final Map<Integer,Integer> taskStaNoToRgvStaNoMap = new HashMap<>();
    // 罐装完成rgv接驳站点
    public static final List<Integer>  canningLineRgvConnectionSiteList = new ArrayList<>();
    static {
        emptyPalletSiteMap.put(1002,"M");emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z");
        emptyPalletSiteMap.put(1002,"M");
        emptyPalletSiteMap.put(1020,"M");emptyPalletSiteMap.put(1035,"Z");
        stackingSite.add(1027);stackingSite.add(1020);
        rgvConnectionSiteList.add(1012);rgvConnectionSiteList.add(1006);rgvConnectionSiteList.add(1001);rgvConnectionSiteList.add(1018);
        rgvConnectionSiteList.add(1019);rgvConnectionSiteList.add(1041);rgvConnectionSiteList.add(1034);rgvConnectionSiteList.add(1033);
        rgvConnectionSiteList.add(1026);rgvConnectionSiteList.add(1022);rgvConnectionSiteList.add(1044);
        rgvConnectionSiteList.add(1083);rgvConnectionSiteList.add(1086);rgvConnectionSiteList.add(1089);rgvConnectionSiteList.add(1090);
        rgvConnectionSiteList.add(1105);rgvConnectionSiteList.add(1100);rgvConnectionSiteList.add(1097);rgvConnectionSiteList.add(1094);
        rgvConnectionSiteList.add(1091);
        taskStaNoToRgvStaNoMap.put(1050,1044);taskStaNoToRgvStaNoMap.put(1079,1044);taskStaNoToRgvStaNoMap.put(1065,1044);taskStaNoToRgvStaNoMap.put(1072,1044);taskStaNoToRgvStaNoMap.put(1093,1094);
        taskStaNoToRgvStaNoMap.put(1104,1100);taskStaNoToRgvStaNoMap.put(1102,1100);taskStaNoToRgvStaNoMap.put(1090,1090);taskStaNoToRgvStaNoMap.put(1002,1001);taskStaNoToRgvStaNoMap.put(1016,1018);
        taskStaNoToRgvStaNoMap.put(1020,1019);taskStaNoToRgvStaNoMap.put(1024,1022);taskStaNoToRgvStaNoMap.put(1035,1034);taskStaNoToRgvStaNoMap.put(1040,1033);taskStaNoToRgvStaNoMap.put(1043,1041);
        canningLineRgvConnectionSiteList.add(1083);canningLineRgvConnectionSiteList.add(1086);
        canningLineRgvConnectionSiteList.add(1089);
    }
    @Autowired
@@ -129,13 +155,6 @@
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
//                if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 == IoModeType.PAKOUT_MODE)
//                ||(staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 == IoModeType.PAKOUT_MODE)
//                ||(staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 == IoModeType.PAKOUT_MODE)) {
//                    errMsg = "当前为出库模式";
//                    back = true;
//                }
//                if (!back && staProtocol.isFrontErr()) {
                    if (staProtocol.isFrontErr()) {
                    errMsg = "前超限";
                    back = true;
@@ -166,7 +185,6 @@
                }
                // 退回
                if (back) {
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                    if (!staProtocol.isLoading()){
@@ -225,6 +243,12 @@
                        param.setIoType(1);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        param.setLocArea(2);// 入空桶库标识
                        param.setBucketType(staProtocol.getBucketType());
                        param.setBucketCount(staProtocol.getBucketCount());
                        param.setTailSupportFlag(staProtocol.isTailSupportFlag());
                        param.setWantBucketFlag(devpThread.getWantBucketFlag());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
@@ -236,6 +260,11 @@
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            // 目标站点是直供罐装线
                            if (dto.getStaNo() == 1079 || dto.getStaNo() == 1065 || dto.getStaNo() == 1072) {
                                devpThread.getWantBucketFlag().remove(dto.getCrnNo()); // 移除输送线要桶信号
                                staProtocol.setClearBucketSignal(dto.getCrnNo()); // 清除要桶信号标识
                            }
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(),dto.getSourceStaNo()));
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
@@ -253,28 +282,21 @@
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
//
//                            if (ledThread != null) {
                            if (ledThread != null) {
                                String errorMsg = jsonObject.getString("msg");
                                if (!Cools.isEmpty(errorMsg)) {
                                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                                }
//                            }
//                            News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                            News.error(methodName + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
//        News.infoNoLog(""+mark+" - 0"+" - 组托  ===》执行完成");
        }
    }
@@ -522,40 +544,34 @@
                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
                            && crnProtocol.statusType == CrnStatusType.WAITING
                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
//                        News.error("堆垛机出库完成 - 开始执行");
                        // 命令下发区 --------------------------------------------------------------------------
                        // 更新工作档状态为14失败
                        // 下发站点信息
                        if (wrkMast.getSourceStaNo() == 106 && wrkMast.getWrkSts() == 12L) {
                            wrkMast.setWrkSts(16L);
                            wrkMast.setCrnNo(1);
                            if (wrkMast.getStaNo() == 107) {
                                wrkMast.setSourceStaNo(107);
                            } else if(wrkMast.getStaNo()==104) {
                                wrkMast.setSourceStaNo(105);
                            }
                            staProtocol.setStaNo((short) 106);
                            log.info("----------106移库标识---------");
                        }else if(wrkMast.getSourceStaNo() == 105 && wrkMast.getWrkSts() == 16L) {
                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                            log.info("106移库完成,输送线发送105到104,源站为:" + staProtocol.getSiteId());
                            wrkMast.setWrkSts(14L);
                        }else {
                            staProtocol.setStaNo(wrkMast.getStaNo().shortValue());
                            wrkMast.setWrkSts(14L);
                        }
                        staProtocol.setWorkNo(wrkMast.getWrkNo());
                        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol))) {
                            continue;
                        }
                        wrkMast.setWrkSts(14L);
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 空桶出库完成库位组任务
                            if (wrkMast.getSourceStaNo() == 1056) {
                                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_sta_no", 1056).eq("wrk_sts", 12));
                                if (wrkMast1 != null) {
                                    StaProtocol staProtocol1 = devpThread.getStation().get(1057);
                                    if (staProtocol1 != null) {
                                        staProtocol1 = staProtocol1.clone();
                                        staProtocol1.setStaNo(wrkMast1.getStaNo().shortValue());
                                        staProtocol1.setWorkNo(wrkMast1.getWrkNo());
                                        if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) {
                                            log.error("空桶出库完成库位组任务推送输送线命令队列失败");
                                        }
                                        wrkMast1.setWrkSts(14L);
                                        wrkMast1.setCrnEndTime(new Date());
                                        if (wrkMastMapper.updateById(wrkMast1) != 0) {
                                        }
                                    }
                                }
                            }
                            // 复位堆垛机
                            log.info("出库任务完成下发堆垛机复位,任务号:{}",wrkMast.getWrkNo());
                            crnThread.setResetFlag(true);
@@ -578,6 +594,142 @@
    }
    /**
     * 空子托盘入库
     */
    public synchronized void storeEmptyPlt() {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getEmptyInSta()) {
                // 获取条码扫描仪信息
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (barcodeThread == null) {
                    continue;
                }
                String barcode = barcodeThread.getBarcode();
                // 尺寸检测异常
                boolean back = false;
                String errMsg = "";
                if (staProtocol.isFrontErr()) {
                    errMsg = "前超限";
                    back = true;
                }
                if (!back && staProtocol.isBackErr()) {
                    errMsg = "后超限";
                    back = true;
                }
                if (!back && staProtocol.isHighErr()) {
                    errMsg = "高超限";
                    back = true;
                }
                if (!back && staProtocol.isLeftErr()) {
                    errMsg = "左超限";
                    back = true;
                }
                if (!back && staProtocol.isRightErr()) {
                    errMsg = "右超限";
                    back = true;
                }
                if (!back && staProtocol.isWeightErr()) {
                    errMsg = "超重";
                    back = true;
                }
                if (!back && staProtocol.isBarcodeErr()) {
                    errMsg = "扫码失败";
                    back = true;
                }
                // 退回
                if (back) {
                    MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errMsg));
                    if (!staProtocol.isLoading()) {
                        continue;
                    }
                    if (!staProtocol.isPakMk()) {
                        continue;
                    }
                    staProtocol.setWorkNo(wrkNo);
                    News.info("{}空托入库回退:{},任务号:{}", inSta.getStaNo(), errMsg, wrkNo);
                    staProtocol.setStaNo(inSta.getBackSta().shortValue());
                    devpThread.setPakMk(staProtocol.getSiteId(), false);
                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                    log.error("输送线下发1:" + wrkNo + "," + inSta.getBackSta());
                    return;
                }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()) {
                    if (Cools.isEmpty(barcode) || "NG".endsWith(barcode) || "NoRead".equals(barcode) || "00000000".equals(barcode)) {
                        News.info("{}号条码扫描器检测条码信息:{}", inSta.getBarcode(), barcode);
                        continue;
                    }
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
                        continue;
                    }
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        param.setBarcode(barcode);
                        param.setIoType(10);
                        param.setSourceStaNo(inSta.getStaNo());
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        log.info("空子托盘入库请求wms原始返回:" + response);
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            barcodeThread.setBarcode("");
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo()));
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发2:" + dto.getWorkNo() + "," + dto.getStaNo());
                            if (!result) {
                                News.error(":更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            } else {
                                ledThread.errorReset();
                            }
                        } else {
                            staProtocol.setWorkNo(wrkNo);
                            staProtocol.setStaNo(inSta.getBackSta().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            String errorMsg = jsonObject.getString("msg");
                            if (!Cools.isEmpty(errorMsg)) {
                                MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(3, errorMsg));
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
    /**
     * 入出库  ===>>  堆垛机入出库作业下发
     */
    public synchronized void crnIoExecute(Integer mark) {
@@ -594,11 +746,6 @@
                News.error(""+mark+" - 1"+" - {}号堆垛机尚未在数据库进行维护!", crn.getId());
                continue;
            }
//            //堆垛机回原点任务中
//            if(crnThread.isBackHpFlag()){
//                continue;
//            }
            // 只有当堆垛机空闲 并且 无任务时才继续执行
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
@@ -628,12 +775,8 @@
                }
            }
            // 库位移转
            //mark - 3 - ....
            this.locToLoc(crn, crnProtocol,mark);
//            this.crnRebackHp(crnProtocol, crnThread);
        }
//        News.infoNoLog(""+mark+" - 0"+" - 堆垛机入出库作业下发执行完成");
    }
    /**
@@ -761,18 +904,6 @@
                News.error(""+mark+" - 1"+" - 16"+" - 堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
            } else {
//                long startTime = System.currentTimeMillis();
//                while ((System.currentTimeMillis() - startTime) < COMMAND_TIMEOUT) {
//
//                    if (true) {
//                        break;
//                    }
//
//                    try{
//                        Thread.sleep(500);
//                    }catch(Exception ignore){}
//                }
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                Date now = new Date();
                wrkMast.setWrkSts(3L);
@@ -780,6 +911,21 @@
                wrkMast.setModiTime(now);
                if (wrkMastMapper.updateById(wrkMast) == 0) {
                    News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                }
                // 如果是1049则有两个任务,需要把1050改成吊车入库中
                if (crnStn.getStaNo() == 1049) {
                    BasDevp basDevp = basDevpService.selectById(1050);
                    if (basDevp.getWrkNo() == 0) {
                        log.error("取货点为1049,但是1050任务号为0");
                    } else {
                        WrkMast wrkMast1 = wrkMastMapper.selectById(basDevp.getWrkNo());
                        wrkMast1.setWrkSts(3L);
                        wrkMast1.setCrnStrTime(now);
                        wrkMast1.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast1) == 0) {
                            News.error(""+mark+" - 1"+" - 17"+" - 修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                    }
                }
            }
        }
@@ -794,9 +940,7 @@
        News.warnNoLog(""+mark+" - 2"+" - 0"+" - 堆垛机入出库作业下发:执行出库");
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            // todo 限制出库到305的工作档,如果配置outModel不等于Y,则跳过
            for (WrkMast wrkMast : wrkMasts) {
                if (wrkMast == null) {
                    continue;
@@ -818,41 +962,22 @@
                if (staProtocol == null) {
                    News.infoNoLog(""+mark+" - 2"+" - 3"+" - 堆垛机出库站信息(staProtocol!=null继续执行,否则循环终止):staProtocol="+staProtocol);
                    break;
//                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
//            // 入出库模式判断
//            if (devpThread.ioMode != IoModeType.PAKOUT_MODE) { continue; }
//                if (wrkMast.getStaNo() == 204 && devpThread.ioModeOf2F != IoModeType.PAKOUT_MODE) {
//                    News.infoNoLog(""+mark+" - 2"+" - 4"+" - 入出库模式(此处出库方法,出库模式继续=="+devpThread.ioModeOf2F);
//                    continue;
//                }
                // 入出库模式判断
//                if ((staProtocol.getSiteId() == 101 && devpThread.ioModeOf101 != IoModeType.PAKOUT_MODE)
//                   || (staProtocol.getSiteId() == 103 && devpThread.ioModeOf103 != IoModeType.PAKOUT_MODE)
//                   || (staProtocol.getSiteId() == 305 && devpThread.ioModeOf305 != IoModeType.PAKOUT_MODE)) {
//                    continue;
//                }
                // 查询站点详细信息
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    News.error(""+mark+" - 2"+" - 5"+" - 出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                // 107无物才能出,其他有转运架才能出
                boolean loading = (staProtocol.getSiteId() == 107) != staProtocol.isLoading();
                // 判断堆垛机出库站状态
                if (staProtocol.isAutoing() && loading && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                        && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                    // 命令下发区 --------------------------------------------------------------------------
//                    log.warn("堆垛机出库命令下发:"+staProtocol.getWorkNo()+","+staProtocol.isOutEnable()+","+staProtocol.getSiteId());
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
@@ -908,11 +1033,39 @@
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
//                    if(crnStn.getStaNo() == 105) {
//                        continue;
//                    }
                    WrkMast wrkMast1 = null; // 库位任务对应另一个库位任务
                    LocMast locMast = null; // 库位对应另一个库位
                    // 空桶库出库需要两个库位一起出
                    if(slave.getId() == 4) {
                        Integer row = sourceSta.getRow1();
                        // 获取对应库位
                        String  newLocNo = (row == 9 || row == 11 ? String.valueOf(row + 1) : row == 10 ? "09" : "11") + sourceSta.getLocNo().substring(2);
                        locMast = locMastService.selectById(newLocNo);
                        if (locMast == null) {
                            log.error("空桶出库寻找{}对应库位组库位号{}错误",sourceSta.getLocNo(),newLocNo);
                            break;
                        }
                        if (locMast.getLocSts().equals("R")) {
                            wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo));
                        } else if(locMast.getLocSts().equals("F")) {
                            log.error("空桶出库寻找{}对应库位组库位号{}库位状态错误F",sourceSta.getLocNo(),newLocNo);
                            break;
                        }
                    }
                    if (wrkMast1 != null) {
                        // 判断给堆垛机发生命令的源库位
                        if (sourceSta.getRow1() == 10 || sourceSta.getRow1() == 11) {
                            // 交换库位和任务
                            LocMast t1 = sourceSta;
                            sourceSta = locMast;
                            locMast = t1;
                            WrkMast t2 = wrkMast1;
                            wrkMast1 = wrkMast;
                            wrkMast = t2;
                        }
                    }
                    News.warnNoLog(""+mark+" - 2"+" - 12"+" - 命令下发 : 工作号={},源排={},源列={},源层={},目标排={},目标列={},目标层={}",wrkMast.getWrkNo().shortValue()
                            ,sourceSta.getRow1().shortValue(),sourceSta.getBay1().shortValue(),sourceSta.getLev1().shortValue()
@@ -941,6 +1094,15 @@
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                        // 修改空桶库对应库位任务状态
                        if (wrkMast1 != null) {
                            wrkMast1.setWrkSts(12L);
                            wrkMast1.setCrnStrTime(now);
                            wrkMast1.setModiTime(now);
                            if (wrkMastMapper.updateById(wrkMast1) == 0) {
                                News.error(""+mark+" - 2"+" - 14"+" - 修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                            }
                        }
                        break;
                    }
@@ -1500,7 +1662,7 @@
    }
    /**
     * 生成 空子/母托盘任务
     * 生成 空子/母托盘出库任务
     */
    public synchronized void generateEmptyPalletStoreWrk() {
        Integer devpId = 1;
@@ -1516,7 +1678,7 @@
            // 自动&无物&可出
            if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) {
                // 判断是否已经生成任务
                if (wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("sta_no", entry.getKey())).size() > 0) {
                if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 111,112).eq("sta_no", entry.getKey())).size() > 0) {
                    log.warn("{}站点已经存在空板出库任务", entry.getKey());
                    continue;
                }
@@ -1544,4 +1706,165 @@
            }
        }
    }
    /**
     * 托盘到达rgv接驳站点,更改工作档状态为9.呼叫RGV,环穿程序调度rgv
     */
    public synchronized void callRgv() {
        // 输送线plc编号
        Integer devpPlcId = 1;
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId);
        for (Integer site : rgvConnectionSiteList) {
            StaProtocol staProtocol = devpThread.getStation().get(site);
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() != 0) {
                // 查询工作档
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
                if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) {
                    wrkMast.setRgvNo(0);
                    wrkMast.setRgvSstaNo(site);
                    wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo()));
                    wrkMast.setModiTime(new Date());
                    wrkMastMapper.updateById(wrkMast);
                    log.info("任务号:{}已到达rgv接驳位,准备呼叫rgv...", wrkMast.getWrkNo());
                }
            }
        }
    }
    /**
     * 母托盘叠满自动入库
     */
    public synchronized void autoEmptyIn() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历空板入库口
            for (Integer site :  stackingSite) {
                // 获取空板入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(site);
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (!staProtocol.isLoading()){
                    continue;
                }
                // 站点条件判断
                if (staProtocol.isAutoing()
                        && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && staProtocol.isPakMk()
                        && staProtocol.getWorkNo() == 0
                ) {
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        param.setIoType(10);
                        param.setSourceStaNo(site);
                        param.setLocType1(locTypeDto.getLocType1());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            // 更新站点信息 且 下发plc命令
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(staProtocol.getSiteId().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                            log.error("输送线下发6:"+dto.getWorkNo()+","+staProtocol.getSiteId());
                            if (!result) {
                                News.errorNoLog(""+" - 1"+" - 更新plc站点信息失败");
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            News.error(" - 3"+" - 母托叠盘入库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                } else {
                    News.errorNoLog(" - 母托叠盘入库站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isAutoing()+"、可入信号:" + staProtocol.isInEnable()
                            +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo()
                            +"、锁定标记"+ staProtocol.isPakMk());
                }
            }
        }
    }
    /**
     * 空桶罐装完成到达罐装线rgv口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务
     */
    public synchronized void canningLineTaskFinish() {
        // 输送线plc编号
        Integer devpPlcId = 1;
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devpPlcId);
        for (Integer site : canningLineRgvConnectionSiteList) {
            StaProtocol staProtocol = devpThread.getStation().get(site);
            if (staProtocol == null) {
                continue;
            } else {
                staProtocol = staProtocol.clone();
            }
            if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWorkNo() != 0) {
                // 查询工作档
                WrkMast wrkMast = wrkMastMapper.selectByWrkNo(staProtocol.getWorkNo());
                if (wrkMast.getIoType() != 1) {
                    try {
                        CanningLineInLocParam param = new CanningLineInLocParam();
                        param.setWrkNo(wrkMast.getWrkNo());
                        param.setSourceStaNo(site);
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/rpc/pakin/CanningLine/loc/v1")
                                .setJson(JSON.toJSONString(param))
                                .build()
                                .doPost();
                        log.info("罐装线入库请求wms原始返回:" + response);
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
                            staProtocol.setWorkNo(dto.getWorkNo());
                            staProtocol.setStaNo(RouteUtils.SouStaEnd(dto.getStaNo(), dto.getSourceStaNo()));
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            // 这里下发命令后,输送线要把该站点可入信号去除
                            boolean result = MessageQueue.offer(SlaveType.Devp, devpPlcId, new Task(2, staProtocol));
                            if (result) {
                                log.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo());
                                News.info("罐装线入库推送输送线命令成功:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo());
                            } else {
                                log.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo());
                                News.error("罐装线入库推送输送线命令失败:" + dto.getWorkNo() + "," + site + "," + dto.getStaNo());
                                throw new CoolException("罐装线入库推送输送线命令失败:" + site);
                            }
                        } else {
                            log.error("罐装线入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                            News.error("罐装线入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
}
src/main/resources/application.yml
@@ -41,7 +41,7 @@
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 1,4,5,8
  doubleLocs: 1,4
  # 一个堆垛机负责的货架排数
  groupCount: 4
@@ -58,41 +58,17 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
      row: 2
      staNo: 1093
      row: 3
      bay: 1
      lev: 1
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 203
      row: 2
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 103
      row: 2
      staNo: 1093
      row: 3
      bay: 1
      lev: 1
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      row: 2
      bay: 4
      lev: 1
    crnOutStn[2]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 107
      row: 1
      bay: 28
      lev: 1
    crnOutStn[3]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 203
      row: 2
      bay: 1
      lev: 2
  # 堆垛机2
  crn[1]:
    id: 2
@@ -106,34 +82,16 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      staNo: 1104
      row: 6
      bay: 1
      lev: 1
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 201
      row: 6
      bay: 1
      lev: 2
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      row: 6
      staNo: 1099
      row: 5
      bay: 1
      lev: 1
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 201
      row: 6
      bay: 1
      lev: 2
    crnOutStn[2]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 106
      row: 6
      bay: 28
      lev: 1
  # 堆垛机3
  crn[2]:
@@ -148,15 +106,15 @@
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      row: 6
      staNo: 1102
      row: 7
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      row: 6
      staNo: 1107
      row: 8
      bay: 1
      lev: 1
  # 堆垛机4
@@ -169,18 +127,25 @@
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    # 堆垛机入库站点1
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      row: 6
      staNo: 1050
      row: 11
      bay: 1
      lev: 1
    # 堆垛机入库站点2
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 1049
      row: 12
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 101
      row: 6
      staNo: 1056
      row: 9
      bay: 1
      lev: 1
@@ -193,26 +158,61 @@
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 101
      staNo: 1011
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 100
      backSta: 1010
      led: ${wcs-slave.led[0].id}
    # 入库口2
    inSta[1]:
      staNo: 103
      staNo: 1007
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 102
      backSta: 1008
      led: ${wcs-slave.led[1].id}
    # 入库口3
    inSta[2]:
      staNo: 305
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1016
      led: ${wcs-slave.led[1].id}
    # 入库口4
    inSta[3]:
      staNo: 1042
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1043
      led: ${wcs-slave.led[1].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 1042
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 1043
      led: ${wcs-slave.led[2].id}
    # 空板入库口2
    emptyInSta[1]:
      staNo: 1017
      barcode: ${wcs-slave.barcode[1].id}
      backSta: 1016
      led: ${wcs-slave.led[3].id}
    # 空板入库口3
    emptyInSta[2]:
      staNo: 1007
      barcode: ${wcs-slave.barcode[2].id}
      backSta: 1008
      led: ${wcs-slave.led[4].id}
    # 出库口1
    outSta[0]:
      staNo: 100
      staNo: 1024
      led: ${wcs-slave.led[0].id}
    # 出库口2
    outSta[1]:
      staNo: 102
      staNo: 1040
      led: ${wcs-slave.led[1].id}
    # 出库口3
    outSta[2]:
      staNo: 1043
      led: ${wcs-slave.led[1].id}
    # 出库口4
    outSta[3]:
      staNo: 1016
      led: ${wcs-slave.led[1].id}
  # 条码扫描仪1
@@ -242,46 +242,46 @@
    ip: 10.10.10.190
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 101
    staArr: 1024
  # LED2
  led[1]:
    id: 2
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1040
  # LED3
  led[2]:
    id: 3
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1042,1043
  # LED4
  led[3]:
    id: 4
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1017,1016
  # LED5
  led[4]:
    id: 5
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1007
  # LED6
  led[5]:
    id: 6
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1011
  # LED7
  led[6]:
    id: 7
    ip: 10.10.10.191
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102
    staArr: 1090
src/main/resources/mapper/WrkMastMapper.xml
@@ -59,6 +59,9 @@
<!--        <result column="Pdc_type" property="PdcType" />-->
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
        <result column="rgv_no" property="rgvNo" />
        <result column="rgv_ssta_no" property="rgvSstaNo" />
        <result column="rgv_dsta_no" property="rgvDstaNo" />
    </resultMap>