#
zjj
3 天以前 c904f735e0b8a488ef56744c08f8e10258639bce
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -161,7 +161,7 @@
    /**
     * 读取状态
     */
    private void readStatus(){
    private void readStatus() throws InterruptedException {
        OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) 56);
        if (result.IsSuccess) {
@@ -202,88 +202,6 @@
                    if (write(crnCommand)) {
                        resetFlag = false;
                        //堆垛机任务完成后访问wms请求任务完成 locationDone 货位处理完成
                        TaskWrkService taskWrkService = SpringUtils.getBean(TaskWrkService.class);
                        TaskWrk taskWrk = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("wrk_no",crnProtocol.getTaskNo()));
                        String tasktype = null;
                        switch (taskWrk.getIoType()){
                            case 1:
                                tasktype= "RK";
                                break;
                            case 2:
                                tasktype= "CK";
                                break;
                            case 3:
                                tasktype= "YK";
                                break;
                            default:
                                tasktype= "未知";
                        }
                        Map<String, Object> map = new HashMap<>();
                        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
                        TaskOverToWms taskOverToWms = new TaskOverToWms();
                        taskOverToWms.setFeedbackFrom("WCS"); //来源
                        taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识
                        taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号
                        taskOverToWms.setTaskType(tasktype); // 任务类型
                        taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码
                        if (taskWrk.getIoType() ==1){
                            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
                        }else if (taskWrk.getIoType() ==2){
                            Map<Integer,String> map1 = new HashMap<>();
                            map1.put(102,"J-1101");
                            map1.put(106,"J-1103");
                            map1.put(110,"J-1105");
                            map1.put(114,"J-1107");
                            map1.put(118,"J-1109");
                            map1.put(122,"J-1111");
                            map1.put(305,"H-1101");
                            map1.put(405,"G-1101");
                            taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
                            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
                        } else if (taskWrk.getIoType() == 3) {
                            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
                            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint());
                            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
                        }
                        taskOverToWms.setTaskStatus("location_done"); //任务状态
                        String response = null;
                        try {
                            response = new HttpHandler.Builder()
                                    .setHeaders(map)
                                    .setUri("10.32.53.195:8080")
                                    .setPath("wcsManager/wcsInterface/taskStatusFeedback")
                                    .setJson(JSON.toJSONString(taskOverToWms))
                                    .build()
                                    .doPost();
                        }catch (Exception e){
                            log.error("堆垛机任务完成,请求wms任务完成接口失败");
                        }
                        ApiLogService apiLogService = SpringUtils.getBean(ApiLogService.class);
                        apiLogService.save("Wms任务完成接口"
                                ,"10.32.53.195:8080"+"/wcsManager/wcsInterface/taskStatusFeedback"
                                ,null
                                ,"127.0.0.1"
                                ,JSON.toJSONString(taskOverToWms)
                                ,response
                                ,true
                        );
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)){
                            if (taskWrk.getIoType() == 3){
                                taskWrk.setWrkSts(4);
                            }
                            taskWrk.setStatus(5);
                            if (!taskWrkService.update(taskWrk,new EntityWrapper<TaskWrk>().eq("wrk_no",crnProtocol.getTaskNo()))){
                                log.error("堆垛机任务完成,改变任务状态失败");
                            }
                            log.info("堆垛机任务完成,请求wms任务完成接口成功");
                        }else {
                            log.error("堆垛机任务完成,请求wms任务完成接口完成,但返回失败");
                        }
                    }
@@ -315,7 +233,7 @@
    /**
     * 写入数据
     */
    private boolean write(CrnCommand command){
    private boolean write(CrnCommand command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            return false;
@@ -354,7 +272,7 @@
        array[6] = command.getDestinationPosZ();
        array[7] = command.getDestinationPosX();
        array[8] = command.getDestinationPosY();
        array[9] = command.getCommand();
//        array[9] = command.getCommand();
        // 作业信息
        OperateResult result = siemensNet.Write("DB100.0", array);
@@ -395,12 +313,12 @@
        try{
            //堆垛机任务写入后,回读一次,看是否成功
            Thread.sleep(500);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                //one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
@@ -409,9 +327,11 @@
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                one.setSourceStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 18));
//                one.setDestinationStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 20));
                if (!crnCommand.getTaskNo().equals(one.getTaskNo()) && !crnCommand.getAckFinish().equals(one.getAckFinish())
                        && !crnCommand.getSourcePosZ().equals(one.getSourcePosZ()) &&  !crnCommand.getSourcePosX().equals(one.getSourcePosX()) && !crnCommand.getSourcePosY().equals(one.getSourcePosY())
                        && !crnCommand.getDestinationPosZ().equals(one.getDestinationPosZ()) &&  !crnCommand.getDestinationPosX().equals(one.getDestinationPosX()) && !crnCommand.getDestinationPosY().equals(one.getDestinationPosY())
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                ){
                    log.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    log.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(crnCommand));
@@ -420,20 +340,55 @@
                    readStatus();
                    return false;
                } else {
                    log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    log.info("5堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
                }
            }
        }catch (Exception e){
            log.error("堆垛机命令地址写入后回读出错");
        }
        if (command.getAckFinish() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.18", commandFinish);
                    if(result.IsSuccess){
                        //堆垛机任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                log.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                log.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            log.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        log.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
        return true;
    }
    /**
     * 写入数据
     */
    private boolean write2(CrnCommand command){
    private boolean write2(CrnCommand command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            return false;
@@ -472,11 +427,10 @@
        array[6] = command.getDestinationPosZ();
        array[7] = command.getDestinationPosX();
        array[8] = command.getDestinationPosY();
        array[9] = command.getCommand();
//        array[9] = command.getCommand();
        // 作业信息
        OperateResult result = siemensNet.Write("DB100.0", array);
        // 日志记录
//        try {
            if (command.getAckFinish() != 1) {
                BasCrnOptService bean = SpringUtils.getBean(BasCrnOptService.class);
                BasCrnOpt basCrnOpt = new BasCrnOpt(
@@ -498,7 +452,7 @@
                );
                bean.insert(basCrnOpt);
            }
//        } catch (Exception ignore) {}
        //更新命令日志
        CommandInfoLogService commandInfoLogService = SpringUtils.getBean(CommandInfoLogService.class);
@@ -511,22 +465,7 @@
        }
        CommandInfoLog commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class);
        commandInfoLog.setId(null);
//        CommandInfoLog commandInfoLog = new CommandInfoLog();
//        if (commandInfo != null) {
//            commandInfoLog = JSON.parseObject(JSON.toJSONString(commandInfo), CommandInfoLog.class);
//            commandInfoLog.setId(null);
//        }else {
//            Date now = new Date();
//            commandInfoLog.setCommand(JSON.toJSONString(command));
//            commandInfoLog.setCommandStatus(3);
//            commandInfoLog.setStartTime(now);
//            commandInfoLog.setExecuteTime(now);
//            commandInfoLog.setCompleteTime(now);
//            commandInfoLog.setDevice(SlaveType.Devp.toString());
//            commandInfoLog.setWrkNo(9999);
//            commandInfoLog.setTaskNo("9999");
//            commandInfoLog.setCommandDesc("手动命令");
//        }
        if (result.IsSuccess) {
@@ -563,41 +502,84 @@
            commandInfoLogService.insert(commandInfoLog);
            return false;
        }
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        try{
            //堆垛机任务写入后,回读一次,看是否成功
            Thread.sleep(500);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 24);
            OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
            if (resultRead.IsSuccess) {
                CrnCommand one = new CrnCommand();
                one.setAckFinish(siemensNet.getByteTransform().TransInt16(resultRead.Content, 0));
                one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                //one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
//                one.setSourceStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 18));
//                one.setDestinationStaNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 20));
                if (!crnCommand.getTaskNo().equals(one.getTaskNo()) && !crnCommand.getAckFinish().equals(one.getAckFinish())
                && !crnCommand.getSourcePosZ().equals(one.getSourcePosZ()) &&  !crnCommand.getSourcePosX().equals(one.getSourcePosX()) && !crnCommand.getSourcePosY().equals(one.getSourcePosY())
                        && !crnCommand.getDestinationPosZ().equals(one.getDestinationPosZ()) &&  !crnCommand.getDestinationPosX().equals(one.getDestinationPosX()) && !crnCommand.getDestinationPosY().equals(one.getDestinationPosY())
//                one.setTraySize(siemensNet.getByteTransform().TransBool(resultRead.Content, 22));
                if (!command.getTaskNo().equals(one.getTaskNo()) || !command.getTaskMode().equals(one.getTaskMode())
                        || !command.getSourcePosX().equals(one.getSourcePosX()) || !command.getSourcePosY().equals(one.getSourcePosY())
                        || !command.getSourcePosZ().equals(one.getSourcePosZ()) || !command.getDestinationPosX().equals(one.getDestinationPosX())
                        || !command.getDestinationPosY().equals(one.getDestinationPosY()) || !command.getDestinationPosZ().equals(one.getDestinationPosZ())
                ){
                    log.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    log.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(crnCommand));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(5, crnCommand));
                    try{
                        log.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    }catch (Exception e){
                        try{
                            log.error("日志打印失败:===>>参数one报错 [id:{}],{}", slave.getId(), JSON.toJSON(command),JSON.toJSON(resultRead));
                        }catch (Exception e1){
                            log.error("日志打印失败:===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                        }
                    }
                    log.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(command));
                    MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(5, command));
                    Thread.sleep(100);
                    readStatus();
                    return false;
                } else {
                    log.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                    OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
                    log.info("4堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                }
            }
        }catch (Exception e){
            log.error("堆垛机命令地址写入后回读出错");
        }
        if (command.getAckFinish() == 0) {
            if (result.IsSuccess) {
                Thread.sleep(300);
                //任务下发次数
                int writeCount2 = 0;
                do {
                    writeCount2++;
                    short commandFinish = (short) 1;
                    result = siemensNet.Write("DB100.18", commandFinish);
                    if(result.IsSuccess){
                        //堆垛机任务写入后,回读一次,看是否成功
                        Thread.sleep(200);
                        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.18", (short) 2);
                        if (resultRead.IsSuccess) {
                            commandFinish=siemensNet.getByteTransform().TransInt16(resultRead.Content, 0);
                            if (commandFinish != 1){
                                log.error("堆垛机任务确认位"+commandFinish+"写入数据与回读数据不一致!"+"循环执行次数:"+writeCount2+"次");
                            }else{
                                //任务命令写入成功
                                log.info("堆垛机任务确认位"+commandFinish+"回读成功!"+"循环执行次数:"+writeCount2+"次");
                                break;
                            }
                        }else {
                            log.error("堆垛机任务确认位"+commandFinish+"回读失败!"+"循环执行次数:"+writeCount2+"次");
                        }
                    } else {
                        log.error("堆垛机任务确认位"+commandFinish+"写入失败!"+"循环执行次数:"+writeCount2+"次");
                    }
                }while (writeCount2<5);
            }
        }
        return true;
    }