自动化立体仓库 - WCS系统
#
Junjie
2023-11-15 4d2609f0e8c9fbb75eed02fddec04dc9c4538767
#
4个文件已修改
252 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/CrnSlave.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -46,10 +46,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -2100,43 +2097,111 @@
        }
    }
    public synchronized void autoEmptyOut() {
        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, 1);
        Integer autoOutSite = 12;
        //如果站点可出禁用,则不生成空盘出库任务
        StaProtocol staProtocol = devpThread.getStation().get(autoOutSite);
        if (staProtocol == null) {
            return;
        } else {
            staProtocol = staProtocol.clone();
        }
        if (staProtocol.isAutoing()  //自动
                && !staProtocol.isLoading()  //无物
                && staProtocol.isOutEnable()  //可出信号
                && staProtocol.getWorkNo() == 0
        ) {
            WrkMast pakoutEmpty = wrkMastMapper.selectPakoutEmpty(autoOutSite);
            if (null != pakoutEmpty) {
                return;
            }
            try {
                String response = new HttpHandler.Builder()
                        .setUri(wmsUrl)
                        .setPath("/rpc/auto/emptyOut/v1")
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
                    JSONObject data = (JSONObject) jsonObject.get("data");
                    log.info((String) data.get("msg"));
    /**
     * 扫描碟盘机自动入库空托盘
     */
    public synchronized void autoEmptyIn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 遍历空板入库口
            for (CrnSlave.CrnStn emptyInStn : crnSlave.getEmptyCrnInStn()) {
                // 获取空板入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, emptyInStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(emptyInStn.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response);
                    staProtocol = staProtocol.clone();
                }
            } catch (Exception e) {
                e.printStackTrace();
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                // 站点条件判断
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                        && staProtocol.isEmptyMk() && (staProtocol.getWorkNo() >= 9990
                        && staProtocol.getWorkNo() <= 9999)) {
                    try {
                        LocTypeDto locTypeDto = new LocTypeDto(staProtocol);
                        SearchLocParam param = new SearchLocParam();
                        param.setIoType(10);
                        param.setSourceStaNo(emptyInStn.getStaNo());
                        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().shortValue());
                            staProtocol.setStaNo(dto.getStaNo().shortValue());
                            devpThread.setPakMk(staProtocol.getSiteId(), false);
                            boolean result = MessageQueue.offer(SlaveType.Devp, devpThread.getSlave().getId(), new Task(2, staProtocol));
                            if (!result) {
                                throw new CoolException("更新plc站点信息失败");
                            }
                        } else {
                            log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
    /**
     * 扫描拆盘机自动出库空托盘
     */
    public synchronized void autoEmptyOut() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            for (CrnSlave.CrnStn emptyOutStn : crnSlave.getEmptyCrnOutStn()) {
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, emptyOutStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(emptyOutStn.getStaNo());
                if (staProtocol == null) {
                    return;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing()  //自动
                        && !staProtocol.isLoading()  //无物
                        && staProtocol.isOutEnable()  //可出信号
                        && staProtocol.getWorkNo() == 0
                ) {
                    WrkMast pakoutEmpty = wrkMastMapper.selectPakoutEmpty(emptyOutStn.getStaNo());
                    if (null != pakoutEmpty) {
                        return;
                    }
                    try {
                        HashMap<String, Object> map = new HashMap<>();
                        map.put("crnNo", crnSlave.getId());
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setParams(map)
                                .setPath("/rpc/auto/emptyOut/v1")
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            JSONObject data = (JSONObject) jsonObject.get("data");
                            log.info((String) data.get("msg"));
                        } else {
                            log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1","", response);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    }
                }
            }
        }
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -45,58 +45,32 @@
                    // 演示
                    //mainService.crnDemoOfLocMove1();
                    // 演示 所有库位轮询
                    mainService.crnDemoOfLocMove2();
                    // 入出库模式切换函数
//                    mainService.ioConvert();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    mainService.generateStoreWrkFile0(); // WMS入库
                    // 拣料、并板、盘点再入库
                    mainService.stnToCrnStnPick();
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
                    mainService.crnIoExecute();
                    // 入出库增强 ===>> 堆垛机命令下发后,异步修改工作档状态
//                    mainService.crnIoWrkMast();
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr();
                    // 入库  ===>> 空栈板初始化入库,叉车入库站放货
                    mainService.storeEmptyPlt();  // 空板入库
                    // 出库  ===>> 工作档信息写入led显示器
                    mainService.ledExecute();
                    // 其他  ===>> LED显示器复位,显示默认信息
                    mainService.ledReset();
                    mainService.outOfDevp();
                    //空托盘自动出库
                    //mainService.autoEmptyOut();
//                    //空托盘自动入库
//                    mainService.autoEmptyIn();
//                    // 其他  ===>> 入出库模式切换
//                    i++;
//                    if (i > 1) {
//                        mainService.ioConvert();
//                        i = 0;
//                    }
                    // 扫描碟盘机自动入库空托盘
                    mainService.autoEmptyIn();
                    // 扫描拆盘机自动出库空托盘
                    mainService.autoEmptyOut();
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/model/CrnSlave.java
@@ -28,6 +28,12 @@
    // 堆垛机出库站点
    private List<CrnStn> crnOutStn = new ArrayList<>();
    // 空托入库站点
    private List<CrnStn> emptyCrnInStn = new ArrayList<>();
    // 空托出库站点
    private List<CrnStn> emptyCrnOutStn = new ArrayList<>();
    @Data
    public static class CrnStn {
src/main/resources/application.yml
@@ -57,30 +57,30 @@
    # 堆垛机入库站1
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 1
      bay: 1
      lev: 1
    # 堆垛机入库站点2
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      staNo: 100
      row: 1
      bay: 1
      lev: 1
    # 堆垛机出库站点1
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 1
      bay: 1
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 300
      row: 3
      bay: 36
      lev: 1
    # 堆垛机出库站点2
    crnOutStn[1]:
    # 空托入库站点
    emptyCrnInStn[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 307
      row: 3
      bay: 36
      lev: 1
    # 空托出库站点
    emptyCrnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      row: 1
      bay: 1
      staNo: 103
      row: 3
      bay: 36
      lev: 1
  # 堆垛机2
  crn[1]:
@@ -95,30 +95,37 @@
    # 堆垛机入库站1
    crnInStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 1
      bay: 1
      lev: 5
    # 堆垛机入库站点2
    crnInStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      staNo: 203
      row: 1
      bay: 1
      lev: 5
    # 堆垛机出库站点1
    crnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 102
      row: 1
      bay: 1
      staNo: 406
      row: 8
      bay: 27
      lev: 5
    # 堆垛机出库站点2
    crnOutStn[1]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 105
      row: 1
      bay: 26
      staNo: 407
      row: 10
      bay: 27
      lev: 1
    # 空托入库站点
    emptyCrnInStn[0]:
      devpPlcId: ${wcs-slave.devp[1].id}
      staNo: 408
      row: 3
      bay: 36
      lev: 1
    # 空托出库站点
    emptyCrnOutStn[0]:
      devpPlcId: ${wcs-slave.devp[0].id}
      staNo: 204
      row: 3
      bay: 36
      lev: 1
  # 输送线1
  devp[0]:
@@ -173,10 +180,10 @@
    slot: 0
    # 空板入库口1
    emptyInSta[0]:
      staNo: 305
      staNo: 307
    # 空板入库口2
    emptyInSta[1]:
      staNo: 400
      staNo: 408
    # 出库口1
    outSta[0]:
      staNo: 305