自动化立体仓库 - WCS系统
Junjie
2023-10-22 1d71c4a6ed388f4086fc1a7b1d99ceeb6ae728b0
src/main/java/com/zy/core/thread/LiftThread.java
@@ -1,23 +1,19 @@
package com.zy.core.thread;
import HslCommunication.Core.Transfer.DataFormat;
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.ModBus.ModbusTcpNet;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasLift;
import com.zy.asrs.entity.BasLiftOpt;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.BasShuttleOpt;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.BasLiftOptService;
import com.zy.asrs.service.BasLiftService;
import com.zy.asrs.service.BasShuttleOptService;
import com.zy.asrs.service.BasShuttleService;
import com.zy.common.utils.CommonUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.ThreadHandler;
@@ -26,11 +22,10 @@
import com.zy.core.enums.*;
import com.zy.core.model.LiftSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.LiftAssignCommand;
import com.zy.core.model.command.LiftCommand;
import com.zy.core.model.command.ShuttleAssignCommand;
import com.zy.core.model.command.ShuttleCommand;
import com.zy.core.model.command.*;
import com.zy.core.model.protocol.LiftStaProtocol;
import com.zy.core.model.protocol.LiftProtocol;
import com.zy.core.model.protocol.StaProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -47,14 +42,27 @@
@Slf4j
public class LiftThread implements  Runnable, ThreadHandler {
    private ModbusTcpNet modbusTcpNet;
    private SiemensS7Net siemensS7Net;
    private LiftSlave slave;
    private LiftProtocol liftProtocol;
    private RedisUtil redisUtil;
    private List<LiftStaProtocol> liftStaProtocols = new ArrayList<>();
    public LiftThread(LiftSlave slave,RedisUtil redisUtil) {
        this.slave = slave;
        this.redisUtil = redisUtil;
        //初始化站点
        for (LiftSlave.Sta sta : this.slave.getSta()) {
            LiftStaProtocol liftStaProtocol = new LiftStaProtocol();
            liftStaProtocol.setStaNo(sta.getStaNo());//站点号
            liftStaProtocol.setLev(sta.getLev());//站点楼层
            String locNo = Utils.getLocNo(this.slave.getStaRow(), this.slave.getStaBay(), sta.getLev());
            liftStaProtocol.setLocNo(locNo);//站点库位号
            liftStaProtocol.setLiftNo(sta.getLiftNo());//提升机号
            liftStaProtocols.add(liftStaProtocol);
        }
    }
    @Override
@@ -70,16 +78,18 @@
                switch (step) {
                    // 读数据
                    case 1:
                        readStatus();
                        read();
                        break;
                    // 写入数据
                    case 2:
                        write((LiftCommand) task.getData());
                        write((NyLiftCommand) task.getData());
                        break;
                    //分配任务
                    case 3:
                        assignWork((LiftAssignCommand) task.getData());
                        break;
                    case 4:
                        write2((HashMap<String, Object>) task.getData());
                    default:
                        break;
                }
@@ -94,10 +104,8 @@
    public boolean connect() {
        boolean result = false;
        //-------------------------提升机连接方法------------------------//
        modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x02);
        // 当你需要指定格式的数据解析时,就需要设置下面的这个信息
        modbusTcpNet.setDataFormat(DataFormat.ABCD);
        OperateResult connect = modbusTcpNet.ConnectServer();
        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
        OperateResult connect = siemensS7Net.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】提升机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
@@ -106,90 +114,86 @@
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】提升机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("提升机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
        }
        modbusTcpNet.ConnectClose();
        siemensS7Net.ConnectClose();
        //-------------------------提升机连接方法------------------------//
        return result;
    }
    @Override
    public void close() {
        modbusTcpNet.ConnectClose();
        siemensS7Net.ConnectClose();
    }
    private void read() {
        try {
            readStatus();
            //提升机处于运行状态,将标记置为false
            if (liftProtocol.getBusy()) {
                liftProtocol.setPakMk(false);
            }
            //提升机处于未运行、就绪、标记true、有任务号
            if (!liftProtocol.getBusy()
                    && !liftProtocol.getPakMk()
                    && liftProtocol.getTaskNo() != 0) {
                //还有未完成的命令
                executeWork(liftProtocol.getTaskNo());
            }
        } catch (Exception e) {
            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】提升机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
    }
    private void readStatus() {
        try {
            OperateResultExOne<byte[]> result = modbusTcpNet.Read("29", (short) 50);
            if (result.IsSuccess) {
            //获取提升机数据
            OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB82.4.0", (short) 10);
            if (result1.IsSuccess) {
                if (null == liftProtocol) {
                    liftProtocol = new LiftProtocol();
                    liftProtocol.setLiftNo(slave.getId().shortValue());
                }
                //----------读取提升机状态-----------
                //获取数据
                byte[] content = result.Content;
                //提升机锁定
                liftProtocol.setLiftLock(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content, 0)));
                //位置到达反馈
                liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
                //准备就绪
                liftProtocol.setReady(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,4)));
                //运行中
                liftProtocol.setRunning(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,6)));
                //联机/单机
                liftProtocol.setMode(CommonUtils.shortToBoolean(modbusTcpNet.getByteTransform().TransInt16(content,8)));
                //以下参数并未进行调整(需要后续针对实机进行获取和调试)
                //输送线前端光电有货
                liftProtocol.setLineFrontHasStock(modbusTcpNet.getByteTransform().TransBool(content,10));
                //输送线正转反馈
                liftProtocol.setForwardRotationFeedback(modbusTcpNet.getByteTransform().TransBool(content,12));
                //输送线反转反馈
                liftProtocol.setReverseFeedback(modbusTcpNet.getByteTransform().TransBool(content,14));
                //输送线电机过载
                liftProtocol.setMotorOverload(modbusTcpNet.getByteTransform().TransBool(content,16));
                //输送线末端光电有货
                liftProtocol.setLineEndHasStock(modbusTcpNet.getByteTransform().TransBool(content,18));
                //进输送线卡托盘报警
                liftProtocol.setInConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,20));
                //出输送线卡托盘报警
                liftProtocol.setOutConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,22));
                //平台位置偏差报警
                liftProtocol.setPlatPositionDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,24));
                //平台扭矩偏差报警
                liftProtocol.setPlatTorqueDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,26));
                //平台四向车检测
                liftProtocol.setPlatShuttleCheck(modbusTcpNet.getByteTransform().TransBool(content,28));
                //未就绪状态
                liftProtocol.setNotReady(modbusTcpNet.getByteTransform().TransInt16(content,30));
                //伺服1错误
                liftProtocol.setServoError1(modbusTcpNet.getByteTransform().TransInt16(content,32));
                //伺服2错误
                liftProtocol.setServoError2(modbusTcpNet.getByteTransform().TransInt16(content,34));
                //伺服3错误
                liftProtocol.setServoError3(modbusTcpNet.getByteTransform().TransInt16(content,36));
                //伺服4错误
                liftProtocol.setServoError4(modbusTcpNet.getByteTransform().TransInt16(content,38));
                //提升机实际速度反馈
                liftProtocol.setLiftActualSpeed(modbusTcpNet.getByteTransform().TransInt16(content,40));
                ///读取提升机状态-end
                //小车处于运行状态,将标记置为true
                if (liftProtocol.getRunning()) {
                    liftProtocol.setPakMk(true);
                //读取4.0-4.7数据
                boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result1.Content, 0, 1);
                //读取5.0-5.7数据
                boolean[] status2 = siemensS7Net.getByteTransform().TransBool(result1.Content, 1, 1);
                //模式
                liftProtocol.setModel(status1[0]);
                //忙闲
                liftProtocol.setBusy(!status1[1]);
                //前超限
                liftProtocol.setFrontOverrun(status1[4]);
                //后超限
                liftProtocol.setBackOverrun(status1[5]);
                //左超限
                liftProtocol.setLeftOverrun(status1[6]);
                //右超限
                liftProtocol.setRightOverrun(status1[7]);
                //超高
                liftProtocol.setOverHeight(status2[0]);
                //超重
                liftProtocol.setOverWeight(status2[1]);
                //有托盘
                liftProtocol.setHasTray(status2[5]);
                //有小车
                liftProtocol.setHasCar(status2[6]);
                //设备故障
                liftProtocol.setDeviceError(status2[7]);
                //任务号
                liftProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 2));
                //目的地址
                liftProtocol.setDistAddress(siemensS7Net.getByteTransform().TransInt16(result1.Content, 4));
                //已完成任务号
                liftProtocol.setCompleteTaskNo(siemensS7Net.getByteTransform().TransInt16(result1.Content, 6));
                //当前楼层
                short lev = siemensS7Net.getByteTransform().TransInt16(result1.Content, 8);
                if (lev >= 7 && lev <= 9) {
                    lev -= 2;
                } else if (lev >= 12 && lev <= 14) {
                    lev -= 4;
                }
                //提升机处于锁定、未运行、就绪、标记true、有任务号
                if (liftProtocol.getLiftLock()
                        && !liftProtocol.getRunning()
                        && liftProtocol.getReady()
                        && liftProtocol.getPakMk()
                        && liftProtocol.getTaskNo() != 0
                        && liftProtocol.getAssignCommand() != null) {
                    //还有未完成的命令
                    executeWork(liftProtocol.getAssignCommand());
                }
                liftProtocol.setLev(lev);
                //将提升机状态保存至数据库
                BasLiftService liftService = SpringUtils.getBean(BasLiftService.class);
@@ -204,228 +208,249 @@
                basLift.setWrkNo(liftProtocol.getTaskNo().intValue());
                basLift.setUpdateTime(new Date());
                basLift.setPakMk(liftProtocol.getPakMk());
                basLift.setLiftLock(liftProtocol.getLiftLock());
                basLift.setPositionArrivalFeedback(liftProtocol.getPositionArrivalFeedback().intValue());
                basLift.setReady(liftProtocol.getReady());
                basLift.setRunning(liftProtocol.getRunning());
                basLift.setMode(liftProtocol.getMode());
                basLift.setLineFrontHasStock(liftProtocol.getLineFrontHasStock());
                basLift.setForwardRotationFeedback(liftProtocol.getForwardRotationFeedback());
                basLift.setReverseFeedback(liftProtocol.getReverseFeedback());
                basLift.setMotorOverload(liftProtocol.getMotorOverload());
                basLift.setLineEndHasStock(liftProtocol.getLineEndHasStock());
                basLift.setInConveyLineCardTrayAlarm(liftProtocol.getInConveyLineCardTrayAlarm());
                basLift.setOutConveyLineCardTrayAlarm(liftProtocol.getOutConveyLineCardTrayAlarm());
                basLift.setPlatPositionDeviationAlarm(liftProtocol.getPlatPositionDeviationAlarm());
                basLift.setPlatTorqueDeviationAlarm(liftProtocol.getPlatTorqueDeviationAlarm());
                basLift.setPlatShuttleCheck(liftProtocol.getPlatShuttleCheck());
                basLift.setNotReady(liftProtocol.getNotReady().intValue());
                basLift.setServoError1(liftProtocol.getServoError1().intValue());
                basLift.setServoError2(liftProtocol.getServoError2().intValue());
                basLift.setServoError3(liftProtocol.getServoError3().intValue());
                basLift.setServoError4(liftProtocol.getServoError4().intValue());
                basLift.setLiftActualSpeed(liftProtocol.getLiftActualSpeed().intValue());
                basLift.setModel(liftProtocol.getModel());
                basLift.setBusy(liftProtocol.getBusy());
                basLift.setFrontOverrun(liftProtocol.getFrontOverrun());
                basLift.setBackOverrun(liftProtocol.getBackOverrun());
                basLift.setLeftOverrun(liftProtocol.getLeftOverrun());
                basLift.setRightOverrun(liftProtocol.getRightOverrun());
                basLift.setOverHeight(liftProtocol.getOverHeight());
                basLift.setOverWeight(liftProtocol.getOverWeight());
                basLift.setHasTray(liftProtocol.getHasTray());
                basLift.setHasCar(liftProtocol.getHasCar());
                basLift.setDeviceError(liftProtocol.getDeviceError());
                basLift.setDistAddress(liftProtocol.getDistAddress().intValue());
                basLift.setCompleteTaskNo(liftProtocol.getCompleteTaskNo().intValue());
                basLift.setLev(liftProtocol.getLev().intValue());
                if (liftService.updateById(basLift)) {
                    OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
//                    log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                }
            }else {
                OutputQueue.LIFT.offer(MessageFormat.format("【{0}】{1}提升机plc状态信息失败", DateUtils.convert(new Date()), slave.getId()));
                throw new CoolException(MessageFormat.format( "提升机plc状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
            }
            Thread.sleep(200);
            //获取提升机站点数据
            OperateResultExOne<byte[]> result2 = siemensS7Net.Read("DB82.14.0", (short) (10 * liftStaProtocols.size()));
            if (result1.IsSuccess) {
                for (int i = 0; i < slave.getSta().size(); i++) {
                    LiftStaProtocol liftStaProtocol = liftStaProtocols.get(i);
                    int i1 = 0 + (i * 10);
                    int i2 = 1 + (i * 10);
                    //读取x4.0-x4.7数据
                    boolean[] status1 = siemensS7Net.getByteTransform().TransBool(result2.Content, i1, 1);
                    //读取x5.0-x5.7数据
                    boolean[] status2 = siemensS7Net.getByteTransform().TransBool(result2.Content, i2, 1);
                    //模式
                    liftStaProtocol.setModel(status1[0]);
                    //忙闲
                    liftStaProtocol.setBusy(!status1[1]);
                    //有托盘
                    liftStaProtocol.setHasTray(status1[2]);
                    //前超限
                    liftStaProtocol.setFrontOverrun(status1[4]);
                    //后超限
                    liftStaProtocol.setBackOverrun(status1[5]);
                    //左超限
                    liftStaProtocol.setLeftOverrun(status1[6]);
                    //右超限
                    liftStaProtocol.setRightOverrun(status1[7]);
                    //超高
                    liftStaProtocol.setOverHeight(status2[0]);
                    //超重
                    liftStaProtocol.setOverWeight(status2[1]);
                    //有小车
                    liftStaProtocol.setHasCar(status2[6]);
                    //设备故障
                    liftStaProtocol.setDeviceError(status2[7]);
                    //任务号
                    liftStaProtocol.setTaskNo(siemensS7Net.getByteTransform().TransInt16(result2.Content, 2));
                    //已完成任务号
                    liftStaProtocol.setCompleteTaskNo(siemensS7Net.getByteTransform().TransInt16(result2.Content, 6));
                }
            }
        } catch (Exception e) {
            OutputQueue.LIFT.offer(MessageFormat.format("【{0}】提升机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            initLift();
        }
    }
    private boolean write(LiftCommand command){
    private boolean write(NyLiftCommand command){
        if (null == command) {
            News.error("提升机写入命令为空");
            return false;
        }
        command.setLiftNo(slave.getId().shortValue());
        // 开始任务
        short[] array = new short[30];
        //开始运行
        array[0] = command.getRun();
        if (command.getDistPosition() != null) {
            //目标位置
            array[1] = command.getDistPosition();
        }
        if (command.getSpeed() != null) {
            //运行速度
            array[2] = command.getSpeed();
        }
        if (command.getHeight2() != null) {
            //二层高度设定
            array[3] = command.getHeight2();
        }
        if (command.getHeight3() != null) {
            //三层高度设定
            array[4] = command.getHeight3();
        }
        if (command.getHeight4() != null) {
            //四层高度设定
            array[5] = command.getHeight4();
        }
        if (command.getLiftLockShortValue() != null) {
            //提升机锁定
            array[29] = command.getLiftLockShortValue();
        }
        short[] array = getCommandArr(command);//获取命令报文
        OperateResult result = modbusTcpNet.Write("0", array);;
        OperateResult result = siemensS7Net.Write("DB83.0", 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()));
            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(NyLiftCommand command) {
        // 开始任务
        short[] array = new short[4];
        if (command.getTaskModel() != null) {
            //任务类型
            array[0] = command.getTaskModel();
        }
        if (command.getSourceSta() != null) {
            //源站台编号
            array[1] = command.getSourceSta();
        }
        if (command.getTargetSta() != null) {
            //目标站台编号
            array[2] = command.getTargetSta();
        }
        if (command.getTaskNo() != null) {
            //任务号
            array[3] = command.getTaskNo();
        }
        return array;
    }
    //分配任务
    private void assignWork(LiftAssignCommand assignCommand) {
        //将此map存入redis中
        HashMap<String, Object> map = new HashMap<>();
        //提升机号
        map.put("lift_no", assignCommand.getLiftNo());
        //工作号
        map.put("wrk_no", assignCommand.getTaskNo());
        //命令执行步序
        map.put("commandStep", 0);
        //命令
        map.put("assignCommand", assignCommand);
        LiftRedisCommand redisCommand = new LiftRedisCommand();
        redisCommand.setLiftNo(assignCommand.getLiftNo());//提升机号
        redisCommand.setWrkNo(assignCommand.getTaskNo());//工作号
        redisCommand.setCommandStep(0);//命令执行步序
        redisCommand.setAssignCommand(assignCommand);//命令
        //任务数据保存到redis
        redisUtil.set("lift_wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map));
        redisUtil.set("lift_wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(redisCommand));
        liftProtocol.setAssignCommand(assignCommand);
        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);
        //执行下发任务
        executeWork(assignCommand);
        executeWork(assignCommand.getTaskNo());
    }
    //执行任务
    private boolean executeWork(LiftAssignCommand assignCommand) {
    private boolean executeWork(Short wrkNo) {
        //读取redis数据
        if (assignCommand == null) {
        if (wrkNo == null) {
            return false;
        }
        //将标记置为false(防止重发)
        liftProtocol.setPakMk(false);
        //手动模式指令
        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.setRun((short) 1);//升降
                    command.setDistPosition(++lev);
                    break;
                case 2://下降一层
                    command.setRun((short) 1);//下降
                    command.setDistPosition(--lev);
                    break;
                case 3://有货正转
                    command.setRun((short) 6);
                    break;
                case 4://有货反转
                    command.setRun((short) 3);
                    break;
                case 5://复位
                    command.setRun((short) 0);
                    command.setLiftLock(false);
                    liftProtocol.setTaskNo((short) 0);
                    liftProtocol.setShuttleNo((short) 0);
                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
                    liftProtocol.setPakMk(true);
                    break;
                default:
            }
            commands.add(command);
            assignCommand.setCommands(commands);
        }
        Object o = redisUtil.get("lift_wrk_no_" + assignCommand.getTaskNo());
        WrkMastMapper wrkMastMapper = SpringUtils.getBean(WrkMastMapper.class);
        Object o = redisUtil.get("lift_wrk_no_" + wrkNo);
        if (o == null) {
            return false;
        }
        HashMap map = JSON.parseObject(o.toString(), HashMap.class);
        List<LiftCommand> commands = assignCommand.getCommands();
        LiftRedisCommand redisCommand = JSON.parseObject(o.toString(), LiftRedisCommand.class);
        List<NyLiftCommand> commands = redisCommand.getAssignCommand().getCommands();
        //当前步序
        int commandStep = Integer.parseInt(map.get("commandStep").toString());
        int commandStep = redisCommand.getCommandStep();
        //总步序
        int size = commands.size();
        //取出命令
        LiftCommand command = commands.get(commandStep);
        NyLiftCommand command = commands.get(commandStep);
        if (!redisCommand.getLiftNo().equals(liftProtocol.getLiftNo())) {
            return false;
        }
        //下发命令
        if (!write(command)) {
            News.error("提升机命令下发失败,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
            return false;
        }
        liftProtocol.setProtocolStatus(LiftProtocolStatusType.WORKING);
        News.info("提升机命令下发成功,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
        //将标记置为true(防止重发)
        liftProtocol.setPakMk(true);
        //保存数据到数据库做流水
        BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
        if (liftOptService != null) {
            short[] commandArr = getCommandArr(command);//获取命令报文
            BasLiftOpt opt = new BasLiftOpt(
                    redisCommand.getWrkNo().intValue(),
                    liftProtocol.getLiftNo().intValue(),
                    new Date(),
                    null,
                    null,
                    null,
                    JSON.toJSONString(command),
                    JSON.toJSONString(liftProtocol)
            );
            opt.setDeviceWrk(command.getTaskNo().toString());//设备工作号
            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());
            //判断数据是否执行完成
            if (commandStep < size - 1) {
                //更新redis数据
                //步序增加
                commandStep++;
                map.put("commandStep", commandStep);
                //任务数据保存到redis
                redisUtil.set("lift_wrk_no_" + map.get("wrk_no").toString(), JSON.toJSONString(map));
            }else {
                //已执行完成
                //保存数据到数据库做流水
                BasLiftOptService liftOptService = SpringUtils.getBean(BasLiftOptService.class);
                if (liftOptService != null) {
                    BasLiftOpt opt = new BasLiftOpt(
                            assignCommand.getTaskNo().intValue(),
                            assignCommand.getLiftNo().intValue(),
                            new Date(),
                            null,
                            null,
                            null,
                            JSON.toJSONString(assignCommand)
                    );
                    liftOptService.insert(opt);
                }
                //删除redis
                redisUtil.del("lift_wrk_no_" + map.get("wrk_no").toString());
            //对主线程抛出等待确认状态waiting
            liftProtocol.setProtocolStatus(LiftProtocolStatusType.WAITING);
            News.info("提升机任务执行下发完成等待执行结束,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
        }
                if (assignCommand.getAuto()) {
                    //对主线程抛出等待确认状态waiting
                    liftProtocol.setProtocolStatus(LiftProtocolStatusType.WAITING);
                    News.info("提升机任务执行完成等待确认中,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
                }else {
                    //手动模式不抛出等待状态
                    News.info("提升机手动任务执行完成,提升机号={},任务数据={}", command.getLiftNo(), JSON.toJSON(command));
                }
            }
        if (redisCommand.getAssignCommand().getTaskMode() == NyLiftTaskModelType.RESET.id.shortValue()) {
            //复位命令
            //工作号清零
            liftProtocol.setTaskNo((short) 0);
            //令牌清零
            liftProtocol.setToken(0);
            //设置提升机为空闲状态
            liftProtocol.setProtocolStatus(LiftProtocolStatusType.IDLE);
            //任务指令清零
            liftProtocol.setAssignCommand(null);
        }
        return true;
    }
    /**
     * 初始化提升机
     */
    private void initLift() {
        if (null == liftProtocol) {
            liftProtocol = new LiftProtocol();
    //给提升机写入进出状态
    private void write2(HashMap<String,Object> data) {
//        //出
//        status = true;
//        //进
//        status = false;
        int lev = Integer.parseInt(data.get("lev").toString());
        boolean status = Boolean.parseBoolean(data.get("status").toString());
        ArrayList<String> list = new ArrayList<String>(){{
            add("83.8.0");
            add("83.8.1");
            add("83.8.2");
            add("83.8.3");
            add("83.8.4");
            add("83.8.5");
            add("83.8.6");
            add("83.8.7");
            add("83.9.0");
            add("83.9.1");
        }};
        OperateResult result = siemensS7Net.Write("DB" + list.get(lev - 1), status);
        if (result != null && result.IsSuccess) {
            News.info("提升机命令下发[id:{}]", slave.getId());
        } else {
            News.error("写入提升机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }