*
lsh
2025-11-24 a775cccf69b395cff784ea50164b89a6ef00341a
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -1,99 +1,59 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasRgv;
import com.zy.asrs.entity.BasRgvErrorLog;
import com.zy.core.enums.RgvModeType;
import com.zy.core.enums.RgvStatusType;
import lombok.Data;
import javax.swing.*;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by vincent on 2020/8/7
 */
@Data
public class RgvProtocol implements Cloneable{
public class RgvProtocol {
    private short RgvNo;
    private Integer RgvNo;
    /**
     * 1 = 手动模式
     * 2 = 自动模式
     * 3 = 电脑模式
     */
    public Short mode;
    public Short mode = -1;
    public RgvModeType modeType;
    private transient Long loadingStartTime;
    public RgvModeType modeType = RgvModeType.NONE;
    /**
     * 执行优先级
     * 0:不判断
     * 1:工位1先执行
     * 2:工位2先执行
     */
    public Short wrkTaskPri;
    public Short wrkTaskMove1;
    public Short wrkTaskMove2;
    /**
     * RGV当前状态工位1
     * RGV当前状态
     * 0:空闲,无任务
     * 1:作业中
     * 2:报警
     */
    public Short status;
    public Short status = -1;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType;
    public RgvStatusType statusType = RgvStatusType.NONE;
    /**
     * 工位1任务号
     * 任务号
     */
    public Integer taskNo1 = 0;
    /**
     * 工位1目标站
     */
    public Integer staNo1 = 0;
    public Long taskNo = 0L;
    /**
     * RGV工位1当前状态
     * 0:空闲,无任务
     * 11:取货中
     * 12:放货中
     * 10:任务完成等待WCS确认
     * 有物
     */
    public Short status1;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType1;
    /**
     * 工位1有物
     */
    public Boolean loaded1;
    public Short loaded = -1;//0 无物;1 有物
    /**
     * RGV当前位置
     */
    public Integer RgvPos;
    public Long RgvPos = 0L;
    /**
     * RGV当前目的位置
     * RGV目的位置
     */
    public Integer RgvPosDestination;
    public Long RgvPosDestination = 0L;
    /**
     * 走行在定位
@@ -103,176 +63,9 @@
    public Short walkPos;
    /**
     * 急停触发
     */
    public Boolean err1;
    /**
     *
     */
    public Boolean err2;
    /**
     * 有资料无物
     */
    public Boolean err3;
    /**
     * 命令错误走行联调冲突
     */
    public Boolean err4;
    /**
     * 目标为超过行走极限
     */
    public Boolean err5;
    /**
     *  变频器异常
     */
    public Boolean err6;
    /**
     * 光电异常
     */
    public Boolean err7;
    public Boolean err8;
    public Boolean err9;
    public Boolean err10;
    public Boolean err11;
    public Boolean err12;
    //////////////////////     工位2定义   //////////////////////////////////////////////////
    /**
     * 工位2任务号
     */
    public Integer taskNo2 = 0;
    /**
     * 工位1目标站
     */
    public Integer staNo2 = 0;
    /**
     * RGV工位2当前状态
     * 0:空闲,无任务
     * 11:取货中
     * 12:放货中
     * 10:任务完成等待WCS确认
     */
    public Short status2;
    /**
     * 状态枚举
     */
    public RgvStatusType statusType2;
    /**
     * 工位2有物
     */
    public Boolean loaded2;
//    /**
//     * 急停
//     */
//    public Boolean err21;
//
//    /**
//     * 有物无资料
//     */
//    public Boolean err22;
//
//    /**
//     * 有资料无物
//     */
//    public Boolean err23;
//
//    /**
//     * 命令错误走行联调冲突
//     */
//    public Boolean err24;
//
//    /**
//     * 目标为超过行走极限
//     */
//    public Boolean err25;
//
//    /**
//     *  变频器异常
//     */
//    public Boolean err26;
//
//    /**
//     * 光电异常
//     */
//    public Boolean err27;
    ///////////////////////////////////////////////////////////////////////////////////////
    //配置信号-----------------------------------------------------------------------------
    // 故障读取锁定标记
    private boolean errorMk = false;
    //写入标记
    private boolean writeMk = true;
    private Boolean chainForward1 = false;       // 链条前进 1
    private Boolean chainReverse1 = false;       // 链条后退 1
    private Boolean inverterAlarm = false;       // 变频器报警
    private Boolean leftOverlimit2 = false;      // 左超限 2
    private Boolean rightOverlimit2 = false;     // 右超限 2
    private Boolean leftAtPosition2 = false;     // 左到位 2
    private Boolean rightAtPosition2 = false;    // 右到位 2
    private Boolean cargoSpeedReduction = false; // 货物减速
    private Boolean conveyorInverterAlarm2 = false; // 输送变频器报警 2
    private Boolean emergencyStop = false;       // 急停触发
    private Boolean slot1EmptyNoData = false;    // 1号位有物无资料
    private Boolean slot2EmptyNoData = false;    // 2号位有物无资料
    private Boolean commandErrorChainConflict = false; // 命令错误走链条冲突
    private Boolean targetPositionIssue = false; // 目标位下发错误
    private Boolean travelInverterError = false; // 走行变频器异常
    private Boolean photoelectric1Error = false; // 1号光电异常
    private Boolean photoelectric2Error = false; // 2号光电异常
    private Boolean timeoutConnectionWithLine = false; // 与输线时接超时
    private Boolean leftRollerTimeout = false;    // 左侧滚筒运行超时
    private Boolean rightRollerTimeout = false;   // 右侧滚筒运行超时
    private Boolean rgvRunTimeout = false;        // rgv运行超时
    private Boolean position1ChainInverterError = false; // 1号工位链条变频器异常
    private Boolean position2ChainInverterError = false; // 2号工位链条变频器异常
    private Boolean frontRearLimit = false;      // 前后极限位
    private Boolean emergencyButton = false;     // 急停按钮
    private Boolean forwardButton = false;       // 前进按钮
    private Boolean reverseButton = false;       // 后退按钮
    private Boolean localRemote = false;         // 本地/远程
    private Boolean reset = false;               // 复位
    private Boolean travelBrakeSwitch = false;   // 走行抱闸开关钮
    private Boolean travelSpeedLimitPhotoelectric = false; // 走行强制减速光电
    private Boolean leftOverlimit1 = false;      // 左超限 1
    private Boolean rightOverlimit1 = false;     // 右超限 1
    private Boolean leftAtPosition1 = false;     // 左到位 1
    private Boolean rightAtPosition1 = false;    // 右到位 1
    private Boolean rightConveyor2 = false;      // 右输送 2
    private Boolean leftConveyor2 = false;       // 左输送 2
    //---------------------------------------------------------------------
    /**
     * 异常码
     */
    public Short alarm;
    /**
     * 心跳指令 1-2每秒切换一次
     */
    public Short heart;
    private Short temp1;
    private Short temp2;
    private Short temp3;
    private Short temp4;
    private Short temp5;
    /**
     * X行走行速度m/min
@@ -280,59 +73,54 @@
    private Float xSpeed;
    /**
     * 堆垛机累计走行距离km
     * 累计走行距离km
     */
    public Float xDistance;
    /**
     * 堆垛机累计走行时长h
     * 累计走行时长h
     */
    public Float xDuration;
    /**
     * 车身
     */
    public Long carBodyJiaoMing = 2000L;
    public BasRgvErrorLog toSqlModelError(){
        BasRgvErrorLog basRgvErrorLog = new BasRgvErrorLog();
        basRgvErrorLog.setRgvNo((int) RgvNo);// 设备号(假设有定义 siteId)
        basRgvErrorLog.setChainForward1(chainForward1 ? "Y" : "N");       // 链条前进 1
        basRgvErrorLog.setChainReverse1(chainReverse1 ? "Y" : "N");       // 链条后退 1
        basRgvErrorLog.setInverterAlarm(inverterAlarm ? "Y" : "N");       // 变频器报警
        basRgvErrorLog.setLeftOverlimit2(leftOverlimit2 ? "Y" : "N");      // 左超限 2
        basRgvErrorLog.setRightOverlimit2(rightOverlimit2 ? "Y" : "N");     // 右超限 2
        basRgvErrorLog.setLeftAtPosition2(leftAtPosition2 ? "Y" : "N");     // 左到位 2
        basRgvErrorLog.setRightAtPosition2(rightAtPosition2 ? "Y" : "N");    // 右到位 2
        basRgvErrorLog.setCargoSpeedReduction(cargoSpeedReduction ? "Y" : "N"); // 货物减速
        basRgvErrorLog.setConveyorInverterAlarm2(conveyorInverterAlarm2 ? "Y" : "N"); // 输送变频器报警 2
        basRgvErrorLog.setEmergencyStop(emergencyStop ? "Y" : "N");       // 急停触发
        basRgvErrorLog.setSlot1EmptyNoData(slot1EmptyNoData ? "Y" : "N");    // 1号位有物无资料
        basRgvErrorLog.setSlot2EmptyNoData(slot2EmptyNoData ? "Y" : "N");    // 2号位有物无资料
        basRgvErrorLog.setCommandErrorChainConflict(commandErrorChainConflict ? "Y" : "N"); // 命令错误走链条冲突
        basRgvErrorLog.setTargetPositionIssue(targetPositionIssue ? "Y" : "N"); // 目标位下发错误
        basRgvErrorLog.setTravelInverterError(travelInverterError ? "Y" : "N"); // 走行变频器异常
        basRgvErrorLog.setPhotoelectric1Error(photoelectric1Error ? "Y" : "N"); // 1号光电异常
        basRgvErrorLog.setPhotoelectric2Error(photoelectric2Error ? "Y" : "N"); // 2号光电异常
        basRgvErrorLog.setTimeoutConnectionWithLine(timeoutConnectionWithLine ? "Y" : "N"); // 与输线时接超时
        basRgvErrorLog.setLeftRollerTimeout(leftRollerTimeout ? "Y" : "N");    // 左侧滚筒运行超时
        basRgvErrorLog.setRightRollerTimeout(rightRollerTimeout ? "Y" : "N");   // 右侧滚筒运行超时
        basRgvErrorLog.setRgvRunTimeout(rgvRunTimeout ? "Y" : "N");        // rgv运行超时
        basRgvErrorLog.setPosition1ChainInverterError(position1ChainInverterError ? "Y" : "N"); // 1号工位链条变频器异常
        basRgvErrorLog.setPosition2ChainInverterError(position2ChainInverterError ? "Y" : "N"); // 2号工位链条变频器异常
        basRgvErrorLog.setFrontRearLimit(frontRearLimit ? "Y" : "N");      // 前后极限位
        basRgvErrorLog.setEmergencyButton(emergencyButton ? "Y" : "N");     // 急停按钮
        basRgvErrorLog.setForwardButton(forwardButton ? "Y" : "N");       // 前进按钮
        basRgvErrorLog.setReverseButton(reverseButton ? "Y" : "N");       // 后退按钮
        basRgvErrorLog.setLocalRemote(localRemote ? "Y" : "N");         // 本地/远程
        basRgvErrorLog.setReset(reset ? "Y" : "N");               // 复位
        basRgvErrorLog.setTravelBrakeSwitch(travelBrakeSwitch ? "Y" : "N");   // 走行抱闸开关钮
        basRgvErrorLog.setTravelSpeedLimitPhotoelectric(travelSpeedLimitPhotoelectric ? "Y" : "N"); // 走行强制减速光电
        basRgvErrorLog.setLeftOverlimit1(leftOverlimit1 ? "Y" : "N");      // 左超限 1
        basRgvErrorLog.setRightOverlimit1(rightOverlimit1 ? "Y" : "N");     // 右超限 1
        basRgvErrorLog.setLeftAtPosition1(leftAtPosition1 ? "Y" : "N");     // 左到位 1
        basRgvErrorLog.setRightAtPosition1(rightAtPosition1 ? "Y" : "N");    // 右到位 1
        basRgvErrorLog.setRightConveyor2(rightConveyor2 ? "Y" : "N");      // 右输送 2
        basRgvErrorLog.setLeftConveyor2(leftConveyor2 ? "Y" : "N");       // 左输送 2
    /**
     * 车身
     */
    public Long carBodyKunPeng = 15000L;
        return basRgvErrorLog;
    }
    /**
     * 是否启用
     */
    public boolean statusEnable;//0\1\2
    // 急停
    private boolean err1;
    // 有物无资料
    private boolean err2;
    // 命令错误走行链条冲突
    private boolean err3;
    // 目标为超过走行极限
    private boolean err4;
    // 变频器异常
    private boolean err5;
    // 光电异常
    private boolean err6;
    //小车模式切换错误
    private boolean err7;
    //其他未知异常
    private boolean err8;
    private String errorRgv;
    public void setMode(Short mode) {
        this.mode = mode;
@@ -354,50 +142,20 @@
        this.status = RgvStatusType.get(type).id.shortValue();
    }
    public void setStatus1(Short status1){
        this.status1 = status1;
        this.statusType1 = RgvStatusType.get(status1);
    }
    public void setStatus1(RgvStatusType type1){
        this.statusType1 = type1;
        this.status1 = RgvStatusType.get(type1).id.shortValue();
    }
    public void setStatus2(Short status2){
        this.status2 = status2;
        this.statusType2 = RgvStatusType.get(status2);
    }
    public void setStatus2(RgvStatusType type2){
        this.statusType2 = type2;
        this.status2 = RgvStatusType.get(type2).id.shortValue();
    }
    public boolean isLoaded1ing() {
        return Boolean.TRUE.equals(this.loaded1);
    }
    public boolean isLoaded2ing() {
        return Boolean.TRUE.equals(this.loaded2);
    }
    /**
     * 最近一次入出库类型
     *       I:入库
     *       O:出库
     */
    private String lastIo = "I";
    public BasRgv toSqlModel(BasRgv basRgv){
        if (alarm!=null) {
            basRgv.setRgvErr(alarm.longValue());
        }
        basRgv.setWrkNo1(taskNo1.intValue());
        basRgv.setWrkNo2(taskNo2.intValue());
        basRgv.setWrkNo1(taskNo.intValue());
        return basRgv;
    }
    public long getRgvPosDestinationOrPos(boolean sign){
        if (!sign){
            return RgvPosDestination>RgvPos? RgvPosDestination:RgvPos;
        } else {
            return RgvPosDestination<RgvPos? RgvPosDestination:RgvPos;
        }
    }
    public void setxSpeed(Short xSpeed) {
@@ -412,87 +170,53 @@
        this.xDuration = Float.valueOf(xDuration);
    }
    public Integer getRgvPosI(){
        //需要根据现场改造  根据读到的值获取对应站点位置
        Map<Short,Integer> map = new HashMap<>();
        map.put((short) 1,1004);map.put((short) 2,1007);
        map.put((short) 3,1010);map.put((short) 4,1014);
        map.put((short) 5,1018);map.put((short) 6,1021);
       map.put((short) 7,1024); map.put((short) 8,1028);
        map.put((short) 9,1031);map.put((short) 10,1035);
        map.put((short) 11,2003);map.put((short) 12,2006);
        map.put((short) 13,2009);map.put((short) 14,2012);
        map.put((short) 15,2015);map.put((short) 16,2018);
        map.put((short) 17,2021);map.put((short) 18,2024);
        map.put((short) 19,2027);map.put((short) 20,2030);
        if (RgvPos==null) return 0;
        return map.get(RgvPos);
    }
    public Integer getRgvPosI1() {
        // key: 站点号  value: 基准物理位置
        Map<Integer, Integer> posMap = new HashMap<>();
        posMap.put(1004, 6534);
        posMap.put(1007, 33634);
        posMap.put(1010, 75174);
        posMap.put(1014, 102124);
        posMap.put(1018, 138224);
        posMap.put(1021, 178034);
        posMap.put(1024, 219684);
        posMap.put(1028, 246724);
        posMap.put(1031, 288194);
        posMap.put(1035, 314954);
        int tolerance = 200; // 允许误差范围
        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
            int site = entry.getKey();
            int basePos = entry.getValue();
            if (Math.abs(RgvPos - basePos) <= tolerance) {
                return site;
            }
    public int getAlarm$(){
        if (err1){
            return 1;
        }
        return 0; // 没匹配到站点
    }
    public Integer getRgvPosI2() {
        // key: 站点号  value: 基准物理位置
        Map<Integer, Integer> posMap = new HashMap<>();
        posMap.put(2030, 314954);
        posMap.put(2027, 288094);
        posMap.put(2024, 246574);
        posMap.put(2021, 219584);
        posMap.put(2018, 177934);
        posMap.put(2015, 138126);
        posMap.put(2012, 102124);
        posMap.put(2009, 75174);
        posMap.put(2006, 33748);
        posMap.put(2003, 6449);
        int tolerance = 500; // 允许误差范围
        for (Map.Entry<Integer, Integer> entry : posMap.entrySet()) {
            int site = entry.getKey();
            int basePos = entry.getValue();
            if (Math.abs(RgvPos - basePos) <= tolerance) {
                return site;
            }
        if (err2){
            return 2;
        }
        return 0; // 没匹配到站点
    }
    @Override
    public RgvProtocol clone() {
        try {
            return (RgvProtocol) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        if (err3){
            return 3;
        }
        return null;
        if (err4){
            return 4;
        }
        if (err5){
            return 5;
        }
        if (err6){
            return 6;
        }
        if (err7){
            return 7;
        }
        if (err8){
            return 8;
        }
        return 0;
    }
    public String getAlarmM(){
        switch (getAlarm$()){
            case 1:
                return "急停";
            case 2:
                return "有物无资料";
            case 3:
                return "命令错误走行链条冲突";
            case 4:
                return "目标为超过走行极限";
            case 5:
                return "变频器异常";
            case 6:
                return "光电异常";
            case 7:
                return "小车模式切换错误";
            case 8:
                return "其它未知异常";
        }
        return "正常";
    }
}