AGV小车心跳线程检测功能

文章描述了一个名为WcsHeartThread的类,负责处理无线通信设备(Rgv)的心跳信息,包括发送请求、解析响应、同步时间和状态更新等操作,确保系统与设备之间的实时通信

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.meslog.wcs.service.thread;

import com.meslog.basic.wcs.path.core.Node;
import com.meslog.basic.wcs.path.enums.DirectionStatus;
import com.meslog.basic.wcs.plc.utils.LoggerUtil;
import com.meslog.basic.wcs.utils.Coord;
import com.meslog.commin.core.utils.SpringContextHolder;
import com.meslog.wcs.res.enums.PalletStatus;
import com.meslog.wcs.res.enums.RgvStatus;
import com.meslog.wcs.res.msgparse.ByteBeanUtil;
import com.meslog.wcs.res.msgparse.HeartBaseResult;
import com.meslog.wcs.res.msgparse.MapDataResult;
import com.meslog.wcs.res.msgparse.ResultBase;
import com.meslog.wcs.service.core.util.LockNodeManager;
import com.meslog.wcs.service.core.util.LongConnSendUtilLora;
import com.meslog.wcs.service.enums.ElectricStatus;
import com.meslog.wcs.service.enums.RgvType;
import com.meslog.wcs.service.init.SystemInit;
import com.meslog.wcs.service.pojo.Rgv;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.base.RgvBaseMessage;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.message.RgvLifeRecMessage;
import com.meslog.wcs.service.pojo.rgv.rgv.protocol.message.RgvLifeSendMessage;
import com.meslog.wcs.service.rescontact.ResultContainer;
import com.meslog.wcs.service.rescontact.ToRes;
import com.meslog.wcs.service.system.service.impl.CodeDBServiceImpl;
import com.meslog.wcs.service.system.service.impl.RgvDBServiceImpl;
import com.meslog.wcs.service.system.service.impl.WareHouseDBServiceImpl;
import com.meslog.wcs.service.util.WcsUtil;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WcsHeartThread extends Thread {
  private static final CodeDBServiceImpl codeDBService = (CodeDBServiceImpl)SpringContextHolder.getBean(CodeDBServiceImpl.class);
  
  private static WareHouseDBServiceImpl wareHouseDBService = (WareHouseDBServiceImpl)SpringContextHolder.getBean(WareHouseDBServiceImpl.class);
  
  private Rgv rgv;
  
  private static final int INTERVAL_TIME = 800;
  
  private static Logger log = LoggerFactory.getLogger(WcsHeartThread.class);
  
  private static final RgvDBServiceImpl rgvdbService = (RgvDBServiceImpl)SpringContextHolder.getBean(RgvDBServiceImpl.class);
  
  private boolean syncTiming = false;
  
  public WcsHeartThread(Rgv rgv) {
    super(rgv.getRgvDB().getRgvNo() + "号车心跳线程");
    this.rgv = rgv;
  }
  
  public void run() {
    try {
      while (true) {
        try {
          if (RgvType.FOUR_GENERATIONS.getValue().equals(this.rgv.getRgvDB().getRgvType())) {
            doExec(ToRes.getInstance(this.rgv).heartRequest(ByteBeanUtil.toByte(this.rgv.getRgvHeart(), this.rgv.getRgvDB().getRgvNo())));
          } else if (this.rgv.checkRgvType(RgvType.FIVE_POINT_FOUR_TL) && !this.rgv.isStopHeart()) {
            RgvBaseMessage rgvBaseMessage = ToRes.getInstance(this.rgv).heartRequest(new RgvLifeSendMessage(this.rgv));
            if (!this.syncTiming && this.rgv.getCurResTaskNo() == null && 
              rgvBaseMessage != null)
              if (rgvBaseMessage instanceof RgvLifeRecMessage) {
                syncTime((RgvLifeRecMessage)rgvBaseMessage, this.rgv);
              } else {
                LoggerUtil.error("数据返回类型错误-->" + rgvBaseMessage, getClass());
              }  
          } 
        } catch (IOException e) {
          LongConnSendUtilLora.socketMap.remove(this.rgv);
          if (this.rgv.getRgvStatus() != RgvStatus.ERROR) {
            this.rgv.setRgvStatus(RgvStatus.OFF_LINE);
            this.rgv.offLinePing();
          } else {
            this.rgv.setStatusDescription("小车离线");
          } 
          log.warn(this.rgv.getRgvName() + "心跳通讯异常", e.getMessage());
          Thread.sleep(3000L);
        } catch (Exception e) {
          log.error("心跳通讯出现故障", e);
          log.warn(this.rgv.getRgvName() + "心跳通讯异常", e.getMessage());
          Thread.sleep(5000L);
        } 
        try {
          Thread.sleep(800L);
        } catch (InterruptedException e) {
          e.printStackTrace();
        } 
      } 
    } catch (Throwable $ex) {
      throw $ex;
    } 
  }
  
  private void syncTime(RgvLifeRecMessage rgvLifeRecMessage, Rgv rgv) {
    if (!rgvLifeRecMessage.isTimeSync()) {
      this.syncTiming = true;
      (new Thread(() -> {
            try {
              ToRes toRes = ToRes.getInstance(rgv);
              toRes.syncTime(Integer.valueOf(0));
            } catch (Exception e) {
              WcsUtil.exceptionLog(e, getClass());
            } 
            this.syncTiming = false;
          })).start();
    } 
  }
  
  public static void doExec(byte[] receiveByte) {
    long receiveTime = System.currentTimeMillis();
    ResultBase receiveMsg = ByteBeanUtil.parseByte(receiveByte);
    receiveMsg.setRetTime(receiveTime);
    if (receiveMsg instanceof HeartBaseResult) {
      Rgv rgv = SystemInit.getByRgvNo(receiveMsg.getDeviceNo());
      baseInfoHandle((HeartBaseResult)receiveMsg, rgv);
    } else if (receiveMsg instanceof MapDataResult) {
      Rgv rgv = SystemInit.getByRgvNo(receiveMsg.getDeviceNo());
      mapInfoHandle((MapDataResult)receiveMsg, rgv);
    } 
  }
  
  private static void mapInfoHandle(MapDataResult mapDataResult, Rgv rgv) {
    ResultContainer.getContainer(rgv).putMapResultMap(mapDataResult.getDeviceNo(), (ResultBase)mapDataResult);
  }
  
  private static void baseInfoHandle(HeartBaseResult heartBaseResult, Rgv rgv) {
    if (RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue()) != RgvStatus.OFF_LINE) {
      ResultContainer.getContainer(rgv).putResult(Integer.valueOf(heartBaseResult.getCmdNo()), heartBaseResult);
      ResultContainer.getContainer(rgv).putResult(Integer.valueOf(heartBaseResult.getTaskNo()), heartBaseResult);
      rgv.setPalletStatus(PalletStatus.parseStatus(heartBaseResult.getPalletStatus().intValue()));
      rgv.setDirection(parseDirection(heartBaseResult.getDriveDirection(), Integer.valueOf((SystemInit.wareHouseDB == null) ? 1 : SystemInit.wareHouseDB.getMapDirection().intValue())));
      rgv.setElectricStatus(ElectricStatus.parseStatus(heartBaseResult.getBattery().intValue(), rgv));
      rgv.setResTaskResult(Integer.valueOf(heartBaseResult.getTaskResult()));
      rgv.setBattery(heartBaseResult.getBattery());
      rgv.setSameMapVersion((heartBaseResult.getIsSameMapVersion().intValue() == 0));
      rgv.setCurrSegment(heartBaseResult.getCurentSegment());
      rgv.setSegmentLocation(heartBaseResult.getSegmentLocation());
      String codeDescByWarning = codeDBService.getCodeDescByWarning(heartBaseResult.getStatusMessage());
      if (codeDescByWarning != null) {
        rgv.setStatusDescription(codeDescByWarning);
      } else if (rgv.getCurResTaskNo() == null) {
        rgv.setStatusDescription(null);
      } 
      rgv.setBarrierAtOne(Integer.valueOf(heartBaseResult.getBarrierAtOne()));
      rgv.setBarrierAtTwo(Integer.valueOf(heartBaseResult.getBarrierAtTwo()));
      rgv.setBarrierAtThree(Integer.valueOf(heartBaseResult.getBarrierAtThree()));
      rgv.setBarrierAtFour(Integer.valueOf(heartBaseResult.getBarrierAtFour()));
      rgv.setHasPallet(Integer.valueOf(heartBaseResult.getOffsetGroundCode()));
      rgv.setLocationCode(String.valueOf(heartBaseResult.getOffsetGroundCode()));
      if (heartBaseResult.getCurBarcode().intValue() != 16776991) {
        rgv.setGroundCode(String.format("%06d", new Object[] { heartBaseResult.getCurBarcode() }));
      } else {
        rgv.setGroundCode(null);
      } 
      rgv.setDirectionStatus(DirectionStatus.parseStatus(heartBaseResult.getReserveStatus().intValue()));
      Node oldLocation = rgv.getCurLocation();
      if (heartBaseResult.getX().intValue() == 255 || heartBaseResult.getY().intValue() == 255 || heartBaseResult.getZ().intValue() == 31) {
        rgv.setCurLocation(null);
      } else {
        rgv.setCurLocation(new Node(heartBaseResult.getX().intValue(), heartBaseResult.getY().intValue(), heartBaseResult.getZ().intValue()));
        rgv.getRgvDB().setLocation(rgv.getCurLocation().toString());
        if (oldLocation != null && !oldLocation.equals(rgv.getCurLocation())) {
          rgvdbService.updateRgvLocation(rgv.getRgvDB());
          LockNodeManager.updateLocationLock(rgv);
        } 
      } 
      rgv.updateWcsTimeModuleResultBO((Coord)rgv.getCurLocation());
    } 
    rgv.setRgvResStatus(RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue()));
    if (rgv.getRgvStatus() != RgvStatus.ERROR)
      rgv.setRgvStatus(RgvStatus.parseStatus(heartBaseResult.getRgvStatus().intValue())); 
  }
  
  private static Integer parseDirection(Integer resDirection, Integer carDirection) {
    if (resDirection.intValue() == 0)
      return resDirection; 
    if (resDirection.intValue() < 0 || resDirection.intValue() > 4)
      return Integer.valueOf(5); 
    switch (carDirection.intValue()) {
      case 3:
        return Integer.valueOf((resDirection.intValue() + 0) % 4);
      case 2:
        return Integer.valueOf((resDirection.intValue() + 1) % 4);
      case 1:
        return Integer.valueOf((resDirection.intValue() + 2) % 4);
      case 4:
        return Integer.valueOf((resDirection.intValue() + 3) % 4);
    } 
    return Integer.valueOf(5);
  }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

meslog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值