自动化立体仓库 - WCS系统
Junjie
2023-05-09 1ee427c388dfdb76121c6962a9ae65b72b6d0fdb
src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java
@@ -1,6 +1,18 @@
package com.zy.core.model.protocol;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasShuttleErr;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasShuttleErrService;
import com.zy.asrs.service.BasShuttleService;
import com.zy.asrs.service.LocMastService;
import com.zy.core.News;
import com.zy.core.enums.ShuttleErrorCodeType;
import com.zy.core.enums.ShuttleProtocolStatusType;
import com.zy.core.enums.ShuttleStatusType;
import com.zy.core.model.command.ShuttleAssignCommand;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -19,100 +31,39 @@
    /**
     * 任务号
     */
    public Short taskNo = 0;
    private Short taskNo = 0;
    /**
     * 排
     * 任务指令
     */
    public Short row;
    private ShuttleAssignCommand assignCommand;
    /**
     * 列
     * 当前小车状态(内部自我维护)
     */
    public Short bay;
    private Integer protocolStatus;
    /**
     * 层
     * 当前小车状态枚举
     */
    public Short lev;
    private ShuttleProtocolStatusType protocolStatusType;
    /**
     * 控制指令字
     * 源库位
     */
    private Integer commandWord;
    private String sourceLocNo;
    /**
     * 启始二维编号
     * 目标库位
     */
    private Integer startCodeNum;
    /**
     * 中间二维编号
     */
    private Integer middleCodeNum;
    /**
     * 目标二维编号
     */
    private Integer distCodeNum;
    /**
     * 起点到目标点的距离长度
     */
    private Integer startToDistDistance;
    /**
     * 中间点到目标点的距离长度
     */
    private Integer middleToDistDistance;
    /**
     * 小车运行方向
     */
    private Integer runDirection;
    /**
     * 托盘顶升
     */
    private Integer palletLift;
    /**
     * 小车强制移动距离
     */
    private Integer forceMoveDistance;
    /**
     * 充电开关
     */
    private Integer chargeSwitch;
    /**
     * 小车IO控制
     */
    private Integer IOControl;
    /**
     * 小车运行速度
     */
    private Integer runSpeed;
    /**
     * 小车雷达备用
     */
    private Integer radarTmp;
    /**
     * 指令结束位
     */
    private Integer commandEnd;
    private String locNo;
    /**
     * 小车忙状态位
     * true: 忙
     * false: 空闲
     * 1: 忙
     * 0: 空闲
     */
    private Boolean busyStatus;
    private Short busyStatus;
    /**
     * 小车忙状态位枚举
@@ -123,172 +74,273 @@
     * 当前二维码
     * 0为空
     */
    private String currentCode;
    private Short currentCode;
    /**
     * 电池电量百分比
     */
    private Double batteryPower;
    private Short batteryPower;
    /**
     * 电池温度
     */
    private Double batteryTemp;
    private Short batteryTemp;
    /**
     * 错误编号
     */
    private Integer errorCode;
    private Short errorCode;
    /**
     * 错误编号枚举
     */
    private ShuttleErrorCodeType errorCodeType;
    /**
     * Plc输出状态IO
     */
    private byte plcOutputStatusIO;
    private Short plcOutputStatusIO;
    /**
     * Plc输出状态IO-顶升位
     */
    private Boolean plcOutputLift;
    /**
     * Plc输出状态IO-换向位
     */
    private Boolean plcOutputTransfer;
    /**
     * Plc输出状态IO-抱闸位
     */
    private Boolean plcOutputBrake;
    /**
     * Plc输出状态IO-充电位
     */
    private Boolean plcOutputCharge;
    /**
     * 错误信息码
     */
    private Integer statusErrorCode;
    private Short statusErrorCode;
    /**
     * PLC输入状态
     */
    private byte plcInputStatus;
    private Short plcInputStatus;
    /**
     * 当前或者之前读到的二维码值
     */
    private String currentOrBeforeCode;
    private Short currentOrBeforeCode;
    /**
     * 读到的二维码X方向偏移量
     */
    private Integer codeOffsetX;
    private Short codeOffsetX;
    /**
     * 读到的二维码Y方向偏移量
     */
    private Integer codeOffsetY;
    private Short codeOffsetY;
    /**
     * 当前的电压值
     */
    private Double currentVoltage;
    private Short currentVoltage;
    /**
     * 当前的模拟量值
     */
    private Integer currentAnalogValue;
    private Short currentAnalogValue;
    /**
     * 当前的升降伺服速度
     */
    private Double currentLiftServoSpeed;
    private Short currentLiftServoSpeed;
    /**
     * 当前的行走伺服速度
     */
    private Double currentMoveServoSpeed;
    private Short currentMoveServoSpeed;
    /**
     * 当前的升降伺服负载率
     */
    private Double currentLiftServoLoad;
    private Short currentLiftServoLoad;
    /**
     * 当前的行走伺服负载率
     */
    private Double currentMoveServoLoad;
    private Short currentMoveServoLoad;
    /**
     * 作业标记
     */
    private String pakMk = "-";
    private Boolean pakMk = true;
    // 任务信息 ---------------------------------------------------------
    /**
     * 96.入库任务中
     */
    private boolean pakInTask;
    /**
     * 97. 出库任务中
     */
    private boolean pakOutTask;
    /**
     * 98. 移库任务中
     */
    private boolean pakMoveTask;
    /**
     * 99. 回原点任务中
     */
    private boolean goHpTask;
    /**
     * 100. 去反原点任务中
     */
    private boolean goOHpTask;
    /**
     * 101. 去原点避让位
     */
    private boolean goHpAvoid;
    /**
     * 102. 去反原点避让位
     */
    private boolean goOHpAvoid;
    /**
     * 104. 入库取空结束
     */
    private boolean pakInEmpty;
    /**
     * 105. 入库正常结束
     */
    private boolean pakInFinish;
    /**
     * 106. 出库取空结束
     */
    private boolean pakOutEmpty;
    /**
     * 107. 出库正常结束
     */
    private boolean pakOutFinish;
    /**
     * 108. 去原点避让完成
     */
    private boolean goHpAvoidFinish;
    /**
     * 109. 去反原点避让完成
     */
    private boolean goOHpAvoidFinish;
    /**
     * 110. 去原点避让完成
     */
    private boolean goHpAvoidErr;
    /**
     * 111. 去反原点避让完成
     */
    private boolean goOHpAvoidErr;
    public void setBusyStatus(Boolean status) {
    public void setBusyStatus(Short status) {
        this.busyStatus = status;
        this.busyStatusType = ShuttleStatusType.get(status);
    }
    public void setBusyStatus(ShuttleStatusType type) {
        this.busyStatus = type.id.booleanValue();
        this.busyStatus = type.id.shortValue();
        this.busyStatusType = type;
    }
    //获取电池电量
    public Short getBatteryPower$() {
        return (short) (this.batteryPower * 0.1);
    }
    //获取电池温度
    public Short getBatteryTemp$() {
        return (short) (this.batteryTemp * 0.1);
    }
    /**
     * 设置小车状态
     */
    public void setProtocolStatus(Integer status) {
        this.protocolStatus = status;
        this.protocolStatusType = ShuttleProtocolStatusType.get(status);
    }
    /**
     * 设置小车状态
     */
    public void setProtocolStatus(ShuttleProtocolStatusType status) {
        this.protocolStatus = status.id;
        this.protocolStatusType = status;
    }
    /**
     * 设置错误编号
     */
    public void setErrorCode(Short errorCode) {
        this.errorCode = errorCode;
        this.errorCodeType = ShuttleErrorCodeType.get(errorCode.intValue());
    }
    /**
     * 设置错误编号
     */
    public void setErrorCode(ShuttleErrorCodeType type) {
        this.errorCode = type.id.shortValue();
        this.errorCodeType = type;
    }
    // 是否处于空闲待命状态
    public Boolean isIdle() {
        boolean res = this.busyStatusType.equals(ShuttleStatusType.IDLE)
                && this.pakMk.equals(true)
                && this.errorCodeType.equals(ShuttleErrorCodeType.NORMAL)
                && this.taskNo == 0
                ;
        if (!res) {
            return res;
        } else {
            // 电量
            try {
                Integer chargeLine = SpringUtils.getBean(BasShuttleService.class).selectById(this.shuttleNo).getChargeLine();
                return this.getBatteryPower$() > chargeLine;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
    // 是否处于空闲待命状态,传入的taskNo和当前taskNo相同时允许放行
    public Boolean isIdle(Short taskNo) {
        boolean res = this.busyStatusType.equals(ShuttleStatusType.IDLE)
                && this.pakMk.equals(true)
                && this.errorCodeType.equals(ShuttleErrorCodeType.NORMAL)
                && (this.taskNo == 0 || this.taskNo == taskNo)
                ;
        if (!res) {
            return res;
        } else {
            // 电量
            try {
                Integer chargeLine = SpringUtils.getBean(BasShuttleService.class).selectById(this.shuttleNo).getChargeLine();
                return this.getBatteryPower$() > chargeLine;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
    // 是否满足充电状态
    public Boolean isRequireCharge() {
        if (this.busyStatusType == null || this.pakMk == null || this.errorCodeType == null || this.taskNo == null) {
            return false;
        }
        boolean res = this.busyStatusType.equals(ShuttleStatusType.IDLE)
                && this.pakMk.equals(true)
                && this.errorCodeType.equals(ShuttleErrorCodeType.NORMAL)
                && this.taskNo == 0
                ;
        if (!res) {
            return res;
        } else {
            // 电量小于阈值或电压小于48V,需要进行充电
            try {
                Integer chargeLine = SpringUtils.getBean(BasShuttleService.class).selectById(this.shuttleNo).getChargeLine();
                return this.getBatteryPower$() < chargeLine || this.currentVoltage < 480;
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
    //通过当前二维码获取当前库位号
    public String getCurrentLocNo() {
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        if (locMastService == null) {
            return null;
        }
        //源库位(小车当前位置)
        LocMast currentLocMast = locMastService.queryByQrCode(this.currentCode.toString());
        if (currentLocMast == null) {
            return null;
        }
        return currentLocMast.getLocNo();
    }
    public String getStatusErrorCode$() {
        BasShuttleErrService basShuttleErrService = SpringUtils.getBean(BasShuttleErrService.class);
        BasShuttleErr basShuttleErr = basShuttleErrService.queryByCode(this.statusErrorCode.intValue());
        if (basShuttleErr == null) {
            return null;
        }
        return basShuttleErr.getErrName();
    }
    public void setCurrentCode(Short currentCode) {
        this.currentCode = currentCode;
        LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
        if (locMastService != null) {
            LocMast locMast = locMastService.queryByQrCode(currentCode.toString());
            if (locMast == null) {
                //查不到库位号,查询是否为站点
                BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
                if (basDevpService != null) {
                    BasDevp basDevp = basDevpService.queryByLocNo(currentCode.toString());
                    if (basDevp != null) {
                        this.locNo = basDevp.getLocNo();
                    }
                }
            }else{
                this.locNo = locMast.getLocNo();
            }
        }
    }
}