自动化立体仓库 - WCS系统
pang.jiabao
2024-04-22 32b905ac1f907fd0f58784acd8f609e691b2ea6e
src/main/java/com/zy/core/thread/MelsecCrnThread.java
@@ -7,10 +7,11 @@
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
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.entity.BasCrnOpt;
import com.zy.entity.BasCrnp;
import com.zy.service.BasCrnOptService;
import com.zy.service.BasCrnpService;
import com.zy.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
@@ -24,7 +25,6 @@
import com.zy.core.model.protocol.CrnProtocol;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import java.text.MessageFormat;
import java.util.Date;
@@ -42,6 +42,11 @@
    private CrnProtocol crnProtocol;
    private short heartBeatVal = 1;
    private boolean resetFlag = false;
    /**
     * 堆垛机是否在回原点运动中标记
     */
    private boolean backHpFlag = false;
    public MelsecCrnThread(CrnSlave slave) {
        this.slave = slave;
@@ -82,12 +87,12 @@
                        command.setTaskNo((short) 0); // 工作号
                        command.setAckFinish((short) 1);  // 任务完成确认位
                        command.setTaskMode(CrnTaskModeType.NONE); // 任务模式
                        command.setSourcePosX((short)0);     // 源库位排
                        command.setSourcePosY((short)0);     // 源库位列
                        command.setSourcePosZ((short)0);     // 源库位层
                        command.setDestinationPosX((short)0);     // 目标库位排
                        command.setDestinationPosY((short)0);     // 目标库位列
                        command.setDestinationPosZ((short)0);     // 目标库位层
//                        command.setSourcePosX((short)0);     // 源库位排
//                        command.setSourcePosY((short)0);     // 源库位列
//                        command.setSourcePosZ((short)0);     // 源库位层
//                        command.setDestinationPosX((short)0);     // 目标库位排
//                        command.setDestinationPosY((short)0);     // 目标库位列
//                        command.setDestinationPosZ((short)0);     // 目标库位层
                        write(command);
                        break;
                    default:
@@ -120,13 +125,13 @@
        crnProtocol.setWalkPos((short)0);
        crnProtocol.setLoaded((short)0);
        crnProtocol.setAlarm((short)0);
        crnProtocol.setXSpeed(0F);
        crnProtocol.setYSpeed(0F);
        crnProtocol.setZSpeed(0F);
        crnProtocol.setXDistance(0F);
        crnProtocol.setYDistance(0F);
        crnProtocol.setXDuration(0F);
        crnProtocol.setYDuration(0F);
        crnProtocol.setxSpeed((short)0);
        crnProtocol.setySpeed((short)0);
        crnProtocol.setzSpeed((short)0);
        crnProtocol.setxDistance((short)0);
        crnProtocol.setyDistance((short)0);
        crnProtocol.setxDuration((short)0);
        crnProtocol.setyDuration((short)0);
    }
    @Override
@@ -137,10 +142,10 @@
        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()));
            log.info("堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            News.info("MelsecCrn"+" - 1"+" - 堆垛机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } 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("MelsecCrn"+" - 2"+" - 堆垛机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initCrn();
        }
//        melsecMcNet.ConnectClose();
@@ -157,10 +162,11 @@
//                flag1=1;
//                System.out.println("===");
//            }
            OperateResultExOne<byte[]> result = melsecMcNet.Read("D20", (short) 70);
            OperateResultExOne<byte[]> result = melsecMcNet.Read("D1035", (short) 56);
            if (result.IsSuccess) {
                if (null == crnProtocol) {
                    crnProtocol = new CrnProtocol();
                    crnProtocol.setCrnNo(slave.getId());
                }
                crnProtocol.setMode(melsecMcNet.getByteTransform().TransInt16(result.Content, 0));
                crnProtocol.setTaskNo(melsecMcNet.getByteTransform().TransInt16(result.Content, 2));
@@ -176,20 +182,23 @@
                crnProtocol.setTemp2(melsecMcNet.getByteTransform().TransInt16(result.Content, 22));
                crnProtocol.setTemp3(melsecMcNet.getByteTransform().TransInt16(result.Content, 24));
                crnProtocol.setTemp4(melsecMcNet.getByteTransform().TransInt16(result.Content, 26));
                crnProtocol.setXSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 28));
                crnProtocol.setYSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 32));
                crnProtocol.setZSpeed(melsecMcNet.getByteTransform().TransSingle(result.Content, 36));
                crnProtocol.setXDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 40));
                crnProtocol.setYDistance(melsecMcNet.getByteTransform().TransSingle(result.Content, 44));
                crnProtocol.setXDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 48));
                crnProtocol.setYDuration(melsecMcNet.getByteTransform().TransSingle(result.Content, 52));
                crnProtocol.setxSpeed(melsecMcNet.getByteTransform().TransInt16(result.Content, 28));
                crnProtocol.setySpeed(melsecMcNet.getByteTransform().TransInt16(result.Content, 32));
                crnProtocol.setzSpeed(melsecMcNet.getByteTransform().TransInt16(result.Content, 36));
                crnProtocol.setxDistance(melsecMcNet.getByteTransform().TransInt16(result.Content, 40));
                crnProtocol.setyDistance(melsecMcNet.getByteTransform().TransInt16(result.Content, 44));
                crnProtocol.setxDuration(melsecMcNet.getByteTransform().TransInt16(result.Content, 48));
                crnProtocol.setyDuration(melsecMcNet.getByteTransform().TransInt16(result.Content, 52));
                OutputQueue.CRN.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                // 复位信号
                if (crnProtocol.getStatusType().equals(CrnStatusType.WAITING)) {
                    log.error("-------------------------------------------第一步、[堆垛机号:{}][工作号:{}]==>> 状态为90,等待确认!!",slave.getId(),crnProtocol.getTaskNo());
                    News.error("MelsecCrn"+" - 3"+" ---------第一步、[堆垛机号:{}][工作号:{}]==>> 状态为90,等待确认!!",slave.getId(),crnProtocol.getTaskNo());
                    if (resetFlag) {
                        if(crnProtocol.getTaskNo()==9999){
                            backHpFlag = false;
                        }
                        CrnCommand crnCommand = new CrnCommand();
                        crnCommand.setAckFinish((short)1);
                        if (write(crnCommand)) {
@@ -198,7 +207,6 @@
                    }
                }
                // 根据实时信息更新数据库
                BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
                BasCrnp basCrnp = new BasCrnp();
@@ -206,7 +214,7 @@
                basCrnp.setCrnNo(slave.getId());
                basCrnp.setCrnSts((int)crnProtocol.getMode());
                if (!basCrnpService.updateById(crnProtocol.toSqlModel(basCrnp))){
                    log.error("堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                    News.error("MelsecCrn"+" - 4"+" - 堆垛机plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
                }
            } else {
@@ -216,7 +224,7 @@
        } 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("MelsecCrn"+" - 5"+" - 读取堆垛机plc状态信息失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            initCrn();
        }
@@ -227,9 +235,58 @@
     */
    private boolean write(CrnCommand command){
        if (null == command) {
            log.error("堆垛机写入命令为空");
            News.error("MelsecCrn"+" - 6"+" - 堆垛机写入命令为空");
            return false;
        }
//        OperateResult result = null;
//        try{
//            Integer exeCount=0;
//            do{
//                command.setCrnNo(slave.getId());
//                short[] array = new short[10];
//                array[0] = command.getAckFinish();
//                array[1] = command.getTaskNo();
//                array[2] = command.getTaskMode();
//                array[3] = command.getSourcePosX();
//                array[4] = command.getSourcePosY();
//                array[5] = command.getSourcePosZ();
//                array[6] = command.getDestinationPosX();
//                array[7] = command.getDestinationPosY();
//                array[8] = command.getDestinationPosZ();
//                array[9] = command.getCommand();
//                result = melsecMcNet.Write("D0", array);
//                if(result.IsSuccess) {
//                    if (command.getAckFinish() == 0) {
//                        short commandFinish = 1;
//                        result = melsecMcNet.Write("D9", commandFinish);
//                        if(result.IsSuccess){
//                            //写任务确认返回成功后,查询确认一次
//                            Thread.sleep(200);
//                            OperateResultExOne<byte[]> result1 = melsecMcNet.Read("D9", (short)2);
//                            if(result1.IsSuccess){
//                                short commandVal = melsecMcNet.getByteTransform().TransInt16(result1.Content,2);
//                                if(commandVal==1){
//                                    break;
//                                } else {
//                                    exeCount++;
//                                }
//                            } else{
//                                exeCount++;
//                            }
//                        }else{
//                            exeCount++;
//                        }
//                    }
//                }else{
//                    exeCount++;
//                }
//                Thread.sleep(200);
//            }while(exeCount>3);
//        }catch (Exception e){
//
//        }
        command.setCrnNo(slave.getId());
        short[] array = new short[10];
        array[0] = command.getAckFinish();
@@ -242,11 +299,11 @@
        array[7] = command.getDestinationPosY();
        array[8] = command.getDestinationPosZ();
        array[9] = command.getCommand();
        OperateResult result = melsecMcNet.Write("D0", array);
        OperateResult result = melsecMcNet.Write("D1001", array);
        if (command.getAckFinish() == 0) {
            short commandFinish = 1;
            result = melsecMcNet.Write("D9", commandFinish);
            result = melsecMcNet.Write("D1010", commandFinish);
        }
        try {
@@ -272,13 +329,13 @@
            bean.insert(basCrnOpt);
        } catch (Exception ignore) {}
        if (result.IsSuccess) {
            log.info("堆垛机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
        if (result != null && result.IsSuccess) {
            News.info("MelsecCrn"+" - 7"+" - 堆垛机命令下发[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("MelsecCrn"+" - 8"+" - 写入堆垛机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
@@ -292,14 +349,24 @@
     * 心跳
     */
    private void heartbeat(){
        if (heartBeatVal == 1) {
            heartBeatVal = 2;
        if (heartBeatVal >= 30000) {
            heartBeatVal = -30000;
        } else {
            heartBeatVal = 1;
            heartBeatVal =(short) (heartBeatVal+1);
        }
        OperateResult write = melsecMcNet.Write("D10", heartBeatVal);
        OperateResult write = melsecMcNet.Write("D1011", heartBeatVal);
//        OperateResult write1 = melsecMcNet.Write("D1001", (short) 0);
//        OperateResult write2 = melsecMcNet.Write("D1002", (short) 0);
//        OperateResult write3 = melsecMcNet.Write("D1003", (short) 0);
//        OperateResult write4 = melsecMcNet.Write("D1004", (short) 0);
//        OperateResult write5 = melsecMcNet.Write("D1005", (short) 0);
//        OperateResult write6 = melsecMcNet.Write("D1006", (short) 0);
//        OperateResult write7 = melsecMcNet.Write("D1007", (short) 0);
//        OperateResult write8 = melsecMcNet.Write("D1008", (short) 0);
//        OperateResult write9 = melsecMcNet.Write("D1009", (short) 0);
//        OperateResult write10 = melsecMcNet.Write("D1010", (short) 0);
        if (!write.IsSuccess) {
            log.error("输送线plc编号={} 心跳失败", slave.getId());
            News.error("MelsecCrn"+" - 9"+" - 堆垛机plc心跳通讯失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }