1
zhang
2025-05-20 10c42cf3afce2b89626d094d6f85acbbbb5dd4e8
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -5,16 +5,20 @@
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.zy.asrs.entity.BasCrnOpt;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.service.BasCrnOptService;
import com.zy.asrs.service.BasCrnpService;
import com.zy.common.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.*;
import com.zy.core.enums.CrnStatusType;
import com.zy.core.enums.CrnTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CrnCommand;
@@ -127,10 +131,10 @@
        if(connect.IsSuccess){
            result = true;
            OutputQueue.CRN.offer(MessageFormat.format( "【{0}】堆垛机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            News.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
        } else {
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】堆垛机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            log.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            News.error("堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            initCrn();
        }
//        siemensNet.ConnectClose();
@@ -148,6 +152,7 @@
                    crnProtocol = new CrnProtocol();
                    crnProtocol.setCrnNo(this.getSlave().getId());
                }
                crnProtocol.setCrnNo(this.getSlave().getId());
                crnProtocol.setMode(siemensNet.getByteTransform().TransInt16(result.Content, 0));
                crnProtocol.setTaskNo(siemensNet.getByteTransform().TransInt16(result.Content, 2));
                crnProtocol.setStatus(siemensNet.getByteTransform().TransInt16(result.Content, 4));
@@ -169,11 +174,38 @@
                crnProtocol.setYDistance(siemensNet.getByteTransform().TransSingle(result.Content, 44));
                crnProtocol.setXDuration(siemensNet.getByteTransform().TransSingle(result.Content, 48));
                crnProtocol.setYDuration(siemensNet.getByteTransform().TransSingle(result.Content, 52));
                crnProtocol.setStatusEnd(false);
                try{
                    OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
                    if (resultRead.IsSuccess) {
                        CrnCommand one = new CrnCommand();
                        one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
                        one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
                        one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
                        one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
                        one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
                        one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
                        one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
                        one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
                        if (this.slave.getId() == 1){
                            if (one.getDestinationPosX() == 3 && one.getDestinationPosY() == 2 && one.getDestinationPosZ() == 1){
                                crnProtocol.setStatusEnd(true);
                            }
                        } else if (this.slave.getId() == 3){
                            if (one.getDestinationPosX() == 19 && one.getDestinationPosY() == 6 && one.getDestinationPosZ() == 1){
                                crnProtocol.setStatusEnd(true);
                            }
                        }
                    }
                } catch (Exception e){ }
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                if (!Cools.isEmpty(crnProtocol.getStatusType()) && crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    News.error("---第一步、[堆垛机号:{}, 工作号:{}, 载货台信号:{}]==>> 状态为10,等待确认!!",
                            slave.getId(),crnProtocol.getTaskNo(), crnProtocol.getLoaded()==1 ? "有物" : "无物");
                    if (resetFlag) {
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setAckFinish((short)1);
@@ -189,19 +221,19 @@
                    BasCrnp basCrnp = new BasCrnp();
                    basCrnp.setCrnNo(slave.getId());
                    if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
                        log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                        News.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                } catch (Exception ignore){}
            } else {
                initCrn();
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】读取堆垛机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
//                log.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
//                News.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
            }
        } catch (Exception e) {
//            e.printStackTrace();
            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());
//            News.error("读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initCrn();
        }
    }
@@ -220,12 +252,25 @@
     */
    private boolean write(CrnCommand command) throws InterruptedException {
        if (null == command) {
            log.error("堆垛机写入命令为空");
            News.error("堆垛机写入命令为空");
            return false;
        }
        OperateResult result1 = siemensNet.Write("DB100.0", 0);
        result1 = siemensNet.Write("DB100.18", 0);
        //下发前克隆一份
        CrnCommand crnCommand = new CrnCommand();
        crnCommand.setCrnNo(command.getCrnNo());
        crnCommand.setAckFinish(command.getAckFinish());
        crnCommand.setTaskNo(command.getTaskNo());
        crnCommand.setTaskMode(command.getTaskMode());
        crnCommand.setSourcePosX(command.getSourcePosX());
        crnCommand.setSourcePosY(command.getSourcePosY());
        crnCommand.setSourcePosZ(command.getSourcePosZ());
        crnCommand.setDestinationPosX(command.getDestinationPosX());
        crnCommand.setDestinationPosY(command.getDestinationPosY());
        crnCommand.setDestinationPosZ(command.getDestinationPosZ());
        crnCommand.setSourceStaNo(command.getSourceStaNo());
        crnCommand.setDestinationStaNo(command.getDestinationStaNo());
        crnCommand.setCommand(command.getCommand());
//        convertRow(command);
        command.setCrnNo(slave.getId());
@@ -242,11 +287,61 @@
        array[9] = command.getCommand();
        OperateResult result = siemensNet.Write("DB100.0", array);
        if(!result.IsSuccess){
            log.error("写入堆垛机plc数据失败,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(crnCommand));
            MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand));
            Thread.sleep(100);
            readStatus();
            return false;
        }
        //堆垛机任务写入后,回读一次,看是否成功
        Thread.sleep(200);
        OperateResultExOne<byte[]> resultRead = siemensNet.Read("DB100.0", (short) 20);
        if (resultRead.IsSuccess) {
            CrnCommand one = new CrnCommand();
            one.setTaskNo(siemensNet.getByteTransform().TransInt16(resultRead.Content, 2));
            one.setTaskMode(siemensNet.getByteTransform().TransInt16(resultRead.Content, 4));
            one.setSourcePosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 6));
            one.setSourcePosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 8));
            one.setSourcePosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 10));
            one.setDestinationPosX(siemensNet.getByteTransform().TransInt16(resultRead.Content, 12));
            one.setDestinationPosY(siemensNet.getByteTransform().TransInt16(resultRead.Content, 14));
            one.setDestinationPosZ(siemensNet.getByteTransform().TransInt16(resultRead.Content, 16));
            if (!command.getTaskNo().equals(one.getTaskNo()) || command.getTaskMode()!=one.getTaskMode()
                || command.getSourcePosX()!=one.getSourcePosX() ||  command.getSourcePosY()!=one.getSourcePosY()
                || command.getSourcePosZ()!=one.getSourcePosZ() || command.getDestinationPosX()!=one.getDestinationPosX()
                || command.getDestinationPosY()!=one.getDestinationPosY() || command.getDestinationPosZ()!=one.getDestinationPosZ()
            ){
                News.error("堆垛机命令地址写入后回读失败[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
                News.error("堆垛机命令回读失败后,重新添加任务到队列 ===>> [id:{}],{}", slave.getId(), JSON.toJSON(crnCommand));
//                MessageQueue.offer(SlaveType.Crn, slave.getId(), new Task(2, crnCommand));
                Thread.sleep(100);
                readStatus();
                return false;
            }else{
                News.info("堆垛机命令地址写入后回读成功[id:{}] >>>>> 写入[{}],===>>回读[{}]", slave.getId(), JSON.toJSON(command),JSON.toJSON(one));
            }
        }
        if (command.getAckFinish() == 0) {
            if (result.IsSuccess) {
                short commandFinish = 1;
                Thread.sleep(300);
                result = siemensNet.Write("DB100.18", commandFinish);
                News.info("堆垛机命令地址写入成功,开始写确认位[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
                Integer counts = 0;
                while(true) {
                    result = siemensNet.Write("DB100.18", commandFinish);
                    if(result.IsSuccess){
                        break;
                    } else {
                        counts++;
                        if(counts>5){
                            break;
                        }
                    }
                    Thread.sleep(300);
                }
            }
        }
@@ -276,12 +371,12 @@
        if (result != null && result.IsSuccess) {
            Thread.sleep(200);
//            this.readStatus();
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            News.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
            OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
            return true;
        } else {
            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());
            News.error("写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }