1
zhang
2025-07-10 b8feb2880cc44d8408627db431eb9cf31967f393
1
5个文件已修改
1个文件已添加
360 ■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-wcs.yml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -95,7 +95,7 @@
     * 组托
     * 入库站,根据条码扫描生成入库工作档,工作状态 2
     */
    public synchronized void generateStoreWrkFile(Integer mark) {
    public synchronized void generateStoreWrkFile(Integer mark) throws InterruptedException {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
@@ -115,43 +115,15 @@
                    staProtocol = staProtocol.clone();
                }
                //调用外形检测
                if (!shape(devp, staProtocol, devpThread, inSta)) {
                    continue;
                }
                //LED
                LedThread ledThread = (LedThread) SlaveConnection.get(SlaveType.Led, inSta.getLed());
                // 入出库模式判断
//                if ( inSta.getStaNo()==203 && devpThread.ioModeOf2F != IoModeType.PAKIN_MODE) { continue; }
//                if (inSta.getStaNo() == 203 && devpThread.ioModeOf2F == IoModeType.PAKOUT_MODE) {
//                    continue;
//                }
                // 判断是否满足入库条件
                if (!staProtocol.isLoading()){
                    continue;
                }
                String barcode11 = barcodeThread.getBarcode();
                if (Cools.isEmpty(barcode11)){
                    if (staProtocol.isAutoing()&& !staProtocol.isEmptyMk() && staProtocol.getWorkNo() == 9999 && staProtocol.isPakMk() && staProtocol.getStamp()==2){
                        staProtocol.setStamp(3);
                        News.info(""+mark+" - 7"+" - 扫码失败2 ===>> {}号条码扫描器检测条码信息:{},站点:{}", inSta.getBarcode(), barcode11, inSta.getStaNo());
                        staProtocol.setWorkNo((short) 9989);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                        // led 异常显示
                        if (ledThread != null) {
                            String errorMsg = "扫码失败,请重试";
                            MessageQueue.offer(SlaveType.Led, inSta.getLed(), new Task(5, errorMsg));
                        }
                        continue;
                    }
                }
                if (staProtocol.isAutoing() && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 9990
                        && staProtocol.getWorkNo()!=9999 && staProtocol.getWorkNo()!=9992 && staProtocol.getWorkNo()!=0
                        && staProtocol.isPakMk() && staProtocol.getStamp()>=2 && staProtocol.getStamp()!=3) {// && !Cools.isEmpty(barcode)) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行");
//                    try {
//                        Thread.sleep(300);
//                    }catch (Exception e){}
                    String barcode = barcodeThread.getBarcode();
                    if(!Cools.isEmpty(barcode)) {
@@ -184,6 +156,11 @@
                        }
                        continue;
                    }
                if (staProtocol.isAutoing() && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && staProtocol.getWorkNo() > 9990
                        && staProtocol.getWorkNo() != 9999 && staProtocol.getWorkNo() != 9992 && staProtocol.getWorkNo() != 0
                        && staProtocol.isPakMk()) {
                    News.warnNoLog("" + mark + " - 0" + " - 开始执行");
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
@@ -279,7 +256,7 @@
                }else {
                    News.errorNoLog(""+mark+" - 6"+" - 站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isAutoing()+"、可入信号:" + staProtocol.isInEnable()
                            +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo()
                            +"、锁定标记"+ staProtocol.isPakMk()+"、入库印记:" + staProtocol.getStamp());
                            + "、锁定标记" + staProtocol.isPakMk());
                }
            }
@@ -346,7 +323,7 @@
                }else {
                    News.errorNoLog(""+mark+" - 6"+" - 站点信息不符合入库条件!!!"+" 自动信号:"+staProtocol.isLoading()+"、可入信号:" + staProtocol.isInEnable()
                            +"、空板信号:"+ staProtocol.isEmptyMk()+"、工作号:" + staProtocol.getWorkNo()
                            +"、锁定标记"+ staProtocol.isPakMk()+"、入库印记:" + staProtocol.getStamp());
                            + "、锁定标记" + staProtocol.isPakMk());
                }
            }
        }
@@ -1467,7 +1444,7 @@
                        && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk()
                        && (staProtocol.getWorkNo() > 9990 && staProtocol.getWorkNo() <= 9999)
                        && staProtocol.isPakMk()&& staProtocol.getStamp()>=2) {
                        && staProtocol.isPakMk()) {
                    News.warnNoLog(""+mark+" - 0"+" - 开始执行:空栈板初始化入库,叉车入库站放货");
                    try {
@@ -1644,25 +1621,7 @@
            if (CollectionUtils.equals(ledThread.getWorkNos(), workNos)) {
                continue;
            }
//             命令下发 -------------------------------------------------------------------------------
//            if (!commands.isEmpty()) {
//                if (led.getId() < 7) {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
//                        News.error(""+mark+" - 2"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                } else {
//                    if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(1, commands))) {
//                        News.error(""+mark+" - 3"+" - {}号LED命令下发失败!!![ip:{}] [port:{}]", led.getId(), led.getIp(), led.getPort());
//                        continue;
//                    } else {
//                        ledThread.setLedMk(false);
//                    }
//                }
//
//            }
            // 命令下发 -------------------------------------------------------------------------------
            if (!commands.isEmpty()) {
                if (!MessageQueue.offer(SlaveType.Led, led.getId(), new Task(3, commands))) {
@@ -2242,4 +2201,58 @@
            }
        }
    }
    public short wrkNo = 9999;
    private boolean shape(DevpSlave devp, StaProtocol staProtocol, DevpThread devpThread, DevpSlave.Sta sta) throws InterruptedException {
        // 尺寸检测异常
        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) {
            if (!staProtocol.isLoading()) {
                return true;
            }
            if (!staProtocol.isPakMk()) {
                return true;
            }
            staProtocol.setWorkNo(wrkNo);
            News.warn("{}入库回退:{},任务号:{}", sta.getStaNo(), errMsg, wrkNo);
            staProtocol.setStaNo(sta.getBackSta().shortValue());
            devpThread.setPakMk(staProtocol.getSiteId(), false);
            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
            MessageQueue.offer(SlaveType.Led, sta.getLed(), new Task(5, errMsg));
            Thread.sleep(500);
        }
        return true;
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -44,9 +44,7 @@
                    }
                    // 演示
                    mainService.crnDemoOfLocMove1();
                    // 入出库模式切换函数
//                    mainService.ioConvert();
//                    mainService.crnDemoOfLocMove1();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(1); // 组托
                    mainService.generateStoreWrkFile0(2); // WMS入库
@@ -72,6 +70,9 @@
                    mainService.outOfDevp(11);
                    // 堆垛机回原点
                    //mainService.crnRebackHp();
                    //空托盘自动出库
//                    mainService.autoEmptyOut();
//                    //空托盘自动入库
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -56,8 +56,30 @@
    private String nearbySta;
    private String barcode;
    //lfd入库印记  当stamp>=2时才入库
    private Integer stamp = 0;
    // 外形检测 ------------------------------------------------------------------------
    // 前超限
    private boolean frontErr = false;
    // 后超限
    private boolean backErr = false;
    // 高超限
    private boolean highErr = false;
    // 左超限
    private boolean leftErr = false;
    // 右超限
    private boolean rightErr = false;
    // 超重
    private boolean weightErr = false;
    // 扫码失败
    private boolean barcodeErr = false;
    private boolean weight = false;
    public BasDevp toSqlModel(){
        BasDevp basDevp = new BasDevp();
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -47,7 +47,8 @@
//
//    }};
    public static final ArrayList<Integer> staNos1 = new ArrayList<Integer>() {{
        add(101);add(102);
        add(101);
        add(102);
    }};
@@ -116,6 +117,7 @@
        }
    }
    /**
     * 初始化站点状态
     */
@@ -192,20 +194,7 @@
                staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result4.Content, i*2));   // 目标站
            }
        }
//        Thread.sleep(200);
//        OperateResultExOne<byte[]> result0 = siemensS7Net.Read("DB101.0", (short) 186);
//        if (result0.IsSuccess) {
//            for (int i = 0; i < 93; 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.setStaNo(siemensS7Net.getByteTransform().TransInt16(result0.Content, i*2));   // 目标站
//            }
//        }
        //条码扫描器
        Thread.sleep(200);
        OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB100.200",(short)(barcodeSize*8));
@@ -218,7 +207,20 @@
                    barcodeThread.setBarcode(barcode);
                }
            }
        }
        //外形检测
        OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.42", (short) 8);
        if (resultErr.IsSuccess) {
            boolean[] status = siemensS7Net.getByteTransform().TransBool(resultErr.Content, 0, 1);
            StaProtocol staProtocol = station.get(304);
            staProtocol.setFrontErr(status[0]);
            staProtocol.setBackErr(status[1]);
            staProtocol.setHighErr(status[2]);
            staProtocol.setLeftErr(status[3]);
            staProtocol.setRightErr(status[4]);
            staProtocol.setWeightErr(status[5]);
            staProtocol.setBarcodeErr(status[6]);
        }
        Thread.sleep(200);
@@ -240,21 +242,12 @@
                if (!staProtocol.isPakMk() && !staProtocol.isLoading()) {
                    staProtocol.setPakMk(true);
                }
                if (staProtocol.getStamp()>=2 && !staProtocol.isLoading()){
                    staProtocol.setStamp(0);
                }else if (staProtocol.getStamp()<2 && staProtocol.isLoading()){
                    //lfd入库印记  当stamp>=2时才入库
                    staProtocol.setStamp(staProtocol.getStamp()+1);
                }
            }
        }
        if (result.IsSuccess && result1.IsSuccess) {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
            // 根据实时信息更新数据库
            try {
                List<BasDevp> basDevps = new ArrayList<>();
@@ -320,8 +313,7 @@
                    writeCount++;
                    log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                }
            }
            else {
            } else {
                writeCount++;
                log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
            }
src/main/resources/application-wcs.yml
New file
@@ -0,0 +1,77 @@
# 下位机配置
wcs-slave:
  inSta: 102,104,110,115
  outSta: 101,103,111,116
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 31,34
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.11.7
    port: 6000
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 33
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 33
      bay: 1
      lev: 1
  # 输送线1
  devp[0]:
    id: 1
    ip: 10.10.11.10
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 出库口1
    outSta[0]:
      staNo: 102
      led: ${wcs-slave.led[0].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.121
    port: 51236
    # LED1
  led[0]:
    id: 1
    ip: 10.10.11.210
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    # 入库站和出库站
    staArr: 102,101
src/main/resources/application.yml
@@ -4,6 +4,8 @@
    context-path: /@pom.build.finalName@
spring:
  profiles:
    active: wcs
  application:
    name: @pom.build.finalName@
  datasource:
@@ -35,80 +37,3 @@
wms:
  url: 127.0.0.1:8080/wms
# 下位机配置
wcs-slave:
  inSta: 102,104,110,115
  outSta: 101,103,111,116
  # 双深
  doubleDeep: true
  # 双深库位排号
  doubleLocs: 31,34
  # 一个堆垛机负责的货架排数
  groupCount: 4
  # 堆垛机1
  crn[0]:
    id: 1
    ip: 10.10.11.7
    port: 6000
    rack: 0
    slot: 0
    # 偏移量,当堆垛机站点列号=1时,偏移量=2
    offset: 2
    demo: false
    # 堆垛机入库站点
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 33
      bay: 1
      lev: 1
    # 堆垛机出库站点
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 33
      bay: 1
      lev: 1
  # 输送线1
  devp[0]:
    id: 1
    ip: 10.10.11.10
    port: 102
    rack: 0
    slot: 0
    # 入库口1
    inSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 空板入库口1
    emptyInSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 拣料入库口1
    pickSta[0]:
      staNo: 102
      barcode: ${wcs-slave.barcode[0].id}
      backSta: 101
      led: ${wcs-slave.led[0].id}
    # 出库口1
    outSta[0]:
      staNo: 102
      led: ${wcs-slave.led[0].id}
  # 条码扫描仪1
  barcode[0]:
    id: 1
    ip: 10.10.10.121
    port: 51236
   # LED1
  led[0]:
    id: 1
    ip: 10.10.11.210
    port: 5005
    devpPlcId: ${wcs-slave.devp[0].id}
    staArr: 102