自动化立体仓库 - WCS系统
#
Junjie
2023-08-21 8bd6a3d7574f0ed50e52424d55a9767a0a3f03e4
src/main/java/com/zy/core/model/protocol/SteProtocol.java
@@ -1,36 +1,43 @@
package com.zy.core.model.protocol;
import com.zy.asrs.entity.BasCrnp;
import com.zy.core.enums.CrnForkPosType;
import com.zy.core.enums.CrnLiftPosType;
import com.zy.core.enums.CrnModeType;
import com.zy.core.enums.CrnStatusType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.BasSte;
import com.zy.asrs.service.BasSteService;
import com.zy.core.News;
import com.zy.core.enums.SteHisTaskStatusType;
import com.zy.core.enums.SteLocaType;
import com.zy.core.enums.SteStatusType;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
 * Created by vincent on 2020/8/7
 */
@Slf4j
@Data
public class SteProtocol {
    /**
     * 1 = 手动模式
     * 2 = 自动模式
     * 3 = 电脑模式
     * 设备号
     */
    private Short steNo;
    /**
     * 1 = 联机模式
     * 0 = 脱机模式
     */
    public Short mode;
    public CrnModeType modeType;
    /**
     * 1 = 急停
     IDLE(0, "空闲"),
     MOVING(1, "作业中"),
     SOS(2, "报警"),
     WAITING(3, "任务完成等待WCS确认"),
     */
    public Short eStop;
    public Short status;
    /**
     * 异常码
     */
    public Short alarm;
    public SteStatusType statusType;
    /**
     * 任务号
@@ -38,199 +45,444 @@
    public Short taskNo = 0;
    /**
     * 堆垛机当前状态
     * 0:空闲,无任务
     * 1:取货定位中
     * 2:取货中
     * 3:取货完成,放货定位中
     * 4:放货中
     * 5:回原点中
     * 6:反原点
     * 7:库位移位
     * 90:任务完成等待WCS确认
     * 99:报警
     * 正在执行任务
     */
    public Short status;
    public Boolean execute;
    /**
     * 状态枚举
     * 任务完成,等待WCS确认
     */
    public CrnStatusType statusType;
    public Boolean waiting;
    /**
     * 堆垛机当前列号
     * 异常码1
     */
    public Short alarm;
    /**
     * 异常码2
     */
    public Short alarm0;
    /**
     * 电池电量
     */
    public Float charge = 0.0F;
    public void setCharge(Float charge) {
        if (charge >= 0) {
            this.charge = charge;
        }
    }
    /**
     * 满电
     */
    public Boolean fullCharge;
    /**
     * 低电量
     */
    public Boolean lowCharge;
    /**
     * 电池馈电    0,欠电,1低电 2满电
     */
    public Short feed;
    /**
     * 当前位置     1,近点,2远点,3A点,4B点
     */
    public Short loca;
    public SteLocaType locaType;
    /**
     * 近点距离
     */
    public Double closer;
    /**
     * 当前速度
     */
    public Double speed = 0.0D;
    /**
     * 高低位 0,低位,1高位
     */
    public Short pos;
    /**
     * 有货 0,没货,1有货
     */
    public Short load;
    /**
     * 在轨道上 0不在,1在
     */
    public Short track;
    /**
     * 任务类型
     */
    public Short taskType;
    /**
     * 排
     */
    public Short row;
    /**
     * 列
     */
    public Short bay;
    /**
     * 堆垛机当前层号
     * 层
     */
    public Short level;
    public Short lev;
    /**
     * 当前货叉位置
     * 0 = 货叉原位
     * 1 = 货叉在左侧
     * 2 = 货叉在右侧
     * 过账指令任务号
     */
    public Short forkPos;
    public CrnForkPosType forkPosType;
    public Integer hisTaskNo;
    /**
     * 当前载货台位置
     * 0 = 下定位
     * 1 = 上定位
     * 过账指令状态
     * 0初始 1执行完成 2删除
     */
    public Short liftPos;
    public Short hisTaskStatus;
    public CrnLiftPosType liftPosType;
    public SteHisTaskStatusType hisTaskStatusType;
    /**
     * 走行在定位
     * 0 = 在定位
     * 1 = 不在定位
     * 盘点数量
     */
    public Short walkPos;
    public Short checkQty;
    /**
     * 载货台有物
     * 就绪状态  0未就绪 1就绪
     */
    public Short loaded;
    private Short temp1;
    private CrnTemp1 crnTemp1;
    private Short temp2;
    private Short temp3;
    private Short temp4;
    public Short ready;
    /**
     * 异常1
     * 打开充电桩号
     */
    private boolean[] error1;
    private CrnError1 crnError1;
    public Short chargeNo;
    /**
     * 异常2
     * 心跳指令 1-2每秒切换一次
     */
    private boolean[] error2;
    private CrnError2 crnError2;
    public Short heart;
    /**
     * 异常3
     * 堆垛机禁止运行 1运行,0禁止
     */
    private boolean[] error3;
    private CrnError3 crnError3;
    public Short crnStopRun;
    /**
     * 异常4
     * 堆垛机禁止伸叉 1运行,0禁止
     */
    private boolean[] error4;
    private CrnError4 crnError4;
    public Short crnStopFork;
    /**
     * 异常5
     * 堆垛机搬移允许 0不允许   1允许
     */
    private boolean[] error5;
    private CrnError5 crnError5;
    public Short crnAllowRun;
    /**
     * 异常6
     * 充电状态  1:在充电;0:不在充电
     */
    private boolean[] error6;
    private Short chargeStatus;
    private CrnError6 crnError6;
    // 入库取空
    private Boolean inEmpty;
    // 出库取空
    private Boolean outEmpty;
    // 穿梭车异常 ------------------------------------------------------------------------
    /**
     * X行走线速度m/min
     * 0.升降超时报警
     */
    private Float xSpeed;
    private boolean liftErr;
    /**
     * Y行走线速度m/min
     * 2.入库取空报警
     */
    private Float ySpeed;
    private boolean inFetchErr;
    /**
     * Z行走线速度m/min
     * 3.出库取空报警
     */
    private Float zSpeed;
    private boolean outFetchErr;
    /**
     * 堆垛机累计走行距离km
     * 4.防撞保护
     */
    public Float xDistance;
    private boolean antiErr;
    /**
     * 堆垛机累计升降距离km
     * 5.升降接近开关故障
     */
    public Float yDistance;
    private boolean liftSwitchErr;
    /**
     * 堆垛机累计走行时长h
     * 6.轨道检测报警
     */
    public Float xDuration;
    private boolean trackErr;
    /**
     * 堆垛机累计升降时长h
     * 7.设备运行超时报警
     */
    public Float yDuration;
    private boolean timeoutErr;
    public void setMode(Short mode) {
        this.mode = mode;
        this.modeType = CrnModeType.get(mode);
    }
    /**
     * 8.通信错误报警
     */
    private boolean connectErr;
    public void setMode(CrnModeType type) {
        this.modeType = type;
        this.mode = CrnModeType.get(type).id.shortValue();
    }
    /**
     * 9.设备急停
     */
    private boolean emergencyErr;
    public void setForkPos(Short forkPos) {
        this.forkPos = forkPos;
        this.forkPosType = CrnForkPosType.get(forkPos);
    }
    /**
     * 10.任务类型缺失
     */
    private boolean taskTypeErr;
    public void setForkPos(CrnForkPosType type) {
        this.forkPosType = type;
        this.forkPos = CrnForkPosType.get(type).id.shortValue();
    }
    /**
     * 11.任务号缺失
     */
    private boolean taskNoErr;
    public void setLiftPos(Short liftPos) {
        this.liftPos = liftPos;
        this.liftPosType = CrnLiftPosType.get(liftPos);
    }
    /**
     * 12.运行中有新任务
     */
    private boolean newTaskErr;
    public void setLiftPos(CrnLiftPosType type) {
        this.liftPosType = type;
        this.liftPos = CrnLiftPosType.get(type).id.shortValue();
    }
    /**
     * 13.故障中有任务
     */
    private boolean errTaskErr;
    /**
     * 14.运行中停止
     */
    private boolean stopErr;
    /**
     * 15.脱机模式下有任务
     */
    private boolean offlineTaskErr;
    /**
     * 16.条件未满足启动任务
     */
    private boolean startTaskErr;
    /**
     * 17.低电压时有任务
     */
    private boolean voltageTaskErr;
    /**
     * 63.设备故障标志位
     */
    private boolean devpErr;
    // 穿梭车异常 ------------------------------------------------------------------------
    // 穿梭车提示信息 ------------------------------------------------------------------------
    /**
     * 64.联机状态
     */
    private boolean online;
    /**
     * 65.不在轨道上
     */
    private boolean notOnTrack;
    /**
     * 66.低电量提醒
     */
    private boolean lowVoltage;
    /**
     * 67.亏电中
     */
    private boolean electricityLoss;
    /**
     * 68.强制行走启动
     */
    private boolean forcedTravel;
    /**
     * 69.演示模式开启
     */
    private boolean demoMode;
    /**
     * 70.充电刷已接通
     */
    private boolean brushConnect;
    /**
     * 71.任务中禁止手动
     */
    private boolean taskManualForbid;
    /**
     * 72.联机中禁止手动
     */
    private boolean onlineManualForbid;
    /**
     * 73.设备急停中
     */
    private boolean devpEmergency;
    /**
     * 74.任务中断中
     */
    private boolean taskInterrupt;
    /**
     * 75.任务已清除
     */
    private boolean taskClear;
    /**
     * 76.任务确认已超时
     */
    private boolean taskConfirmTimeout;
    /**
     * 77.充电中有任务
     */
    private boolean taskWithCharge;
    // 任务信息 ---------------------------------------------------------
    /**
     * 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;
    // 状态信息 ---------------------------------------------------------
    /**
     * 112. 联机模式
     */
    private boolean autoMode;
    /**
     * 113. 电压过低
     */
    private boolean voltageLow;
    public void setStatus(Short status){
        this.status = status;
        this.statusType = CrnStatusType.get(status);
        this.statusType = SteStatusType.get(status);
    }
    public void setStatus(CrnStatusType type){
    public void setStatus(SteStatusType type){
        this.statusType = type;
        this.status = CrnStatusType.get(type).id.shortValue();
        this.status = SteStatusType.get(type).id.shortValue();
    }
    public Short getTemp1() {
        return temp1;
    public void setLoca(Short loca){
        this.loca = loca;
        this.locaType = SteLocaType.get(loca);
    }
    public void setTemp1(Short temp1) {
        this.temp1 = temp1;
    public void setLoca(SteLocaType type){
        this.locaType = type;
        this.loca = SteLocaType.get(type).id.shortValue();
    }
    public void setHisTaskStatus(Short hisTaskStatus){
        this.hisTaskStatus = hisTaskStatus;
        this.hisTaskStatusType = SteHisTaskStatusType.get(hisTaskStatus);
    }
    public void setHisTaskStatus(SteHisTaskStatusType type){
        this.hisTaskStatusType = type;
        this.hisTaskStatus = SteHisTaskStatusType.get(type).id.shortValue();
    }
    /**
@@ -240,12 +492,65 @@
     */
    private String lastIo = "I";
    private String pakMk = "-";
    public BasCrnp toSqlModel(BasCrnp basCrnp){
    public BasSte toSqlModel(BasSte basSte){
        if (alarm!=null) {
            basCrnp.setCrnErr(alarm.longValue());
            basSte.setSteErr(alarm.longValue());
        }
        basCrnp.setWrkNo(taskNo.intValue());
        return basCrnp;
        basSte.setWrkNo(taskNo.intValue());
//        if (basSte.getPakMk().equals("N")) {
//            if (!Cools.isEmpty(row)) {
//                basSte.setRow(row.intValue());
//            }
//            if (!Cools.isEmpty(bay)) {
//                basSte.setBay(bay.intValue());
//            }
//            if (!Cools.isEmpty(lev)) {
//                basSte.setLev(lev.intValue());
//            }
//        }
        return basSte;
    }
    // 是否处于空闲待命状态
    public Boolean isIdle() {
        boolean res = this.statusType.equals(SteStatusType.IDLE)
                && this.mode == 1
                && this.pakMk.equals("N")
                && !isAlarm()
                && this.chargeStatus == 0
                && isEnable()
                ;
        if (!res) {
            return res;
        } else {
            // 电量
            try {
                String chargeLine = SpringUtils.getBean(BasSteService.class).selectById(this.steNo).getChargeLine();
                return charge > Float.parseFloat(chargeLine);
            } catch (Exception e) {
                News.error("fail", e);
                return false;
            }
        }
    }
    // 小车电量
    public Float isIdle2() {
        return this.charge;
    }
    // 是否处于报警状态
    public Boolean isAlarm() {
        return this.alarm > 1;
    }
    public Boolean isEnable() {
        if (Cools.isEmpty(row, bay, lev)) {
            return false;
        }
        return row > 0 && bay > 0 && lev > 0;
    }
}