*
lsh
2025-06-14 cc885fe7e9629fa922a369c3938a748ec7f7e246
src/main/java/com/zy/core/thread/RgvThread.java
@@ -8,15 +8,14 @@
import com.core.common.DateUtils;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvErrLog;
import com.zy.asrs.entity.BasRgvOpt;
import com.zy.asrs.service.BasRgvErrLogService;
import com.zy.asrs.service.BasRgvOptService;
import com.zy.asrs.service.BasRgvService;
import com.zy.asrs.utils.NumUtils;
import com.zy.asrs.utils.RouteUtils;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.RgvStatusType;
import com.zy.core.enums.RgvTaskModeType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.RgvSlave;
@@ -27,7 +26,10 @@
import lombok.extern.slf4j.Slf4j;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
/**
 * RGV线程
@@ -49,6 +51,7 @@
     */
    private boolean resetFlag2 = false;
    private boolean connectRgv = false;
    private boolean alarmChangeSign = false;
    public RgvThread(RgvSlave slave) {
        this.slave = slave;
@@ -98,13 +101,16 @@
                    step = task.getStep();
                }
                switch (step) {
                    // 读数据
                    //漫游任务完成信号
                    case 1:
//                        readStatus();
                        taskComplete();
                        break;
                    //工位1写入数据
                    case 2:
                        write((RgvCommand) task.getData());
                        RgvCommand command2 = (RgvCommand) task.getData();
                        rgvOpt(command2);
                        write(command2);
                        break;
                    // 复位
                    case 3:
@@ -118,26 +124,25 @@
                        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
                        command.setSourceStaNo1((short)0);     // 源站
                        command.setDestinationStaNo1((short)0);     // 目标站
                        rgvOpt(command);
                        write3(command);
                        break;
                    // 复位
                    //工位1写入取消数据
                    case 4:
                        RgvCommand command4 = (RgvCommand) task.getData();
                        if (null == command4) {
                            command4 = new RgvCommand();
                        }
                        command4.setRgvNo(slave.getId()); // RGV编号
                        command4.setTaskNo1((short) 0); // 工作号
                        command4.setAckFinish1((short) 1);  // 任务完成确认位
                        command4.setTaskMode1(RgvTaskModeType.X_MOVE); // 任务模式
                        command4.setSourceStaNo1((short)0);     // 源站
                        command4.setDestinationStaNo1((short)0);     // 目标站
                        write3(command4);
                        rgvOpt(command4);
                        write4(command4);
                        break;
                    // 漫游
                    case 5:
                        Long aLong = (Long) task.getData();
                        rgvOpt(aLong);
                        write5(aLong);
                        break;
                    default:
                        break;
                }
                Thread.sleep(100);
                Thread.sleep(50);
            } catch (Exception e) {
                log.error("RGV写线程异常"+e.getMessage());
//                e.printStackTrace();
@@ -218,6 +223,30 @@
        rgvProtocol.setxDuration((short) 0);
    }
