#
Junjie
2023-08-30 9fcfc2da51b6cb89415566384a76143900f61b05
src/main/java/com/zy/core/thread/LiftThread.java
@@ -73,7 +73,7 @@
                        break;
                    // 写入数据
                    case 2:
                        write((LiftCommand) task.getData());
                        write((NyLiftCommand) task.getData());
                        break;
                    //分配任务
                    case 3:
@@ -223,146 +223,52 @@
        }
    }
    private boolean write(LiftCommand command){
    private boolean write(NyLiftCommand command){
        if (null == command) {
            News.error("提升机写入命令为空");
            return false;
        }
//        command.setLiftNo(slave.getId().shortValue());
//        short[] array = getCommandArr(command);//获取命令报文
//
//        try {
//            Thread.sleep(500);//命令下发前休眠
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
//
//        OperateResult result = modbusTcpNet.Write("41088", array);
//        if (result != null && result.IsSuccess) {
//            News.info("提升机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
//            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
//
//            try {
//                Thread.sleep(500);//命令下发后休眠
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//
//            for (int i = 0; i < 5; i++) {
//                if (command.getRun().intValue() == 4 || command.getRun().intValue() == 5) {
//                    break;//系统复位和链条停止转动不需要重发
//                }
//                readStatus();//重新读取状态
//                if (liftProtocol.getRunning()) {
//                    break;
//                }
//
//                //判断是否运行中,如不运行,重新下发命令
//                result = modbusTcpNet.Write("41088", array);
//                News.info("提升机命令下发[id:{}] >>>>> {},次数:{}", slave.getId(), JSON.toJSON(command), i);
//                OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2},次数:{}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command), i));
//                try {
//                    Thread.sleep(300);//命令下发后休眠
//                } catch (InterruptedException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//            return true;
//        } else {
//            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】写入提升机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}],次数:{}", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
//            News.error("写入提升机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
//            return false;
//        }
        command.setLiftNo(slave.getId().shortValue());
        short[] array = getCommandArr(command);//获取命令报文
        return true;
        OperateResult result = siemensS7Net.Write("41088", array);
        if (result != null && result.IsSuccess) {
            News.info("提升机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】写入提升机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}],次数:{}", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            News.error("写入提升机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    //获取命令报文
    private short[] getCommandArr(LiftCommand command) {
    private short[] getCommandArr(NyLiftCommand command) {
        // 开始任务
        short[] array = new short[30];
        //开始运行
        array[0] = command.getRun();
        if (command.getDistPosition() != null) {
            //目标位置
            array[1] = command.getDistPosition();
        short[] array = new short[4];
        if (command.getTaskModel() != null) {
            //任务类型
            array[0] = command.getTaskModel();
        }
        if (command.getSpeed() != null) {
            //运行速度
            array[2] = command.getSpeed();
        if (command.getSourceSta() != null) {
            //源站台编号
            array[1] = command.getSourceSta();
        }
        if (command.getHeight2() != null) {
            //二层高度设定
            array[3] = command.getHeight2();
        if (command.getTargetSta() != null) {
            //目标站台编号
            array[2] = command.getTargetSta();
        }
        if (command.getHeight3() != null) {
            //三层高度设定
            array[4] = command.getHeight3();
        }
        if (command.getHeight4() != null) {
            //四层高度设定
            array[5] = command.getHeight4();
        }
        if (command.getHeight5() != null) {
            //四层高度设定
            array[6] = command.getHeight5();
        }
        if (command.getLiftLockShortValue() != null) {
            //提升机锁定
            array[29] = command.getLiftLockShortValue();
        }
        if (array[2] == 0) {
            // 开始任务
            short[] tmp = new short[2];
            tmp[0] = array[0];
            tmp[1] = array[1];
            array = tmp;
        if (command.getTaskNo() != null) {
            //任务号
            array[3] = command.getTaskNo();
        }
        return array;
    }
    //分配任务
    private void assignWork(LiftAssignCommand assignCommand) {
        //手动模式指令
        if (!assignCommand.getAuto()) {
            LiftCommand command = new LiftCommand();
            //提升机当前楼层
            Short lev = liftProtocol.getLev();
            List<LiftCommand> commands = assignCommand.getCommands();
            if (commands == null) {
                commands = new ArrayList<LiftCommand>();
            }
            liftProtocol.setTaskNo(assignCommand.getTaskNo());
            switch (assignCommand.getTaskMode()) {
                case 1://移动提升机
                    command = getLiftUpDownCommand(assignCommand.getLev());//获取提升机上升下降命令
                    break;
                case 3://无货正转
                    command = getLiftTurnCommand(3);//获取提升机转动命令
                    break;
                case 4://无货反转
                    command = getLiftTurnCommand(4);//获取提升机转动命令
                    break;
                case 5://有货正转
                    command = getLiftTurnCommand(1);//获取提升机转动命令
                    break;
                case 6://有货反转
                    command = getLiftTurnCommand(2);//获取提升机转动命令
                    break;
                case 7://链条停止
                    command = getLiftTurnCommand(5);//获取提升机转动命令
                    break;
                case 0://复位
                    command = getResetCommand();//获取复位命令
                    break;
                default:
            }
            commands.add(command);
            assignCommand.setCommands(commands);
        }
        LiftRedisCommand redisCommand = new LiftRedisCommand();
        redisCommand.setLiftNo(assignCommand.getLiftNo());//提升机号
        redisCommand.setWrkNo(assignCommand.getTaskNo());//工作号
@@ -389,257 +295,62 @@
            return false;
        }
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class);
        List<LiftCommand> commands = redisCommand.getAssignCommand().getCommands();
        List<NyLiftCommand> commands = redisCommand.getAssignCommand().getCommands();
        //当前步序
        int commandStep = redisCommand.getCommandStep();
        //总步序
        int size = commands.size();
        LiftAssignCommand assignCommand = redisCommand.getAssignCommand();
//        if (commandStep != 0) {
//            //判断上一条指令是否完成
//            LiftCommand command = commands.get(commandStep - 1);
//            if (command.getRun().intValue() == 1) {
//                //提升机升降命令
//                if (command.getDistPosition().intValue() == liftProtocol.getPositionArrivalFeedback().intValue()) {
//                    //提升机目标楼层和实际楼层相同,则认定命令完成
//                    command.setComplete(true);
//                }
//            } else if (command.getRun().intValue() == 2 || command.getRun().intValue() == 3) {
//                //无货正转,有货正转
//                if (!liftProtocol.getForwardRotationFeedback()) {
//                    //输送线正转反馈不在运行中,认定命令完成
//                    command.setComplete(true);
//                }
//            } else if (command.getRun().intValue() == 6 || command.getRun().intValue() == 7) {
//                //有货反转,无货反转
//                if (!liftProtocol.getReverseFeedback()) {
//                    //输送线反转反馈不在运行中,认定命令完成
//                    command.setComplete(true);
//                }
//            } else if (command.getRun().intValue() == 4) {
//                //输送线停止
//                if (!liftProtocol.getForwardRotationFeedback() && !liftProtocol.getReverseFeedback()) {
//                    //输送线正转反转都不在运行中,认定命令完成
//                    command.setComplete(true);
//                }
//            }
//            //任务数据保存到redis
//            redisUtil.set("lift_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
//
//            if (!command.getComplete()) {
//                //上一条任务未完成,禁止下发命令
//                return false;
//            }
//        }
        //取出命令
        LiftCommand command = commands.get(commandStep);
        if (command.getOperaStaNo() != null && command.getDevpId() != null) {
            //站点和输送线ID不为null,需要下发站点指令调度指定站点进行链条转动
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, command.getDevpId());
            StaProtocol staProtocol = devpThread.getStation().get(command.getOperaStaNo().intValue());
            staProtocol = staProtocol.clone();
            if (!staProtocol.isLiftArrival()) {//链条转动条件,需要有提升机到位信号
                liftProtocol.setPakMk(true);
                return false;
            }
            staProtocol.setWorkNo(wrkNo);//设置任务号
            if (command.getStaNo() != null) {
                staProtocol.setStaNo(command.getStaNo());//设置目标站
            }
            if (command.getRotationDire() != null) {
                staProtocol.setRotationDire(command.getRotationDire());//站点链条转动信号
            }
            Integer devpId = command.getDevpId();
            boolean result1 = MessageQueue.offer(SlaveType.Devp, devpId, new Task(3, staProtocol));//下发命令使输送线链条运转
        }
        WrkMast wrkMast = wrkMastMapper.selectByWorkNo(wrkNo.intValue());
        if (wrkMast != null) {
            if (wrkMast.getWrkSts() == 28) {//28.提升机搬运中
                if (command.getRun().intValue() == 1 && command.getDistPosition().intValue() == LiftLevType.TWO.lev) {
                    //提升机移动且位置是到输送线楼层,需要判断站点货物是否无物,提升机是否有物
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, command.getDevpId());
                    //工作档源库位楼层
                    int wrkMastLocNoLey = Utils.getLev(wrkMast.getSourceLocNo());
                    StaProtocol staProtocol = devpThread.getStation().get(Utils.levToOutInStaNo(wrkMastLocNoLey >= 2 ? wrkMastLocNoLey + 1 : wrkMastLocNoLey));//起始站点
                    //判断输送站点是否有物,只有无物情况才能继续调度提升机
                    if (staProtocol.isLoading()) {
                        //有物禁止调度
                        return false;
                    }
                }
            }
        }
        NyLiftCommand command = commands.get(commandStep);
        //下发命令
        if (!write(command)) {
            News.error("提升机命令下发失败,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
            return false;
        }
        News.info("提升机命令下发成功,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
        //将标记置为false(防止重发)
        liftProtocol.setPakMk(false);
        //保存数据到数据库做流水
        BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
        if (liftOptService != null) {
            short[] commandArr = getCommandArr(command);//获取命令报文
            BasLiftOpt opt = new BasLiftOpt(
                    redisCommand.getWrkNo().intValue(),
                    redisCommand.getLiftNo().intValue(),
                    new Date(),
                    null,
                    null,
                    null,
                    JSON.toJSONString(command),
                    JSON.toJSONString(commandArr)
            );
            liftOptService.insert(opt);
        }
        //判断数据是否执行完成
        if (commandStep < size - 1) {
            //更新redis数据
            //步序增加
            commandStep++;
            redisCommand.setCommandStep(commandStep);
            //任务数据保存到redis
            redisUtil.set("lift_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
        }else {
            News.info("提升机命令下发成功,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
            //已执行完成
            //删除redis
            redisUtil.del("lift_wrk_no_" + redisCommand.getWrkNo());
            //将标记置为false(防止重发)
            liftProtocol.setPakMk(false);
            //保存数据到数据库做流水
            BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
            if (liftOptService != null) {
                short[] commandArr = getCommandArr(command);//获取命令报文
                BasLiftOpt opt = new BasLiftOpt(
                        redisCommand.getWrkNo().intValue(),
                        redisCommand.getLiftNo().intValue(),
                        new Date(),
                        null,
                        null,
                        null,
                        JSON.toJSONString(command),
                        JSON.toJSONString(commandArr)
                );
                liftOptService.insert(opt);
            }
            //判断数据是否执行完成
            if (commandStep < size - 1) {
                //更新redis数据
                //步序增加
                commandStep++;
                redisCommand.setCommandStep(commandStep);
                //任务数据保存到redis
                redisUtil.set("lift_wrk_no_" + redisCommand.getWrkNo(), JSON.toJSONString(redisCommand));
            }else {
                //已执行完成
                //删除redis
                redisUtil.del("lift_wrk_no_" + redisCommand.getWrkNo());
                //对主线程抛出等待确认状态waiting
                liftProtocol.setProtocolStatus(LiftProtocolStatusType.WAITING);
                News.info("提升机任务执行下发完成等待执行结束,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
            }
            //对主线程抛出等待确认状态waiting
            liftProtocol.setProtocolStatus(LiftProtocolStatusType.WAITING);
            News.info("提升机任务执行下发完成等待执行结束,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
        }
        return true;
    }
    /**
     * 获取提升机解锁命令
     */
    public LiftCommand getUnlockCommand(Short liftNo) {
        LiftCommand command = new LiftCommand();
        command.setRun((short) 0);
        command.setLiftNo(liftNo);
        command.setLiftLock(false);
        return command;
    }
    /**
     * 获取复位命令
     */
    public LiftCommand getResetCommand() {
        LiftCommand command = new LiftCommand();
        command.setRun((short) 5);
        command.setLiftLock(false);
        return command;
    }
    /**
     * 获取提升机上升下降命令
     */
    public LiftCommand getLiftUpDownCommand(Integer lev) {
        LiftCommand command = new LiftCommand();
        command.setRun((short) 1);//升降
        Short position = LiftLevType.getRealLev(lev);//获取提升机实际楼层数值
        command.setDistPosition(position);
//        command.setSpeed((short) 200);
//        command.setHeight2((short) 180);
//        command.setHeight3((short) 1645);
//        command.setHeight4((short) (2 * 1645));
//        command.setHeight5((short) (3 * 1645));
        return command;
    }
    /**
     * 获取提升机上升下降命令
     */
    public LiftCommand getLiftUpDownCommand(Short liftNo, Short taskNo, Integer lev) {
        LiftCommand command = new LiftCommand();
        Short position = LiftLevType.getRealLev(lev);//获取提升机实际楼层数值
        command.setRun((short) 1);//升降
        command.setLiftNo(liftNo);//提升机号
        command.setTaskNo(taskNo);//任务号
        command.setDistPosition(position);//目标楼层
//        command.setSpeed((short) 200);
//        command.setHeight2((short) 180);
//        command.setHeight3((short) 1645);
//        command.setHeight4((short) 3290);
//        command.setHeight5((short) 4945);
        return command;
    }
    /**
     * 获取提升机转动命令,direction:1=》有货正转,2=》有货反转,3=>无货正转,4=>无货反转
     */
    public LiftCommand getLiftTurnCommand(Integer direction) {
        LiftCommand command = new LiftCommand();
        Short run = 0;
        switch (direction) {
            case 1:
                run = 6;//有货正转
                break;
            case 2:
                run = 3;//有货反转
                break;
            case 3:
                run = 2;//无货正转
                break;
            case 4:
                run = 7;//无货反转
                break;
            case 5:
                run = 4;//链条停止
        }
        command.setRun(run);
        return command;
    }
    /**
     * 获取提升机转动命令,direction:1=》有货正转,2=》有货反转
     */
    public LiftCommand getLiftTurnCommand(Short liftNo, Short taskNo, Integer direction) {
        LiftCommand command = new LiftCommand();
        Short run = 0;
        switch (direction) {
            case 1:
                run = 6;//有货正转
                break;
            case 2:
                run = 3;//有货反转
                break;
            case 3:
                run = 2;//无货正转
                break;
            case 4:
                run = 7;//无货反转
                break;
            case 5:
                run = 4;//链条停止
        }
        command.setRun(run);
        command.setLiftNo(liftNo);//提升机号
        command.setTaskNo(taskNo);//任务号
        return command;
    }
    /**
     * 初始化提升机
     */
    private void initLift() {
        this.connect();
        if (null == liftProtocol) {
            liftProtocol = new LiftProtocol();
        }
    }
    /******************************************************************************************/