自动化立体仓库 - WCS系统
#
whycq
2024-01-30 c3f35481f4f5b3951c17c3e53cbc855473c07a91
#
5个文件已修改
124 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/CrnController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/CrnStatusType.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/CrnController.java
@@ -413,6 +413,7 @@
        command.setDestinationPosZ(param.getRow());     // 目标库位排
        command.setDestinationPosX(param.getBay());     // 目标库位列
        command.setDestinationPosY(param.getLev());     // 目标库位层
        command.setCommand((short)1);
        return crnControl(command)?R.ok():R.error();
    }
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -753,8 +753,8 @@
            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk)) {
//                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                if (Cools.isEmpty(taskWrk)&&crnProtocol.getTaskNo() !=999) {
                   log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
src/main/java/com/zy/core/enums/CrnStatusType.java
@@ -20,12 +20,12 @@
    IDLE(0, "空闲,无任务"),
    NONE_MOVING(1, "取货定位"),
    FETCHING(2, "取货中"),
    MOVING(3, "取货完成,放货定位中"),
    PUTTING(4, "放货中"),
    HOMING(5, "回原点"),
    ANTI_ORIGIN(6, "反原点"),
    PUT_COMPLETE(7, "库位移载"),
    FETCHING(2, "取货等待"),
    MOVING(3, "取货中"),
    PUTTING(4, "放货走行"),
    HOMING(5, "放货等待"),
    ANTI_ORIGIN(6, "放货中"),
    PUT_COMPLETE(7, "回原点"),
//    MOVE_THE_SHIPPING_LOCATION(8, "移动到放货位置"),
//    PUTTING(9, "放货中"),
    HANDLING_COMPLETED(10, "搬运完成等待WCS确认"),
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -336,7 +336,7 @@
//        crnCommand.setDestinationStaNo(command.getDestinationStaNo());
        crnCommand.setCommand(command.getCommand());
        if (command.getTaskNo() == 0 && command.getAckFinish() == 0 && command.getAuto() != 1) {
            command.setTaskNo((short) 9999);
            command.setTaskNo((short) 999);
        }
        command.setCrnNo(slave.getId());
@@ -454,7 +454,7 @@
//        crnCommand.setDestinationStaNo(command.getDestinationStaNo());
        crnCommand.setCommand(command.getCommand());
        if (command.getTaskNo() == 0 && command.getAckFinish() == 0 && command.getAuto() != 1) {
            command.setTaskNo((short) 9999);
            command.setTaskNo((short) 999);
        }
        command.setCrnNo(slave.getId());
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -364,100 +364,21 @@
        int writeCount = 0;
        //任务下发成功标识
        boolean writeFlag = false;
        while(writeCount < 5){
            writeResult = siemensS7Net.Write("DB100." + index*4, array);    // 工作号、目标站
            if(writeResult.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*4, (short)4);
                if(readResult.IsSuccess){
                    short workNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 0);
                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 2);
                    if(staProtocol.getWorkNo().equals(workNo) && staProtocol.getStaNo().equals(staNo)){
                        //任务命令写入成功
                        writeFlag = true;
                        log.info("写入输送线命令后返回成功,并且回读成功。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                        Date now = new Date();
                        //更新指令状态
                        commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//输送线直接完成状态
                        commandInfo.setExecuteTime(now);
                        commandInfo.setCompleteTime(now);
                        commandInfoService.updateById(commandInfo);
                        //更新指令日志
                        commandInfoLog.setDeviceLog("指令下发成功");
                        commandInfoLog.setCommandStatus(CommandStatusType.COMPLETE.id);//输送线直接完成状态
                        commandInfoLog.setExecuteTime(now);
                        commandInfoLog.setCompleteTime(now);
                        commandInfoLogService.insert(commandInfoLog);
                        //更新任务步序
                        TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class);
                        TaskWrk taskWrk = taskWrkService.selectByWrkNo(staProtocol.getWorkNo().intValue());
                        if (taskWrk != null) {
                            taskWrk.setCommandStep(taskWrk.getCommandStep() + 1);//更新指令步序
                            taskWrkService.updateById(taskWrk);
                        }
                        break;
                    } else {//返回结果是成功了,但是真实值不相同
                        writeCount++;
                        OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={1},站点数据={2},写入次数={3}",
                                slave.getId(), JSON.toJSON(staProtocol),writeCount));
                        log.error("写入输送线命令后返回成功,但是读取任务值不一致。输送线plc编号={},{},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                        //更新指令日志
                        commandInfoLog.setDeviceLog("指令下发失败");
                        commandInfoLogService.insert(commandInfoLog);
                    }
                } else {
                    writeCount++;
                    OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令后读取失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                            slave.getId(), JSON.toJSON(staProtocol), writeCount));
                    log.error("写入输送线命令后读取失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                    //更新指令日志
                    commandInfoLog.setDeviceLog("指令下发失败");
                    commandInfoLogService.insert(commandInfoLog);
                }
            } else {
                writeCount++;
                OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令失败。输送线plc编号={1},站点数据={2},写入次数={3}",
                        slave.getId(), JSON.toJSON(staProtocol),writeCount));
                log.error("写入输送线命令失败。输送线plc编号={},站点数据={},写入次数={}", slave.getId(), JSON.toJSON(staProtocol), writeCount);
                //更新指令日志
                commandInfoLog.setDeviceLog("指令下发失败");
                commandInfoLogService.insert(commandInfoLog);
            }
            Thread.sleep(200);
        }
        //写命令尝试了5次还是失败了
        if(!writeFlag){
            staProtocol = station.get(staProtocol.getSiteId());
            if (staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0) {
                staProtocol.setPakMk(true);
            }
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】写入输送线命令尝试5次失败。输送线plc编号={1},站点数据={2}", slave.getId(), JSON.toJSON(staProtocol)));
            log.error("写入输送线命令尝试5次失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
            //重新添加数据到任务队列
            boolean result = MessageQueue.offer(SlaveType.Devp, slave.getId(), new Task(2, staProtocol));
            read();//读取1次设备状态
            return;
        } else {
            OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发成功 [id:{1}] >>>>> {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(staProtocol)));
            //log.info("输送线命令下发 [id:{}] >>>>> 命令下发成功: {}",  slave.getId(), JSON.toJSON(staProtocol));
            Integer siteId = staProtocol.getSiteId();
            staProtocol = station.get(siteId);
            if ((siteId == 101 || siteId == 201)&&(staProtocol.getWorkNo() == 0 && staProtocol.getStaNo() ==0)) {
                staProtocol.setPakMk(true);
        OperateResult writeResult1 = siemensS7Net.Write("DB100." + index*6, (int) staProtocol.getWorkNo());    // 工作号
        OperateResult writeResult2 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo());    // 目标站
        if(writeResult1.IsSuccess&&writeResult2.IsSuccess){
            //更新任务步序
            TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class);
            TaskWrk taskWrk = taskWrkService.selectByWrkNo((int) staProtocol.getWorkNo());
            if (taskWrk != null) {
                taskWrk.setCommandStep(taskWrk.getCommandStep() + 1);//更新指令步序
                taskWrkService.updateById(taskWrk);
            }else{
                log.error("输送线写入失败"+staProtocol+"++++++++++++++++++++++++++++++++++++++");
            }
        }
    }
    private void write2(StaProtocol staProtocol) throws InterruptedException {
        if (null == staProtocol) {