//    /**
//     * 初始化RGV状态
//     */
//    private void initRgv() {
//        if (null == rgvProtocol) {
//            rgvProtocol = new RgvProtocol();
//        }
//        rgvProtocol.setRgvNo(slave.getId());
//        rgvProtocol.setMode((short) 3);
//        rgvProtocol.setStatus((short)0);
//        rgvProtocol.setTaskNo1((short)0);
//        rgvProtocol.setStatus1((short)0);
//        rgvProtocol.setLoaded1((short)0);
//        rgvProtocol.setWalkPos((short)0);
//        rgvProtocol.setRgvPos(slave.getId()*100000L);
//        rgvProtocol.setTaskNo2((short)0);
//        rgvProtocol.setStatus2((short)0);
//        rgvProtocol.setLoaded2((short)0);
//        rgvProtocol.setAlarm((short)0);
//        rgvProtocol.setxSpeed((short) 0);
//        rgvProtocol.setxDistance((short) 0);
//        rgvProtocol.setxDuration((short) 0);
//    }
    @Override
    public boolean connect() {
        boolean result = false;
@@ -246,6 +275,7 @@
            OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) 20);
            OperateResultExOne<byte[]> resultV = siemensNet.Read("DB20.16", (short) 2);
            OperateResultExOne<byte[]> resultE = siemensNet.Read("DB20.26", (short) 2);
            OperateResultExOne<byte[]> resultError = siemensNet.Read("DB13.0", (short) 13);
            if (result.IsSuccess && resultV.IsSuccess && resultE.IsSuccess) {
                if (null == rgvProtocol) {
                    rgvProtocol = new RgvProtocol();
@@ -262,8 +292,21 @@
                rgvProtocol.setRgvPos(siemensNet.getByteTransform().TransUInt32(result.Content, 16));
                rgvProtocol.setInstantaneousSpeed(Double.valueOf(siemensNet.getByteTransform().TransInt16(resultV.Content, 0)));
                rgvProtocol.setEndStaM(siemensNet.getByteTransform().TransInt16(resultE.Content, 0));
                boolean[] statusAlarmList = siemensNet.getByteTransform().TransBool(resultError.Content, 0, 13);
                int alarmCount = 0;
                List<Integer> alarmList = new ArrayList<>();
                for (boolean alarmSign : statusAlarmList){
                    alarmCount++;
                    if (alarmSign){
                        alarmList.add(alarmCount);
                    }
                }
                alarmChangeSign = new HashSet<>(alarmList).equals(new HashSet<>(rgvProtocol.getAlarmList()));
                rgvProtocol.setAlarmList(alarmList);
//                rgvProtocol.setRgvPos((long)NumUtils.GetRandomIntInRange(1737000));
                OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
                try {
                    // 根据实时信息更新数据库
@@ -275,6 +318,16 @@
                    if (!basRgvService.updateById(rgvProtocol.toSqlModel(basRgv))){
                        log.error("RGV plc数据库更新失败 ===>> [id:{}] [ip:{}] [port:{}] [rack:{}] [slot:{}]", slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot());
                    }
                    try{
                        if (!alarmChangeSign && !alarmList.isEmpty()){
                            BasRgvErrLogService basRgvErrLogService = SpringUtils.getBean(BasRgvErrLogService.class);
                            BasRgvErrLog basRgvErrLog = new BasRgvErrLog(rgvProtocol.getAlarmList(), rgvProtocol.getTaskNo1(), rgvProtocol.getRgvNo());
                            basRgvErrLogService.insert(basRgvErrLog);
                        }
                    } catch (Exception e){
                        log.error("RGV异常信息保存失败!!");
                    }
                } catch (Exception ignore) {
                }
@@ -295,6 +348,24 @@
    /**
     * 工位1写入数据
     */
    private void rgvOpt(RgvCommand command) {
        try{
            BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol, command);
            basRgvOptService.insert(basRgvOpt);
        }catch (Exception e){
            log.error("RGV写入命令保存失败!!");
        }
    }
    private void rgvOpt(Long command) {
        try{
            BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol, command);
            basRgvOptService.insert(basRgvOpt);
        }catch (Exception e){
            log.error("RGV写入命令保存失败!!");
        }
    }
    private boolean write(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
@@ -357,6 +428,95 @@
            return false;
        }
    }
    private boolean write4(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");
            return false;
        }
//        siemensNet.Write("DB24.10.0", false);
//        siemensNet.Write("DB24.10.1", false);
        command.setRgvNo(slave.getId());
        short[] array = new short[5];
        array[0] = command.getRgvNo().shortValue();
        array[1] = command.getSourceStaNo1();
        array[2] = command.getDestinationStaNo1();
        array[3] = command.getTaskMode1();//任务模式
        array[4] = command.getTaskNo1();
        OperateResult result = siemensNet.Write("DB24.0", array);
//
//        if (command.getAckFinish1().equals((short)0)) {
////            Thread.sleep(100L);
////            siemensNet.Write("DB24.10.7", command.getRgvSome() == 1);
////            Thread.sleep(20L);
////            result = siemensNet.Write("DB24.10.0", true);
//        } else {
//            siemensNet.Write("DB24.10.1", true);
//        }
        try {
            // 日志记录
            BasRgvOptService bean = SpringUtils.getBean(BasRgvOptService.class);
            BasRgvOpt basRgvOpt = new BasRgvOpt(
                    command.getTaskNo1().intValue(),
                    command.getTaskNo2().intValue(),
                    command.getRgvNo(),
                    new Date(),
                    command.getTaskModeType1().toString(),
                    command.getSourceStaNo1().intValue(),
                    command.getDestinationStaNo1().intValue(),
                    command.getSourceStaNo2().intValue(),
                    command.getDestinationStaNo2().intValue(),
                    null,
                    new Date(),
                    null
            );
            bean.insert(basRgvOpt);
        } catch (Exception ignore) {}
        if (result != null && result.IsSuccess) {
//            Thread.sleep(200);
//            this.readStatus();
            log.info("RGV 工位1取消命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSONString(command));
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 工位1命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSONString(command)));
            return true;
        } else {
            OutputQueue.RGV.offer(MessageFormat.format("【{0}】写入RGV plc工位1数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
            log.error("写入RGV plc工位1取消数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            return false;
        }
    }
    /**
     * 完成
     */
    private void taskComplete() {
        try {
            OperateResultExOne<byte[]> result = siemensNet.Read("DB24.11", (short) 1);
            boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, 0, 1);
            if (status[0]){
                OperateResult result4 = siemensNet.Write("DB24.11.0", false);
            }
        } catch (Exception e) {
            log.error("RGV数据任务下发复位线程异常!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    private void write5(Long devperimeter){
        try {
            siemensNet.Write("DB24.12", devperimeter.intValue());
            Thread.sleep(10L);
            siemensNet.Write("DB24.11.0", true);
        } catch (Exception ignore) {
            log.error("写入RGV plc工位1漫游数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    private boolean write3(RgvCommand command) throws InterruptedException {
        if (null == command) {
            log.error("RGV写入命令为空");